///////////////////////////////////////////////////////////////////////////// // Name: wx/intl.h // Purpose: Internationalization and localisation for wxWidgets // Author: Vadim Zeitlin // Modified by: Michael N. Filippov // (2003/09/30 - plural forms support) // Created: 29/01/98 // RCS-ID: $Id$ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifndef _WX_INTL_H_ #define _WX_INTL_H_ #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma interface "intl.h" #endif #include "wx/defs.h" #include "wx/string.h" #if wxUSE_INTL #include "wx/fontenc.h" // ============================================================================ // global decls // ============================================================================ // ---------------------------------------------------------------------------- // macros // ---------------------------------------------------------------------------- // gettext() style macros (notice that xgettext should be invoked with // --keyword="_" --keyword="wxPLURAL:1,2" options // to extract the strings from the sources) #ifndef WXINTL_NO_GETTEXT_MACRO #define _(s) wxGetTranslation(_T(s)) #define wxPLURAL(sing, plur, n) wxGetTranslation(_T(sing), _T(plur), n) #endif // another one which just marks the strings for extraction, but doesn't // perform the translation (use -kwxTRANSLATE with xgettext!) #define wxTRANSLATE(str) _T(str) // ---------------------------------------------------------------------------- // forward decls // ---------------------------------------------------------------------------- class WXDLLIMPEXP_BASE wxLocale; class WXDLLIMPEXP_BASE wxLanguageInfoArray; class wxMsgCatalog; // ============================================================================ // locale support // ============================================================================ // ---------------------------------------------------------------------------- // wxLanguage: defines all supported languages // ---------------------------------------------------------------------------- // --- --- --- generated code begins here --- --- --- // This enum is generated by misc/languages/genlang.py // When making changes, please put them into misc/languages/langtabl.txt enum wxLanguage { // user's default/preffered language as got from OS: wxLANGUAGE_DEFAULT, // unknown language, if wxLocale::GetSystemLanguage fails: wxLANGUAGE_UNKNOWN, wxLANGUAGE_ABKHAZIAN, wxLANGUAGE_AFAR, wxLANGUAGE_AFRIKAANS, wxLANGUAGE_ALBANIAN, wxLANGUAGE_AMHARIC, wxLANGUAGE_ARABIC, wxLANGUAGE_ARABIC_ALGERIA, wxLANGUAGE_ARABIC_BAHRAIN, wxLANGUAGE_ARABIC_EGYPT, wxLANGUAGE_ARABIC_IRAQ, wxLANGUAGE_ARABIC_JORDAN, wxLANGUAGE_ARABIC_KUWAIT, wxLANGUAGE_ARABIC_LEBANON, wxLANGUAGE_ARABIC_LIBYA, wxLANGUAGE_ARABIC_MOROCCO, wxLANGUAGE_ARABIC_OMAN, wxLANGUAGE_ARABIC_QATAR, wxLANGUAGE_ARABIC_SAUDI_ARABIA, wxLANGUAGE_ARABIC_SUDAN, wxLANGUAGE_ARABIC_SYRIA, wxLANGUAGE_ARABIC_TUNISIA, wxLANGUAGE_ARABIC_UAE, wxLANGUAGE_ARABIC_YEMEN, wxLANGUAGE_ARMENIAN, wxLANGUAGE_ASSAMESE, wxLANGUAGE_AYMARA, wxLANGUAGE_AZERI, wxLANGUAGE_AZERI_CYRILLIC, wxLANGUAGE_AZERI_LATIN, wxLANGUAGE_BASHKIR, wxLANGUAGE_BASQUE, wxLANGUAGE_BELARUSIAN, wxLANGUAGE_BENGALI, wxLANGUAGE_BHUTANI, wxLANGUAGE_BIHARI, wxLANGUAGE_BISLAMA, wxLANGUAGE_BRETON, wxLANGUAGE_BULGARIAN, wxLANGUAGE_BURMESE, wxLANGUAGE_CAMBODIAN, wxLANGUAGE_CATALAN, wxLANGUAGE_CHINESE, wxLANGUAGE_CHINESE_SIMPLIFIED, wxLANGUAGE_CHINESE_TRADITIONAL, wxLANGUAGE_CHINESE_HONGKONG, wxLANGUAGE_CHINESE_MACAU, wxLANGUAGE_CHINESE_SINGAPORE, wxLANGUAGE_CHINESE_TAIWAN, wxLANGUAGE_CORSICAN, wxLANGUAGE_CROATIAN, wxLANGUAGE_CZECH, wxLANGUAGE_DANISH, wxLANGUAGE_DUTCH, wxLANGUAGE_DUTCH_BELGIAN, wxLANGUAGE_ENGLISH, wxLANGUAGE_ENGLISH_UK, wxLANGUAGE_ENGLISH_US, wxLANGUAGE_ENGLISH_AUSTRALIA, wxLANGUAGE_ENGLISH_BELIZE, wxLANGUAGE_ENGLISH_BOTSWANA, wxLANGUAGE_ENGLISH_CANADA, wxLANGUAGE_ENGLISH_CARIBBEAN, wxLANGUAGE_ENGLISH_DENMARK, wxLANGUAGE_ENGLISH_EIRE, wxLANGUAGE_ENGLISH_JAMAICA, wxLANGUAGE_ENGLISH_NEW_ZEALAND, wxLANGUAGE_ENGLISH_PHILIPPINES, wxLANGUAGE_ENGLISH_SOUTH_AFRICA, wxLANGUAGE_ENGLISH_TRINIDAD, wxLANGUAGE_ENGLISH_ZIMBABWE, wxLANGUAGE_ESPERANTO, wxLANGUAGE_ESTONIAN, wxLANGUAGE_FAEROESE, wxLANGUAGE_FARSI, wxLANGUAGE_FIJI, wxLANGUAGE_FINNISH, wxLANGUAGE_FRENCH, wxLANGUAGE_FRENCH_BELGIAN, wxLANGUAGE_FRENCH_CANADIAN, wxLANGUAGE_FRENCH_LUXEMBOURG, wxLANGUAGE_FRENCH_MONACO, wxLANGUAGE_FRENCH_SWISS, wxLANGUAGE_FRISIAN, wxLANGUAGE_GALICIAN, wxLANGUAGE_GEORGIAN, wxLANGUAGE_GERMAN, wxLANGUAGE_GERMAN_AUSTRIAN, wxLANGUAGE_GERMAN_BELGIUM, wxLANGUAGE_GERMAN_LIECHTENSTEIN, wxLANGUAGE_GERMAN_LUXEMBOURG, wxLANGUAGE_GERMAN_SWISS, wxLANGUAGE_GREEK, wxLANGUAGE_GREENLANDIC, wxLANGUAGE_GUARANI, wxLANGUAGE_GUJARATI, wxLANGUAGE_HAUSA, wxLANGUAGE_HEBREW, wxLANGUAGE_HINDI, wxLANGUAGE_HUNGARIAN, wxLANGUAGE_ICELANDIC, wxLANGUAGE_INDONESIAN, wxLANGUAGE_INTERLINGUA, wxLANGUAGE_INTERLINGUE, wxLANGUAGE_INUKTITUT, wxLANGUAGE_INUPIAK, wxLANGUAGE_IRISH, wxLANGUAGE_ITALIAN, wxLANGUAGE_ITALIAN_SWISS, wxLANGUAGE_JAPANESE, wxLANGUAGE_JAVANESE, wxLANGUAGE_KANNADA, wxLANGUAGE_KASHMIRI, wxLANGUAGE_KASHMIRI_INDIA, wxLANGUAGE_KAZAKH, wxLANGUAGE_KERNEWEK, wxLANGUAGE_KINYARWANDA, wxLANGUAGE_KIRGHIZ, wxLANGUAGE_KIRUNDI, wxLANGUAGE_KONKANI, wxLANGUAGE_KOREAN, wxLANGUAGE_KURDISH, wxLANGUAGE_LAOTHIAN, wxLANGUAGE_LATIN, wxLANGUAGE_LATVIAN, wxLANGUAGE_LINGALA, wxLANGUAGE_LITHUANIAN, wxLANGUAGE_MACEDONIAN, wxLANGUAGE_MALAGASY, wxLANGUAGE_MALAY, wxLANGUAGE_MALAYALAM, wxLANGUAGE_MALAY_BRUNEI_DARUSSALAM, wxLANGUAGE_MALAY_MALAYSIA, wxLANGUAGE_MALTESE, wxLANGUAGE_MANIPURI, wxLANGUAGE_MAORI, wxLANGUAGE_MARATHI, wxLANGUAGE_MOLDAVIAN, wxLANGUAGE_MONGOLIAN, wxLANGUAGE_NAURU, wxLANGUAGE_NEPALI, wxLANGUAGE_NEPALI_INDIA, wxLANGUAGE_NORWEGIAN_BOKMAL, wxLANGUAGE_NORWEGIAN_NYNORSK, wxLANGUAGE_OCCITAN, wxLANGUAGE_ORIYA, wxLANGUAGE_OROMO, wxLANGUAGE_PASHTO, wxLANGUAGE_POLISH, wxLANGUAGE_PORTUGUESE, wxLANGUAGE_PORTUGUESE_BRAZILIAN, wxLANGUAGE_PUNJABI, wxLANGUAGE_QUECHUA, wxLANGUAGE_RHAETO_ROMANCE, wxLANGUAGE_ROMANIAN, wxLANGUAGE_RUSSIAN, wxLANGUAGE_RUSSIAN_UKRAINE, wxLANGUAGE_SAMOAN, wxLANGUAGE_SANGHO, wxLANGUAGE_SANSKRIT, wxLANGUAGE_SCOTS_GAELIC, wxLANGUAGE_SERBIAN, wxLANGUAGE_SERBIAN_CYRILLIC, wxLANGUAGE_SERBIAN_LATIN, wxLANGUAGE_SERBO_CROATIAN, wxLANGUAGE_SESOTHO, wxLANGUAGE_SETSWANA, wxLANGUAGE_SHONA, wxLANGUAGE_SINDHI, wxLANGUAGE_SINHALESE, wxLANGUAGE_SISWATI, wxLANGUAGE_SLOVAK, wxLANGUAGE_SLOVENIAN, wxLANGUAGE_SOMALI, wxLANGUAGE_SPANISH, wxLANGUAGE_SPANISH_ARGENTINA, wxLANGUAGE_SPANISH_BOLIVIA, wxLANGUAGE_SPANISH_CHILE, wxLANGUAGE_SPANISH_COLOMBIA, wxLANGUAGE_SPANISH_COSTA_RICA, wxLANGUAGE_SPANISH_DOMINICAN_REPUBLIC, wxLANGUAGE_SPANISH_ECUADOR, wxLANGUAGE_SPANISH_EL_SALVADOR, wxLANGUAGE_SPANISH_GUATEMALA, wxLANGUAGE_SPANISH_HONDURAS, wxLANGUAGE_SPANISH_MEXICAN, wxLANGUAGE_SPANISH_MODERN, wxLANGUAGE_SPANISH_NICARAGUA, wxLANGUAGE_SPANISH_PANAMA, wxLANGUAGE_SPANISH_PARAGUAY, wxLANGUAGE_SPANISH_PERU, wxLANGUAGE_SPANISH_PUERTO_RICO, wxLANGUAGE_SPANISH_URUGUAY, wxLANGUAGE_SPANISH_US, wxLANGUAGE_SPANISH_VENEZUELA, wxLANGUAGE_SUNDANESE, wxLANGUAGE_SWAHILI, wxLANGUAGE_SWEDISH, wxLANGUAGE_SWEDISH_FINLAND, wxLANGUAGE_TAGALOG, wxLANGUAGE_TAJIK, wxLANGUAGE_TAMIL, wxLANGUAGE_TATAR, wxLANGUAGE_TELUGU, wxLANGUAGE_THAI, wxLANGUAGE_TIBETAN, wxLANGUAGE_TIGRINYA, wxLANGUAGE_TONGA, wxLANGUAGE_TSONGA, wxLANGUAGE_TURKISH, wxLANGUAGE_TURKMEN, wxLANGUAGE_TWI, wxLANGUAGE_UIGHUR, wxLANGUAGE_UKRAINIAN, wxLANGUAGE_URDU, wxLANGUAGE_URDU_INDIA, wxLANGUAGE_URDU_PAKISTAN, wxLANGUAGE_UZBEK, wxLANGUAGE_UZBEK_CYRILLIC, wxLANGUAGE_UZBEK_LATIN, wxLANGUAGE_VIETNAMESE, wxLANGUAGE_VOLAPUK, wxLANGUAGE_WELSH, wxLANGUAGE_WOLOF, wxLANGUAGE_XHOSA, wxLANGUAGE_YIDDISH, wxLANGUAGE_YORUBA, wxLANGUAGE_ZHUANG, wxLANGUAGE_ZULU, // for custom, user-defined languages: wxLANGUAGE_USER_DEFINED }; // --- --- --- generated code ends here --- --- --- // ---------------------------------------------------------------------------- // wxLanguageInfo: encapsulates wxLanguage to OS native lang.desc. // translation information // ---------------------------------------------------------------------------- struct WXDLLIMPEXP_BASE wxLanguageInfo { int Language; // wxLanguage id wxString CanonicalName; // Canonical name, e.g. fr_FR #ifdef __WIN32__ wxUint32 WinLang, // Win32 language identifiers WinSublang; #endif // __WIN32__ wxString Description; // human-readable name of the language }; // ---------------------------------------------------------------------------- // wxLocaleCategory: the category of locale settings // ---------------------------------------------------------------------------- enum wxLocaleCategory { // (any) numbers wxLOCALE_CAT_NUMBER, // date/time wxLOCALE_CAT_DATE, // monetary value wxLOCALE_CAT_MONEY, wxLOCALE_CAT_MAX }; // ---------------------------------------------------------------------------- // wxLocaleInfo: the items understood by wxLocale::GetInfo() // ---------------------------------------------------------------------------- enum wxLocaleInfo { // the thounsands separator wxLOCALE_THOUSANDS_SEP, // the character used as decimal point wxLOCALE_DECIMAL_POINT }; // ---------------------------------------------------------------------------- // wxLocale: encapsulates all language dependent settings, including current // message catalogs, date, time and currency formats (TODO) &c // ---------------------------------------------------------------------------- enum wxLocaleInitFlags { wxLOCALE_LOAD_DEFAULT = 0x0001, // load wxwin.mo? wxLOCALE_CONV_ENCODING = 0x0002 // convert encoding on the fly? }; class WXDLLIMPEXP_BASE wxLocale { public: // ctor & dtor // ----------- // call Init() if you use this ctor wxLocale() { DoCommonInit(); } // the ctor has a side effect of changing current locale wxLocale(const wxChar *szName, // name (for messages) const wxChar *szShort = (const wxChar *) NULL, // dir prefix (for msg files) const wxChar *szLocale = (const wxChar *) NULL, // locale (for setlocale) bool bLoadDefault = true, // preload wxstd.mo? bool bConvertEncoding = false) // convert Win<->Unix if necessary? { DoCommonInit(); Init(szName, szShort, szLocale, bLoadDefault, bConvertEncoding); } wxLocale(int language, // wxLanguage id or custom language int flags = wxLOCALE_LOAD_DEFAULT | wxLOCALE_CONV_ENCODING) { DoCommonInit(); Init(language, flags); } // the same as a function (returns true on success) bool Init(const wxChar *szName, const wxChar *szShort = (const wxChar *) NULL, const wxChar *szLocale = (const wxChar *) NULL, bool bLoadDefault = true, bool bConvertEncoding = false); // same as second ctor (returns true on success) bool Init(int language = wxLANGUAGE_DEFAULT, int flags = wxLOCALE_LOAD_DEFAULT | wxLOCALE_CONV_ENCODING); // restores old locale ~wxLocale(); // Try to get user's (or OS's) preferred language setting. // Return wxLANGUAGE_UNKNOWN if language-guessing algorithm failed static int GetSystemLanguage(); // get the encoding used by default for text on this system, returns // wxFONTENCODING_SYSTEM if it couldn't be determined static wxFontEncoding GetSystemEncoding(); // get the string describing the system encoding, return empty string if // couldn't be determined static wxString GetSystemEncodingName(); // get the values of the given locale-dependent datum: the current locale // is used, the US default value is returned if everything else fails static wxString GetInfo(wxLocaleInfo index, wxLocaleCategory cat); // return true if the locale was set successfully bool IsOk() const { return m_pszOldLocale != NULL; } // returns locale name const wxChar *GetLocale() const { return m_strLocale; } // return current locale wxLanguage value int GetLanguage() const { return m_language; } // return locale name to be passed to setlocale() wxString GetSysName() const; // return 'canonical' name, i.e. in the form of xx[_YY], where xx is // language code according to ISO 639 and YY is country name // as specified by ISO 3166. wxString GetCanonicalName() const { return m_strShort; } // add a prefix to the catalog lookup path: the message catalog files will be // looked up under prefix//LC_MESSAGES, prefix/LC_MESSAGES and prefix // (in this order). // // This only applies to subsequent invocations of AddCatalog()! static void AddCatalogLookupPathPrefix(const wxString& prefix); // add a catalog: it's searched for in standard places (current directory // first, system one after), but the you may prepend additional directories to // the search path with AddCatalogLookupPathPrefix(). // // The loaded catalog will be used for message lookup by GetString(). // // Returns 'true' if it was successfully loaded bool AddCatalog(const wxChar *szDomain); bool AddCatalog(const wxChar *szDomain, wxLanguage msgIdLanguage, const wxChar *msgIdCharset); // check if the given catalog is loaded bool IsLoaded(const wxChar *szDomain) const; // Retrieve the language info struct for the given language // // Returns NULL if no info found, pointer must *not* be deleted by caller static const wxLanguageInfo *GetLanguageInfo(int lang); // Returns language name in English or empty string if the language // is not in database static wxString GetLanguageName(int lang); // Find the language for the given locale string which may be either a // canonical ISO 2 letter language code ("xx"), a language code followed by // the country code ("xx_XX") or a Windows full language name ("Xxxxx...") // // Returns NULL if no info found, pointer must *not* be deleted by caller static const wxLanguageInfo *FindLanguageInfo(const wxString& locale); // Add custom language to the list of known languages. // Notes: 1) wxLanguageInfo contains platform-specific data // 2) must be called before Init to have effect static void AddLanguage(const wxLanguageInfo& info); // retrieve the translation for a string in all loaded domains unless // the szDomain parameter is specified (and then only this domain is // searched) // n - additional parameter for PluralFormsParser // // return original string if translation is not available // (in this case an error message is generated the first time // a string is not found; use wxLogNull to suppress it) // // domains are searched in the last to first order, i.e. catalogs // added later override those added before. const wxChar *GetString(const wxChar *szOrigString, const wxChar *szDomain = NULL) const; // plural form version of the same: const wxChar *GetString(const wxChar *szOrigString, const wxChar *szOrigString2, size_t n, const wxChar *szDomain = NULL) const; // Returns the current short name for the locale const wxString& GetName() const { return m_strShort; } // return the contents of .po file header wxString GetHeaderValue( const wxChar* szHeader, const wxChar* szDomain = NULL ) const; // These two methods are for internal use only. First one creates // ms_languagesDB if it doesn't already exist, second one destroys // it. static void CreateLanguagesDB(); static void DestroyLanguagesDB(); private: // find catalog by name in a linked list, return NULL if !found wxMsgCatalog *FindCatalog(const wxChar *szDomain) const; // copy default table of languages from global static array to // m_langugagesInfo, called by InitLanguagesDB static void InitLanguagesDB(); // initialize the member fields to default values void DoCommonInit(); wxString m_strLocale, // this locale name m_strShort; // short name for the locale int m_language; // this locale wxLanguage value const wxChar *m_pszOldLocale; // previous locale from setlocale() wxLocale *m_pOldLocale; // previous wxLocale wxMsgCatalog *m_pMsgCat; // pointer to linked list of catalogs bool m_bConvertEncoding; bool m_initialized; static wxLanguageInfoArray *ms_languagesDB; DECLARE_NO_COPY_CLASS(wxLocale) }; // ---------------------------------------------------------------------------- // global functions // ---------------------------------------------------------------------------- // get the current locale object (note that it may be NULL!) extern WXDLLIMPEXP_BASE wxLocale* wxGetLocale(); // get the translation of the string in the current locale inline const wxChar *wxGetTranslation(const wxChar *sz) { wxLocale *pLoc = wxGetLocale(); if (pLoc) return pLoc->GetString(sz); else return sz; } inline const wxChar *wxGetTranslation(const wxChar *sz1, const wxChar *sz2, size_t n) { wxLocale *pLoc = wxGetLocale(); if (pLoc) return pLoc->GetString(sz1, sz2, n); else return n == 1 ? sz1 : sz2; } #else // !wxUSE_INTL // the macros should still be defined - otherwise compilation would fail #if !defined(WXINTL_NO_GETTEXT_MACRO) #if !defined(_) #define _(s) (_T(s)) #endif #endif #define wxTRANSLATE(str) _T(str) // Note: use of 'inline' here can cause this symbol not to be found when compiled with gcc //const wxChar *wxGetTranslation(const wxChar *sz); #define wxGetTranslation(sz) (sz) #endif // wxUSE_INTL/!wxUSE_INTL // define this one just in case it occurs somewhere (instead of preferred // wxTRANSLATE) too #if !defined(WXINTL_NO_GETTEXT_MACRO) #if !defined(gettext_noop) #define gettext_noop(str) _T(str) #endif #if !defined(N_) #define N_(s) _T(s) #endif #endif #endif // _WX_INTL_H_