123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315 |
- #ifndef NULLSOFT_API_LANGUAGE_H
- #define NULLSOFT_API_LANGUAGE_H
- #include "../../bfc/dispatch.h"
- #include "lang.h"
- #include <locale.h>
- #if (_MSC_VER <= 1200)
- struct threadlocaleinfostruct;
- struct threadmbcinfostruct;
- typedef struct threadlocaleinfostruct * pthreadlocinfo;
- typedef struct threadmbcinfostruct * pthreadmbcinfo;
- typedef struct localeinfo_struct
- {
- pthreadlocinfo locinfo;
- pthreadmbcinfo mbcinfo;
- } _locale_tstruct, *_locale_t;
- #endif
- class api_language : public Dispatchable
- {
- protected:
- api_language() {}
- ~api_language() {}
- public:
- char *GetString(HINSTANCE hinst, HINSTANCE owner, UINT uID, char *str=NULL, size_t maxlen=0);
- wchar_t *GetStringW(HINSTANCE hinst, HINSTANCE owner, UINT uID, wchar_t *str=NULL, size_t maxlen=0);
- char *GetStringFromGUID(const GUID guid, HINSTANCE owner, UINT uID, char *str=NULL, size_t maxlen=0);
- wchar_t *GetStringFromGUIDW(const GUID guid, HINSTANCE owner, UINT uID, wchar_t *str=NULL, size_t maxlen=0);
- HINSTANCE FindDllHandleByGUID(GUID guid);
- HINSTANCE FindDllHandleByString(const char* str);
- HINSTANCE FindDllHandleByStringW(const wchar_t* str);
- HINSTANCE StartLanguageSupport(HINSTANCE hinstance, const GUID guid);
- const wchar_t *GetLanguageFolder();
- #define LANG_IDENT_STR 0
- #define LANG_LANG_CODE 1
- #define LANG_COUNTRY_CODE 2
- const wchar_t *GetLanguageIdentifier(int mode);
- HWND CreateLDialogParam(HINSTANCE localised, HINSTANCE original, UINT id, HWND parent, DLGPROC proc, LPARAM param);
- INT_PTR LDialogBoxParam(HINSTANCE localised, HINSTANCE original, UINT id, HWND parent, DLGPROC proc, LPARAM param);
- HMENU LoadLMenu(HINSTANCE localised, HINSTANCE original, UINT id);
- HWND CreateLDialogParamW(HINSTANCE localised, HINSTANCE original, UINT id, HWND parent, DLGPROC proc, LPARAM param);
- INT_PTR LDialogBoxParamW(HINSTANCE localised, HINSTANCE original, UINT id, HWND parent, DLGPROC proc, LPARAM param);
- HMENU LoadLMenuW(HINSTANCE localised, HINSTANCE original, UINT id);
- void* LoadResourceFromFile(HINSTANCE hinst, HINSTANCE owner, LPCTSTR lpType, LPCTSTR lpName, DWORD* size);
- void* LoadResourceFromFileW(HINSTANCE hinst, HINSTANCE owner, LPCWSTR lpType, LPCWSTR lpName, DWORD* size);
- HACCEL LoadAcceleratorsA(HINSTANCE hinst, HINSTANCE owner, LPCSTR lpTableName);
- HACCEL LoadAcceleratorsW(HINSTANCE hinst, HINSTANCE owner, LPCWSTR lpTableName);
- // Implemented in 5.58+
- // When called this will attempt to set the locale used for numeric representation
- // to that of the user running the current Winamp instance as long as the language
- // and country identifiers match those reported within the language pack (if used)
- //
- // If you're running under a different thread then this will need to be called as
- // the locale is set on a per thread basis which generally means anything under the
- // Winamp process will be handled correctly unless a UI aspect is running under a
- // different thread. Internally this is called within winamp.exe and vis_milk2.dll
- BOOL UseUserNumericLocale();
- // Get_C_NumericLocale() is a wrapper for _create_locale(LC_NUMERIC, "C") which can
- // then be used in _atof_l(..), _sscanf_l(..) or other locale based functions when
- // you need to process numbers without localisation handling ie the "C" locale.
- // This function is provided for convenience unless you want to do it all manually.
- _locale_t Get_C_NumericLocale();
- public:
- DISPATCH_CODES
- {
- API_LANGUAGE_GETSTRING = 10,
- API_LANGUAGE_GETSTRINGW = 11,
- API_LANGUAGE_GETSTRINGFROMGUID = 12,
- API_LANGUAGE_GETSTRINGFROMGUIDW = 13,
- API_LANGUAGE_GETHINSTANCEBYGUID = 20,
- API_LANGUAGE_GETHINSTANCEBYNAME = 21,
- API_LANGUAGE_GETHINSTANCEBYNAMEW = 22,
- API_LANGUAGE_STARTUP = 30,
- API_LANGUAGE_SHUTDOWN = 31,
- API_LANGUAGE_GETLANGUAGEFOLDER=40,
- API_LANGUAGE_CREATELDIALOGPARAM=50,
- API_LANGUAGE_LDIALOGBOXPARAM=51,
- API_LANGUAGE_LOADLMENU=52,
- API_LANGUAGE_CREATELDIALOGPARAMW=53,
- API_LANGUAGE_LDIALOGBOXPARAMW=54,
- API_LANGUAGE_LOADLMENUW=55,
- API_LANGUAGE_GETLANGUAGEIDENTIFIER=60,
- API_LANGUAGE_LOADRESOURCEFROMFILE=70,
- API_LANGUAGE_LOADRESOURCEFROMFILEW=71,
- API_LANGUAGE_LOADACCELERATORSA=80,
- API_LANGUAGE_LOADACCELERATORSW=81,
- // Implemented in 5.58+
- // See UseUserNumericLocale notes
- API_LANGUAGE_USEUSERNUMERICLOCALE=90,
- API_LANGUAGE_GET_C_NUMERICLOCALE=91,
- };
- };
- inline char *api_language::GetString(HINSTANCE hinst, HINSTANCE owner, UINT uID, char *str, size_t maxlen)
- {
- return _call(API_LANGUAGE_GETSTRING, (char * )0, hinst, owner, uID, str, maxlen);
- }
- inline wchar_t *api_language::GetStringW(HINSTANCE hinst, HINSTANCE owner, UINT uID, wchar_t *str, size_t maxlen)
- {
- return _call(API_LANGUAGE_GETSTRINGW, (wchar_t * )0, hinst, owner, uID, str, maxlen);
- }
- inline char *api_language::GetStringFromGUID(const GUID guid, HINSTANCE owner, UINT uID, char *str, size_t maxlen)
- {
- return _call(API_LANGUAGE_GETSTRINGFROMGUID, (char * )0, guid, owner, uID, str, maxlen);
- }
- inline wchar_t *api_language::GetStringFromGUIDW(const GUID guid, HINSTANCE owner, UINT uID, wchar_t *str, size_t maxlen)
- {
- return _call(API_LANGUAGE_GETSTRINGFROMGUIDW, (wchar_t * )0, guid, owner, uID, str, maxlen);
- }
- inline HINSTANCE api_language::FindDllHandleByGUID(const GUID guid)
- {
- return _call(API_LANGUAGE_GETHINSTANCEBYGUID, (HINSTANCE )0, guid);
- }
- inline HINSTANCE api_language::FindDllHandleByString(const char* str)
- {
- return _call(API_LANGUAGE_GETHINSTANCEBYNAME, (HINSTANCE )0, str);
- }
- inline HINSTANCE api_language::FindDllHandleByStringW(const wchar_t* str)
- {
- return _call(API_LANGUAGE_GETHINSTANCEBYNAMEW, (HINSTANCE )0, str);
- }
- inline HINSTANCE api_language::StartLanguageSupport(HINSTANCE hinstance, const GUID guid)
- {
- return _call(API_LANGUAGE_STARTUP, (HINSTANCE )0, hinstance, guid);
- }
- inline const wchar_t *api_language::GetLanguageFolder()
- {
- return _call(API_LANGUAGE_GETLANGUAGEFOLDER, (const wchar_t *)0);
- }
- inline HWND api_language::CreateLDialogParam(HINSTANCE localised, HINSTANCE original, UINT id, HWND parent, DLGPROC proc, LPARAM param)
- {
- return _call(API_LANGUAGE_CREATELDIALOGPARAM, (HWND)0, localised, original, id, parent, proc, param);
- }
- inline INT_PTR api_language::LDialogBoxParam(HINSTANCE localised, HINSTANCE original, UINT id, HWND parent, DLGPROC proc, LPARAM param)
- {
- return _call(API_LANGUAGE_LDIALOGBOXPARAM, (INT_PTR)0, localised, original, id, parent, proc, param);
- }
- inline HMENU api_language::LoadLMenu(HINSTANCE localised, HINSTANCE original, UINT id)
- {
- return _call(API_LANGUAGE_LOADLMENU, (HMENU)0, localised, original, id);
- }
- inline HWND api_language::CreateLDialogParamW(HINSTANCE localised, HINSTANCE original, UINT id, HWND parent, DLGPROC proc, LPARAM param)
- {
- return _call(API_LANGUAGE_CREATELDIALOGPARAMW, (HWND)0, localised, original, id, parent, proc, param);
- }
- inline INT_PTR api_language::LDialogBoxParamW(HINSTANCE localised, HINSTANCE original, UINT id, HWND parent, DLGPROC proc, LPARAM param)
- {
- return _call(API_LANGUAGE_LDIALOGBOXPARAMW, (INT_PTR)0, localised, original, id, parent, proc, param);
- }
- inline HMENU api_language::LoadLMenuW(HINSTANCE localised, HINSTANCE original, UINT id)
- {
- return _call(API_LANGUAGE_LOADLMENUW, (HMENU)0, localised, original, id);
- }
- inline const wchar_t *api_language::GetLanguageIdentifier(int mode)
- {
- return _call(API_LANGUAGE_GETLANGUAGEIDENTIFIER, (const wchar_t *)0, mode);
- }
- inline void *api_language::LoadResourceFromFile(HINSTANCE hinst, HINSTANCE owner, LPCTSTR lpType, LPCTSTR lpName, DWORD* size)
- {
- return _call(API_LANGUAGE_LOADRESOURCEFROMFILE, (void*)0, hinst, owner, lpType, lpName, size);
- }
- inline void *api_language::LoadResourceFromFileW(HINSTANCE hinst, HINSTANCE owner, LPCWSTR lpType, LPCWSTR lpName, DWORD* size)
- {
- return _call(API_LANGUAGE_LOADRESOURCEFROMFILEW, (void*)0, hinst, owner, lpType, lpName, size);
- }
- inline HACCEL api_language::LoadAcceleratorsA(HINSTANCE hinst, HINSTANCE owner, LPCSTR lpTableName)
- {
- return _call(API_LANGUAGE_LOADACCELERATORSA, (HACCEL)NULL, hinst, owner, lpTableName);
- }
- inline HACCEL api_language::LoadAcceleratorsW(HINSTANCE hinst, HINSTANCE owner, LPCWSTR lpTableName)
- {
- return _call(API_LANGUAGE_LOADACCELERATORSA, (HACCEL)NULL, hinst, owner, lpTableName);
- }
- inline BOOL api_language::UseUserNumericLocale()
- {
- return _call(API_LANGUAGE_USEUSERNUMERICLOCALE, (BOOL)0);
- }
- inline _locale_t api_language::Get_C_NumericLocale()
- {
- return _call(API_LANGUAGE_GET_C_NUMERICLOCALE, (_locale_t)0);
- }
- // utility macros and relevant predefined variables for use with the service + macros
- extern api_language *languageManager;
- #define WASABI_API_LNG languageManager
- extern HINSTANCE api_localised_hinstance;
- #define WASABI_API_LNG_HINST api_localised_hinstance
- extern HINSTANCE api_orig_hinstance;
- #define WASABI_API_ORIG_HINST api_orig_hinstance
- #define WASABI_API_LNGSTR WASABI_API_LNG->GetString
- // use this is you want a temp copy of the string
- #define WASABI_API_LNGSTRING(uID) \
- WASABI_API_LNGSTR(WASABI_API_LNG_HINST,WASABI_API_ORIG_HINST,uID)
- // use this is you want a temp copy of the string but need it to fallback to a different module
- #define WASABI_API_LNGSTRING_HINST(hinst,uID) \
- WASABI_API_LNGSTR(WASABI_API_LNG_HINST,hinst,uID)
- // use this is you want a copy of the string
- #define WASABI_API_LNGSTRING_BUF(uID,buf,len) \
- WASABI_API_LNGSTR(WASABI_API_LNG_HINST,WASABI_API_ORIG_HINST,uID,buf,len)
- // use this is you want a copy of the string but need it to fallback to a different module
- #define WASABI_API_LNGSTRING_HINST_BUF(hinst,uID,buf,len) \
- WASABI_API_LNGSTR(WASABI_API_LNG_HINST,hinst,uID,buf,len)
- // unicode versions of the above macros
- #define WASABI_API_LNGSTRW WASABI_API_LNG->GetStringW
- #define WASABI_API_LNGSTRINGW(uID) \
- WASABI_API_LNGSTRW(WASABI_API_LNG_HINST,WASABI_API_ORIG_HINST,uID)
- #define WASABI_API_LNGSTRINGW_HINST(hinst,uID) \
- WASABI_API_LNGSTRW(WASABI_API_LNG_HINST,hinst,uID)
- #define WASABI_API_LNGSTRINGW_BUF(uID,buf,len) \
- WASABI_API_LNGSTRW(WASABI_API_LNG_HINST,WASABI_API_ORIG_HINST,uID,buf,len)
- #define WASABI_API_LNGSTRINGW_BUF_HINST(hinst,uID,buf,len) \
- WASABI_API_LNGSTRW(WASABI_API_LNG_HINST,hinst,uID,buf,len)
- // Dialog handling functions (will revert back to the non-localised version if not valid/present)
- #define WASABI_API_CREATEDIALOGPARAM(id, parent, proc, param) \
- WASABI_API_LNG->CreateLDialogParam(WASABI_API_LNG_HINST, WASABI_API_ORIG_HINST, id, parent, (DLGPROC)proc, param)
- #define WASABI_API_CREATEDIALOG(id, parent, proc) \
- WASABI_API_LNG->CreateLDialogParam(WASABI_API_LNG_HINST, WASABI_API_ORIG_HINST, id, parent, (DLGPROC)proc, 0)
- #define WASABI_API_CREATEDIALOGPARAMW(id, parent, proc, param) \
- WASABI_API_LNG->CreateLDialogParamW(WASABI_API_LNG_HINST, WASABI_API_ORIG_HINST, id, parent, (DLGPROC)proc, param)
- #define WASABI_API_CREATEDIALOGW(id, parent, proc) \
- WASABI_API_LNG->CreateLDialogParamW(WASABI_API_LNG_HINST, WASABI_API_ORIG_HINST, id, parent, (DLGPROC)proc, 0)
- #define WASABI_API_DIALOGBOXPARAM(id, parent, proc, param) \
- WASABI_API_LNG->LDialogBoxParam(WASABI_API_LNG_HINST, WASABI_API_ORIG_HINST, id, parent, (DLGPROC)proc, param)
- #define WASABI_API_DIALOGBOX(id, parent, proc) \
- WASABI_API_LNG->LDialogBoxParam(WASABI_API_LNG_HINST, WASABI_API_ORIG_HINST, id, parent, (DLGPROC)proc, 0)
- #define WASABI_API_DIALOGBOXPARAMW(id, parent, proc, param) \
- WASABI_API_LNG->LDialogBoxParamW(WASABI_API_LNG_HINST, WASABI_API_ORIG_HINST, id, parent, (DLGPROC)proc, param)
- #define WASABI_API_DIALOGBOXW(id, parent, proc) \
- WASABI_API_LNG->LDialogBoxParamW(WASABI_API_LNG_HINST, WASABI_API_ORIG_HINST, id, parent, (DLGPROC)proc, 0)
- #define WASABI_API_LOADMENU(id) \
- WASABI_API_LNG->LoadLMenu(WASABI_API_LNG_HINST, WASABI_API_ORIG_HINST, id)
- #define WASABI_API_LOADMENUW(id) \
- WASABI_API_LNG->LoadLMenuW(WASABI_API_LNG_HINST, WASABI_API_ORIG_HINST, id)
- #define WASABI_API_LOADACCELERATORSA(__id) \
- WASABI_API_LNG->LoadAcceleratorsA(WASABI_API_LNG_HINST, WASABI_API_ORIG_HINST, MAKEINTRESOURCEA(__id))
- #define WASABI_API_LOADACCELERATORSW(__id) \
- WASABI_API_LNG->LoadAcceleratorsW(WASABI_API_LNG_HINST, WASABI_API_ORIG_HINST, MAKEINTRESOURCEW(__id))
- #ifdef UNICODE
- #define WASABI_API_LOADACCELERATORS WASABI_API_LOADACCELERATORSW
- #else
- #define WASABI_API_LOADACCELERATORS WASABI_API_LOADACCELERATORSA
- #endif
- #define WASABI_API_START_LANG(orig_hinst, guid) \
- { \
- WASABI_API_ORIG_HINST = orig_hinst; \
- WASABI_API_LNG_HINST = WASABI_API_LNG->StartLanguageSupport(WASABI_API_ORIG_HINST,guid); \
- }
- #define WASABI_API_LOADRESFROMFILE(lpType, lpName, size) \
- WASABI_API_LNG->LoadResourceFromFile(WASABI_API_LNG_HINST, WASABI_API_ORIG_HINST, lpType, lpName, size)
- #define WASABI_API_LOADRESFROMFILEW(lpType, lpName, size) \
- WASABI_API_LNG->LoadResourceFromFileW(WASABI_API_LNG_HINST, WASABI_API_ORIG_HINST, lpType, lpName, size)
- // {30AED4E5-EF10-4277-8D49-27AB5570E891}
- static const GUID languageApiGUID =
- { 0x30aed4e5, 0xef10, 0x4277, { 0x8d, 0x49, 0x27, 0xab, 0x55, 0x70, 0xe8, 0x91 } };
- #endif
|