1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/intl.h
3 // Purpose:     Internationalization and localisation for wxWindows
4 // Author:      Vadim Zeitlin
5 // Modified by:
6 // Created:     29/01/98
7 // RCS-ID:      $Id: intl.h,v 1.1 2006/12/02 15:58:24 scara Exp $
8 // Copyright:   (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
9 // Licence:     wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11 
12 #ifndef _WX_INTL_H_
13 #define _WX_INTL_H_
14 
15 #if defined(__GNUG__) && !defined(__APPLE__)
16     #pragma interface "intl.h"
17 #endif
18 
19 #include "wx/defs.h"
20 #include "wx/string.h"
21 
22 #if wxUSE_INTL
23 
24 #include "wx/fontenc.h"
25 
26 // ============================================================================
27 // global decls
28 // ============================================================================
29 
30 // ----------------------------------------------------------------------------
31 // macros
32 // ----------------------------------------------------------------------------
33 
34 // gettext() style macro (notice that xgettext should be invoked with "-k_"
35 // option to extract the strings inside _() from the sources)
36 #ifndef WXINTL_NO_GETTEXT_MACRO
37     #define   _(str)  wxGetTranslation(_T(str))
38 #endif
39 
40 // another one which just marks the strings for extraction, but doesn't
41 // perform the translation (use -kwxTRANSLATE with xgettext!)
42 #define wxTRANSLATE(str) _T(str)
43 
44 // ----------------------------------------------------------------------------
45 // forward decls
46 // ----------------------------------------------------------------------------
47 
48 class WXDLLEXPORT wxLocale;
49 class WXDLLEXPORT wxMsgCatalog;
50 class WXDLLEXPORT wxLanguageInfoArray;
51 
52 // ============================================================================
53 // locale support
54 // ============================================================================
55 
56 // ----------------------------------------------------------------------------
57 // wxLanguage: defines all supported languages
58 // ----------------------------------------------------------------------------
59 
60 // --- --- --- generated code begins here --- --- ---
61 
62 // This enum is generated by misc/languages/genlang.py
63 // When making changes, please put them into misc/languages/langtabl.txt
64 enum wxLanguage
65 {
66     // user's default/preffered language as got from OS:
67     wxLANGUAGE_DEFAULT,
68     // unknown language, if wxLocale::GetSystemLanguage fails:
69     wxLANGUAGE_UNKNOWN,
70 
71     wxLANGUAGE_ABKHAZIAN,
72     wxLANGUAGE_AFAR,
73     wxLANGUAGE_AFRIKAANS,
74     wxLANGUAGE_ALBANIAN,
75     wxLANGUAGE_AMHARIC,
76     wxLANGUAGE_ARABIC,
77     wxLANGUAGE_ARABIC_ALGERIA,
78     wxLANGUAGE_ARABIC_BAHRAIN,
79     wxLANGUAGE_ARABIC_EGYPT,
80     wxLANGUAGE_ARABIC_IRAQ,
81     wxLANGUAGE_ARABIC_JORDAN,
82     wxLANGUAGE_ARABIC_KUWAIT,
83     wxLANGUAGE_ARABIC_LEBANON,
84     wxLANGUAGE_ARABIC_LIBYA,
85     wxLANGUAGE_ARABIC_MOROCCO,
86     wxLANGUAGE_ARABIC_OMAN,
87     wxLANGUAGE_ARABIC_QATAR,
88     wxLANGUAGE_ARABIC_SAUDI_ARABIA,
89     wxLANGUAGE_ARABIC_SUDAN,
90     wxLANGUAGE_ARABIC_SYRIA,
91     wxLANGUAGE_ARABIC_TUNISIA,
92     wxLANGUAGE_ARABIC_UAE,
93     wxLANGUAGE_ARABIC_YEMEN,
94     wxLANGUAGE_ARMENIAN,
95     wxLANGUAGE_ASSAMESE,
96     wxLANGUAGE_AYMARA,
97     wxLANGUAGE_AZERI,
98     wxLANGUAGE_AZERI_CYRILLIC,
99     wxLANGUAGE_AZERI_LATIN,
100     wxLANGUAGE_BASHKIR,
101     wxLANGUAGE_BASQUE,
102     wxLANGUAGE_BELARUSIAN,
103     wxLANGUAGE_BENGALI,
104     wxLANGUAGE_BHUTANI,
105     wxLANGUAGE_BIHARI,
106     wxLANGUAGE_BISLAMA,
107     wxLANGUAGE_BRETON,
108     wxLANGUAGE_BULGARIAN,
109     wxLANGUAGE_BURMESE,
110     wxLANGUAGE_CAMBODIAN,
111     wxLANGUAGE_CATALAN,
112     wxLANGUAGE_CHINESE,
113     wxLANGUAGE_CHINESE_SIMPLIFIED,
114     wxLANGUAGE_CHINESE_TRADITIONAL,
115     wxLANGUAGE_CHINESE_HONGKONG,
116     wxLANGUAGE_CHINESE_MACAU,
117     wxLANGUAGE_CHINESE_SINGAPORE,
118     wxLANGUAGE_CHINESE_TAIWAN,
119     wxLANGUAGE_CORSICAN,
120     wxLANGUAGE_CROATIAN,
121     wxLANGUAGE_CZECH,
122     wxLANGUAGE_DANISH,
123     wxLANGUAGE_DUTCH,
124     wxLANGUAGE_DUTCH_BELGIAN,
125     wxLANGUAGE_ENGLISH,
126     wxLANGUAGE_ENGLISH_UK,
127     wxLANGUAGE_ENGLISH_US,
128     wxLANGUAGE_ENGLISH_AUSTRALIA,
129     wxLANGUAGE_ENGLISH_BELIZE,
130     wxLANGUAGE_ENGLISH_BOTSWANA,
131     wxLANGUAGE_ENGLISH_CANADA,
132     wxLANGUAGE_ENGLISH_CARIBBEAN,
133     wxLANGUAGE_ENGLISH_DENMARK,
134     wxLANGUAGE_ENGLISH_EIRE,
135     wxLANGUAGE_ENGLISH_JAMAICA,
136     wxLANGUAGE_ENGLISH_NEW_ZEALAND,
137     wxLANGUAGE_ENGLISH_PHILIPPINES,
138     wxLANGUAGE_ENGLISH_SOUTH_AFRICA,
139     wxLANGUAGE_ENGLISH_TRINIDAD,
140     wxLANGUAGE_ENGLISH_ZIMBABWE,
141     wxLANGUAGE_ESPERANTO,
142     wxLANGUAGE_ESTONIAN,
143     wxLANGUAGE_FAEROESE,
144     wxLANGUAGE_FARSI,
145     wxLANGUAGE_FIJI,
146     wxLANGUAGE_FINNISH,
147     wxLANGUAGE_FRENCH,
148     wxLANGUAGE_FRENCH_BELGIAN,
149     wxLANGUAGE_FRENCH_CANADIAN,
150     wxLANGUAGE_FRENCH_LUXEMBOURG,
151     wxLANGUAGE_FRENCH_MONACO,
152     wxLANGUAGE_FRENCH_SWISS,
153     wxLANGUAGE_FRISIAN,
154     wxLANGUAGE_GALICIAN,
155     wxLANGUAGE_GEORGIAN,
156     wxLANGUAGE_GERMAN,
157     wxLANGUAGE_GERMAN_AUSTRIAN,
158     wxLANGUAGE_GERMAN_BELGIUM,
159     wxLANGUAGE_GERMAN_LIECHTENSTEIN,
160     wxLANGUAGE_GERMAN_LUXEMBOURG,
161     wxLANGUAGE_GERMAN_SWISS,
162     wxLANGUAGE_GREEK,
163     wxLANGUAGE_GREENLANDIC,
164     wxLANGUAGE_GUARANI,
165     wxLANGUAGE_GUJARATI,
166     wxLANGUAGE_HAUSA,
167     wxLANGUAGE_HEBREW,
168     wxLANGUAGE_HINDI,
169     wxLANGUAGE_HUNGARIAN,
170     wxLANGUAGE_ICELANDIC,
171     wxLANGUAGE_INDONESIAN,
172     wxLANGUAGE_INTERLINGUA,
173     wxLANGUAGE_INTERLINGUE,
174     wxLANGUAGE_INUKTITUT,
175     wxLANGUAGE_INUPIAK,
176     wxLANGUAGE_IRISH,
177     wxLANGUAGE_ITALIAN,
178     wxLANGUAGE_ITALIAN_SWISS,
179     wxLANGUAGE_JAPANESE,
180     wxLANGUAGE_JAVANESE,
181     wxLANGUAGE_KANNADA,
182     wxLANGUAGE_KASHMIRI,
183     wxLANGUAGE_KASHMIRI_INDIA,
184     wxLANGUAGE_KAZAKH,
185     wxLANGUAGE_KERNEWEK,
186     wxLANGUAGE_KINYARWANDA,
187     wxLANGUAGE_KIRGHIZ,
188     wxLANGUAGE_KIRUNDI,
189     wxLANGUAGE_KONKANI,
190     wxLANGUAGE_KOREAN,
191     wxLANGUAGE_KURDISH,
192     wxLANGUAGE_LAOTHIAN,
193     wxLANGUAGE_LATIN,
194     wxLANGUAGE_LATVIAN,
195     wxLANGUAGE_LINGALA,
196     wxLANGUAGE_LITHUANIAN,
197     wxLANGUAGE_MACEDONIAN,
198     wxLANGUAGE_MALAGASY,
199     wxLANGUAGE_MALAY,
200     wxLANGUAGE_MALAYALAM,
201     wxLANGUAGE_MALAY_BRUNEI_DARUSSALAM,
202     wxLANGUAGE_MALAY_MALAYSIA,
203     wxLANGUAGE_MALTESE,
204     wxLANGUAGE_MANIPURI,
205     wxLANGUAGE_MAORI,
206     wxLANGUAGE_MARATHI,
207     wxLANGUAGE_MOLDAVIAN,
208     wxLANGUAGE_MONGOLIAN,
209     wxLANGUAGE_NAURU,
210     wxLANGUAGE_NEPALI,
211     wxLANGUAGE_NEPALI_INDIA,
212     wxLANGUAGE_NORWEGIAN_BOKMAL,
213     wxLANGUAGE_NORWEGIAN_NYNORSK,
214     wxLANGUAGE_OCCITAN,
215     wxLANGUAGE_ORIYA,
216     wxLANGUAGE_OROMO,
217     wxLANGUAGE_PASHTO,
218     wxLANGUAGE_POLISH,
219     wxLANGUAGE_PORTUGUESE,
220     wxLANGUAGE_PORTUGUESE_BRAZILIAN,
221     wxLANGUAGE_PUNJABI,
222     wxLANGUAGE_QUECHUA,
223     wxLANGUAGE_RHAETO_ROMANCE,
224     wxLANGUAGE_ROMANIAN,
225     wxLANGUAGE_RUSSIAN,
226     wxLANGUAGE_RUSSIAN_UKRAINE,
227     wxLANGUAGE_SAMOAN,
228     wxLANGUAGE_SANGHO,
229     wxLANGUAGE_SANSKRIT,
230     wxLANGUAGE_SCOTS_GAELIC,
231     wxLANGUAGE_SERBIAN,
232     wxLANGUAGE_SERBIAN_CYRILLIC,
233     wxLANGUAGE_SERBIAN_LATIN,
234     wxLANGUAGE_SERBO_CROATIAN,
235     wxLANGUAGE_SESOTHO,
236     wxLANGUAGE_SETSWANA,
237     wxLANGUAGE_SHONA,
238     wxLANGUAGE_SINDHI,
239     wxLANGUAGE_SINHALESE,
240     wxLANGUAGE_SISWATI,
241     wxLANGUAGE_SLOVAK,
242     wxLANGUAGE_SLOVENIAN,
243     wxLANGUAGE_SOMALI,
244     wxLANGUAGE_SPANISH,
245     wxLANGUAGE_SPANISH_ARGENTINA,
246     wxLANGUAGE_SPANISH_BOLIVIA,
247     wxLANGUAGE_SPANISH_CHILE,
248     wxLANGUAGE_SPANISH_COLOMBIA,
249     wxLANGUAGE_SPANISH_COSTA_RICA,
250     wxLANGUAGE_SPANISH_DOMINICAN_REPUBLIC,
251     wxLANGUAGE_SPANISH_ECUADOR,
252     wxLANGUAGE_SPANISH_EL_SALVADOR,
253     wxLANGUAGE_SPANISH_GUATEMALA,
254     wxLANGUAGE_SPANISH_HONDURAS,
255     wxLANGUAGE_SPANISH_MEXICAN,
256     wxLANGUAGE_SPANISH_MODERN,
257     wxLANGUAGE_SPANISH_NICARAGUA,
258     wxLANGUAGE_SPANISH_PANAMA,
259     wxLANGUAGE_SPANISH_PARAGUAY,
260     wxLANGUAGE_SPANISH_PERU,
261     wxLANGUAGE_SPANISH_PUERTO_RICO,
262     wxLANGUAGE_SPANISH_URUGUAY,
263     wxLANGUAGE_SPANISH_US,
264     wxLANGUAGE_SPANISH_VENEZUELA,
265     wxLANGUAGE_SUNDANESE,
266     wxLANGUAGE_SWAHILI,
267     wxLANGUAGE_SWEDISH,
268     wxLANGUAGE_SWEDISH_FINLAND,
269     wxLANGUAGE_TAGALOG,
270     wxLANGUAGE_TAJIK,
271     wxLANGUAGE_TAMIL,
272     wxLANGUAGE_TATAR,
273     wxLANGUAGE_TELUGU,
274     wxLANGUAGE_THAI,
275     wxLANGUAGE_TIBETAN,
276     wxLANGUAGE_TIGRINYA,
277     wxLANGUAGE_TONGA,
278     wxLANGUAGE_TSONGA,
279     wxLANGUAGE_TURKISH,
280     wxLANGUAGE_TURKMEN,
281     wxLANGUAGE_TWI,
282     wxLANGUAGE_UIGHUR,
283     wxLANGUAGE_UKRAINIAN,
284     wxLANGUAGE_URDU,
285     wxLANGUAGE_URDU_INDIA,
286     wxLANGUAGE_URDU_PAKISTAN,
287     wxLANGUAGE_UZBEK,
288     wxLANGUAGE_UZBEK_CYRILLIC,
289     wxLANGUAGE_UZBEK_LATIN,
290     wxLANGUAGE_VIETNAMESE,
291     wxLANGUAGE_VOLAPUK,
292     wxLANGUAGE_WELSH,
293     wxLANGUAGE_WOLOF,
294     wxLANGUAGE_XHOSA,
295     wxLANGUAGE_YIDDISH,
296     wxLANGUAGE_YORUBA,
297     wxLANGUAGE_ZHUANG,
298     wxLANGUAGE_ZULU,
299 
300     // for custom, user-defined languages:
301     wxLANGUAGE_USER_DEFINED
302 };
303 
304 // --- --- --- generated code ends here --- --- ---
305 
306 // ----------------------------------------------------------------------------
307 // wxLanguageInfo: encapsulates wxLanguage to OS native lang.desc.
308 //                 translation information
309 // ----------------------------------------------------------------------------
310 
311 struct WXDLLEXPORT wxLanguageInfo
312 {
313     int Language;                   // wxLanguage id
314     wxString CanonicalName;         // Canonical name, e.g. fr_FR
315 #ifdef __WIN32__
316     wxUint32 WinLang,               // Win32 language identifiers
317              WinSublang;
318 #endif // __WIN32__
319     wxString Description;           // human-readable name of the language
320 };
321 
322 // ----------------------------------------------------------------------------
323 // wxLocaleCategory: the category of locale settings
324 // ----------------------------------------------------------------------------
325 
326 enum wxLocaleCategory
327 {
328     // (any) numbers
329     wxLOCALE_CAT_NUMBER,
330 
331     // date/time
332     wxLOCALE_CAT_DATE,
333 
334     // monetary value
335     wxLOCALE_CAT_MONEY,
336 
337     wxLOCALE_CAT_MAX
338 };
339 
340 // ----------------------------------------------------------------------------
341 // wxLocaleInfo: the items understood by wxLocale::GetInfo()
342 // ----------------------------------------------------------------------------
343 
344 enum wxLocaleInfo
345 {
346     // the thounsands separator
347     wxLOCALE_THOUSANDS_SEP,
348 
349     // the character used as decimal point
350     wxLOCALE_DECIMAL_POINT
351 
352 };
353 
354 // ----------------------------------------------------------------------------
355 // wxLocale: encapsulates all language dependent settings, including current
356 //           message catalogs, date, time and currency formats (TODO) &c
357 // ----------------------------------------------------------------------------
358 
359 enum wxLocaleInitFlags
360 {
361     wxLOCALE_LOAD_DEFAULT  = 0x0001,     // load wxwin.mo?
362     wxLOCALE_CONV_ENCODING = 0x0002      // convert encoding on the fly?
363 };
364 
365 class WXDLLEXPORT wxLocale
366 {
367 public:
368     // ctor & dtor
369     // -----------
370 
371         // call Init() if you use this ctor
372     wxLocale();
373         // the ctor has a side effect of changing current locale
374     wxLocale(const wxChar *szName,                               // name (for messages)
375              const wxChar *szShort = (const wxChar *) NULL,      // dir prefix (for msg files)
376              const wxChar *szLocale = (const wxChar *) NULL,     // locale (for setlocale)
377              bool bLoadDefault = TRUE,                           // preload wxstd.mo?
378              bool bConvertEncoding = FALSE)                      // convert Win<->Unix if neccessary?
379         {
380             Init(szName, szShort, szLocale, bLoadDefault, bConvertEncoding);
381         }
382 
383     wxLocale(int language, // wxLanguage id or custom language
384              int flags = wxLOCALE_LOAD_DEFAULT | wxLOCALE_CONV_ENCODING)
385         { Init(language, flags); }
386 
387         // the same as a function (returns TRUE on success)
388     bool Init(const wxChar *szName,
389               const wxChar *szShort = (const wxChar *) NULL,
390               const wxChar *szLocale = (const wxChar *) NULL,
391               bool bLoadDefault = TRUE,
392               bool bConvertEncoding = FALSE);
393 
394         // same as second ctor (returns TRUE on success)
395     bool Init(int language = wxLANGUAGE_DEFAULT,
396               int flags = wxLOCALE_LOAD_DEFAULT | wxLOCALE_CONV_ENCODING);
397 
398         // restores old locale
399     ~wxLocale();
400 
401     // Try to get user's (or OS's) prefered language setting.
402     // Return wxLANGUAGE_UNKNOWN if language-guessing algorithm failed
403     static int GetSystemLanguage();
404 
405     // get the encoding used by default for text on this system, returns
406     // wxFONTENCODING_SYSTEM if it couldn't be determined
407     static wxFontEncoding GetSystemEncoding();
408 
409     // get the string describing the system encoding, return empty string if
410     // couldn't be determined
411     static wxString GetSystemEncodingName();
412 
413     // get the values of the given locale-dependent datum: the current locale
414     // is used, the US default value is returned if everything else fails
415     static wxString GetInfo(wxLocaleInfo index, wxLocaleCategory cat);
416 
417     // return TRUE if the locale was set successfully
IsOk()418     bool IsOk() const { return m_pszOldLocale != NULL; }
419 
420     // returns locale name
GetLocale()421     const wxChar *GetLocale() const { return m_strLocale; }
422 
423     // return current locale wxLanguage value
GetLanguage()424     int GetLanguage() const { return m_language; }
425 
426     // return locale name to be passed to setlocale()
427     wxString GetSysName() const;
428 
429     // return 'canonical' name, i.e. in the form of xx[_YY], where xx is
430     // language code according to ISO 639 and YY is country name
431     // as specified by ISO 3166.
GetCanonicalName()432     wxString GetCanonicalName() const { return m_strShort; }
433 
434     // add a prefix to the catalog lookup path: the message catalog files will be
435     // looked up under prefix/<lang>/LC_MESSAGES, prefix/LC_MESSAGES and prefix
436     // (in this order).
437     //
438     // This only applies to subsequent invocations of AddCatalog()!
439     static void AddCatalogLookupPathPrefix(const wxString& prefix);
440 
441     // add a catalog: it's searched for in standard places (current directory
442     // first, system one after), but the you may prepend additional directories to
443     // the search path with AddCatalogLookupPathPrefix().
444     //
445     // The loaded catalog will be used for message lookup by GetString().
446     //
447     // Returns 'true' if it was successfully loaded
448     bool AddCatalog(const wxChar *szDomain);
449 
450     // check if the given catalog is loaded
451     bool IsLoaded(const wxChar *szDomain) const;
452 
453     // Retrieve the language info struct for the given language
454     //
455     // Returns NULL if no info found, pointer must *not* be deleted by caller
456     static const wxLanguageInfo *GetLanguageInfo(int lang);
457 
458     // Add custom language to the list of known languages.
459     // Notes: 1) wxLanguageInfo contains platform-specific data
460     //        2) must be called before Init to have effect
461     static void AddLanguage(const wxLanguageInfo& info);
462 
463     // retrieve the translation for a string in all loaded domains unless
464     // the szDomain parameter is specified (and then only this domain is
465     // searched)
466     //
467     // return original string if translation is not available
468     // (in this case an error message is generated the first time
469     //  a string is not found; use wxLogNull to suppress it)
470     //
471     // domains are searched in the last to first order, i.e. catalogs
472     // added later override those added before.
473     const wxChar *GetString(const wxChar *szOrigString,
474                             const wxChar *szDomain = (const wxChar *) NULL) const;
475 
476     // Returns the current short name for the locale
GetName()477     const wxString& GetName() const { return m_strShort; }
478 
479     // These two methods are for internal use only. First one creates
480     // ms_languagesDB if it doesn't already exist, second one destroys
481     // it.
482     static void CreateLanguagesDB();
483     static void DestroyLanguagesDB();
484 
485 private:
486     // find catalog by name in a linked list, return NULL if !found
487     wxMsgCatalog  *FindCatalog(const wxChar *szDomain) const;
488 
489     // copy default table of languages from global static array to
490     // m_langugagesInfo, called by InitLanguagesDB
491     static void InitLanguagesDB();
492 
493     wxString       m_strLocale,       // this locale name
494                    m_strShort;        // short name for the locale
495     int            m_language;        // this locale wxLanguage value
496 
497     const wxChar  *m_pszOldLocale;    // previous locale from setlocale()
498     wxLocale      *m_pOldLocale;      // previous wxLocale
499 
500     wxMsgCatalog  *m_pMsgCat;         // pointer to linked list of catalogs
501 
502     bool           m_bConvertEncoding;
503 
504     static wxLanguageInfoArray *ms_languagesDB;
505 };
506 
507 // ----------------------------------------------------------------------------
508 // global functions
509 // ----------------------------------------------------------------------------
510 
511 // get the current locale object (note that it may be NULL!)
512 extern WXDLLEXPORT wxLocale* wxGetLocale();
513 
514 // get the translation of the string in the current locale
wxGetTranslation(const wxChar * sz)515 inline const wxChar *wxGetTranslation(const wxChar *sz)
516 {
517     wxLocale *pLoc = wxGetLocale();
518     if (pLoc)
519         return pLoc->GetString(sz);
520     else
521         return sz;
522 }
523 
524 #else // !wxUSE_INTL
525 
526 // the macros should still be defined - otherwise compilation would fail
527 
528 #if !defined(WXINTL_NO_GETTEXT_MACRO) && !defined(_)
529     #define   _(str)  (str)
530 #endif
531 
532 #define wxTRANSLATE(str) _T(str)
533 
534 // Note: use of 'inline' here can cause this symbol not to be found when compiled with gcc
535 //const wxChar *wxGetTranslation(const wxChar *sz);
536 #define wxGetTranslation(sz) (sz)
537 
538 #endif // wxUSE_INTL/!wxUSE_INTL
539 
540 // define this one just in case it occurs somewhere (instead of preferred
541 // wxTRANSLATE) too
542 #if !defined(WXINTL_NO_GETTEXT_MACRO) && !defined(gettext_noop)
543     #define gettext_noop(str) _T(str)
544 #endif
545 
546 #endif // _WX_INTL_H_
547 
548