]> git.saurik.com Git - wxWidgets.git/commitdiff
Split intl.h into intl.h, language.h and translation.h.
authorVáclav Slavík <vslavik@fastmail.fm>
Sat, 24 Apr 2010 07:06:32 +0000 (07:06 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Sat, 24 Apr 2010 07:06:32 +0000 (07:06 +0000)
To make the code more manageable, intl.h now contains wxLocale and
translation.h all translations-related stuff (wxTranslations, _() etc.).
Code generated by genlang.py was moved into its own files (language.h,
languageinfo.cpp).

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@64118 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

24 files changed:
Makefile.in
build/bakefiles/files.bkl
build/msw/makefile.bcc
build/msw/makefile.gcc
build/msw/makefile.vc
build/msw/makefile.wat
build/msw/wx_base.dsp
build/msw/wx_vc7_base.vcproj
build/msw/wx_vc8_base.vcproj
build/msw/wx_vc9_base.vcproj
include/wx/intl.h
include/wx/language.h [new file with mode: 0644]
include/wx/translation.h [new file with mode: 0644]
interface/wx/intl.h
interface/wx/language.h [new file with mode: 0644]
interface/wx/translation.h [new file with mode: 0644]
misc/languages/README
misc/languages/genlang.py
src/common/intl.cpp
src/common/languageinfo.cpp [new file with mode: 0644]
src/common/translation.cpp [new file with mode: 0644]
wxGTK.spec
wxMotif.spec
wxX11.spec

index d5f00eee3ae45f87f522d6553edfab2bcd167e07..41849250f3c424c1f6e65842665044ed0c67621e 100644 (file)
@@ -389,6 +389,7 @@ ALL_BASE_HEADERS =  \
        wx/ipc.h \
        wx/ipcbase.h \
        wx/kbdstate.h \
+       wx/language.h \
        wx/link.h \
        wx/list.h \
        wx/listimpl.cpp \
@@ -440,6 +441,7 @@ ALL_BASE_HEADERS =  \
        wx/tls.h \
        wx/tokenzr.h \
        wx/tracker.h \
+       wx/translation.h \
        wx/txtstrm.h \
        wx/typeinfo.h \
        wx/types.h \
@@ -554,6 +556,7 @@ ALL_PORTS_BASE_HEADERS =  \
        wx/ipc.h \
        wx/ipcbase.h \
        wx/kbdstate.h \
+       wx/language.h \
        wx/link.h \
        wx/list.h \
        wx/listimpl.cpp \
@@ -605,6 +608,7 @@ ALL_PORTS_BASE_HEADERS =  \
        wx/tls.h \
        wx/tokenzr.h \
        wx/tracker.h \
+       wx/translation.h \
        wx/txtstrm.h \
        wx/typeinfo.h \
        wx/types.h \
@@ -731,6 +735,7 @@ ALL_BASE_SOURCES =  \
        src/common/init.cpp \
        src/common/intl.cpp \
        src/common/ipcbase.cpp \
+       src/common/languageinfo.cpp \
        src/common/list.cpp \
        src/common/log.cpp \
        src/common/longlong.cpp \
@@ -760,6 +765,7 @@ ALL_BASE_SOURCES =  \
        src/common/timercmn.cpp \
        src/common/timerimpl.cpp \
        src/common/tokenzr.cpp \
+       src/common/translation.cpp \
        src/common/txtstrm.cpp \
        src/common/unichar.cpp \
        src/common/uri.cpp \
@@ -927,6 +933,7 @@ MONODLL_OBJECTS =  \
        monodll_init.o \
        monodll_intl.o \
        monodll_ipcbase.o \
+       monodll_languageinfo.o \
        monodll_list.o \
        monodll_log.o \
        monodll_longlong.o \
@@ -956,6 +963,7 @@ MONODLL_OBJECTS =  \
        monodll_timercmn.o \
        monodll_timerimpl.o \
        monodll_tokenzr.o \
+       monodll_translation.o \
        monodll_txtstrm.o \
        monodll_unichar.o \
        monodll_uri.o \
@@ -1057,6 +1065,7 @@ MONOLIB_OBJECTS =  \
        monolib_init.o \
        monolib_intl.o \
        monolib_ipcbase.o \
+       monolib_languageinfo.o \
        monolib_list.o \
        monolib_log.o \
        monolib_longlong.o \
@@ -1086,6 +1095,7 @@ MONOLIB_OBJECTS =  \
        monolib_timercmn.o \
        monolib_timerimpl.o \
        monolib_tokenzr.o \
+       monolib_translation.o \
        monolib_txtstrm.o \
        monolib_unichar.o \
        monolib_uri.o \
@@ -1182,6 +1192,7 @@ BASEDLL_OBJECTS =  \
        basedll_init.o \
        basedll_intl.o \
        basedll_ipcbase.o \
+       basedll_languageinfo.o \
        basedll_list.o \
        basedll_log.o \
        basedll_longlong.o \
@@ -1211,6 +1222,7 @@ BASEDLL_OBJECTS =  \
        basedll_timercmn.o \
        basedll_timerimpl.o \
        basedll_tokenzr.o \
+       basedll_translation.o \
        basedll_txtstrm.o \
        basedll_unichar.o \
        basedll_uri.o \
@@ -1290,6 +1302,7 @@ BASELIB_OBJECTS =  \
        baselib_init.o \
        baselib_intl.o \
        baselib_ipcbase.o \
+       baselib_languageinfo.o \
        baselib_list.o \
        baselib_log.o \
        baselib_longlong.o \
@@ -1319,6 +1332,7 @@ BASELIB_OBJECTS =  \
        baselib_timercmn.o \
        baselib_timerimpl.o \
        baselib_tokenzr.o \
+       baselib_translation.o \
        baselib_txtstrm.o \
        baselib_unichar.o \
        baselib_uri.o \
@@ -14851,6 +14865,9 @@ monodll_intl.o: $(srcdir)/src/common/intl.cpp $(MONODLL_ODEP)
 monodll_ipcbase.o: $(srcdir)/src/common/ipcbase.cpp $(MONODLL_ODEP)
        $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/ipcbase.cpp
 
+monodll_languageinfo.o: $(srcdir)/src/common/languageinfo.cpp $(MONODLL_ODEP)
+       $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/languageinfo.cpp
+
 monodll_list.o: $(srcdir)/src/common/list.cpp $(MONODLL_ODEP)
        $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/list.cpp
 
@@ -14938,6 +14955,9 @@ monodll_timerimpl.o: $(srcdir)/src/common/timerimpl.cpp $(MONODLL_ODEP)
 monodll_tokenzr.o: $(srcdir)/src/common/tokenzr.cpp $(MONODLL_ODEP)
        $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/tokenzr.cpp
 
+monodll_translation.o: $(srcdir)/src/common/translation.cpp $(MONODLL_ODEP)
+       $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/translation.cpp
+
 monodll_txtstrm.o: $(srcdir)/src/common/txtstrm.cpp $(MONODLL_ODEP)
        $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/txtstrm.cpp
 
@@ -19699,6 +19719,9 @@ monolib_intl.o: $(srcdir)/src/common/intl.cpp $(MONOLIB_ODEP)
 monolib_ipcbase.o: $(srcdir)/src/common/ipcbase.cpp $(MONOLIB_ODEP)
        $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/ipcbase.cpp
 
+monolib_languageinfo.o: $(srcdir)/src/common/languageinfo.cpp $(MONOLIB_ODEP)
+       $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/languageinfo.cpp
+
 monolib_list.o: $(srcdir)/src/common/list.cpp $(MONOLIB_ODEP)
        $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/list.cpp
 
@@ -19786,6 +19809,9 @@ monolib_timerimpl.o: $(srcdir)/src/common/timerimpl.cpp $(MONOLIB_ODEP)
 monolib_tokenzr.o: $(srcdir)/src/common/tokenzr.cpp $(MONOLIB_ODEP)
        $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/tokenzr.cpp
 
+monolib_translation.o: $(srcdir)/src/common/translation.cpp $(MONOLIB_ODEP)
+       $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/translation.cpp
+
 monolib_txtstrm.o: $(srcdir)/src/common/txtstrm.cpp $(MONOLIB_ODEP)
        $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/txtstrm.cpp
 
@@ -24547,6 +24573,9 @@ basedll_intl.o: $(srcdir)/src/common/intl.cpp $(BASEDLL_ODEP)
 basedll_ipcbase.o: $(srcdir)/src/common/ipcbase.cpp $(BASEDLL_ODEP)
        $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/common/ipcbase.cpp
 
+basedll_languageinfo.o: $(srcdir)/src/common/languageinfo.cpp $(BASEDLL_ODEP)
+       $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/common/languageinfo.cpp
+
 basedll_list.o: $(srcdir)/src/common/list.cpp $(BASEDLL_ODEP)
        $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/common/list.cpp
 
@@ -24634,6 +24663,9 @@ basedll_timerimpl.o: $(srcdir)/src/common/timerimpl.cpp $(BASEDLL_ODEP)
 basedll_tokenzr.o: $(srcdir)/src/common/tokenzr.cpp $(BASEDLL_ODEP)
        $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/common/tokenzr.cpp
 
+basedll_translation.o: $(srcdir)/src/common/translation.cpp $(BASEDLL_ODEP)
+       $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/common/translation.cpp
+
 basedll_txtstrm.o: $(srcdir)/src/common/txtstrm.cpp $(BASEDLL_ODEP)
        $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/common/txtstrm.cpp
 
@@ -25042,6 +25074,9 @@ baselib_intl.o: $(srcdir)/src/common/intl.cpp $(BASELIB_ODEP)
 baselib_ipcbase.o: $(srcdir)/src/common/ipcbase.cpp $(BASELIB_ODEP)
        $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/common/ipcbase.cpp
 
+baselib_languageinfo.o: $(srcdir)/src/common/languageinfo.cpp $(BASELIB_ODEP)
+       $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/common/languageinfo.cpp
+
 baselib_list.o: $(srcdir)/src/common/list.cpp $(BASELIB_ODEP)
        $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/common/list.cpp
 
@@ -25129,6 +25164,9 @@ baselib_timerimpl.o: $(srcdir)/src/common/timerimpl.cpp $(BASELIB_ODEP)
 baselib_tokenzr.o: $(srcdir)/src/common/tokenzr.cpp $(BASELIB_ODEP)
        $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/common/tokenzr.cpp
 
+baselib_translation.o: $(srcdir)/src/common/translation.cpp $(BASELIB_ODEP)
+       $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/common/translation.cpp
+
 baselib_txtstrm.o: $(srcdir)/src/common/txtstrm.cpp $(BASELIB_ODEP)
        $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/common/txtstrm.cpp
 
index 2605b2baf53853f6aedd2592a379230d2e8a19a5..9a7e37c0a7a71a87b8933a9feccbba8b0ed1687a 100644 (file)
@@ -350,6 +350,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
     src/common/init.cpp
     src/common/intl.cpp
     src/common/ipcbase.cpp
+    src/common/languageinfo.cpp
     src/common/list.cpp
     src/common/log.cpp
     src/common/longlong.cpp
@@ -379,6 +380,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
     src/common/timercmn.cpp
     src/common/timerimpl.cpp
     src/common/tokenzr.cpp
+    src/common/translation.cpp
     src/common/txtstrm.cpp
     src/common/unichar.cpp
     src/common/uri.cpp
@@ -468,6 +470,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
     wx/ipc.h
     wx/ipcbase.h
     wx/kbdstate.h
+    wx/language.h
     wx/link.h
     wx/list.h
     wx/listimpl.cpp
@@ -519,6 +522,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
     wx/tls.h
     wx/tokenzr.h
     wx/tracker.h
+    wx/translation.h
     wx/txtstrm.h
     wx/typeinfo.h
     wx/types.h
index 90b4ea26afa08fd34bd0452369dce5005c9ac902..46606ca5a62ffcabec2a7926da9e1becf5c8ca32 100644 (file)
@@ -362,6 +362,7 @@ MONODLL_OBJECTS =  \
        $(OBJS)\monodll_init.obj \\r
        $(OBJS)\monodll_intl.obj \\r
        $(OBJS)\monodll_ipcbase.obj \\r
+       $(OBJS)\monodll_languageinfo.obj \\r
        $(OBJS)\monodll_list.obj \\r
        $(OBJS)\monodll_log.obj \\r
        $(OBJS)\monodll_longlong.obj \\r
@@ -391,6 +392,7 @@ MONODLL_OBJECTS =  \
        $(OBJS)\monodll_timercmn.obj \\r
        $(OBJS)\monodll_timerimpl.obj \\r
        $(OBJS)\monodll_tokenzr.obj \\r
+       $(OBJS)\monodll_translation.obj \\r
        $(OBJS)\monodll_txtstrm.obj \\r
        $(OBJS)\monodll_unichar.obj \\r
        $(OBJS)\monodll_uri.obj \\r
@@ -507,6 +509,7 @@ MONOLIB_OBJECTS =  \
        $(OBJS)\monolib_init.obj \\r
        $(OBJS)\monolib_intl.obj \\r
        $(OBJS)\monolib_ipcbase.obj \\r
+       $(OBJS)\monolib_languageinfo.obj \\r
        $(OBJS)\monolib_list.obj \\r
        $(OBJS)\monolib_log.obj \\r
        $(OBJS)\monolib_longlong.obj \\r
@@ -536,6 +539,7 @@ MONOLIB_OBJECTS =  \
        $(OBJS)\monolib_timercmn.obj \\r
        $(OBJS)\monolib_timerimpl.obj \\r
        $(OBJS)\monolib_tokenzr.obj \\r
+       $(OBJS)\monolib_translation.obj \\r
        $(OBJS)\monolib_txtstrm.obj \\r
        $(OBJS)\monolib_unichar.obj \\r
        $(OBJS)\monolib_uri.obj \\r
@@ -650,6 +654,7 @@ BASEDLL_OBJECTS =  \
        $(OBJS)\basedll_init.obj \\r
        $(OBJS)\basedll_intl.obj \\r
        $(OBJS)\basedll_ipcbase.obj \\r
+       $(OBJS)\basedll_languageinfo.obj \\r
        $(OBJS)\basedll_list.obj \\r
        $(OBJS)\basedll_log.obj \\r
        $(OBJS)\basedll_longlong.obj \\r
@@ -679,6 +684,7 @@ BASEDLL_OBJECTS =  \
        $(OBJS)\basedll_timercmn.obj \\r
        $(OBJS)\basedll_timerimpl.obj \\r
        $(OBJS)\basedll_tokenzr.obj \\r
+       $(OBJS)\basedll_translation.obj \\r
        $(OBJS)\basedll_txtstrm.obj \\r
        $(OBJS)\basedll_unichar.obj \\r
        $(OBJS)\basedll_uri.obj \\r
@@ -777,6 +783,7 @@ BASELIB_OBJECTS =  \
        $(OBJS)\baselib_init.obj \\r
        $(OBJS)\baselib_intl.obj \\r
        $(OBJS)\baselib_ipcbase.obj \\r
+       $(OBJS)\baselib_languageinfo.obj \\r
        $(OBJS)\baselib_list.obj \\r
        $(OBJS)\baselib_log.obj \\r
        $(OBJS)\baselib_longlong.obj \\r
@@ -806,6 +813,7 @@ BASELIB_OBJECTS =  \
        $(OBJS)\baselib_timercmn.obj \\r
        $(OBJS)\baselib_timerimpl.obj \\r
        $(OBJS)\baselib_tokenzr.obj \\r
+       $(OBJS)\baselib_translation.obj \\r
        $(OBJS)\baselib_txtstrm.obj \\r
        $(OBJS)\baselib_unichar.obj \\r
        $(OBJS)\baselib_uri.obj \\r
@@ -5776,6 +5784,9 @@ $(OBJS)\monodll_intl.obj: ..\..\src\common\intl.cpp
 $(OBJS)\monodll_ipcbase.obj: ..\..\src\common\ipcbase.cpp\r
        $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\common\ipcbase.cpp\r
 \r
+$(OBJS)\monodll_languageinfo.obj: ..\..\src\common\languageinfo.cpp\r
+       $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\common\languageinfo.cpp\r
+\r
 $(OBJS)\monodll_list.obj: ..\..\src\common\list.cpp\r
        $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\common\list.cpp\r
 \r
@@ -5863,6 +5874,9 @@ $(OBJS)\monodll_timerimpl.obj: ..\..\src\common\timerimpl.cpp
 $(OBJS)\monodll_tokenzr.obj: ..\..\src\common\tokenzr.cpp\r
        $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\common\tokenzr.cpp\r
 \r
+$(OBJS)\monodll_translation.obj: ..\..\src\common\translation.cpp\r
+       $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\common\translation.cpp\r
+\r
 $(OBJS)\monodll_txtstrm.obj: ..\..\src\common\txtstrm.cpp\r
        $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\common\txtstrm.cpp\r
 \r
@@ -7966,6 +7980,9 @@ $(OBJS)\monolib_intl.obj: ..\..\src\common\intl.cpp
 $(OBJS)\monolib_ipcbase.obj: ..\..\src\common\ipcbase.cpp\r
        $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\ipcbase.cpp\r
 \r
+$(OBJS)\monolib_languageinfo.obj: ..\..\src\common\languageinfo.cpp\r
+       $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\languageinfo.cpp\r
+\r
 $(OBJS)\monolib_list.obj: ..\..\src\common\list.cpp\r
        $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\list.cpp\r
 \r
@@ -8053,6 +8070,9 @@ $(OBJS)\monolib_timerimpl.obj: ..\..\src\common\timerimpl.cpp
 $(OBJS)\monolib_tokenzr.obj: ..\..\src\common\tokenzr.cpp\r
        $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\tokenzr.cpp\r
 \r
+$(OBJS)\monolib_translation.obj: ..\..\src\common\translation.cpp\r
+       $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\translation.cpp\r
+\r
 $(OBJS)\monolib_txtstrm.obj: ..\..\src\common\txtstrm.cpp\r
        $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\txtstrm.cpp\r
 \r
@@ -10156,6 +10176,9 @@ $(OBJS)\basedll_intl.obj: ..\..\src\common\intl.cpp
 $(OBJS)\basedll_ipcbase.obj: ..\..\src\common\ipcbase.cpp\r
        $(CXX) -q -c -P -o$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\ipcbase.cpp\r
 \r
+$(OBJS)\basedll_languageinfo.obj: ..\..\src\common\languageinfo.cpp\r
+       $(CXX) -q -c -P -o$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\languageinfo.cpp\r
+\r
 $(OBJS)\basedll_list.obj: ..\..\src\common\list.cpp\r
        $(CXX) -q -c -P -o$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\list.cpp\r
 \r
@@ -10243,6 +10266,9 @@ $(OBJS)\basedll_timerimpl.obj: ..\..\src\common\timerimpl.cpp
 $(OBJS)\basedll_tokenzr.obj: ..\..\src\common\tokenzr.cpp\r
        $(CXX) -q -c -P -o$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\tokenzr.cpp\r
 \r
+$(OBJS)\basedll_translation.obj: ..\..\src\common\translation.cpp\r
+       $(CXX) -q -c -P -o$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\translation.cpp\r
+\r
 $(OBJS)\basedll_txtstrm.obj: ..\..\src\common\txtstrm.cpp\r
        $(CXX) -q -c -P -o$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\txtstrm.cpp\r
 \r
@@ -10483,6 +10509,9 @@ $(OBJS)\baselib_intl.obj: ..\..\src\common\intl.cpp
 $(OBJS)\baselib_ipcbase.obj: ..\..\src\common\ipcbase.cpp\r
        $(CXX) -q -c -P -o$@ $(BASELIB_CXXFLAGS) ..\..\src\common\ipcbase.cpp\r
 \r
+$(OBJS)\baselib_languageinfo.obj: ..\..\src\common\languageinfo.cpp\r
+       $(CXX) -q -c -P -o$@ $(BASELIB_CXXFLAGS) ..\..\src\common\languageinfo.cpp\r
+\r
 $(OBJS)\baselib_list.obj: ..\..\src\common\list.cpp\r
        $(CXX) -q -c -P -o$@ $(BASELIB_CXXFLAGS) ..\..\src\common\list.cpp\r
 \r
@@ -10570,6 +10599,9 @@ $(OBJS)\baselib_timerimpl.obj: ..\..\src\common\timerimpl.cpp
 $(OBJS)\baselib_tokenzr.obj: ..\..\src\common\tokenzr.cpp\r
        $(CXX) -q -c -P -o$@ $(BASELIB_CXXFLAGS) ..\..\src\common\tokenzr.cpp\r
 \r
+$(OBJS)\baselib_translation.obj: ..\..\src\common\translation.cpp\r
+       $(CXX) -q -c -P -o$@ $(BASELIB_CXXFLAGS) ..\..\src\common\translation.cpp\r
+\r
 $(OBJS)\baselib_txtstrm.obj: ..\..\src\common\txtstrm.cpp\r
        $(CXX) -q -c -P -o$@ $(BASELIB_CXXFLAGS) ..\..\src\common\txtstrm.cpp\r
 \r
index 693fd1ddace0c339647d7a9c98d08cca532edb3c..372d0d4ded5d1bc6bd63eb18647293ddcd622c5b 100644 (file)
@@ -349,6 +349,7 @@ MONODLL_OBJECTS =  \
        $(OBJS)\monodll_init.o \\r
        $(OBJS)\monodll_intl.o \\r
        $(OBJS)\monodll_ipcbase.o \\r
+       $(OBJS)\monodll_languageinfo.o \\r
        $(OBJS)\monodll_list.o \\r
        $(OBJS)\monodll_log.o \\r
        $(OBJS)\monodll_longlong.o \\r
@@ -378,6 +379,7 @@ MONODLL_OBJECTS =  \
        $(OBJS)\monodll_timercmn.o \\r
        $(OBJS)\monodll_timerimpl.o \\r
        $(OBJS)\monodll_tokenzr.o \\r
+       $(OBJS)\monodll_translation.o \\r
        $(OBJS)\monodll_txtstrm.o \\r
        $(OBJS)\monodll_unichar.o \\r
        $(OBJS)\monodll_uri.o \\r
@@ -495,6 +497,7 @@ MONOLIB_OBJECTS =  \
        $(OBJS)\monolib_init.o \\r
        $(OBJS)\monolib_intl.o \\r
        $(OBJS)\monolib_ipcbase.o \\r
+       $(OBJS)\monolib_languageinfo.o \\r
        $(OBJS)\monolib_list.o \\r
        $(OBJS)\monolib_log.o \\r
        $(OBJS)\monolib_longlong.o \\r
@@ -524,6 +527,7 @@ MONOLIB_OBJECTS =  \
        $(OBJS)\monolib_timercmn.o \\r
        $(OBJS)\monolib_timerimpl.o \\r
        $(OBJS)\monolib_tokenzr.o \\r
+       $(OBJS)\monolib_translation.o \\r
        $(OBJS)\monolib_txtstrm.o \\r
        $(OBJS)\monolib_unichar.o \\r
        $(OBJS)\monolib_uri.o \\r
@@ -639,6 +643,7 @@ BASEDLL_OBJECTS =  \
        $(OBJS)\basedll_init.o \\r
        $(OBJS)\basedll_intl.o \\r
        $(OBJS)\basedll_ipcbase.o \\r
+       $(OBJS)\basedll_languageinfo.o \\r
        $(OBJS)\basedll_list.o \\r
        $(OBJS)\basedll_log.o \\r
        $(OBJS)\basedll_longlong.o \\r
@@ -668,6 +673,7 @@ BASEDLL_OBJECTS =  \
        $(OBJS)\basedll_timercmn.o \\r
        $(OBJS)\basedll_timerimpl.o \\r
        $(OBJS)\basedll_tokenzr.o \\r
+       $(OBJS)\basedll_translation.o \\r
        $(OBJS)\basedll_txtstrm.o \\r
        $(OBJS)\basedll_unichar.o \\r
        $(OBJS)\basedll_uri.o \\r
@@ -767,6 +773,7 @@ BASELIB_OBJECTS =  \
        $(OBJS)\baselib_init.o \\r
        $(OBJS)\baselib_intl.o \\r
        $(OBJS)\baselib_ipcbase.o \\r
+       $(OBJS)\baselib_languageinfo.o \\r
        $(OBJS)\baselib_list.o \\r
        $(OBJS)\baselib_log.o \\r
        $(OBJS)\baselib_longlong.o \\r
@@ -796,6 +803,7 @@ BASELIB_OBJECTS =  \
        $(OBJS)\baselib_timercmn.o \\r
        $(OBJS)\baselib_timerimpl.o \\r
        $(OBJS)\baselib_tokenzr.o \\r
+       $(OBJS)\baselib_translation.o \\r
        $(OBJS)\baselib_txtstrm.o \\r
        $(OBJS)\baselib_unichar.o \\r
        $(OBJS)\baselib_uri.o \\r
@@ -5925,6 +5933,9 @@ $(OBJS)\monodll_intl.o: ../../src/common/intl.cpp
 $(OBJS)\monodll_ipcbase.o: ../../src/common/ipcbase.cpp\r
        $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<\r
 \r
+$(OBJS)\monodll_languageinfo.o: ../../src/common/languageinfo.cpp\r
+       $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<\r
+\r
 $(OBJS)\monodll_list.o: ../../src/common/list.cpp\r
        $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<\r
 \r
@@ -6012,6 +6023,9 @@ $(OBJS)\monodll_timerimpl.o: ../../src/common/timerimpl.cpp
 $(OBJS)\monodll_tokenzr.o: ../../src/common/tokenzr.cpp\r
        $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<\r
 \r
+$(OBJS)\monodll_translation.o: ../../src/common/translation.cpp\r
+       $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<\r
+\r
 $(OBJS)\monodll_txtstrm.o: ../../src/common/txtstrm.cpp\r
        $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<\r
 \r
@@ -8115,6 +8129,9 @@ $(OBJS)\monolib_intl.o: ../../src/common/intl.cpp
 $(OBJS)\monolib_ipcbase.o: ../../src/common/ipcbase.cpp\r
        $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<\r
 \r
+$(OBJS)\monolib_languageinfo.o: ../../src/common/languageinfo.cpp\r
+       $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<\r
+\r
 $(OBJS)\monolib_list.o: ../../src/common/list.cpp\r
        $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<\r
 \r
@@ -8202,6 +8219,9 @@ $(OBJS)\monolib_timerimpl.o: ../../src/common/timerimpl.cpp
 $(OBJS)\monolib_tokenzr.o: ../../src/common/tokenzr.cpp\r
        $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<\r
 \r
+$(OBJS)\monolib_translation.o: ../../src/common/translation.cpp\r
+       $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<\r
+\r
 $(OBJS)\monolib_txtstrm.o: ../../src/common/txtstrm.cpp\r
        $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<\r
 \r
@@ -10305,6 +10325,9 @@ $(OBJS)\basedll_intl.o: ../../src/common/intl.cpp
 $(OBJS)\basedll_ipcbase.o: ../../src/common/ipcbase.cpp\r
        $(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $<\r
 \r
+$(OBJS)\basedll_languageinfo.o: ../../src/common/languageinfo.cpp\r
+       $(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $<\r
+\r
 $(OBJS)\basedll_list.o: ../../src/common/list.cpp\r
        $(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $<\r
 \r
@@ -10392,6 +10415,9 @@ $(OBJS)\basedll_timerimpl.o: ../../src/common/timerimpl.cpp
 $(OBJS)\basedll_tokenzr.o: ../../src/common/tokenzr.cpp\r
        $(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $<\r
 \r
+$(OBJS)\basedll_translation.o: ../../src/common/translation.cpp\r
+       $(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $<\r
+\r
 $(OBJS)\basedll_txtstrm.o: ../../src/common/txtstrm.cpp\r
        $(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $<\r
 \r
@@ -10632,6 +10658,9 @@ $(OBJS)\baselib_intl.o: ../../src/common/intl.cpp
 $(OBJS)\baselib_ipcbase.o: ../../src/common/ipcbase.cpp\r
        $(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $<\r
 \r
+$(OBJS)\baselib_languageinfo.o: ../../src/common/languageinfo.cpp\r
+       $(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $<\r
+\r
 $(OBJS)\baselib_list.o: ../../src/common/list.cpp\r
        $(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $<\r
 \r
@@ -10719,6 +10748,9 @@ $(OBJS)\baselib_timerimpl.o: ../../src/common/timerimpl.cpp
 $(OBJS)\baselib_tokenzr.o: ../../src/common/tokenzr.cpp\r
        $(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $<\r
 \r
+$(OBJS)\baselib_translation.o: ../../src/common/translation.cpp\r
+       $(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $<\r
+\r
 $(OBJS)\baselib_txtstrm.o: ../../src/common/txtstrm.cpp\r
        $(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $<\r
 \r
index 5c0b8ba36556199769f955062289cc51a31117c1..d5a3b59071a5cb52ad88fc967e9b7c3319865395 100644 (file)
@@ -366,6 +366,7 @@ MONODLL_OBJECTS =  \
        $(OBJS)\monodll_init.obj \\r
        $(OBJS)\monodll_intl.obj \\r
        $(OBJS)\monodll_ipcbase.obj \\r
+       $(OBJS)\monodll_languageinfo.obj \\r
        $(OBJS)\monodll_list.obj \\r
        $(OBJS)\monodll_log.obj \\r
        $(OBJS)\monodll_longlong.obj \\r
@@ -395,6 +396,7 @@ MONODLL_OBJECTS =  \
        $(OBJS)\monodll_timercmn.obj \\r
        $(OBJS)\monodll_timerimpl.obj \\r
        $(OBJS)\monodll_tokenzr.obj \\r
+       $(OBJS)\monodll_translation.obj \\r
        $(OBJS)\monodll_txtstrm.obj \\r
        $(OBJS)\monodll_unichar.obj \\r
        $(OBJS)\monodll_uri.obj \\r
@@ -518,6 +520,7 @@ MONOLIB_OBJECTS =  \
        $(OBJS)\monolib_init.obj \\r
        $(OBJS)\monolib_intl.obj \\r
        $(OBJS)\monolib_ipcbase.obj \\r
+       $(OBJS)\monolib_languageinfo.obj \\r
        $(OBJS)\monolib_list.obj \\r
        $(OBJS)\monolib_log.obj \\r
        $(OBJS)\monolib_longlong.obj \\r
@@ -547,6 +550,7 @@ MONOLIB_OBJECTS =  \
        $(OBJS)\monolib_timercmn.obj \\r
        $(OBJS)\monolib_timerimpl.obj \\r
        $(OBJS)\monolib_tokenzr.obj \\r
+       $(OBJS)\monolib_translation.obj \\r
        $(OBJS)\monolib_txtstrm.obj \\r
        $(OBJS)\monolib_unichar.obj \\r
        $(OBJS)\monolib_uri.obj \\r
@@ -666,6 +670,7 @@ BASEDLL_OBJECTS =  \
        $(OBJS)\basedll_init.obj \\r
        $(OBJS)\basedll_intl.obj \\r
        $(OBJS)\basedll_ipcbase.obj \\r
+       $(OBJS)\basedll_languageinfo.obj \\r
        $(OBJS)\basedll_list.obj \\r
        $(OBJS)\basedll_log.obj \\r
        $(OBJS)\basedll_longlong.obj \\r
@@ -695,6 +700,7 @@ BASEDLL_OBJECTS =  \
        $(OBJS)\basedll_timercmn.obj \\r
        $(OBJS)\basedll_timerimpl.obj \\r
        $(OBJS)\basedll_tokenzr.obj \\r
+       $(OBJS)\basedll_translation.obj \\r
        $(OBJS)\basedll_txtstrm.obj \\r
        $(OBJS)\basedll_unichar.obj \\r
        $(OBJS)\basedll_uri.obj \\r
@@ -800,6 +806,7 @@ BASELIB_OBJECTS =  \
        $(OBJS)\baselib_init.obj \\r
        $(OBJS)\baselib_intl.obj \\r
        $(OBJS)\baselib_ipcbase.obj \\r
+       $(OBJS)\baselib_languageinfo.obj \\r
        $(OBJS)\baselib_list.obj \\r
        $(OBJS)\baselib_log.obj \\r
        $(OBJS)\baselib_longlong.obj \\r
@@ -829,6 +836,7 @@ BASELIB_OBJECTS =  \
        $(OBJS)\baselib_timercmn.obj \\r
        $(OBJS)\baselib_timerimpl.obj \\r
        $(OBJS)\baselib_tokenzr.obj \\r
+       $(OBJS)\baselib_translation.obj \\r
        $(OBJS)\baselib_txtstrm.obj \\r
        $(OBJS)\baselib_unichar.obj \\r
        $(OBJS)\baselib_uri.obj \\r
@@ -6356,6 +6364,9 @@ $(OBJS)\monodll_intl.obj: ..\..\src\common\intl.cpp
 $(OBJS)\monodll_ipcbase.obj: ..\..\src\common\ipcbase.cpp\r
        $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\ipcbase.cpp\r
 \r
+$(OBJS)\monodll_languageinfo.obj: ..\..\src\common\languageinfo.cpp\r
+       $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\languageinfo.cpp\r
+\r
 $(OBJS)\monodll_list.obj: ..\..\src\common\list.cpp\r
        $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\list.cpp\r
 \r
@@ -6443,6 +6454,9 @@ $(OBJS)\monodll_timerimpl.obj: ..\..\src\common\timerimpl.cpp
 $(OBJS)\monodll_tokenzr.obj: ..\..\src\common\tokenzr.cpp\r
        $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\tokenzr.cpp\r
 \r
+$(OBJS)\monodll_translation.obj: ..\..\src\common\translation.cpp\r
+       $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\translation.cpp\r
+\r
 $(OBJS)\monodll_txtstrm.obj: ..\..\src\common\txtstrm.cpp\r
        $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\txtstrm.cpp\r
 \r
@@ -8546,6 +8560,9 @@ $(OBJS)\monolib_intl.obj: ..\..\src\common\intl.cpp
 $(OBJS)\monolib_ipcbase.obj: ..\..\src\common\ipcbase.cpp\r
        $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\ipcbase.cpp\r
 \r
+$(OBJS)\monolib_languageinfo.obj: ..\..\src\common\languageinfo.cpp\r
+       $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\languageinfo.cpp\r
+\r
 $(OBJS)\monolib_list.obj: ..\..\src\common\list.cpp\r
        $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\list.cpp\r
 \r
@@ -8633,6 +8650,9 @@ $(OBJS)\monolib_timerimpl.obj: ..\..\src\common\timerimpl.cpp
 $(OBJS)\monolib_tokenzr.obj: ..\..\src\common\tokenzr.cpp\r
        $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\tokenzr.cpp\r
 \r
+$(OBJS)\monolib_translation.obj: ..\..\src\common\translation.cpp\r
+       $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\translation.cpp\r
+\r
 $(OBJS)\monolib_txtstrm.obj: ..\..\src\common\txtstrm.cpp\r
        $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\txtstrm.cpp\r
 \r
@@ -10736,6 +10756,9 @@ $(OBJS)\basedll_intl.obj: ..\..\src\common\intl.cpp
 $(OBJS)\basedll_ipcbase.obj: ..\..\src\common\ipcbase.cpp\r
        $(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\ipcbase.cpp\r
 \r
+$(OBJS)\basedll_languageinfo.obj: ..\..\src\common\languageinfo.cpp\r
+       $(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\languageinfo.cpp\r
+\r
 $(OBJS)\basedll_list.obj: ..\..\src\common\list.cpp\r
        $(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\list.cpp\r
 \r
@@ -10823,6 +10846,9 @@ $(OBJS)\basedll_timerimpl.obj: ..\..\src\common\timerimpl.cpp
 $(OBJS)\basedll_tokenzr.obj: ..\..\src\common\tokenzr.cpp\r
        $(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\tokenzr.cpp\r
 \r
+$(OBJS)\basedll_translation.obj: ..\..\src\common\translation.cpp\r
+       $(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\translation.cpp\r
+\r
 $(OBJS)\basedll_txtstrm.obj: ..\..\src\common\txtstrm.cpp\r
        $(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\txtstrm.cpp\r
 \r
@@ -11063,6 +11089,9 @@ $(OBJS)\baselib_intl.obj: ..\..\src\common\intl.cpp
 $(OBJS)\baselib_ipcbase.obj: ..\..\src\common\ipcbase.cpp\r
        $(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\common\ipcbase.cpp\r
 \r
+$(OBJS)\baselib_languageinfo.obj: ..\..\src\common\languageinfo.cpp\r
+       $(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\common\languageinfo.cpp\r
+\r
 $(OBJS)\baselib_list.obj: ..\..\src\common\list.cpp\r
        $(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\common\list.cpp\r
 \r
@@ -11150,6 +11179,9 @@ $(OBJS)\baselib_timerimpl.obj: ..\..\src\common\timerimpl.cpp
 $(OBJS)\baselib_tokenzr.obj: ..\..\src\common\tokenzr.cpp\r
        $(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\common\tokenzr.cpp\r
 \r
+$(OBJS)\baselib_translation.obj: ..\..\src\common\translation.cpp\r
+       $(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\common\translation.cpp\r
+\r
 $(OBJS)\baselib_txtstrm.obj: ..\..\src\common\txtstrm.cpp\r
        $(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\common\txtstrm.cpp\r
 \r
index e34e38c576f3b346e25bbaa363f951ea94080385..8116672a875bcca2b6fb8506fbf0ea232f56f29e 100644 (file)
@@ -3557,6 +3557,7 @@ MONODLL_OBJECTS =  &
        $(OBJS)\monodll_init.obj &\r
        $(OBJS)\monodll_intl.obj &\r
        $(OBJS)\monodll_ipcbase.obj &\r
+       $(OBJS)\monodll_languageinfo.obj &\r
        $(OBJS)\monodll_list.obj &\r
        $(OBJS)\monodll_log.obj &\r
        $(OBJS)\monodll_longlong.obj &\r
@@ -3586,6 +3587,7 @@ MONODLL_OBJECTS =  &
        $(OBJS)\monodll_timercmn.obj &\r
        $(OBJS)\monodll_timerimpl.obj &\r
        $(OBJS)\monodll_tokenzr.obj &\r
+       $(OBJS)\monodll_translation.obj &\r
        $(OBJS)\monodll_txtstrm.obj &\r
        $(OBJS)\monodll_unichar.obj &\r
        $(OBJS)\monodll_uri.obj &\r
@@ -3701,6 +3703,7 @@ MONOLIB_OBJECTS =  &
        $(OBJS)\monolib_init.obj &\r
        $(OBJS)\monolib_intl.obj &\r
        $(OBJS)\monolib_ipcbase.obj &\r
+       $(OBJS)\monolib_languageinfo.obj &\r
        $(OBJS)\monolib_list.obj &\r
        $(OBJS)\monolib_log.obj &\r
        $(OBJS)\monolib_longlong.obj &\r
@@ -3730,6 +3733,7 @@ MONOLIB_OBJECTS =  &
        $(OBJS)\monolib_timercmn.obj &\r
        $(OBJS)\monolib_timerimpl.obj &\r
        $(OBJS)\monolib_tokenzr.obj &\r
+       $(OBJS)\monolib_translation.obj &\r
        $(OBJS)\monolib_txtstrm.obj &\r
        $(OBJS)\monolib_unichar.obj &\r
        $(OBJS)\monolib_uri.obj &\r
@@ -3843,6 +3847,7 @@ BASEDLL_OBJECTS =  &
        $(OBJS)\basedll_init.obj &\r
        $(OBJS)\basedll_intl.obj &\r
        $(OBJS)\basedll_ipcbase.obj &\r
+       $(OBJS)\basedll_languageinfo.obj &\r
        $(OBJS)\basedll_list.obj &\r
        $(OBJS)\basedll_log.obj &\r
        $(OBJS)\basedll_longlong.obj &\r
@@ -3872,6 +3877,7 @@ BASEDLL_OBJECTS =  &
        $(OBJS)\basedll_timercmn.obj &\r
        $(OBJS)\basedll_timerimpl.obj &\r
        $(OBJS)\basedll_tokenzr.obj &\r
+       $(OBJS)\basedll_translation.obj &\r
        $(OBJS)\basedll_txtstrm.obj &\r
        $(OBJS)\basedll_unichar.obj &\r
        $(OBJS)\basedll_uri.obj &\r
@@ -3970,6 +3976,7 @@ BASELIB_OBJECTS =  &
        $(OBJS)\baselib_init.obj &\r
        $(OBJS)\baselib_intl.obj &\r
        $(OBJS)\baselib_ipcbase.obj &\r
+       $(OBJS)\baselib_languageinfo.obj &\r
        $(OBJS)\baselib_list.obj &\r
        $(OBJS)\baselib_log.obj &\r
        $(OBJS)\baselib_longlong.obj &\r
@@ -3999,6 +4006,7 @@ BASELIB_OBJECTS =  &
        $(OBJS)\baselib_timercmn.obj &\r
        $(OBJS)\baselib_timerimpl.obj &\r
        $(OBJS)\baselib_tokenzr.obj &\r
+       $(OBJS)\baselib_translation.obj &\r
        $(OBJS)\baselib_txtstrm.obj &\r
        $(OBJS)\baselib_unichar.obj &\r
        $(OBJS)\baselib_uri.obj &\r
@@ -6183,6 +6191,9 @@ $(OBJS)\monodll_intl.obj :  .AUTODEPEND ..\..\src\common\intl.cpp
 $(OBJS)\monodll_ipcbase.obj :  .AUTODEPEND ..\..\src\common\ipcbase.cpp\r
        $(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<\r
 \r
+$(OBJS)\monodll_languageinfo.obj :  .AUTODEPEND ..\..\src\common\languageinfo.cpp\r
+       $(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<\r
+\r
 $(OBJS)\monodll_list.obj :  .AUTODEPEND ..\..\src\common\list.cpp\r
        $(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<\r
 \r
@@ -6270,6 +6281,9 @@ $(OBJS)\monodll_timerimpl.obj :  .AUTODEPEND ..\..\src\common\timerimpl.cpp
 $(OBJS)\monodll_tokenzr.obj :  .AUTODEPEND ..\..\src\common\tokenzr.cpp\r
        $(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<\r
 \r
+$(OBJS)\monodll_translation.obj :  .AUTODEPEND ..\..\src\common\translation.cpp\r
+       $(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<\r
+\r
 $(OBJS)\monodll_txtstrm.obj :  .AUTODEPEND ..\..\src\common\txtstrm.cpp\r
        $(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<\r
 \r
@@ -8373,6 +8387,9 @@ $(OBJS)\monolib_intl.obj :  .AUTODEPEND ..\..\src\common\intl.cpp
 $(OBJS)\monolib_ipcbase.obj :  .AUTODEPEND ..\..\src\common\ipcbase.cpp\r
        $(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<\r
 \r
+$(OBJS)\monolib_languageinfo.obj :  .AUTODEPEND ..\..\src\common\languageinfo.cpp\r
+       $(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<\r
+\r
 $(OBJS)\monolib_list.obj :  .AUTODEPEND ..\..\src\common\list.cpp\r
        $(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<\r
 \r
@@ -8460,6 +8477,9 @@ $(OBJS)\monolib_timerimpl.obj :  .AUTODEPEND ..\..\src\common\timerimpl.cpp
 $(OBJS)\monolib_tokenzr.obj :  .AUTODEPEND ..\..\src\common\tokenzr.cpp\r
        $(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<\r
 \r
+$(OBJS)\monolib_translation.obj :  .AUTODEPEND ..\..\src\common\translation.cpp\r
+       $(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<\r
+\r
 $(OBJS)\monolib_txtstrm.obj :  .AUTODEPEND ..\..\src\common\txtstrm.cpp\r
        $(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<\r
 \r
@@ -10563,6 +10583,9 @@ $(OBJS)\basedll_intl.obj :  .AUTODEPEND ..\..\src\common\intl.cpp
 $(OBJS)\basedll_ipcbase.obj :  .AUTODEPEND ..\..\src\common\ipcbase.cpp\r
        $(CXX) -bt=nt -zq -fo=$^@ $(BASEDLL_CXXFLAGS) $<\r
 \r
+$(OBJS)\basedll_languageinfo.obj :  .AUTODEPEND ..\..\src\common\languageinfo.cpp\r
+       $(CXX) -bt=nt -zq -fo=$^@ $(BASEDLL_CXXFLAGS) $<\r
+\r
 $(OBJS)\basedll_list.obj :  .AUTODEPEND ..\..\src\common\list.cpp\r
        $(CXX) -bt=nt -zq -fo=$^@ $(BASEDLL_CXXFLAGS) $<\r
 \r
@@ -10650,6 +10673,9 @@ $(OBJS)\basedll_timerimpl.obj :  .AUTODEPEND ..\..\src\common\timerimpl.cpp
 $(OBJS)\basedll_tokenzr.obj :  .AUTODEPEND ..\..\src\common\tokenzr.cpp\r
        $(CXX) -bt=nt -zq -fo=$^@ $(BASEDLL_CXXFLAGS) $<\r
 \r
+$(OBJS)\basedll_translation.obj :  .AUTODEPEND ..\..\src\common\translation.cpp\r
+       $(CXX) -bt=nt -zq -fo=$^@ $(BASEDLL_CXXFLAGS) $<\r
+\r
 $(OBJS)\basedll_txtstrm.obj :  .AUTODEPEND ..\..\src\common\txtstrm.cpp\r
        $(CXX) -bt=nt -zq -fo=$^@ $(BASEDLL_CXXFLAGS) $<\r
 \r
@@ -10890,6 +10916,9 @@ $(OBJS)\baselib_intl.obj :  .AUTODEPEND ..\..\src\common\intl.cpp
 $(OBJS)\baselib_ipcbase.obj :  .AUTODEPEND ..\..\src\common\ipcbase.cpp\r
        $(CXX) -bt=nt -zq -fo=$^@ $(BASELIB_CXXFLAGS) $<\r
 \r
+$(OBJS)\baselib_languageinfo.obj :  .AUTODEPEND ..\..\src\common\languageinfo.cpp\r
+       $(CXX) -bt=nt -zq -fo=$^@ $(BASELIB_CXXFLAGS) $<\r
+\r
 $(OBJS)\baselib_list.obj :  .AUTODEPEND ..\..\src\common\list.cpp\r
        $(CXX) -bt=nt -zq -fo=$^@ $(BASELIB_CXXFLAGS) $<\r
 \r
@@ -10977,6 +11006,9 @@ $(OBJS)\baselib_timerimpl.obj :  .AUTODEPEND ..\..\src\common\timerimpl.cpp
 $(OBJS)\baselib_tokenzr.obj :  .AUTODEPEND ..\..\src\common\tokenzr.cpp\r
        $(CXX) -bt=nt -zq -fo=$^@ $(BASELIB_CXXFLAGS) $<\r
 \r
+$(OBJS)\baselib_translation.obj :  .AUTODEPEND ..\..\src\common\translation.cpp\r
+       $(CXX) -bt=nt -zq -fo=$^@ $(BASELIB_CXXFLAGS) $<\r
+\r
 $(OBJS)\baselib_txtstrm.obj :  .AUTODEPEND ..\..\src\common\txtstrm.cpp\r
        $(CXX) -bt=nt -zq -fo=$^@ $(BASELIB_CXXFLAGS) $<\r
 \r
index 018da58d55321bfb9848e521a568a624a7c9c555..ab897381417f26fa6de960f54b8f4fd34147589b 100644 (file)
@@ -415,6 +415,10 @@ SOURCE=..\..\src\common\ipcbase.cpp
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=..\..\src\common\languageinfo.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=..\..\src\common\list.cpp\r
 # End Source File\r
 # Begin Source File\r
@@ -535,6 +539,10 @@ SOURCE=..\..\src\common\tokenzr.cpp
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=..\..\src\common\translation.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=..\..\src\common\txtstrm.cpp\r
 # End Source File\r
 # Begin Source File\r
@@ -1339,6 +1347,10 @@ SOURCE=..\..\include\wx\kbdstate.h
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=..\..\include\wx\language.h\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=..\..\include\wx\link.h\r
 # End Source File\r
 # Begin Source File\r
@@ -1539,6 +1551,10 @@ SOURCE=..\..\include\wx\tracker.h
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=..\..\include\wx\translation.h\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=..\..\include\wx\txtstrm.h\r
 # End Source File\r
 # Begin Source File\r
index 7566c86271d9318ba0889dda618433a190f8ae97..4948436c67f379a18fe3511818bc955d3e9fa69f 100644 (file)
                        <File\r
                                RelativePath="..\..\src\common\ipcbase.cpp">\r
                        </File>\r
+                       <File\r
+                               RelativePath="..\..\src\common\languageinfo.cpp">\r
+                       </File>\r
                        <File\r
                                RelativePath="..\..\src\common\list.cpp">\r
                        </File>\r
                        <File\r
                                RelativePath="..\..\src\common\tokenzr.cpp">\r
                        </File>\r
+                       <File\r
+                               RelativePath="..\..\src\common\translation.cpp">\r
+                       </File>\r
                        <File\r
                                RelativePath="..\..\src\common\txtstrm.cpp">\r
                        </File>\r
                        <File\r
                                RelativePath="..\..\include\wx\kbdstate.h">\r
                        </File>\r
+                       <File\r
+                               RelativePath="..\..\include\wx\language.h">\r
+                       </File>\r
                        <File\r
                                RelativePath="..\..\include\wx\link.h">\r
                        </File>\r
                        <File\r
                                RelativePath="..\..\include\wx\tracker.h">\r
                        </File>\r
+                       <File\r
+                               RelativePath="..\..\include\wx\translation.h">\r
+                       </File>\r
                        <File\r
                                RelativePath="..\..\include\wx\txtstrm.h">\r
                        </File>\r
index dc1f89500ad3b20a8723e27f5ef4c658341602db..ccb6393d4448f9d78c93aadfe18ef6e3a048f1f9 100644 (file)
                                RelativePath="..\..\src\common\ipcbase.cpp"\r
                                >\r
                        </File>\r
+                       <File\r
+                               RelativePath="..\..\src\common\languageinfo.cpp"\r
+                               >\r
+                       </File>\r
                        <File\r
                                RelativePath="..\..\src\common\list.cpp"\r
                                >\r
                                RelativePath="..\..\src\common\tokenzr.cpp"\r
                                >\r
                        </File>\r
+                       <File\r
+                               RelativePath="..\..\src\common\translation.cpp"\r
+                               >\r
+                       </File>\r
                        <File\r
                                RelativePath="..\..\src\common\txtstrm.cpp"\r
                                >\r
                                RelativePath="..\..\include\wx\kbdstate.h"\r
                                >\r
                        </File>\r
+                       <File\r
+                               RelativePath="..\..\include\wx\language.h"\r
+                               >\r
+                       </File>\r
                        <File\r
                                RelativePath="..\..\include\wx\link.h"\r
                                >\r
                                RelativePath="..\..\include\wx\tracker.h"\r
                                >\r
                        </File>\r
+                       <File\r
+                               RelativePath="..\..\include\wx\translation.h"\r
+                               >\r
+                       </File>\r
                        <File\r
                                RelativePath="..\..\include\wx\txtstrm.h"\r
                                >\r
index 544df909ce7d44a881c77e5d4c0f3a9a869ff6c1..2f4ff8b5e9c46a4a1a14bedb1d5e10c9d2d907ac 100644 (file)
                                RelativePath="..\..\src\common\ipcbase.cpp"\r
                                >\r
                        </File>\r
+                       <File\r
+                               RelativePath="..\..\src\common\languageinfo.cpp"\r
+                               >\r
+                       </File>\r
                        <File\r
                                RelativePath="..\..\src\common\list.cpp"\r
                                >\r
                                RelativePath="..\..\src\common\tokenzr.cpp"\r
                                >\r
                        </File>\r
+                       <File\r
+                               RelativePath="..\..\src\common\translation.cpp"\r
+                               >\r
+                       </File>\r
                        <File\r
                                RelativePath="..\..\src\common\txtstrm.cpp"\r
                                >\r
                                RelativePath="..\..\include\wx\kbdstate.h"\r
                                >\r
                        </File>\r
+                       <File\r
+                               RelativePath="..\..\include\wx\language.h"\r
+                               >\r
+                       </File>\r
                        <File\r
                                RelativePath="..\..\include\wx\link.h"\r
                                >\r
                                RelativePath="..\..\include\wx\tracker.h"\r
                                >\r
                        </File>\r
+                       <File\r
+                               RelativePath="..\..\include\wx\translation.h"\r
+                               >\r
+                       </File>\r
                        <File\r
                                RelativePath="..\..\include\wx\txtstrm.h"\r
                                >\r
index f14a0a6a642f05245bb186f04562f763967f8e3d..3f60fb6335fd571402596f6f3aabc7f1461706de 100644 (file)
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-// WARNING: Parts of this file are generated. See misc/languages/README for
-// details.
-
 #ifndef _WX_INTL_H_
 #define _WX_INTL_H_
 
 #include "wx/defs.h"
 #include "wx/string.h"
-
-#if !wxUSE_UNICODE
-    #include "wx/hashmap.h"
-#endif
+#include "wx/translation.h"
 
 // Make wxLayoutDirection enum available without need for wxUSE_INTL so wxWindow, wxApp
 // and other classes are not distrubed by wxUSE_INTL
@@ -36,6 +30,7 @@ enum wxLayoutDirection
 #if wxUSE_INTL
 
 #include "wx/fontenc.h"
+#include "wx/language.h"
 
 // ============================================================================
 // global decls
@@ -45,289 +40,17 @@ enum wxLayoutDirection
 // 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((s))
-    #define wxPLURAL(sing, plur, n)  wxGetTranslation((sing), (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) str
-
 // ----------------------------------------------------------------------------
 // forward decls
 // ----------------------------------------------------------------------------
 
-class WXDLLIMPEXP_FWD_BASE wxTranslationsLoader;
 class WXDLLIMPEXP_FWD_BASE wxLocale;
 class WXDLLIMPEXP_FWD_BASE wxLanguageInfoArray;
-class wxMsgCatalog;
 
 // ============================================================================
 // locale support
 // ============================================================================
 
-// ----------------------------------------------------------------------------
-// wxLanguage: defines all supported languages
-// ----------------------------------------------------------------------------
-
-// --- --- --- generated code begins here --- --- ---
-
-/**
-    The languages supported by wxLocale.
-
-    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, returned 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_ASTURIAN,
-    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_SAMI,
-    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_VALENCIAN,
-    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
@@ -360,110 +83,6 @@ struct WXDLLIMPEXP_BASE wxLanguageInfo
 inline wxString wxLanguageInfo::GetLocaleName() const { return CanonicalName; }
 #endif // !__WXMSW__
 
-// ----------------------------------------------------------------------------
-// wxTranslations: message catalogs
-// ----------------------------------------------------------------------------
-
-// this class allows to get translations for strings
-class WXDLLIMPEXP_BASE wxTranslations
-{
-public:
-    wxTranslations();
-    ~wxTranslations();
-
-    // returns current translations object, may return NULL
-    static wxTranslations *Get();
-    // sets current translations object (takes ownership; may be NULL)
-    static void Set(wxTranslations *t);
-
-    // changes loader to non-default one; takes ownership of 'loader'
-    void SetLoader(wxTranslationsLoader *loader);
-
-    void SetLanguage(wxLanguage lang);
-    void SetLanguage(const wxString& lang);
-
-    // add standard wxWidgets catalog ("wxstd")
-    bool AddStdCatalog();
-
-    // add catalog with given domain name and language, looking it up via
-    // wxTranslationsLoader
-    bool AddCatalog(const wxString& domain);
-    bool AddCatalog(const wxString& domain, wxLanguage msgIdLanguage);
-#if !wxUSE_UNICODE
-    bool AddCatalog(const wxString& domain,
-                    wxLanguage msgIdLanguage,
-                    const wxString& msgIdCharset);
-#endif
-
-    // check if the given catalog is loaded
-    bool IsLoaded(const wxString& domain) const;
-
-    // load catalog data directly from file
-    bool LoadCatalogFile(const wxString& filename,
-                         const wxString& domain = wxEmptyString);
-
-    // access to translations
-    const wxString& GetString(const wxString& origString,
-                              const wxString& domain = wxEmptyString) const;
-    const wxString& GetString(const wxString& origString,
-                              const wxString& origString2,
-                              size_t n,
-                              const wxString& domain = wxEmptyString) const;
-
-    wxString GetHeaderValue(const wxString& header,
-                            const wxString& domain = wxEmptyString) const;
-
-    // this is hack to work around a problem with wxGetTranslation() which
-    // returns const wxString& and not wxString, so when it returns untranslated
-    // string, it needs to have a copy of it somewhere
-    static const wxString& GetUntranslatedString(const wxString& str);
-
-private:
-    // find best translation for given domain
-    wxString ChooseLanguageForDomain(const wxString& domain,
-                                     const wxString& msgIdLang);
-
-    // find catalog by name in a linked list, return NULL if !found
-    wxMsgCatalog *FindCatalog(const wxString& domain) const;
-
-    // same as Set(), without taking ownership; only for wxLocale
-    static void SetNonOwned(wxTranslations *t);
-    friend class wxLocale;
-
-private:
-    wxString m_lang;
-    wxTranslationsLoader *m_loader;
-
-    wxMsgCatalog *m_pMsgCat; // pointer to linked list of catalogs
-
-#if !wxUSE_UNICODE
-    wxStringToStringHashMap m_msgIdCharset;
-#endif
-};
-
-
-// abstraction of translations discovery and loading
-class WXDLLIMPEXP_BASE wxTranslationsLoader
-{
-public:
-    wxTranslationsLoader() {}
-    virtual ~wxTranslationsLoader() {}
-
-    virtual bool LoadCatalog(wxTranslations *translations,
-                             const wxString& domain, const wxString& lang) = 0;
-};
-
-// standard wxTranslationsLoader implementation, using filesystem
-class WXDLLIMPEXP_BASE wxFileTranslationsLoader
-    : public wxTranslationsLoader
-{
-public:
-    static void AddCatalogLookupPathPrefix(const wxString& prefix);
-
-    virtual bool LoadCatalog(wxTranslations *translations,
-                             const wxString& domain, const wxString& lang);
-};
-
 
 // ----------------------------------------------------------------------------
 // wxLocaleCategory: the category of locale settings
@@ -749,80 +368,6 @@ private:
 // 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 wxString& wxGetTranslation(const wxString& str,
-                                        const wxString& domain = wxEmptyString)
-{
-    wxTranslations *trans = wxTranslations::Get();
-    if ( trans )
-        return trans->GetString(str, domain);
-    else
-        // NB: this function returns reference to a string, so we have to keep
-        //     a copy of it somewhere
-        return wxTranslations::GetUntranslatedString(str);
-}
-inline const wxString& wxGetTranslation(const wxString& str1,
-                                        const wxString& str2,
-                                        size_t n,
-                                        const wxString& domain = wxEmptyString)
-{
-    wxTranslations *trans = wxTranslations::Get();
-    if ( trans )
-        return trans->GetString(str1, str2, n, domain);
-    else
-        // NB: this function returns reference to a string, so we have to keep
-        //     a copy of it somewhere
-        return n == 1
-               ? wxTranslations::GetUntranslatedString(str1)
-               : wxTranslations::GetUntranslatedString(str2);
-}
-
-#else // !wxUSE_INTL
-
-// the macros should still be defined - otherwise compilation would fail
-
-#if !defined(WXINTL_NO_GETTEXT_MACRO)
-    #if !defined(_)
-        #define _(s)                 (s)
-    #endif
-    #define wxPLURAL(sing, plur, n)  ((n) == 1 ? (sing) : (plur))
-#endif
-
-#define wxTRANSLATE(str) str
-
-// NB: we use a template here in order to avoid using
-//     wxLocale::GetUntranslatedString() above, which would be required if
-//     we returned const wxString&; this way, the compiler should be able to
-//     optimize wxGetTranslation() away
-
-template<typename TString>
-inline TString wxGetTranslation(TString str)
-    { return str; }
-
-template<typename TString, typename TDomain>
-inline TString wxGetTranslation(TString str, TDomain WXUNUSED(domain))
-    { return str; }
-
-template<typename TString, typename TDomain>
-inline TString wxGetTranslation(TString str1, TString str2, size_t n)
-    { return n == 1 ? str1 : str2; }
-
-template<typename TString, typename TDomain>
-inline TString wxGetTranslation(TString str1, TString str2, size_t n,
-                                TDomain WXUNUSED(domain))
-    { return n == 1 ? str1 : str2; }
-
-#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) (str)
-    #endif
-    #if !defined(N_)
-        #define N_(s)             (s)
-    #endif
-#endif
+#endif // wxUSE_INTL
 
 #endif // _WX_INTL_H_
diff --git a/include/wx/language.h b/include/wx/language.h
new file mode 100644 (file)
index 0000000..1757ab9
--- /dev/null
@@ -0,0 +1,281 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        wx/language.h
+// Purpose:     wxLanguage enum
+// Author:      Vadim Zeitlin
+// Created:     2010-04-23
+// RCS-ID:      $Id$
+// Copyright:   (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+// WARNING: Parts of this file are generated. See misc/languages/README for
+// details.
+
+#ifndef _WX_LANGUAGE_H_
+#define _WX_LANGUAGE_H_
+
+#include "wx/defs.h"
+
+#if wxUSE_INTL
+
+// ----------------------------------------------------------------------------
+// wxLanguage: defines all supported languages
+// ----------------------------------------------------------------------------
+
+// --- --- --- generated code begins here --- --- ---
+
+/**
+    The languages supported by wxLocale.
+
+    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, returned 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_ASTURIAN,
+    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_SAMI,
+    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_VALENCIAN,
+    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 --- --- ---
+
+#endif // wxUSE_INTL
+
+#endif // _WX_LANGUAGE_H_
diff --git a/include/wx/translation.h b/include/wx/translation.h
new file mode 100644 (file)
index 0000000..ee10962
--- /dev/null
@@ -0,0 +1,241 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        wx/translation.h
+// Purpose:     Internationalization and localisation for wxWidgets
+// Author:      Vadim Zeitlin, Vaclav Slavik,
+//              Michael N. Filippov <michael@idisys.iae.nsk.su>
+// Created:     2010-04-23
+// RCS-ID:      $Id$
+// Copyright:   (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
+//              (c) 2010 Vaclav Slavik <vslavik@fastmail.fm>
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_TRANSLATION_H_
+#define _WX_TRANSLATION_H_
+
+#include "wx/defs.h"
+#include "wx/string.h"
+
+#if wxUSE_INTL
+
+#include "wx/language.h"
+
+#if !wxUSE_UNICODE
+    #include "wx/hashmap.h"
+#endif
+
+// ============================================================================
+// 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((s))
+    #define wxPLURAL(sing, plur, n)  wxGetTranslation((sing), (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) str
+
+// ----------------------------------------------------------------------------
+// forward decls
+// ----------------------------------------------------------------------------
+
+class WXDLLIMPEXP_FWD_BASE wxTranslationsLoader;
+class WXDLLIMPEXP_FWD_BASE wxLocale;
+class wxMsgCatalog;
+
+// ----------------------------------------------------------------------------
+// wxTranslations: message catalogs
+// ----------------------------------------------------------------------------
+
+// this class allows to get translations for strings
+class WXDLLIMPEXP_BASE wxTranslations
+{
+public:
+    wxTranslations();
+    ~wxTranslations();
+
+    // returns current translations object, may return NULL
+    static wxTranslations *Get();
+    // sets current translations object (takes ownership; may be NULL)
+    static void Set(wxTranslations *t);
+
+    // changes loader to non-default one; takes ownership of 'loader'
+    void SetLoader(wxTranslationsLoader *loader);
+
+    void SetLanguage(wxLanguage lang);
+    void SetLanguage(const wxString& lang);
+
+    // add standard wxWidgets catalog ("wxstd")
+    bool AddStdCatalog();
+
+    // add catalog with given domain name and language, looking it up via
+    // wxTranslationsLoader
+    bool AddCatalog(const wxString& domain);
+    bool AddCatalog(const wxString& domain, wxLanguage msgIdLanguage);
+#if !wxUSE_UNICODE
+    bool AddCatalog(const wxString& domain,
+                    wxLanguage msgIdLanguage,
+                    const wxString& msgIdCharset);
+#endif
+
+    // check if the given catalog is loaded
+    bool IsLoaded(const wxString& domain) const;
+
+    // load catalog data directly from file
+    bool LoadCatalogFile(const wxString& filename,
+                         const wxString& domain = wxEmptyString);
+
+    // access to translations
+    const wxString& GetString(const wxString& origString,
+                              const wxString& domain = wxEmptyString) const;
+    const wxString& GetString(const wxString& origString,
+                              const wxString& origString2,
+                              size_t n,
+                              const wxString& domain = wxEmptyString) const;
+
+    wxString GetHeaderValue(const wxString& header,
+                            const wxString& domain = wxEmptyString) const;
+
+    // this is hack to work around a problem with wxGetTranslation() which
+    // returns const wxString& and not wxString, so when it returns untranslated
+    // string, it needs to have a copy of it somewhere
+    static const wxString& GetUntranslatedString(const wxString& str);
+
+private:
+    // find best translation for given domain
+    wxString ChooseLanguageForDomain(const wxString& domain,
+                                     const wxString& msgIdLang);
+
+    // find catalog by name in a linked list, return NULL if !found
+    wxMsgCatalog *FindCatalog(const wxString& domain) const;
+
+    // same as Set(), without taking ownership; only for wxLocale
+    static void SetNonOwned(wxTranslations *t);
+    friend class wxLocale;
+
+private:
+    wxString m_lang;
+    wxTranslationsLoader *m_loader;
+
+    wxMsgCatalog *m_pMsgCat; // pointer to linked list of catalogs
+
+#if !wxUSE_UNICODE
+    wxStringToStringHashMap m_msgIdCharset;
+#endif
+};
+
+
+// abstraction of translations discovery and loading
+class WXDLLIMPEXP_BASE wxTranslationsLoader
+{
+public:
+    wxTranslationsLoader() {}
+    virtual ~wxTranslationsLoader() {}
+
+    virtual bool LoadCatalog(wxTranslations *translations,
+                             const wxString& domain, const wxString& lang) = 0;
+};
+
+// standard wxTranslationsLoader implementation, using filesystem
+class WXDLLIMPEXP_BASE wxFileTranslationsLoader
+    : public wxTranslationsLoader
+{
+public:
+    static void AddCatalogLookupPathPrefix(const wxString& prefix);
+
+    virtual bool LoadCatalog(wxTranslations *translations,
+                             const wxString& domain, const wxString& lang);
+};
+
+
+// ----------------------------------------------------------------------------
+// global functions
+// ----------------------------------------------------------------------------
+
+// get the translation of the string in the current locale
+inline const wxString& wxGetTranslation(const wxString& str,
+                                        const wxString& domain = wxEmptyString)
+{
+    wxTranslations *trans = wxTranslations::Get();
+    if ( trans )
+        return trans->GetString(str, domain);
+    else
+        // NB: this function returns reference to a string, so we have to keep
+        //     a copy of it somewhere
+        return wxTranslations::GetUntranslatedString(str);
+}
+
+inline const wxString& wxGetTranslation(const wxString& str1,
+                                        const wxString& str2,
+                                        size_t n,
+                                        const wxString& domain = wxEmptyString)
+{
+    wxTranslations *trans = wxTranslations::Get();
+    if ( trans )
+        return trans->GetString(str1, str2, n, domain);
+    else
+        // NB: this function returns reference to a string, so we have to keep
+        //     a copy of it somewhere
+        return n == 1
+               ? wxTranslations::GetUntranslatedString(str1)
+               : wxTranslations::GetUntranslatedString(str2);
+}
+
+#else // !wxUSE_INTL
+
+// the macros should still be defined - otherwise compilation would fail
+
+#if !defined(WXINTL_NO_GETTEXT_MACRO)
+    #if !defined(_)
+        #define _(s)                 (s)
+    #endif
+    #define wxPLURAL(sing, plur, n)  ((n) == 1 ? (sing) : (plur))
+#endif
+
+#define wxTRANSLATE(str) str
+
+// NB: we use a template here in order to avoid using
+//     wxLocale::GetUntranslatedString() above, which would be required if
+//     we returned const wxString&; this way, the compiler should be able to
+//     optimize wxGetTranslation() away
+
+template<typename TString>
+inline TString wxGetTranslation(TString str)
+    { return str; }
+
+template<typename TString, typename TDomain>
+inline TString wxGetTranslation(TString str, TDomain WXUNUSED(domain))
+    { return str; }
+
+template<typename TString, typename TDomain>
+inline TString wxGetTranslation(TString str1, TString str2, size_t n)
+    { return n == 1 ? str1 : str2; }
+
+template<typename TString, typename TDomain>
+inline TString wxGetTranslation(TString str1, TString str2, size_t n,
+                                TDomain WXUNUSED(domain))
+    { return n == 1 ? str1 : str2; }
+
+#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) (str)
+    #endif
+    #if !defined(N_)
+        #define N_(s)             (s)
+    #endif
+#endif
+
+#endif // _WX_TRANSLATION_H_
index ca251333dc34600d0f3a66693085aef57128af58..359a5dfcdc41899dcc83c1d7532510e4e0e0728f 100644 (file)
@@ -6,263 +6,6 @@
 // Licence:     wxWindows license
 /////////////////////////////////////////////////////////////////////////////
 
-
-// --- --- --- generated code begins here --- --- ---
-
-/**
-    The languages supported by wxLocale.
-
-    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, returned 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_ASTURIAN,
-    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_SAMI,
-    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_VALENCIAN,
-    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 --- --- ---
-
-
-
 /**
     This is the layout direction stored in wxLanguageInfo and returned by
     wxApp::GetLayoutDirection(), wxWindow::GetLayoutDirection(),
@@ -744,430 +487,3 @@ public:
     */
     bool IsOk() const;
 };
-
-
-/**
-    This class allows to get translations for strings.
-
-    In wxWidgets this class manages message catalogs which contain the
-    translations of the strings used to the current language. Unlike wxLocale,
-    it isn't bound to locale. It can be used either independently of, or in
-    conjunction with wxLocale. In the latter case, you should initialize
-    wxLocale (which creates wxTranslations instance) first; in the former, you
-    need to create a wxTranslations object and Set() it manually.
-
-    Only one wxTranslations instance is active at a time; it is set with the
-    Set() method and obtained using Get().
-
-    Unlike wxLocale, wxTranslations' primary mean of identifying language
-    is by its "canonical name", i.e. ISO 639 code, possibly combined with
-    ISO 3166 country code and additional modifiers (examples include
-    "fr", "en_GB" or "ca@valencia"; see wxLocale::GetCanonicalName() for
-    more information). This allows apps using wxTranslations API to use even
-    languages not recognized by the operating system or not listed in
-    wxLanguage enum.
-
-    @since 2.9.1
-
-    @see wxLocale
- */
-class wxTranslations
-{
-public:
-    /// Constructor
-    wxTranslations();
-
-    /**
-        Returns current translations object, may return NULL.
-
-        You must either call this early in app initialization code, or let
-        wxLocale do it for you.
-     */
-    static wxTranslations *Get();
-
-    /**
-        Sets current translations object.
-
-        Deletes previous translation object and takes ownership of @a t.
-     */
-    static void Set(wxTranslations *t);
-
-    /**
-        Changes loader use to read catalogs to a non-default one.
-
-        Deletes previous loader and takes ownership of @a loader.
-
-        @see wxTranslationsLoader, wxFileTranslationsLoader
-     */
-    void SetLoader(wxTranslationsLoader *loader);
-
-    /**
-        Sets translations language to use.
-
-        wxLANGUAGE_DEFAULT has special meaning: best suitable translation,
-        given user's preference and available translations, will be used.
-     */
-    void SetLanguage(wxLanguage lang);
-
-    /**
-        Sets translations language to use.
-
-        Empty @a lang string has the same meaning as wxLANGUAGE_DEFAULT in
-        SetLanguage(wxLanguage): best suitable translation, given user's
-        preference and available translations, will be used.
-     */
-    void SetLanguage(const wxString& lang);
-
-    /**
-        Add standard wxWidgets catalogs ("wxstd" and possible port-specific
-        catalogs).
-
-        @return @true if a suitable catalog was found, @false otherwise
-
-        @see AddCatalog()
-     */
-    bool AddStdCatalog();
-
-    /**
-        Add a catalog for use with the current locale.
-
-        By default, it is searched for in standard places (see
-        wxFileTranslationsLoader), but you may also prepend additional
-        directories to the search path with
-        wxFileTranslationsLoader::AddCatalogLookupPathPrefix().
-
-        All loaded catalogs will be used for message lookup by GetString() for
-        the current locale.
-
-        In this overload, @c msgid strings are assumed
-        to be in English and written only using 7-bit ASCII characters.
-        If you have to deal with non-English strings or 8-bit characters in the
-        source code, see the instructions in @ref overview_nonenglish.
-
-        @return
-            @true if catalog was successfully loaded, @false otherwise (which might
-            mean that the catalog is not found or that it isn't in the correct format).
-     */
-    bool AddCatalog(const wxString& domain);
-
-    /**
-        Same as AddCatalog(const wxString&), but takes an additional argument,
-        @a msgIdLanguage.
-
-        @param domain
-            The catalog domain to add.
-
-        @param msgIdLanguage
-            Specifies the language of "msgid" strings in source code
-            (i.e. arguments to GetString(), wxGetTranslation() and the _() macro).
-            It is used if AddCatalog() cannot find any catalog for current language:
-            if the language is same as source code language, then strings from source
-            code are used instead.
-
-        @return
-            @true if catalog was successfully loaded, @false otherwise (which might
-            mean that the catalog is not found or that it isn't in the correct format).
-     */
-    bool AddCatalog(const wxString& domain, wxLanguage msgIdLanguage);
-
-    /**
-        Same as AddCatalog(const wxString&, wxLanguage), but takes two
-        additional arguments, @a msgIdLanguage and @a msgIdCharset.
-
-        This overload is only available in non-Unicode build.
-
-        @param domain
-            The catalog domain to add.
-
-        @param msgIdLanguage
-            Specifies the language of "msgid" strings in source code
-            (i.e. arguments to GetString(), wxGetTranslation() and the _() macro).
-            It is used if AddCatalog() cannot find any catalog for current language:
-            if the language is same as source code language, then strings from source
-            code are used instead.
-
-        @param msgIdCharset
-            Lets you specify the charset used for msgids in sources
-            in case they use 8-bit characters (e.g. German or French strings).
-
-        @return
-            @true if catalog was successfully loaded, @false otherwise (which might
-            mean that the catalog is not found or that it isn't in the correct format).
-     */
-    bool AddCatalog(const wxString& domain,
-                    wxLanguage msgIdLanguage,
-                    const wxString& msgIdCharset);
-
-    /**
-        Check if the given catalog is loaded, and returns @true if it is.
-
-        According to GNU gettext tradition, each catalog normally corresponds to
-        'domain' which is more or less the application name.
-
-        @see AddCatalog()
-     */
-    bool IsLoaded(const wxString& domain) const;
-
-    /**
-        Directly loads catalog from a file.
-
-        It is caller's responsibility to ensure that the catalog contains
-        correct language. This function is primarily intended for
-        wxTranslationsLoader implementations.
-
-        @param filename  Name of the MO file to load.
-        @param domain    Domain to load the translations into (typically
-                         matches file's basename).
-     */
-    bool LoadCatalogFile(const wxString& filename,
-                         const wxString& domain = wxEmptyString);
-
-    /**
-        Retrieves the translation for a string in all loaded domains unless the @a domain
-        parameter is specified (and then only this catalog/domain is searched).
-
-        Returns 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).
-
-        @remarks Domains are searched in the last to first order, i.e. catalogs
-                 added later override those added before.
-    */
-    const wxString& GetString(const wxString& origString,
-                              const wxString& domain = wxEmptyString) const;
-
-    /**
-        Retrieves the translation for a string in all loaded domains unless the @a domain
-        parameter is specified (and then only this catalog/domain is searched).
-
-        Returns 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).
-
-        This form is used when retrieving translation of string that has different
-        singular and plural form in English or different plural forms in some
-        other language.
-        It takes two extra arguments: @a origString parameter must contain the
-        singular form of the string to be converted.
-
-        It is also used as the key for the search in the catalog.
-        The @a origString2 parameter is the plural form (in English).
-
-        The parameter @a n is used to determine the plural form.
-        If no message catalog is found @a origString is returned if 'n == 1',
-        otherwise @a origString2.
-
-        See GNU gettext manual for additional information on plural forms handling.
-        This method is called by the wxGetTranslation() function and _() macro.
-
-        @remarks Domains are searched in the last to first order, i.e. catalogs
-                 added later override those added before.
-    */
-    const wxString& GetString(const wxString& origString,
-                              const wxString& origString2,
-                              size_t n,
-                              const wxString& domain = wxEmptyString) const;
-
-    /**
-        Returns the header value for header @a header.
-        The search for @a header is case sensitive. If an @a domain is passed,
-        this domain is searched. Else all domains will be searched until a
-        header has been found.
-
-        The return value is the value of the header if found. Else this will be empty.
-    */
-    wxString GetHeaderValue(const wxString& header,
-                            const wxString& domain = wxEmptyString) const;
-};
-
-
-/**
-    Abstraction of translations discovery and loading.
-
-    This interface makes it possible to override wxWidgets' default catalogs
-    loading mechanism and load MO files from locations other than the
-    filesystem (e.g. embed them in executable).
-
-    Implementations must implement the LoadCatalog() method.
-
-    @see wxFileTranslationsLoader
- */
-class wxTranslationsLoader
-{
-public:
-    /// Constructor
-    wxTranslationsLoader() {}
-
-    /**
-        Called to load requested catalog.
-
-        If the catalog is found, LoadCatalog() should call LoadCatalogFile()
-        on @a translations to add the translation.
-
-        @param translations  wxTranslations requesting loading.
-        @param domain        Domain to load.
-        @param lang          Language to look for. This is "canonical name"
-                             (see wxLocale::GetCanonicalName()), i.e. ISO 639
-                             code, possibly combined with country code or
-                             additional modifiers (e.g. "fr", "en_GB" or
-                             "ca@valencia").
-
-        @return @true on successful load, @false otherwise
-     */
-    virtual bool LoadCatalog(wxTranslations *translations,
-                             const wxString& domain, const wxString& lang) = 0;
-};
-
-/**
-    Standard wxTranslationsLoader implementation.
-
-    This finds catalogs in the filesystem, using the standard Unix layout.
-    This is the default unless you change the loader with
-    wxTranslations::SetLoader().
-
-    Catalogs are searched for in standard places (current directory first, then
-    the system one), but you may also prepend additional directories to the
-    search path with AddCatalogLookupPathPrefix().
- */
-class wxFileTranslationsLoader : public wxTranslationsLoader
-{
-public:
-    /**
-        Add a prefix to the catalog lookup path: the message catalog files will
-        be looked up under prefix/lang/LC_MESSAGES, prefix/lang and prefix
-        (in this order).
-
-        This only applies to subsequent invocations of
-        wxTranslations::AddCatalog().
-    */
-    static void AddCatalogLookupPathPrefix(const wxString& prefix);
-};
-
-
-
-// ============================================================================
-// Global functions/macros
-// ============================================================================
-
-/** @addtogroup group_funcmacro_string */
-//@{
-
-/**
-    This macro is identical to _() but for the plural variant of
-    wxGetTranslation().
-
-    @return A const wxString.
-
-    @header{wx/intl.h}
-*/
-#define wxPLURAL(string, plural, n)
-
-/**
-    This macro doesn't do anything in the program code -- it simply expands to
-    the value of its argument.
-
-    However it does have a purpose which is to mark the literal strings for the
-    extraction into the message catalog created by @c xgettext program. Usually
-    this is achieved using _() but that macro not only marks the string for
-    extraction but also expands into a wxGetTranslation() call which means that
-    it cannot be used in some situations, notably for static array
-    initialization.
-
-    Here is an example which should make it more clear: suppose that you have a
-    static array of strings containing the weekday names and which have to be
-    translated (note that it is a bad example, really, as wxDateTime already
-    can be used to get the localized week day names already). If you write:
-
-    @code
-    static const char * const weekdays[] = { _("Mon"), ..., _("Sun") };
-    ...
-    // use weekdays[n] as usual
-    @endcode
-
-    The code wouldn't compile because the function calls are forbidden in the
-    array initializer. So instead you should do this:
-
-    @code
-    static const char * const weekdays[] = { wxTRANSLATE("Mon"), ...,
-    wxTRANSLATE("Sun") };
-    ...
-    // use wxGetTranslation(weekdays[n])
-    @endcode
-
-    Note that although the code @b would compile if you simply omit
-    wxTRANSLATE() in the above, it wouldn't work as expected because there
-    would be no translations for the weekday names in the program message
-    catalog and wxGetTranslation() wouldn't find them.
-
-    @return A const wxChar*.
-
-    @header{wx/intl.h}
-*/
-#define wxTRANSLATE(string)
-
-/**
-    This function returns the translation of @a string in the current
-    @c locale(). If the string is not found in any of the loaded message
-    catalogs (see @ref overview_i18n), the original string is returned. In
-    debug build, an error message is logged -- this should help to find the
-    strings which were not yet translated.  If @a domain is specified then only
-    that domain/catalog is searched for a matching string.  As this function is
-    used very often, an alternative (and also common in Unix world) syntax is
-    provided: the _() macro is defined to do the same thing as
-    wxGetTranslation().
-
-    This function calls wxTranslations::GetString().
-
-    @note This function is not suitable for literal strings in Unicode builds
-          since the literal strings must be enclosed into _T() or wxT() macro
-          which makes them unrecognised by @c xgettext, and so they are not
-          extracted to the message catalog. Instead, use the _() and wxPLURAL()
-          macro for all literal strings.
-
-    @see wxGetTranslation(const wxString&, const wxString&, size_t, const wxString&)
-
-    @header{wx/intl.h}
-*/
-const wxString& wxGetTranslation(const wxString& string,
-                                 const wxString& domain = wxEmptyString);
-
-/**
-    This is an overloaded version of
-    wxGetTranslation(const wxString&, const wxString&), please see its
-    documentation for general information.
-
-    This version is used when retrieving translation of string that has
-    different singular and plural forms in English or different plural forms in
-    some other language. Like wxGetTranslation(const wxString&,const wxString&),
-    the @a string parameter must contain the singular form of the string to be
-    converted and is used as the key for the search in the catalog. The
-    @a plural parameter is the plural form (in English). The parameter @a n is
-    used to determine the plural form. If no message catalog is found,
-    @a string is returned if "n == 1", otherwise @a plural is returned.
-
-    See GNU gettext Manual for additional information on plural forms handling:
-    <http://www.gnu.org/software/gettext/manual/gettext.html#Plural-forms>
-    For a shorter alternative see the wxPLURAL() macro.
-
-    This function calls wxLocale::GetString().
-
-    @header{wx/intl.h}
-*/
-const wxString& wxGetTranslation(const wxString& string,
-                                 const wxString& plural, size_t n,
-                                 const wxString& domain = wxEmptyString);
-
-/**
-    This macro expands into a call to wxGetTranslation(), so it marks the
-    message for the extraction by @c xgettext just as wxTRANSLATE() does, but
-    also returns the translation of the string for the current locale during
-    execution.
-
-    Don't confuse this with _T()!
-
-    @header{wx/intl.h}
-*/
-const wxString& _(const wxString& string);
-
-//@}
-
diff --git a/interface/wx/language.h b/interface/wx/language.h
new file mode 100644 (file)
index 0000000..306151c
--- /dev/null
@@ -0,0 +1,263 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        language.h
+// Purpose:     wxLanguage enum
+// Author:      wxWidgets team
+// RCS-ID:      $Id$
+// Licence:     wxWindows license
+/////////////////////////////////////////////////////////////////////////////
+
+
+// --- --- --- generated code begins here --- --- ---
+
+/**
+    The languages supported by wxLocale.
+
+    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, returned 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_ASTURIAN,
+    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_SAMI,
+    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_VALENCIAN,
+    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 --- --- ---
+
diff --git a/interface/wx/translation.h b/interface/wx/translation.h
new file mode 100644 (file)
index 0000000..0e102ee
--- /dev/null
@@ -0,0 +1,434 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        translation.h
+// Purpose:     wxTranslation class
+// Author:      wxWidgets team
+// RCS-ID:      $Id$
+// Licence:     wxWindows license
+/////////////////////////////////////////////////////////////////////////////
+
+
+/**
+    This class allows to get translations for strings.
+
+    In wxWidgets this class manages message catalogs which contain the
+    translations of the strings used to the current language. Unlike wxLocale,
+    it isn't bound to locale. It can be used either independently of, or in
+    conjunction with wxLocale. In the latter case, you should initialize
+    wxLocale (which creates wxTranslations instance) first; in the former, you
+    need to create a wxTranslations object and Set() it manually.
+
+    Only one wxTranslations instance is active at a time; it is set with the
+    Set() method and obtained using Get().
+
+    Unlike wxLocale, wxTranslations' primary mean of identifying language
+    is by its "canonical name", i.e. ISO 639 code, possibly combined with
+    ISO 3166 country code and additional modifiers (examples include
+    "fr", "en_GB" or "ca@valencia"; see wxLocale::GetCanonicalName() for
+    more information). This allows apps using wxTranslations API to use even
+    languages not recognized by the operating system or not listed in
+    wxLanguage enum.
+
+    @since 2.9.1
+
+    @see wxLocale
+ */
+class wxTranslations
+{
+public:
+    /// Constructor
+    wxTranslations();
+
+    /**
+        Returns current translations object, may return NULL.
+
+        You must either call this early in app initialization code, or let
+        wxLocale do it for you.
+     */
+    static wxTranslations *Get();
+
+    /**
+        Sets current translations object.
+
+        Deletes previous translation object and takes ownership of @a t.
+     */
+    static void Set(wxTranslations *t);
+
+    /**
+        Changes loader use to read catalogs to a non-default one.
+
+        Deletes previous loader and takes ownership of @a loader.
+
+        @see wxTranslationsLoader, wxFileTranslationsLoader
+     */
+    void SetLoader(wxTranslationsLoader *loader);
+
+    /**
+        Sets translations language to use.
+
+        wxLANGUAGE_DEFAULT has special meaning: best suitable translation,
+        given user's preference and available translations, will be used.
+     */
+    void SetLanguage(wxLanguage lang);
+
+    /**
+        Sets translations language to use.
+
+        Empty @a lang string has the same meaning as wxLANGUAGE_DEFAULT in
+        SetLanguage(wxLanguage): best suitable translation, given user's
+        preference and available translations, will be used.
+     */
+    void SetLanguage(const wxString& lang);
+
+    /**
+        Add standard wxWidgets catalogs ("wxstd" and possible port-specific
+        catalogs).
+
+        @return @true if a suitable catalog was found, @false otherwise
+
+        @see AddCatalog()
+     */
+    bool AddStdCatalog();
+
+    /**
+        Add a catalog for use with the current locale.
+
+        By default, it is searched for in standard places (see
+        wxFileTranslationsLoader), but you may also prepend additional
+        directories to the search path with
+        wxFileTranslationsLoader::AddCatalogLookupPathPrefix().
+
+        All loaded catalogs will be used for message lookup by GetString() for
+        the current locale.
+
+        In this overload, @c msgid strings are assumed
+        to be in English and written only using 7-bit ASCII characters.
+        If you have to deal with non-English strings or 8-bit characters in the
+        source code, see the instructions in @ref overview_nonenglish.
+
+        @return
+            @true if catalog was successfully loaded, @false otherwise (which might
+            mean that the catalog is not found or that it isn't in the correct format).
+     */
+    bool AddCatalog(const wxString& domain);
+
+    /**
+        Same as AddCatalog(const wxString&), but takes an additional argument,
+        @a msgIdLanguage.
+
+        @param domain
+            The catalog domain to add.
+
+        @param msgIdLanguage
+            Specifies the language of "msgid" strings in source code
+            (i.e. arguments to GetString(), wxGetTranslation() and the _() macro).
+            It is used if AddCatalog() cannot find any catalog for current language:
+            if the language is same as source code language, then strings from source
+            code are used instead.
+
+        @return
+            @true if catalog was successfully loaded, @false otherwise (which might
+            mean that the catalog is not found or that it isn't in the correct format).
+     */
+    bool AddCatalog(const wxString& domain, wxLanguage msgIdLanguage);
+
+    /**
+        Same as AddCatalog(const wxString&, wxLanguage), but takes two
+        additional arguments, @a msgIdLanguage and @a msgIdCharset.
+
+        This overload is only available in non-Unicode build.
+
+        @param domain
+            The catalog domain to add.
+
+        @param msgIdLanguage
+            Specifies the language of "msgid" strings in source code
+            (i.e. arguments to GetString(), wxGetTranslation() and the _() macro).
+            It is used if AddCatalog() cannot find any catalog for current language:
+            if the language is same as source code language, then strings from source
+            code are used instead.
+
+        @param msgIdCharset
+            Lets you specify the charset used for msgids in sources
+            in case they use 8-bit characters (e.g. German or French strings).
+
+        @return
+            @true if catalog was successfully loaded, @false otherwise (which might
+            mean that the catalog is not found or that it isn't in the correct format).
+     */
+    bool AddCatalog(const wxString& domain,
+                    wxLanguage msgIdLanguage,
+                    const wxString& msgIdCharset);
+
+    /**
+        Check if the given catalog is loaded, and returns @true if it is.
+
+        According to GNU gettext tradition, each catalog normally corresponds to
+        'domain' which is more or less the application name.
+
+        @see AddCatalog()
+     */
+    bool IsLoaded(const wxString& domain) const;
+
+    /**
+        Directly loads catalog from a file.
+
+        It is caller's responsibility to ensure that the catalog contains
+        correct language. This function is primarily intended for
+        wxTranslationsLoader implementations.
+
+        @param filename  Name of the MO file to load.
+        @param domain    Domain to load the translations into (typically
+                         matches file's basename).
+     */
+    bool LoadCatalogFile(const wxString& filename,
+                         const wxString& domain = wxEmptyString);
+
+    /**
+        Retrieves the translation for a string in all loaded domains unless the @a domain
+        parameter is specified (and then only this catalog/domain is searched).
+
+        Returns 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).
+
+        @remarks Domains are searched in the last to first order, i.e. catalogs
+                 added later override those added before.
+    */
+    const wxString& GetString(const wxString& origString,
+                              const wxString& domain = wxEmptyString) const;
+
+    /**
+        Retrieves the translation for a string in all loaded domains unless the @a domain
+        parameter is specified (and then only this catalog/domain is searched).
+
+        Returns 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).
+
+        This form is used when retrieving translation of string that has different
+        singular and plural form in English or different plural forms in some
+        other language.
+        It takes two extra arguments: @a origString parameter must contain the
+        singular form of the string to be converted.
+
+        It is also used as the key for the search in the catalog.
+        The @a origString2 parameter is the plural form (in English).
+
+        The parameter @a n is used to determine the plural form.
+        If no message catalog is found @a origString is returned if 'n == 1',
+        otherwise @a origString2.
+
+        See GNU gettext manual for additional information on plural forms handling.
+        This method is called by the wxGetTranslation() function and _() macro.
+
+        @remarks Domains are searched in the last to first order, i.e. catalogs
+                 added later override those added before.
+    */
+    const wxString& GetString(const wxString& origString,
+                              const wxString& origString2,
+                              size_t n,
+                              const wxString& domain = wxEmptyString) const;
+
+    /**
+        Returns the header value for header @a header.
+        The search for @a header is case sensitive. If an @a domain is passed,
+        this domain is searched. Else all domains will be searched until a
+        header has been found.
+
+        The return value is the value of the header if found. Else this will be empty.
+    */
+    wxString GetHeaderValue(const wxString& header,
+                            const wxString& domain = wxEmptyString) const;
+};
+
+
+/**
+    Abstraction of translations discovery and loading.
+
+    This interface makes it possible to override wxWidgets' default catalogs
+    loading mechanism and load MO files from locations other than the
+    filesystem (e.g. embed them in executable).
+
+    Implementations must implement the LoadCatalog() method.
+
+    @see wxFileTranslationsLoader
+ */
+class wxTranslationsLoader
+{
+public:
+    /// Constructor
+    wxTranslationsLoader() {}
+
+    /**
+        Called to load requested catalog.
+
+        If the catalog is found, LoadCatalog() should call LoadCatalogFile()
+        on @a translations to add the translation.
+
+        @param translations  wxTranslations requesting loading.
+        @param domain        Domain to load.
+        @param lang          Language to look for. This is "canonical name"
+                             (see wxLocale::GetCanonicalName()), i.e. ISO 639
+                             code, possibly combined with country code or
+                             additional modifiers (e.g. "fr", "en_GB" or
+                             "ca@valencia").
+
+        @return @true on successful load, @false otherwise
+     */
+    virtual bool LoadCatalog(wxTranslations *translations,
+                             const wxString& domain, const wxString& lang) = 0;
+};
+
+/**
+    Standard wxTranslationsLoader implementation.
+
+    This finds catalogs in the filesystem, using the standard Unix layout.
+    This is the default unless you change the loader with
+    wxTranslations::SetLoader().
+
+    Catalogs are searched for in standard places (current directory first, then
+    the system one), but you may also prepend additional directories to the
+    search path with AddCatalogLookupPathPrefix().
+ */
+class wxFileTranslationsLoader : public wxTranslationsLoader
+{
+public:
+    /**
+        Add a prefix to the catalog lookup path: the message catalog files will
+        be looked up under prefix/lang/LC_MESSAGES, prefix/lang and prefix
+        (in this order).
+
+        This only applies to subsequent invocations of
+        wxTranslations::AddCatalog().
+    */
+    static void AddCatalogLookupPathPrefix(const wxString& prefix);
+};
+
+
+
+// ============================================================================
+// Global functions/macros
+// ============================================================================
+
+/** @addtogroup group_funcmacro_string */
+//@{
+
+/**
+    This macro is identical to _() but for the plural variant of
+    wxGetTranslation().
+
+    @return A const wxString.
+
+    @header{wx/intl.h}
+*/
+#define wxPLURAL(string, plural, n)
+
+/**
+    This macro doesn't do anything in the program code -- it simply expands to
+    the value of its argument.
+
+    However it does have a purpose which is to mark the literal strings for the
+    extraction into the message catalog created by @c xgettext program. Usually
+    this is achieved using _() but that macro not only marks the string for
+    extraction but also expands into a wxGetTranslation() call which means that
+    it cannot be used in some situations, notably for static array
+    initialization.
+
+    Here is an example which should make it more clear: suppose that you have a
+    static array of strings containing the weekday names and which have to be
+    translated (note that it is a bad example, really, as wxDateTime already
+    can be used to get the localized week day names already). If you write:
+
+    @code
+    static const char * const weekdays[] = { _("Mon"), ..., _("Sun") };
+    ...
+    // use weekdays[n] as usual
+    @endcode
+
+    The code wouldn't compile because the function calls are forbidden in the
+    array initializer. So instead you should do this:
+
+    @code
+    static const char * const weekdays[] = { wxTRANSLATE("Mon"), ...,
+    wxTRANSLATE("Sun") };
+    ...
+    // use wxGetTranslation(weekdays[n])
+    @endcode
+
+    Note that although the code @b would compile if you simply omit
+    wxTRANSLATE() in the above, it wouldn't work as expected because there
+    would be no translations for the weekday names in the program message
+    catalog and wxGetTranslation() wouldn't find them.
+
+    @return A const wxChar*.
+
+    @header{wx/intl.h}
+*/
+#define wxTRANSLATE(string)
+
+/**
+    This function returns the translation of @a string in the current
+    @c locale(). If the string is not found in any of the loaded message
+    catalogs (see @ref overview_i18n), the original string is returned. In
+    debug build, an error message is logged -- this should help to find the
+    strings which were not yet translated.  If @a domain is specified then only
+    that domain/catalog is searched for a matching string.  As this function is
+    used very often, an alternative (and also common in Unix world) syntax is
+    provided: the _() macro is defined to do the same thing as
+    wxGetTranslation().
+
+    This function calls wxTranslations::GetString().
+
+    @note This function is not suitable for literal strings in Unicode builds
+          since the literal strings must be enclosed into _T() or wxT() macro
+          which makes them unrecognised by @c xgettext, and so they are not
+          extracted to the message catalog. Instead, use the _() and wxPLURAL()
+          macro for all literal strings.
+
+    @see wxGetTranslation(const wxString&, const wxString&, size_t, const wxString&)
+
+    @header{wx/intl.h}
+*/
+const wxString& wxGetTranslation(const wxString& string,
+                                 const wxString& domain = wxEmptyString);
+
+/**
+    This is an overloaded version of
+    wxGetTranslation(const wxString&, const wxString&), please see its
+    documentation for general information.
+
+    This version is used when retrieving translation of string that has
+    different singular and plural forms in English or different plural forms in
+    some other language. Like wxGetTranslation(const wxString&,const wxString&),
+    the @a string parameter must contain the singular form of the string to be
+    converted and is used as the key for the search in the catalog. The
+    @a plural parameter is the plural form (in English). The parameter @a n is
+    used to determine the plural form. If no message catalog is found,
+    @a string is returned if "n == 1", otherwise @a plural is returned.
+
+    See GNU gettext Manual for additional information on plural forms handling:
+    <http://www.gnu.org/software/gettext/manual/gettext.html#Plural-forms>
+    For a shorter alternative see the wxPLURAL() macro.
+
+    This function calls wxLocale::GetString().
+
+    @header{wx/intl.h}
+*/
+const wxString& wxGetTranslation(const wxString& string,
+                                 const wxString& plural, size_t n,
+                                 const wxString& domain = wxEmptyString);
+
+/**
+    This macro expands into a call to wxGetTranslation(), so it marks the
+    message for the extraction by @c xgettext just as wxTRANSLATE() does, but
+    also returns the translation of the string for the current locale during
+    execution.
+
+    Don't confuse this with _T()!
+
+    @header{wx/intl.h}
+*/
+const wxString& _(const wxString& string);
+
+//@}
+
index 3650de4e2e834136a79e237cb5c7cc62f1baf269..e72b917951383460246c4c30eccdc59cf23e43e3 100644 (file)
@@ -1,4 +1,5 @@
 Run the genlang.py script from the top level wxWidgets directory to update
-include/wx/intl.h (wxLanguage enum), interface/wx/intl.h (its documentation)
-and src/common/intl.cpp (conversion tables) with the data from langtabl.txt.
+include/wx/language.h (wxLanguage enum), interface/wx/language.h (its
+documentation) and src/common/language.cpp (conversion tables) with the data
+from langtabl.txt.
 
index c8779020253ce0c6e3233ed853aa49a357a22538..6b825cc5566e60bccf415975aa330458e65f1fa0 100755 (executable)
@@ -165,6 +165,6 @@ def ReplaceGeneratedPartOfFile(fname, func):
     os.rename(fnameNew, fname)
 
 table = ReadTable()
-ReplaceGeneratedPartOfFile('include/wx/intl.h', WriteEnum)
-ReplaceGeneratedPartOfFile('interface/wx/intl.h', WriteEnum)
-ReplaceGeneratedPartOfFile('src/common/intl.cpp', WriteTable)
+ReplaceGeneratedPartOfFile('include/wx/language.h', WriteEnum)
+ReplaceGeneratedPartOfFile('interface/wx/language.h', WriteEnum)
+ReplaceGeneratedPartOfFile('src/common/languageinfo.cpp', WriteTable)
index 9a1b3a4a25dd907623956ab826182e189cd8e3be..cc1377007f2ca854e198236868c375442c109ab6 100644 (file)
@@ -57,8 +57,6 @@
 
 #ifdef __WIN32__
     #include "wx/msw/private.h"
-#elif defined(__UNIX_LIKE__)
-    #include "wx/fontmap.h"         // for CharsetToEncoding()
 #endif
 
 #include "wx/file.h"
     #include "wx/osx/core/cfstring.h"
 #endif
 
-// ----------------------------------------------------------------------------
-// simple types
-// ----------------------------------------------------------------------------
-
-// this should *not* be wxChar, this type must have exactly 8 bits!
-typedef wxUint8 size_t8;
-typedef wxUint32 size_t32;
-
 // ----------------------------------------------------------------------------
 // constants
 // ----------------------------------------------------------------------------
 
-// magic number identifying the .mo format file
-const size_t32 MSGCATALOG_MAGIC    = 0x950412de;
-const size_t32 MSGCATALOG_MAGIC_SW = 0xde120495;
-
 // the constants describing the format of ll_CC locale string
 static const size_t LEN_LANG = 2;
 static const size_t LEN_SUBLANG = 2;
@@ -100,1729 +86,99 @@ static const size_t LEN_FULL = LEN_LANG + 1 + LEN_SUBLANG; // 1 for '_'
 
 #define TRACE_I18N wxS("i18n")
 
-// ----------------------------------------------------------------------------
-// global functions
-// ----------------------------------------------------------------------------
-
-static wxLocale *wxSetLocale(wxLocale *pLocale);
-
-namespace
-{
-
-// get just the language part
-inline wxString ExtractLang(const wxString& langFull)
-{
-    return langFull.Left(LEN_LANG);
-}
-
-// helper functions of GetSystemLanguage()
-#ifdef __UNIX__
-
-// get everything else (including the leading '_')
-inline wxString ExtractNotLang(const wxString& langFull)
-{
-    return langFull.Mid(LEN_LANG);
-}
-
-#endif // __UNIX__
-
-} // anonymous namespace
+// ============================================================================
+// implementation
+// ============================================================================
 
 // ----------------------------------------------------------------------------
-// Plural forms parser
-// ----------------------------------------------------------------------------
-
-/*
-                                Simplified Grammar
-
-Expression:
-    LogicalOrExpression '?' Expression ':' Expression
-    LogicalOrExpression
-
-LogicalOrExpression:
-    LogicalAndExpression "||" LogicalOrExpression   // to (a || b) || c
-    LogicalAndExpression
-
-LogicalAndExpression:
-    EqualityExpression "&&" LogicalAndExpression    // to (a && b) && c
-    EqualityExpression
-
-EqualityExpression:
-    RelationalExpression "==" RelationalExperession
-    RelationalExpression "!=" RelationalExperession
-    RelationalExpression
-
-RelationalExpression:
-    MultiplicativeExpression '>' MultiplicativeExpression
-    MultiplicativeExpression '<' MultiplicativeExpression
-    MultiplicativeExpression ">=" MultiplicativeExpression
-    MultiplicativeExpression "<=" MultiplicativeExpression
-    MultiplicativeExpression
-
-MultiplicativeExpression:
-    PmExpression '%' PmExpression
-    PmExpression
-
-PmExpression:
-    N
-    Number
-    '(' Expression ')'
-*/
-
-class wxPluralFormsToken
-{
-public:
-    enum Type
-    {
-        T_ERROR, T_EOF, T_NUMBER, T_N, T_PLURAL, T_NPLURALS, T_EQUAL, T_ASSIGN,
-        T_GREATER, T_GREATER_OR_EQUAL, T_LESS, T_LESS_OR_EQUAL,
-        T_REMINDER, T_NOT_EQUAL,
-        T_LOGICAL_AND, T_LOGICAL_OR, T_QUESTION, T_COLON, T_SEMICOLON,
-        T_LEFT_BRACKET, T_RIGHT_BRACKET
-    };
-    Type type() const { return m_type; }
-    void setType(Type type) { m_type = type; }
-    // for T_NUMBER only
-    typedef int Number;
-    Number number() const { return m_number; }
-    void setNumber(Number num) { m_number = num; }
-private:
-    Type m_type;
-    Number m_number;
-};
-
-
-class wxPluralFormsScanner
-{
-public:
-    wxPluralFormsScanner(const char* s);
-    const wxPluralFormsToken& token() const { return m_token; }
-    bool nextToken();  // returns false if error
-private:
-    const char* m_s;
-    wxPluralFormsToken m_token;
-};
-
-wxPluralFormsScanner::wxPluralFormsScanner(const char* s) : m_s(s)
-{
-    nextToken();
-}
-
-bool wxPluralFormsScanner::nextToken()
-{
-    wxPluralFormsToken::Type type = wxPluralFormsToken::T_ERROR;
-    while (isspace((unsigned char) *m_s))
-    {
-        ++m_s;
-    }
-    if (*m_s == 0)
-    {
-        type = wxPluralFormsToken::T_EOF;
-    }
-    else if (isdigit((unsigned char) *m_s))
-    {
-        wxPluralFormsToken::Number number = *m_s++ - '0';
-        while (isdigit((unsigned char) *m_s))
-        {
-            number = number * 10 + (*m_s++ - '0');
-        }
-        m_token.setNumber(number);
-        type = wxPluralFormsToken::T_NUMBER;
-    }
-    else if (isalpha((unsigned char) *m_s))
-    {
-        const char* begin = m_s++;
-        while (isalnum((unsigned char) *m_s))
-        {
-            ++m_s;
-        }
-        size_t size = m_s - begin;
-        if (size == 1 && memcmp(begin, "n", size) == 0)
-        {
-            type = wxPluralFormsToken::T_N;
-        }
-        else if (size == 6 && memcmp(begin, "plural", size) == 0)
-        {
-            type = wxPluralFormsToken::T_PLURAL;
-        }
-        else if (size == 8 && memcmp(begin, "nplurals", size) == 0)
-        {
-            type = wxPluralFormsToken::T_NPLURALS;
-        }
-    }
-    else if (*m_s == '=')
-    {
-        ++m_s;
-        if (*m_s == '=')
-        {
-            ++m_s;
-            type = wxPluralFormsToken::T_EQUAL;
-        }
-        else
-        {
-            type = wxPluralFormsToken::T_ASSIGN;
-        }
-    }
-    else if (*m_s == '>')
-    {
-        ++m_s;
-        if (*m_s == '=')
-        {
-            ++m_s;
-            type = wxPluralFormsToken::T_GREATER_OR_EQUAL;
-        }
-        else
-        {
-            type = wxPluralFormsToken::T_GREATER;
-        }
-    }
-    else if (*m_s == '<')
-    {
-        ++m_s;
-        if (*m_s == '=')
-        {
-            ++m_s;
-            type = wxPluralFormsToken::T_LESS_OR_EQUAL;
-        }
-        else
-        {
-            type = wxPluralFormsToken::T_LESS;
-        }
-    }
-    else if (*m_s == '%')
-    {
-        ++m_s;
-        type = wxPluralFormsToken::T_REMINDER;
-    }
-    else if (*m_s == '!' && m_s[1] == '=')
-    {
-        m_s += 2;
-        type = wxPluralFormsToken::T_NOT_EQUAL;
-    }
-    else if (*m_s == '&' && m_s[1] == '&')
-    {
-        m_s += 2;
-        type = wxPluralFormsToken::T_LOGICAL_AND;
-    }
-    else if (*m_s == '|' && m_s[1] == '|')
-    {
-        m_s += 2;
-        type = wxPluralFormsToken::T_LOGICAL_OR;
-    }
-    else if (*m_s == '?')
-    {
-        ++m_s;
-        type = wxPluralFormsToken::T_QUESTION;
-    }
-    else if (*m_s == ':')
-    {
-        ++m_s;
-        type = wxPluralFormsToken::T_COLON;
-    } else if (*m_s == ';') {
-        ++m_s;
-        type = wxPluralFormsToken::T_SEMICOLON;
-    }
-    else if (*m_s == '(')
-    {
-        ++m_s;
-        type = wxPluralFormsToken::T_LEFT_BRACKET;
-    }
-    else if (*m_s == ')')
-    {
-        ++m_s;
-        type = wxPluralFormsToken::T_RIGHT_BRACKET;
-    }
-    m_token.setType(type);
-    return type != wxPluralFormsToken::T_ERROR;
-}
-
-class wxPluralFormsNode;
-
-// NB: Can't use wxDEFINE_SCOPED_PTR_TYPE because wxPluralFormsNode is not
-//     fully defined yet:
-class wxPluralFormsNodePtr
-{
-public:
-    wxPluralFormsNodePtr(wxPluralFormsNode *p = NULL) : m_p(p) {}
-    ~wxPluralFormsNodePtr();
-    wxPluralFormsNode& operator*() const { return *m_p; }
-    wxPluralFormsNode* operator->() const { return m_p; }
-    wxPluralFormsNode* get() const { return m_p; }
-    wxPluralFormsNode* release();
-    void reset(wxPluralFormsNode *p);
-
-private:
-    wxPluralFormsNode *m_p;
-};
-
-class wxPluralFormsNode
-{
-public:
-    wxPluralFormsNode(const wxPluralFormsToken& token) : m_token(token) {}
-    const wxPluralFormsToken& token() const { return m_token; }
-    const wxPluralFormsNode* node(size_t i) const
-        { return m_nodes[i].get(); }
-    void setNode(size_t i, wxPluralFormsNode* n);
-    wxPluralFormsNode* releaseNode(size_t i);
-    wxPluralFormsToken::Number evaluate(wxPluralFormsToken::Number n) const;
-
-private:
-    wxPluralFormsToken m_token;
-    wxPluralFormsNodePtr m_nodes[3];
-};
-
-wxPluralFormsNodePtr::~wxPluralFormsNodePtr()
-{
-    delete m_p;
-}
-wxPluralFormsNode* wxPluralFormsNodePtr::release()
-{
-    wxPluralFormsNode *p = m_p;
-    m_p = NULL;
-    return p;
-}
-void wxPluralFormsNodePtr::reset(wxPluralFormsNode *p)
-{
-    if (p != m_p)
-    {
-        delete m_p;
-        m_p = p;
-    }
-}
-
-
-void wxPluralFormsNode::setNode(size_t i, wxPluralFormsNode* n)
-{
-    m_nodes[i].reset(n);
-}
-
-wxPluralFormsNode*  wxPluralFormsNode::releaseNode(size_t i)
-{
-    return m_nodes[i].release();
-}
-
-wxPluralFormsToken::Number
-wxPluralFormsNode::evaluate(wxPluralFormsToken::Number n) const
-{
-    switch (token().type())
-    {
-        // leaf
-        case wxPluralFormsToken::T_NUMBER:
-            return token().number();
-        case wxPluralFormsToken::T_N:
-            return n;
-        // 2 args
-        case wxPluralFormsToken::T_EQUAL:
-            return node(0)->evaluate(n) == node(1)->evaluate(n);
-        case wxPluralFormsToken::T_NOT_EQUAL:
-            return node(0)->evaluate(n) != node(1)->evaluate(n);
-        case wxPluralFormsToken::T_GREATER:
-            return node(0)->evaluate(n) > node(1)->evaluate(n);
-        case wxPluralFormsToken::T_GREATER_OR_EQUAL:
-            return node(0)->evaluate(n) >= node(1)->evaluate(n);
-        case wxPluralFormsToken::T_LESS:
-            return node(0)->evaluate(n) < node(1)->evaluate(n);
-        case wxPluralFormsToken::T_LESS_OR_EQUAL:
-            return node(0)->evaluate(n) <= node(1)->evaluate(n);
-        case wxPluralFormsToken::T_REMINDER:
-            {
-                wxPluralFormsToken::Number number = node(1)->evaluate(n);
-                if (number != 0)
-                {
-                    return node(0)->evaluate(n) % number;
-                }
-                else
-                {
-                    return 0;
-                }
-            }
-        case wxPluralFormsToken::T_LOGICAL_AND:
-            return node(0)->evaluate(n) && node(1)->evaluate(n);
-        case wxPluralFormsToken::T_LOGICAL_OR:
-            return node(0)->evaluate(n) || node(1)->evaluate(n);
-        // 3 args
-        case wxPluralFormsToken::T_QUESTION:
-            return node(0)->evaluate(n)
-                ? node(1)->evaluate(n)
-                : node(2)->evaluate(n);
-        default:
-            return 0;
-    }
-}
-
-
-class wxPluralFormsCalculator
-{
-public:
-    wxPluralFormsCalculator() : m_nplurals(0), m_plural(0) {}
-
-    // input: number, returns msgstr index
-    int evaluate(int n) const;
-
-    // input: text after "Plural-Forms:" (e.g. "nplurals=2; plural=(n != 1);"),
-    // if s == 0, creates default handler
-    // returns 0 if error
-    static wxPluralFormsCalculator* make(const char* s = 0);
-
-    ~wxPluralFormsCalculator() {}
-
-    void  init(wxPluralFormsToken::Number nplurals, wxPluralFormsNode* plural);
-
-private:
-    wxPluralFormsToken::Number m_nplurals;
-    wxPluralFormsNodePtr m_plural;
-};
-
-wxDEFINE_SCOPED_PTR_TYPE(wxPluralFormsCalculator)
-
-void wxPluralFormsCalculator::init(wxPluralFormsToken::Number nplurals,
-                                wxPluralFormsNode* plural)
-{
-    m_nplurals = nplurals;
-    m_plural.reset(plural);
-}
-
-int wxPluralFormsCalculator::evaluate(int n) const
-{
-    if (m_plural.get() == 0)
-    {
-        return 0;
-    }
-    wxPluralFormsToken::Number number = m_plural->evaluate(n);
-    if (number < 0 || number > m_nplurals)
-    {
-        return 0;
-    }
-    return number;
-}
-
-
-class wxPluralFormsParser
-{
-public:
-    wxPluralFormsParser(wxPluralFormsScanner& scanner) : m_scanner(scanner) {}
-    bool parse(wxPluralFormsCalculator& rCalculator);
-
-private:
-    wxPluralFormsNode* parsePlural();
-    // stops at T_SEMICOLON, returns 0 if error
-    wxPluralFormsScanner& m_scanner;
-    const wxPluralFormsToken& token() const;
-    bool nextToken();
-
-    wxPluralFormsNode* expression();
-    wxPluralFormsNode* logicalOrExpression();
-    wxPluralFormsNode* logicalAndExpression();
-    wxPluralFormsNode* equalityExpression();
-    wxPluralFormsNode* multiplicativeExpression();
-    wxPluralFormsNode* relationalExpression();
-    wxPluralFormsNode* pmExpression();
-};
-
-bool wxPluralFormsParser::parse(wxPluralFormsCalculator& rCalculator)
-{
-    if (token().type() != wxPluralFormsToken::T_NPLURALS)
-        return false;
-    if (!nextToken())
-        return false;
-    if (token().type() != wxPluralFormsToken::T_ASSIGN)
-        return false;
-    if (!nextToken())
-        return false;
-    if (token().type() != wxPluralFormsToken::T_NUMBER)
-        return false;
-    wxPluralFormsToken::Number nplurals = token().number();
-    if (!nextToken())
-        return false;
-    if (token().type() != wxPluralFormsToken::T_SEMICOLON)
-        return false;
-    if (!nextToken())
-        return false;
-    if (token().type() != wxPluralFormsToken::T_PLURAL)
-        return false;
-    if (!nextToken())
-        return false;
-    if (token().type() != wxPluralFormsToken::T_ASSIGN)
-        return false;
-    if (!nextToken())
-        return false;
-    wxPluralFormsNode* plural = parsePlural();
-    if (plural == 0)
-        return false;
-    if (token().type() != wxPluralFormsToken::T_SEMICOLON)
-        return false;
-    if (!nextToken())
-        return false;
-    if (token().type() != wxPluralFormsToken::T_EOF)
-        return false;
-    rCalculator.init(nplurals, plural);
-    return true;
-}
-
-wxPluralFormsNode* wxPluralFormsParser::parsePlural()
-{
-    wxPluralFormsNode* p = expression();
-    if (p == NULL)
-    {
-        return NULL;
-    }
-    wxPluralFormsNodePtr n(p);
-    if (token().type() != wxPluralFormsToken::T_SEMICOLON)
-    {
-        return NULL;
-    }
-    return n.release();
-}
-
-const wxPluralFormsToken& wxPluralFormsParser::token() const
-{
-    return m_scanner.token();
-}
-
-bool wxPluralFormsParser::nextToken()
-{
-    if (!m_scanner.nextToken())
-        return false;
-    return true;
-}
-
-wxPluralFormsNode* wxPluralFormsParser::expression()
-{
-    wxPluralFormsNode* p = logicalOrExpression();
-    if (p == NULL)
-        return NULL;
-    wxPluralFormsNodePtr n(p);
-    if (token().type() == wxPluralFormsToken::T_QUESTION)
-    {
-        wxPluralFormsNodePtr qn(new wxPluralFormsNode(token()));
-        if (!nextToken())
-        {
-            return 0;
-        }
-        p = expression();
-        if (p == 0)
-        {
-            return 0;
-        }
-        qn->setNode(1, p);
-        if (token().type() != wxPluralFormsToken::T_COLON)
-        {
-            return 0;
-        }
-        if (!nextToken())
-        {
-            return 0;
-        }
-        p = expression();
-        if (p == 0)
-        {
-            return 0;
-        }
-        qn->setNode(2, p);
-        qn->setNode(0, n.release());
-        return qn.release();
-    }
-    return n.release();
-}
-
-wxPluralFormsNode*wxPluralFormsParser::logicalOrExpression()
-{
-    wxPluralFormsNode* p = logicalAndExpression();
-    if (p == NULL)
-        return NULL;
-    wxPluralFormsNodePtr ln(p);
-    if (token().type() == wxPluralFormsToken::T_LOGICAL_OR)
-    {
-        wxPluralFormsNodePtr un(new wxPluralFormsNode(token()));
-        if (!nextToken())
-        {
-            return 0;
-        }
-        p = logicalOrExpression();
-        if (p == 0)
-        {
-            return 0;
-        }
-        wxPluralFormsNodePtr rn(p);    // right
-        if (rn->token().type() == wxPluralFormsToken::T_LOGICAL_OR)
-        {
-            // see logicalAndExpression comment
-            un->setNode(0, ln.release());
-            un->setNode(1, rn->releaseNode(0));
-            rn->setNode(0, un.release());
-            return rn.release();
-        }
-
-
-        un->setNode(0, ln.release());
-        un->setNode(1, rn.release());
-        return un.release();
-    }
-    return ln.release();
-}
-
-wxPluralFormsNode* wxPluralFormsParser::logicalAndExpression()
-{
-    wxPluralFormsNode* p = equalityExpression();
-    if (p == NULL)
-        return NULL;
-    wxPluralFormsNodePtr ln(p);   // left
-    if (token().type() == wxPluralFormsToken::T_LOGICAL_AND)
-    {
-        wxPluralFormsNodePtr un(new wxPluralFormsNode(token()));  // up
-        if (!nextToken())
-        {
-            return NULL;
-        }
-        p = logicalAndExpression();
-        if (p == 0)
-        {
-            return NULL;
-        }
-        wxPluralFormsNodePtr rn(p);    // right
-        if (rn->token().type() == wxPluralFormsToken::T_LOGICAL_AND)
-        {
-// transform 1 && (2 && 3) -> (1 && 2) && 3
-//     u                  r
-// l       r     ->   u      3
-//       2   3      l   2
-            un->setNode(0, ln.release());
-            un->setNode(1, rn->releaseNode(0));
-            rn->setNode(0, un.release());
-            return rn.release();
-        }
-
-        un->setNode(0, ln.release());
-        un->setNode(1, rn.release());
-        return un.release();
-    }
-    return ln.release();
-}
-
-wxPluralFormsNode* wxPluralFormsParser::equalityExpression()
-{
-    wxPluralFormsNode* p = relationalExpression();
-    if (p == NULL)
-        return NULL;
-    wxPluralFormsNodePtr n(p);
-    if (token().type() == wxPluralFormsToken::T_EQUAL
-        || token().type() == wxPluralFormsToken::T_NOT_EQUAL)
-    {
-        wxPluralFormsNodePtr qn(new wxPluralFormsNode(token()));
-        if (!nextToken())
-        {
-            return NULL;
-        }
-        p = relationalExpression();
-        if (p == NULL)
-        {
-            return NULL;
-        }
-        qn->setNode(1, p);
-        qn->setNode(0, n.release());
-        return qn.release();
-    }
-    return n.release();
-}
-
-wxPluralFormsNode* wxPluralFormsParser::relationalExpression()
-{
-    wxPluralFormsNode* p = multiplicativeExpression();
-    if (p == NULL)
-        return NULL;
-    wxPluralFormsNodePtr n(p);
-    if (token().type() == wxPluralFormsToken::T_GREATER
-            || token().type() == wxPluralFormsToken::T_LESS
-            || token().type() == wxPluralFormsToken::T_GREATER_OR_EQUAL
-            || token().type() == wxPluralFormsToken::T_LESS_OR_EQUAL)
-    {
-        wxPluralFormsNodePtr qn(new wxPluralFormsNode(token()));
-        if (!nextToken())
-        {
-            return NULL;
-        }
-        p = multiplicativeExpression();
-        if (p == NULL)
-        {
-            return NULL;
-        }
-        qn->setNode(1, p);
-        qn->setNode(0, n.release());
-        return qn.release();
-    }
-    return n.release();
-}
-
-wxPluralFormsNode* wxPluralFormsParser::multiplicativeExpression()
-{
-    wxPluralFormsNode* p = pmExpression();
-    if (p == NULL)
-        return NULL;
-    wxPluralFormsNodePtr n(p);
-    if (token().type() == wxPluralFormsToken::T_REMINDER)
-    {
-        wxPluralFormsNodePtr qn(new wxPluralFormsNode(token()));
-        if (!nextToken())
-        {
-            return NULL;
-        }
-        p = pmExpression();
-        if (p == NULL)
-        {
-            return NULL;
-        }
-        qn->setNode(1, p);
-        qn->setNode(0, n.release());
-        return qn.release();
-    }
-    return n.release();
-}
-
-wxPluralFormsNode* wxPluralFormsParser::pmExpression()
-{
-    wxPluralFormsNodePtr n;
-    if (token().type() == wxPluralFormsToken::T_N
-        || token().type() == wxPluralFormsToken::T_NUMBER)
-    {
-        n.reset(new wxPluralFormsNode(token()));
-        if (!nextToken())
-        {
-            return NULL;
-        }
-    }
-    else if (token().type() == wxPluralFormsToken::T_LEFT_BRACKET) {
-        if (!nextToken())
-        {
-            return NULL;
-        }
-        wxPluralFormsNode* p = expression();
-        if (p == NULL)
-        {
-            return NULL;
-        }
-        n.reset(p);
-        if (token().type() != wxPluralFormsToken::T_RIGHT_BRACKET)
-        {
-            return NULL;
-        }
-        if (!nextToken())
-        {
-            return NULL;
-        }
-    }
-    else
-    {
-        return NULL;
-    }
-    return n.release();
-}
-
-wxPluralFormsCalculator* wxPluralFormsCalculator::make(const char* s)
-{
-    wxPluralFormsCalculatorPtr calculator(new wxPluralFormsCalculator);
-    if (s != NULL)
-    {
-        wxPluralFormsScanner scanner(s);
-        wxPluralFormsParser p(scanner);
-        if (!p.parse(*calculator))
-        {
-            return NULL;
-        }
-    }
-    return calculator.release();
-}
-
-
-
-
-// ----------------------------------------------------------------------------
-// wxMsgCatalogFile corresponds to one disk-file message catalog.
-//
-// This is a "low-level" class and is used only by wxMsgCatalog
-// NOTE: for the documentation of the binary catalog (.MO) files refer to
-//       the GNU gettext manual:
-//       http://www.gnu.org/software/autoconf/manual/gettext/MO-Files.html
-// ----------------------------------------------------------------------------
-
-WX_DECLARE_EXPORTED_STRING_HASH_MAP(wxString, wxMessagesHash);
-
-class wxMsgCatalogFile
-{
-public:
-    // ctor & dtor
-    wxMsgCatalogFile();
-    ~wxMsgCatalogFile();
-
-    // load the catalog from disk
-    bool Load(const wxString& filename,
-              wxPluralFormsCalculatorPtr& rPluralFormsCalculator);
-
-    // fills the hash with string-translation pairs
-    bool FillHash(wxMessagesHash& hash, const wxString& msgIdCharset) const;
-
-    // return the charset of the strings in this catalog or empty string if
-    // none/unknown
-    wxString GetCharset() const { return m_charset; }
-
-private:
-    // this implementation is binary compatible with GNU gettext() version 0.10
-
-    // an entry in the string table
-    struct wxMsgTableEntry
-    {
-        size_t32   nLen;           // length of the string
-        size_t32   ofsString;      // pointer to the string
-    };
-
-    // header of a .mo file
-    struct wxMsgCatalogHeader
-    {
-        size_t32  magic,          // offset +00:  magic id
-                  revision,       //        +04:  revision
-                  numStrings;     //        +08:  number of strings in the file
-        size_t32  ofsOrigTable,   //        +0C:  start of original string table
-                  ofsTransTable;  //        +10:  start of translated string table
-        size_t32  nHashSize,      //        +14:  hash table size
-                  ofsHashTable;   //        +18:  offset of hash table start
-    };
-
-    // all data is stored here
-    wxMemoryBuffer m_data;
-
-    // data description
-    size_t32          m_numStrings;   // number of strings in this domain
-    wxMsgTableEntry  *m_pOrigTable,   // pointer to original   strings
-                     *m_pTransTable;  //            translated
-
-    wxString m_charset;               // from the message catalog header
-
-
-    // swap the 2 halves of 32 bit integer if needed
-    size_t32 Swap(size_t32 ui) const
-    {
-        return m_bSwapped ? (ui << 24) | ((ui & 0xff00) << 8) |
-                            ((ui >> 8) & 0xff00) | (ui >> 24)
-                            : ui;
-    }
-
-    // just return the pointer to the start of the data as "char *" to
-    // facilitate doing pointer arithmetic with it
-    char *StringData() const
-    {
-        return static_cast<char *>(m_data.GetData());
-    }
-
-    const char *StringAtOfs(wxMsgTableEntry *pTable, size_t32 n) const
-    {
-        const wxMsgTableEntry * const ent = pTable + n;
-
-        // this check could fail for a corrupt message catalog
-        size_t32 ofsString = Swap(ent->ofsString);
-        if ( ofsString + Swap(ent->nLen) > m_data.GetDataLen())
-        {
-            return NULL;
-        }
-
-        return StringData() + ofsString;
-    }
-
-    bool m_bSwapped;   // wrong endianness?
-
-    wxDECLARE_NO_COPY_CLASS(wxMsgCatalogFile);
-};
-
-
-// ----------------------------------------------------------------------------
-// wxMsgCatalog corresponds to one loaded message catalog.
-//
-// This is a "low-level" class and is used only by wxLocale (that's why
-// it's designed to be stored in a linked list)
-// ----------------------------------------------------------------------------
-
-class wxMsgCatalog
-{
-public:
-#if !wxUSE_UNICODE
-    wxMsgCatalog() { m_conv = NULL; }
-    ~wxMsgCatalog();
-#endif
-
-    // load the catalog from disk
-    bool Load(const wxString& filename,
-              const wxString& domain,
-              const wxString& msgIdCharset);
-
-    // get name of the catalog
-    wxString GetDomain() const { return m_domain; }
-
-    // get the translated string: returns NULL if not found
-    const wxString *GetString(const wxString& sz, size_t n = size_t(-1)) const;
-
-    // public variable pointing to the next element in a linked list (or NULL)
-    wxMsgCatalog *m_pNext;
-
-private:
-    wxMessagesHash  m_messages; // all messages in the catalog
-    wxString        m_domain;   // name of the domain
-
-#if !wxUSE_UNICODE
-    // the conversion corresponding to this catalog charset if we installed it
-    // as the global one
-    wxCSConv *m_conv;
-#endif
-
-    wxPluralFormsCalculatorPtr  m_pluralFormsCalculator;
-};
-
-
-// ============================================================================
-// implementation
-// ============================================================================
-
-// ----------------------------------------------------------------------------
-// wxLanguageInfo
-// ----------------------------------------------------------------------------
-
-#ifdef __WXMSW__
-
-// helper used by wxLanguageInfo::GetLocaleName() and elsewhere to determine
-// whether the locale is Unicode-only (it is if this function returns empty
-// string)
-static wxString wxGetANSICodePageForLocale(LCID lcid)
-{
-    wxString cp;
-
-    wxChar buffer[16];
-    if ( ::GetLocaleInfo(lcid, LOCALE_IDEFAULTANSICODEPAGE,
-                        buffer, WXSIZEOF(buffer)) > 0 )
-    {
-        if ( buffer[0] != wxT('0') || buffer[1] != wxT('\0') )
-            cp = buffer;
-        //else: this locale doesn't use ANSI code page
-    }
-
-    return cp;
-}
-
-wxUint32 wxLanguageInfo::GetLCID() const
-{
-    return MAKELCID(MAKELANGID(WinLang, WinSublang), SORT_DEFAULT);
-}
-
-wxString wxLanguageInfo::GetLocaleName() const
-{
-    wxString locale;
-
-    const LCID lcid = GetLCID();
-
-    wxChar buffer[256];
-    buffer[0] = wxT('\0');
-    if ( !::GetLocaleInfo(lcid, LOCALE_SENGLANGUAGE, buffer, WXSIZEOF(buffer)) )
-    {
-        wxLogLastError(wxT("GetLocaleInfo(LOCALE_SENGLANGUAGE)"));
-        return locale;
-    }
-
-    locale << buffer;
-    if ( ::GetLocaleInfo(lcid, LOCALE_SENGCOUNTRY,
-                        buffer, WXSIZEOF(buffer)) > 0 )
-    {
-        locale << wxT('_') << buffer;
-    }
-
-    const wxString cp = wxGetANSICodePageForLocale(lcid);
-    if ( !cp.empty() )
-    {
-        locale << wxT('.') << cp;
-    }
-
-    return locale;
-}
-
-#endif // __WXMSW__
-
-// ----------------------------------------------------------------------------
-// wxMsgCatalogFile clas
-// ----------------------------------------------------------------------------
-
-wxMsgCatalogFile::wxMsgCatalogFile()
-{
-}
-
-wxMsgCatalogFile::~wxMsgCatalogFile()
-{
-}
-
-// open disk file and read in it's contents
-bool wxMsgCatalogFile::Load(const wxString& filename,
-                            wxPluralFormsCalculatorPtr& rPluralFormsCalculator)
-{
-    wxFile fileMsg(filename);
-    if ( !fileMsg.IsOpened() )
-        return false;
-
-    // get the file size (assume it is less than 4Gb...)
-    wxFileOffset lenFile = fileMsg.Length();
-    if ( lenFile == wxInvalidOffset )
-        return false;
-
-    size_t nSize = wx_truncate_cast(size_t, lenFile);
-    wxASSERT_MSG( nSize == lenFile + size_t(0), wxS("message catalog bigger than 4GB?") );
-
-    // read the whole file in memory
-    if ( fileMsg.Read(m_data.GetWriteBuf(nSize), nSize) != lenFile )
-        return false;
-
-    m_data.UngetWriteBuf(nSize);
-
-
-    // examine header
-    bool bValid = m_data.GetDataLen() > sizeof(wxMsgCatalogHeader);
-
-    const wxMsgCatalogHeader *pHeader = (wxMsgCatalogHeader *)m_data.GetData();
-    if ( bValid ) {
-        // we'll have to swap all the integers if it's true
-        m_bSwapped = pHeader->magic == MSGCATALOG_MAGIC_SW;
-
-        // check the magic number
-        bValid = m_bSwapped || pHeader->magic == MSGCATALOG_MAGIC;
-    }
-
-    if ( !bValid ) {
-        // it's either too short or has incorrect magic number
-        wxLogWarning(_("'%s' is not a valid message catalog."), filename.c_str());
-
-        return false;
-    }
-
-    // initialize
-    m_numStrings  = Swap(pHeader->numStrings);
-    m_pOrigTable  = (wxMsgTableEntry *)(StringData() +
-                    Swap(pHeader->ofsOrigTable));
-    m_pTransTable = (wxMsgTableEntry *)(StringData() +
-                    Swap(pHeader->ofsTransTable));
-
-    // now parse catalog's header and try to extract catalog charset and
-    // plural forms formula from it:
-
-    const char* headerData = StringAtOfs(m_pOrigTable, 0);
-    if ( headerData && headerData[0] == '\0' )
-    {
-        // Extract the charset:
-        const char * const header = StringAtOfs(m_pTransTable, 0);
-        const char *
-            cset = strstr(header, "Content-Type: text/plain; charset=");
-        if ( cset )
-        {
-            cset += 34; // strlen("Content-Type: text/plain; charset=")
-
-            const char * const csetEnd = strchr(cset, '\n');
-            if ( csetEnd )
-            {
-                m_charset = wxString(cset, csetEnd - cset);
-                if ( m_charset == wxS("CHARSET") )
-                {
-                    // "CHARSET" is not valid charset, but lazy translator
-                    m_charset.empty();
-                }
-            }
-        }
-        // else: incorrectly filled Content-Type header
-
-        // Extract plural forms:
-        const char * plurals = strstr(header, "Plural-Forms:");
-        if ( plurals )
-        {
-            plurals += 13; // strlen("Plural-Forms:")
-            const char * const pluralsEnd = strchr(plurals, '\n');
-            if ( pluralsEnd )
-            {
-                const size_t pluralsLen = pluralsEnd - plurals;
-                wxCharBuffer buf(pluralsLen);
-                strncpy(buf.data(), plurals, pluralsLen);
-                wxPluralFormsCalculator * const
-                    pCalculator = wxPluralFormsCalculator::make(buf);
-                if ( pCalculator )
-                {
-                    rPluralFormsCalculator.reset(pCalculator);
-                }
-                else
-                {
-                    wxLogVerbose(_("Failed to parse Plural-Forms: '%s'"),
-                                 buf.data());
-                }
-            }
-        }
-
-        if ( !rPluralFormsCalculator.get() )
-            rPluralFormsCalculator.reset(wxPluralFormsCalculator::make());
-    }
-
-    // everything is fine
-    return true;
-}
-
-bool wxMsgCatalogFile::FillHash(wxMessagesHash& hash,
-                                const wxString& msgIdCharset) const
-{
-    wxUnusedVar(msgIdCharset); // silence warning in Unicode build
-
-    // conversion to use to convert catalog strings to the GUI encoding
-    wxMBConv *inputConv = NULL;
-    wxMBConv *inputConvPtr = NULL; // same as inputConv but safely deleteable
-
-    if ( !m_charset.empty() )
-    {
-#if !wxUSE_UNICODE && wxUSE_FONTMAP
-        // determine if we need any conversion at all
-        wxFontEncoding encCat = wxFontMapperBase::GetEncodingFromName(m_charset);
-        if ( encCat != wxLocale::GetSystemEncoding() )
-#endif
-        {
-            inputConvPtr =
-            inputConv = new wxCSConv(m_charset);
-        }
-    }
-    else // no need or not possible to convert the encoding
-    {
-#if wxUSE_UNICODE
-        // we must somehow convert the narrow strings in the message catalog to
-        // wide strings, so use the default conversion if we have no charset
-        inputConv = wxConvCurrent;
-#endif
-    }
-
-#if !wxUSE_UNICODE
-    // conversion to apply to msgid strings before looking them up: we only
-    // need it if the msgids are neither in 7 bit ASCII nor in the same
-    // encoding as the catalog
-    wxCSConv *sourceConv = msgIdCharset.empty() || (msgIdCharset == m_charset)
-                            ? NULL
-                            : new wxCSConv(msgIdCharset);
-#endif // !wxUSE_UNICODE
-
-    for (size_t32 i = 0; i < m_numStrings; i++)
-    {
-        const char *data = StringAtOfs(m_pOrigTable, i);
-        if (!data)
-            return false; // may happen for invalid MO files
-
-        wxString msgid;
-#if wxUSE_UNICODE
-        msgid = wxString(data, *inputConv);
-#else // ASCII
-        if ( inputConv && sourceConv )
-            msgid = wxString(inputConv->cMB2WC(data), *sourceConv);
-        else
-            msgid = data;
-#endif // wxUSE_UNICODE
-
-        data = StringAtOfs(m_pTransTable, i);
-        if (!data)
-            return false; // may happen for invalid MO files
-
-        size_t length = Swap(m_pTransTable[i].nLen);
-        size_t offset = 0;
-        size_t index = 0;
-        while (offset < length)
-        {
-            const char * const str = data + offset;
-
-            wxString msgstr;
-#if wxUSE_UNICODE
-            msgstr = wxString(str, *inputConv);
-#else
-            if ( inputConv )
-                msgstr = wxString(inputConv->cMB2WC(str), *wxConvUI);
-            else
-                msgstr = str;
-#endif // wxUSE_UNICODE/!wxUSE_UNICODE
-
-            if ( !msgstr.empty() )
-            {
-                hash[index == 0 ? msgid : msgid + wxChar(index)] = msgstr;
-            }
-
-            // skip this string
-            // IMPORTANT: accesses to the 'data' pointer are valid only for
-            //            the first 'length+1' bytes (GNU specs says that the
-            //            final NUL is not counted in length); using wxStrnlen()
-            //            we make sure we don't access memory beyond the valid range
-            //            (which otherwise may happen for invalid MO files):
-            offset += wxStrnlen(str, length - offset) + 1;
-            ++index;
-        }
-    }
-
-#if !wxUSE_UNICODE
-    delete sourceConv;
-#endif
-    delete inputConvPtr;
-
-    return true;
-}
-
-
-// ----------------------------------------------------------------------------
-// wxMsgCatalog class
-// ----------------------------------------------------------------------------
-
-#if !wxUSE_UNICODE
-wxMsgCatalog::~wxMsgCatalog()
-{
-    if ( m_conv )
-    {
-        if ( wxConvUI == m_conv )
-        {
-            // we only change wxConvUI if it points to wxConvLocal so we reset
-            // it back to it too
-            wxConvUI = &wxConvLocal;
-        }
-
-        delete m_conv;
-    }
-}
-#endif // !wxUSE_UNICODE
-
-bool wxMsgCatalog::Load(const wxString& filename,
-                        const wxString& domain,
-                        const wxString& msgIdCharset)
-{
-    wxMsgCatalogFile file;
-
-    m_domain = domain;
-
-    if ( !file.Load(filename, m_pluralFormsCalculator) )
-        return false;
-
-    if ( !file.FillHash(m_messages, msgIdCharset) )
-        return false;
-
-    return true;
-}
-
-const wxString *wxMsgCatalog::GetString(const wxString& str, size_t n) const
-{
-    int index = 0;
-    if (n != size_t(-1))
-    {
-        index = m_pluralFormsCalculator->evaluate(n);
-    }
-    wxMessagesHash::const_iterator i;
-    if (index != 0)
-    {
-        i = m_messages.find(wxString(str) + wxChar(index));   // plural
-    }
-    else
-    {
-        i = m_messages.find(str);
-    }
-
-    if ( i != m_messages.end() )
-    {
-        return &i->second;
-    }
-    else
-        return NULL;
-}
-
-
-// ----------------------------------------------------------------------------
-// wxTranslations
-// ----------------------------------------------------------------------------
-
-namespace
-{
-
-wxTranslations *gs_translations = NULL;
-bool gs_translationsOwned = false;
-
-} // anonymous namespace
-
-
-/*static*/
-wxTranslations *wxTranslations::Get()
-{
-    return gs_translations;
-}
-
-/*static*/
-void wxTranslations::Set(wxTranslations *t)
-{
-    if ( gs_translationsOwned )
-        delete gs_translations;
-    gs_translations = t;
-    gs_translationsOwned = true;
-}
-
-/*static*/
-void wxTranslations::SetNonOwned(wxTranslations *t)
-{
-    if ( gs_translationsOwned )
-        delete gs_translations;
-    gs_translations = t;
-    gs_translationsOwned = false;
-}
-
-
-wxTranslations::wxTranslations()
-{
-    m_pMsgCat = NULL;
-    m_loader = new wxFileTranslationsLoader;
-}
-
-
-wxTranslations::~wxTranslations()
-{
-    delete m_loader;
-
-    // free catalogs memory
-    wxMsgCatalog *pTmpCat;
-    while ( m_pMsgCat != NULL )
-    {
-        pTmpCat = m_pMsgCat;
-        m_pMsgCat = m_pMsgCat->m_pNext;
-        delete pTmpCat;
-    }
-}
-
-
-void wxTranslations::SetLoader(wxTranslationsLoader *loader)
-{
-    wxCHECK_RET( loader, "loader can't be NULL" );
-
-    delete m_loader;
-    m_loader = loader;
-}
-
-
-void wxTranslations::SetLanguage(wxLanguage lang)
-{
-    if ( lang == wxLANGUAGE_DEFAULT )
-        SetLanguage("");
-    else
-        SetLanguage(wxLocale::GetLanguageCanonicalName(lang));
-}
-
-void wxTranslations::SetLanguage(const wxString& lang)
-{
-    m_lang = lang;
-}
-
-
-bool wxTranslations::AddStdCatalog()
-{
-    if ( !AddCatalog(wxS("wxstd")) )
-        return false;
-
-    // there may be a catalog with toolkit specific overrides, it is not
-    // an error if this does not exist
-    wxString port(wxPlatformInfo::Get().GetPortIdName());
-    if ( !port.empty() )
-    {
-        AddCatalog(port.BeforeFirst(wxS('/')).MakeLower());
-    }
-
-    return true;
-}
-
-
-bool wxTranslations::AddCatalog(const wxString& domain)
-{
-    return AddCatalog(domain, wxLANGUAGE_ENGLISH_US);
-}
-
-#if !wxUSE_UNICODE
-bool wxTranslations::AddCatalog(const wxString& domain,
-                                wxLanguage msgIdLanguage,
-                                const wxString& msgIdCharset)
-{
-    m_msgIdCharset[domain] = msgIdCharset;
-    return AddCatalog(domain, msgIdLanguage);
-}
-#endif // !wxUSE_UNICODE
-
-bool wxTranslations::AddCatalog(const wxString& domain,
-                                wxLanguage msgIdLanguage)
-{
-    const wxString msgIdLang = wxLocale::GetLanguageCanonicalName(msgIdLanguage);
-    const wxString domain_lang = ChooseLanguageForDomain(domain, msgIdLang);
-
-    if ( domain_lang.empty() )
-    {
-        wxLogTrace(TRACE_I18N,
-                    wxS("no suitable translation for domain '%s' found"),
-                    domain);
-        return false;
-    }
-
-    wxLogTrace(TRACE_I18N,
-                wxS("adding '%s' translation for domain '%s' (msgid language '%s')"),
-                domain_lang, domain, msgIdLang);
-
-    // It is OK to not load catalog if the msgid language and m_language match,
-    // in which case we can directly display the texts embedded in program's
-    // source code:
-    if ( msgIdLang == domain_lang )
-        return true;
-
-    wxCHECK_MSG( m_loader, false, "loader can't be NULL" );
-    return m_loader->LoadCatalog(this, domain, domain_lang);
-}
-
-
-// check if the given catalog is loaded
-bool wxTranslations::IsLoaded(const wxString& domain) const
-{
-    return FindCatalog(domain) != NULL;
-}
-
-
-bool wxTranslations::LoadCatalogFile(const wxString& filename,
-                                     const wxString& domain)
-{
-    wxMsgCatalog *pMsgCat = new wxMsgCatalog;
-
-#if wxUSE_UNICODE
-    const bool ok = pMsgCat->Load(filename, domain, wxEmptyString/*unused*/);
-#else
-    const bool ok = pMsgCat->Load(filename, domain,
-                                  m_msgIdCharset[domain]);
-#endif
-
-    if ( !ok )
-    {
-        // don't add it because it couldn't be loaded anyway
-        delete pMsgCat;
-        return false;
-    }
-
-    // add it to the head of the list so that in GetString it will
-    // be searched before the catalogs added earlier
-    pMsgCat->m_pNext = m_pMsgCat;
-    m_pMsgCat = pMsgCat;
-
-    return true;
-}
-
-
-wxString wxTranslations::ChooseLanguageForDomain(const wxString& WXUNUSED(domain),
-                                                 const wxString& WXUNUSED(msgIdLang))
-{
-    // explicitly set language should always be respected
-    if ( !m_lang.empty() )
-        return m_lang;
-
-    // TODO: if the default language is used, pick the best (by comparing
-    //       available languages with user's preferences), instead of blindly
-    //       trusting availability of system language translation
-    return wxLocale::GetLanguageCanonicalName(wxLocale::GetSystemLanguage());
-}
-
-
-namespace
-{
-WX_DECLARE_HASH_SET(wxString, wxStringHash, wxStringEqual,
-                    wxLocaleUntranslatedStrings);
-}
-
-/* static */
-const wxString& wxTranslations::GetUntranslatedString(const wxString& str)
-{
-    static wxLocaleUntranslatedStrings s_strings;
-
-    wxLocaleUntranslatedStrings::iterator i = s_strings.find(str);
-    if ( i == s_strings.end() )
-        return *s_strings.insert(str).first;
-
-    return *i;
-}
-
-
-const wxString& wxTranslations::GetString(const wxString& origString,
-                                          const wxString& domain) const
-{
-    return GetString(origString, origString, size_t(-1), domain);
-}
-
-const wxString& wxTranslations::GetString(const wxString& origString,
-                                          const wxString& origString2,
-                                          size_t n,
-                                          const wxString& domain) const
-{
-    if ( origString.empty() )
-        return GetUntranslatedString(origString);
-
-    const wxString *trans = NULL;
-    wxMsgCatalog *pMsgCat;
-
-    if ( !domain.empty() )
-    {
-        pMsgCat = FindCatalog(domain);
-
-        // does the catalog exist?
-        if ( pMsgCat != NULL )
-            trans = pMsgCat->GetString(origString, n);
-    }
-    else
-    {
-        // search in all domains
-        for ( pMsgCat = m_pMsgCat; pMsgCat != NULL; pMsgCat = pMsgCat->m_pNext )
-        {
-            trans = pMsgCat->GetString(origString, n);
-            if ( trans != NULL )   // take the first found
-                break;
-        }
-    }
-
-    if ( trans == NULL )
-    {
-        wxLogTrace
-        (
-            TRACE_I18N,
-            "string \"%s\"%s not found in %slocale '%s'.",
-            origString,
-            ((long)n) != -1 ? wxString::Format("[%ld]", (long)n) : wxString(),
-            !domain.empty() ? wxString::Format("domain '%s' ", domain) : wxString(),
-            m_lang
-        );
-
-        if (n == size_t(-1))
-            return GetUntranslatedString(origString);
-        else
-            return GetUntranslatedString(n == 1 ? origString : origString2);
-    }
-
-    return *trans;
-}
-
-
-wxString wxTranslations::GetHeaderValue(const wxString& header,
-                                        const wxString& domain) const
-{
-    if ( header.empty() )
-        return wxEmptyString;
-
-    const wxString *trans = NULL;
-    wxMsgCatalog *pMsgCat;
-
-    if ( !domain.empty() )
-    {
-        pMsgCat = FindCatalog(domain);
-
-        // does the catalog exist?
-        if ( pMsgCat == NULL )
-            return wxEmptyString;
-
-        trans = pMsgCat->GetString(wxEmptyString, (size_t)-1);
-    }
-    else
-    {
-        // search in all domains
-        for ( pMsgCat = m_pMsgCat; pMsgCat != NULL; pMsgCat = pMsgCat->m_pNext )
-        {
-            trans = pMsgCat->GetString(wxEmptyString, (size_t)-1);
-            if ( trans != NULL )   // take the first found
-                break;
-        }
-    }
-
-    if ( !trans || trans->empty() )
-        return wxEmptyString;
-
-    size_t found = trans->find(header);
-    if ( found == wxString::npos )
-        return wxEmptyString;
-
-    found += header.length() + 2 /* ': ' */;
-
-    // Every header is separated by \n
-
-    size_t endLine = trans->find(wxS('\n'), found);
-    size_t len = (endLine == wxString::npos) ?
-                wxString::npos : (endLine - found);
-
-    return trans->substr(found, len);
-}
-
-
-// find catalog by name in a linked list, return NULL if !found
-wxMsgCatalog *wxTranslations::FindCatalog(const wxString& domain) const
-{
-    // linear search in the linked list
-    wxMsgCatalog *pMsgCat;
-    for ( pMsgCat = m_pMsgCat; pMsgCat != NULL; pMsgCat = pMsgCat->m_pNext )
-    {
-        if ( pMsgCat->GetDomain() == domain )
-            return pMsgCat;
-    }
-
-    return NULL;
-}
-
-// ----------------------------------------------------------------------------
-// wxFileTranslationsLoader
+// global functions
 // ----------------------------------------------------------------------------
 
+static wxLocale *wxSetLocale(wxLocale *pLocale);
+
 namespace
 {
 
-// the list of the directories to search for message catalog files
-wxArrayString gs_searchPrefixes;
-
-// return the directories to search for message catalogs under the given
-// prefix, separated by wxPATH_SEP
-wxString GetMsgCatalogSubdirs(const wxString& prefix, const wxString& lang)
+// get just the language part
+inline wxString ExtractLang(const wxString& langFull)
 {
-    // Search first in Unix-standard prefix/lang/LC_MESSAGES, then in
-    // prefix/lang and finally in just prefix.
-    //
-    // Note that we use LC_MESSAGES on all platforms and not just Unix, because
-    // it doesn't cost much to look into one more directory and doing it this
-    // way has two important benefits:
-    // a) we don't break compatibility with wx-2.6 and older by stopping to
-    //    look in a directory where the catalogs used to be and thus silently
-    //    breaking apps after they are recompiled against the latest wx
-    // b) it makes it possible to package app's support files in the same
-    //    way on all target platforms
-    const wxString pathPrefix = wxFileName(prefix, lang).GetFullPath();
-
-    wxString searchPath;
-    searchPath.reserve(4*pathPrefix.length());
-    searchPath << pathPrefix << wxFILE_SEP_PATH << "LC_MESSAGES" << wxPATH_SEP
-            << prefix << wxFILE_SEP_PATH << wxPATH_SEP
-            << pathPrefix;
-
-    return searchPath;
+    return langFull.Left(LEN_LANG);
 }
 
-// construct the search path for the given language
-static wxString GetFullSearchPath(const wxString& lang)
-{
-    // first take the entries explicitly added by the program
-    wxArrayString paths;
-    paths.reserve(gs_searchPrefixes.size() + 1);
-    size_t n,
-        count = gs_searchPrefixes.size();
-    for ( n = 0; n < count; n++ )
-    {
-        paths.Add(GetMsgCatalogSubdirs(gs_searchPrefixes[n], lang));
-    }
+// helper functions of GetSystemLanguage()
+#ifdef __UNIX__
 
+// get everything else (including the leading '_')
+inline wxString ExtractNotLang(const wxString& langFull)
+{
+    return langFull.Mid(LEN_LANG);
+}
 
-#if wxUSE_STDPATHS
-    // then look in the standard location
-    const wxString stdp = wxStandardPaths::Get().
-        GetLocalizedResourcesDir(lang, wxStandardPaths::ResourceCat_Messages);
+#endif // __UNIX__
 
-    if ( paths.Index(stdp) == wxNOT_FOUND )
-        paths.Add(stdp);
-#endif // wxUSE_STDPATHS
+} // anonymous namespace
 
-    // last look in default locations
-#ifdef __UNIX__
-    // LC_PATH is a standard env var containing the search path for the .mo
-    // files
-    const char *pszLcPath = wxGetenv("LC_PATH");
-    if ( pszLcPath )
-    {
-        const wxString lcp = GetMsgCatalogSubdirs(pszLcPath, lang);
-        if ( paths.Index(lcp) == wxNOT_FOUND )
-            paths.Add(lcp);
-    }
+// ----------------------------------------------------------------------------
+// wxLanguageInfo
+// ----------------------------------------------------------------------------
 
-    // also add the one from where wxWin was installed:
-    wxString wxp = wxGetInstallPrefix();
-    if ( !wxp.empty() )
-    {
-        wxp = GetMsgCatalogSubdirs(wxp + wxS("/share/locale"), lang);
-        if ( paths.Index(wxp) == wxNOT_FOUND )
-            paths.Add(wxp);
-    }
-#endif // __UNIX__
+#ifdef __WXMSW__
 
+// helper used by wxLanguageInfo::GetLocaleName() and elsewhere to determine
+// whether the locale is Unicode-only (it is if this function returns empty
+// string)
+static wxString wxGetANSICodePageForLocale(LCID lcid)
+{
+    wxString cp;
 
-    // finally construct the full search path
-    wxString searchPath;
-    searchPath.reserve(500);
-    count = paths.size();
-    for ( n = 0; n < count; n++ )
+    wxChar buffer[16];
+    if ( ::GetLocaleInfo(lcid, LOCALE_IDEFAULTANSICODEPAGE,
+                        buffer, WXSIZEOF(buffer)) > 0 )
     {
-        searchPath += paths[n];
-        if ( n != count - 1 )
-            searchPath += wxPATH_SEP;
+        if ( buffer[0] != wxT('0') || buffer[1] != wxT('\0') )
+            cp = buffer;
+        //else: this locale doesn't use ANSI code page
     }
 
-    return searchPath;
+    return cp;
 }
 
-} // anonymous namespace
-
-
-void wxFileTranslationsLoader::AddCatalogLookupPathPrefix(const wxString& prefix)
+wxUint32 wxLanguageInfo::GetLCID() const
 {
-    if ( gs_searchPrefixes.Index(prefix) == wxNOT_FOUND )
-    {
-        gs_searchPrefixes.Add(prefix);
-    }
-    //else: already have it
+    return MAKELCID(MAKELANGID(WinLang, WinSublang), SORT_DEFAULT);
 }
 
-
-bool wxFileTranslationsLoader::LoadCatalog(wxTranslations *translations,
-                                           const wxString& domain,
-                                           const wxString& lang)
+wxString wxLanguageInfo::GetLocaleName() const
 {
-    wxCHECK_MSG( lang.length() >= LEN_LANG, false,
-                 "invalid language specification" );
+    wxString locale;
 
-    wxString searchPath;
+    const LCID lcid = GetLCID();
 
-#if wxUSE_FONTMAP
-    // first look for the catalog for this language and the current locale:
-    // notice that we don't use the system name for the locale as this would
-    // force us to install catalogs in different locations depending on the
-    // system but always use the canonical name
-    wxFontEncoding encSys = wxLocale::GetSystemEncoding();
-    if ( encSys != wxFONTENCODING_SYSTEM )
+    wxChar buffer[256];
+    buffer[0] = wxT('\0');
+    if ( !::GetLocaleInfo(lcid, LOCALE_SENGLANGUAGE, buffer, WXSIZEOF(buffer)) )
     {
-        wxString fullname(lang);
-        fullname << wxS('.') << wxFontMapperBase::GetEncodingName(encSys);
-        searchPath << GetFullSearchPath(fullname) << wxPATH_SEP;
+        wxLogLastError(wxT("GetLocaleInfo(LOCALE_SENGLANGUAGE)"));
+        return locale;
     }
-#endif // wxUSE_FONTMAP
 
-    searchPath += GetFullSearchPath(lang);
-    if ( lang.length() > LEN_LANG && lang[LEN_LANG] == wxS('_') )
+    locale << buffer;
+    if ( ::GetLocaleInfo(lcid, LOCALE_SENGCOUNTRY,
+                        buffer, WXSIZEOF(buffer)) > 0 )
     {
-        // also add just base locale name: for things like "fr_BE" (Belgium
-        // French) we should use fall back on plain "fr" if no Belgium-specific
-        // message catalogs exist
-        searchPath << wxPATH_SEP
-                    << GetFullSearchPath(ExtractLang(lang));
+        locale << wxT('_') << buffer;
     }
 
-    wxLogTrace(TRACE_I18N, wxS("Looking for \"%s.mo\" in search path \"%s\""),
-                domain, searchPath);
-
-    wxFileName fn(domain);
-    fn.SetExt(wxS("mo"));
-
-    wxString strFullName;
-    if ( !wxFindFileInPath(&strFullName, searchPath, fn.GetFullPath()) )
+    const wxString cp = wxGetANSICodePageForLocale(lcid);
+    if ( !cp.empty() )
     {
-        wxLogVerbose(_("catalog file for domain '%s' not found."), domain);
-        wxLogTrace(TRACE_I18N, wxS("Catalog \"%s.mo\" not found"), domain);
-        return false;
+        locale << wxT('.') << cp;
     }
 
-    // open file and read its data
-    wxLogVerbose(_("using catalog '%s' from '%s'."), domain, strFullName.c_str());
-    wxLogTrace(TRACE_I18N, wxS("Using catalog \"%s\"."), strFullName.c_str());
-
-    return translations->LoadCatalogFile(strFullName, domain);
+    return locale;
 }
 
+#endif // __WXMSW__
 
 // ----------------------------------------------------------------------------
 // wxLocale
@@ -3304,772 +1660,10 @@ class wxLocaleModule: public wxModule
 
         void OnExit()
         {
-            if ( gs_translationsOwned )
-                delete gs_translations;
-            gs_translations = NULL;
-            gs_translationsOwned = true;
-
             wxLocale::DestroyLanguagesDB();
         }
 };
 
 IMPLEMENT_DYNAMIC_CLASS(wxLocaleModule, wxModule)
 
-
-
-// ----------------------------------------------------------------------------
-// default languages table & initialization
-// ----------------------------------------------------------------------------
-
-
-// --- --- --- generated code begins here --- --- ---
-
-// This table is generated by misc/languages/genlang.py
-// When making changes, please put them into misc/languages/langtabl.txt
-
-#if !defined(__WIN32__) || defined(__WXMICROWIN__)
-
-#define SETWINLANG(info,lang,sublang)
-
-#else
-
-#define SETWINLANG(info,lang,sublang) \
-    info.WinLang = lang, info.WinSublang = sublang;
-
-#ifndef LANG_AFRIKAANS
-#define LANG_AFRIKAANS (0)
-#endif
-#ifndef LANG_ALBANIAN
-#define LANG_ALBANIAN (0)
-#endif
-#ifndef LANG_ARABIC
-#define LANG_ARABIC (0)
-#endif
-#ifndef LANG_ARMENIAN
-#define LANG_ARMENIAN (0)
-#endif
-#ifndef LANG_ASSAMESE
-#define LANG_ASSAMESE (0)
-#endif
-#ifndef LANG_AZERI
-#define LANG_AZERI (0)
-#endif
-#ifndef LANG_BASQUE
-#define LANG_BASQUE (0)
-#endif
-#ifndef LANG_BELARUSIAN
-#define LANG_BELARUSIAN (0)
-#endif
-#ifndef LANG_BENGALI
-#define LANG_BENGALI (0)
-#endif
-#ifndef LANG_BULGARIAN
-#define LANG_BULGARIAN (0)
-#endif
-#ifndef LANG_CATALAN
-#define LANG_CATALAN (0)
-#endif
-#ifndef LANG_CHINESE
-#define LANG_CHINESE (0)
-#endif
-#ifndef LANG_CROATIAN
-#define LANG_CROATIAN (0)
-#endif
-#ifndef LANG_CZECH
-#define LANG_CZECH (0)
-#endif
-#ifndef LANG_DANISH
-#define LANG_DANISH (0)
-#endif
-#ifndef LANG_DUTCH
-#define LANG_DUTCH (0)
-#endif
-#ifndef LANG_ENGLISH
-#define LANG_ENGLISH (0)
-#endif
-#ifndef LANG_ESTONIAN
-#define LANG_ESTONIAN (0)
-#endif
-#ifndef LANG_FAEROESE
-#define LANG_FAEROESE (0)
-#endif
-#ifndef LANG_FARSI
-#define LANG_FARSI (0)
-#endif
-#ifndef LANG_FINNISH
-#define LANG_FINNISH (0)
-#endif
-#ifndef LANG_FRENCH
-#define LANG_FRENCH (0)
-#endif
-#ifndef LANG_GEORGIAN
-#define LANG_GEORGIAN (0)
-#endif
-#ifndef LANG_GERMAN
-#define LANG_GERMAN (0)
-#endif
-#ifndef LANG_GREEK
-#define LANG_GREEK (0)
-#endif
-#ifndef LANG_GUJARATI
-#define LANG_GUJARATI (0)
-#endif
-#ifndef LANG_HEBREW
-#define LANG_HEBREW (0)
-#endif
-#ifndef LANG_HINDI
-#define LANG_HINDI (0)
-#endif
-#ifndef LANG_HUNGARIAN
-#define LANG_HUNGARIAN (0)
-#endif
-#ifndef LANG_ICELANDIC
-#define LANG_ICELANDIC (0)
-#endif
-#ifndef LANG_INDONESIAN
-#define LANG_INDONESIAN (0)
-#endif
-#ifndef LANG_ITALIAN
-#define LANG_ITALIAN (0)
-#endif
-#ifndef LANG_JAPANESE
-#define LANG_JAPANESE (0)
-#endif
-#ifndef LANG_KANNADA
-#define LANG_KANNADA (0)
-#endif
-#ifndef LANG_KASHMIRI
-#define LANG_KASHMIRI (0)
-#endif
-#ifndef LANG_KAZAK
-#define LANG_KAZAK (0)
-#endif
-#ifndef LANG_KONKANI
-#define LANG_KONKANI (0)
-#endif
-#ifndef LANG_KOREAN
-#define LANG_KOREAN (0)
-#endif
-#ifndef LANG_LATVIAN
-#define LANG_LATVIAN (0)
-#endif
-#ifndef LANG_LITHUANIAN
-#define LANG_LITHUANIAN (0)
-#endif
-#ifndef LANG_MACEDONIAN
-#define LANG_MACEDONIAN (0)
-#endif
-#ifndef LANG_MALAY
-#define LANG_MALAY (0)
-#endif
-#ifndef LANG_MALAYALAM
-#define LANG_MALAYALAM (0)
-#endif
-#ifndef LANG_MANIPURI
-#define LANG_MANIPURI (0)
-#endif
-#ifndef LANG_MARATHI
-#define LANG_MARATHI (0)
-#endif
-#ifndef LANG_NEPALI
-#define LANG_NEPALI (0)
-#endif
-#ifndef LANG_NORWEGIAN
-#define LANG_NORWEGIAN (0)
-#endif
-#ifndef LANG_ORIYA
-#define LANG_ORIYA (0)
-#endif
-#ifndef LANG_POLISH
-#define LANG_POLISH (0)
-#endif
-#ifndef LANG_PORTUGUESE
-#define LANG_PORTUGUESE (0)
-#endif
-#ifndef LANG_PUNJABI
-#define LANG_PUNJABI (0)
-#endif
-#ifndef LANG_ROMANIAN
-#define LANG_ROMANIAN (0)
-#endif
-#ifndef LANG_RUSSIAN
-#define LANG_RUSSIAN (0)
-#endif
-#ifndef LANG_SAMI
-#define LANG_SAMI (0)
-#endif
-#ifndef LANG_SANSKRIT
-#define LANG_SANSKRIT (0)
-#endif
-#ifndef LANG_SERBIAN
-#define LANG_SERBIAN (0)
-#endif
-#ifndef LANG_SINDHI
-#define LANG_SINDHI (0)
-#endif
-#ifndef LANG_SLOVAK
-#define LANG_SLOVAK (0)
-#endif
-#ifndef LANG_SLOVENIAN
-#define LANG_SLOVENIAN (0)
-#endif
-#ifndef LANG_SPANISH
-#define LANG_SPANISH (0)
-#endif
-#ifndef LANG_SWAHILI
-#define LANG_SWAHILI (0)
-#endif
-#ifndef LANG_SWEDISH
-#define LANG_SWEDISH (0)
-#endif
-#ifndef LANG_TAMIL
-#define LANG_TAMIL (0)
-#endif
-#ifndef LANG_TATAR
-#define LANG_TATAR (0)
-#endif
-#ifndef LANG_TELUGU
-#define LANG_TELUGU (0)
-#endif
-#ifndef LANG_THAI
-#define LANG_THAI (0)
-#endif
-#ifndef LANG_TURKISH
-#define LANG_TURKISH (0)
-#endif
-#ifndef LANG_UKRAINIAN
-#define LANG_UKRAINIAN (0)
-#endif
-#ifndef LANG_URDU
-#define LANG_URDU (0)
-#endif
-#ifndef LANG_UZBEK
-#define LANG_UZBEK (0)
-#endif
-#ifndef LANG_VIETNAMESE
-#define LANG_VIETNAMESE (0)
-#endif
-#ifndef SUBLANG_ARABIC_ALGERIA
-#define SUBLANG_ARABIC_ALGERIA SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ARABIC_BAHRAIN
-#define SUBLANG_ARABIC_BAHRAIN SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ARABIC_EGYPT
-#define SUBLANG_ARABIC_EGYPT SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ARABIC_IRAQ
-#define SUBLANG_ARABIC_IRAQ SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ARABIC_JORDAN
-#define SUBLANG_ARABIC_JORDAN SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ARABIC_KUWAIT
-#define SUBLANG_ARABIC_KUWAIT SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ARABIC_LEBANON
-#define SUBLANG_ARABIC_LEBANON SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ARABIC_LIBYA
-#define SUBLANG_ARABIC_LIBYA SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ARABIC_MOROCCO
-#define SUBLANG_ARABIC_MOROCCO SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ARABIC_OMAN
-#define SUBLANG_ARABIC_OMAN SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ARABIC_QATAR
-#define SUBLANG_ARABIC_QATAR SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ARABIC_SAUDI_ARABIA
-#define SUBLANG_ARABIC_SAUDI_ARABIA SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ARABIC_SYRIA
-#define SUBLANG_ARABIC_SYRIA SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ARABIC_TUNISIA
-#define SUBLANG_ARABIC_TUNISIA SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ARABIC_UAE
-#define SUBLANG_ARABIC_UAE SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ARABIC_YEMEN
-#define SUBLANG_ARABIC_YEMEN SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_AZERI_CYRILLIC
-#define SUBLANG_AZERI_CYRILLIC SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_AZERI_LATIN
-#define SUBLANG_AZERI_LATIN SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_CHINESE_SIMPLIFIED
-#define SUBLANG_CHINESE_SIMPLIFIED SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_CHINESE_TRADITIONAL
-#define SUBLANG_CHINESE_TRADITIONAL SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_CHINESE_HONGKONG
-#define SUBLANG_CHINESE_HONGKONG SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_CHINESE_MACAU
-#define SUBLANG_CHINESE_MACAU SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_CHINESE_SINGAPORE
-#define SUBLANG_CHINESE_SINGAPORE SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_DUTCH
-#define SUBLANG_DUTCH SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_DUTCH_BELGIAN
-#define SUBLANG_DUTCH_BELGIAN SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ENGLISH_UK
-#define SUBLANG_ENGLISH_UK SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ENGLISH_US
-#define SUBLANG_ENGLISH_US SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ENGLISH_AUS
-#define SUBLANG_ENGLISH_AUS SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ENGLISH_BELIZE
-#define SUBLANG_ENGLISH_BELIZE SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ENGLISH_CAN
-#define SUBLANG_ENGLISH_CAN SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ENGLISH_CARIBBEAN
-#define SUBLANG_ENGLISH_CARIBBEAN SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ENGLISH_EIRE
-#define SUBLANG_ENGLISH_EIRE SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ENGLISH_JAMAICA
-#define SUBLANG_ENGLISH_JAMAICA SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ENGLISH_NZ
-#define SUBLANG_ENGLISH_NZ SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ENGLISH_PHILIPPINES
-#define SUBLANG_ENGLISH_PHILIPPINES SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ENGLISH_SOUTH_AFRICA
-#define SUBLANG_ENGLISH_SOUTH_AFRICA SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ENGLISH_TRINIDAD
-#define SUBLANG_ENGLISH_TRINIDAD SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ENGLISH_ZIMBABWE
-#define SUBLANG_ENGLISH_ZIMBABWE SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_FRENCH
-#define SUBLANG_FRENCH SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_FRENCH_BELGIAN
-#define SUBLANG_FRENCH_BELGIAN SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_FRENCH_CANADIAN
-#define SUBLANG_FRENCH_CANADIAN SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_FRENCH_LUXEMBOURG
-#define SUBLANG_FRENCH_LUXEMBOURG SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_FRENCH_MONACO
-#define SUBLANG_FRENCH_MONACO SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_FRENCH_SWISS
-#define SUBLANG_FRENCH_SWISS SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_GERMAN
-#define SUBLANG_GERMAN SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_GERMAN_AUSTRIAN
-#define SUBLANG_GERMAN_AUSTRIAN SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_GERMAN_LIECHTENSTEIN
-#define SUBLANG_GERMAN_LIECHTENSTEIN SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_GERMAN_LUXEMBOURG
-#define SUBLANG_GERMAN_LUXEMBOURG SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_GERMAN_SWISS
-#define SUBLANG_GERMAN_SWISS SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ITALIAN
-#define SUBLANG_ITALIAN SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_ITALIAN_SWISS
-#define SUBLANG_ITALIAN_SWISS SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_KASHMIRI_INDIA
-#define SUBLANG_KASHMIRI_INDIA SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_KOREAN
-#define SUBLANG_KOREAN SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_LITHUANIAN
-#define SUBLANG_LITHUANIAN SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM
-#define SUBLANG_MALAY_BRUNEI_DARUSSALAM SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_MALAY_MALAYSIA
-#define SUBLANG_MALAY_MALAYSIA SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_NEPALI_INDIA
-#define SUBLANG_NEPALI_INDIA SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_NORWEGIAN_BOKMAL
-#define SUBLANG_NORWEGIAN_BOKMAL SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_NORWEGIAN_NYNORSK
-#define SUBLANG_NORWEGIAN_NYNORSK SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_PORTUGUESE
-#define SUBLANG_PORTUGUESE SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_PORTUGUESE_BRAZILIAN
-#define SUBLANG_PORTUGUESE_BRAZILIAN SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_SERBIAN_CYRILLIC
-#define SUBLANG_SERBIAN_CYRILLIC SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_SERBIAN_LATIN
-#define SUBLANG_SERBIAN_LATIN SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_SPANISH
-#define SUBLANG_SPANISH SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_SPANISH_ARGENTINA
-#define SUBLANG_SPANISH_ARGENTINA SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_SPANISH_BOLIVIA
-#define SUBLANG_SPANISH_BOLIVIA SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_SPANISH_CHILE
-#define SUBLANG_SPANISH_CHILE SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_SPANISH_COLOMBIA
-#define SUBLANG_SPANISH_COLOMBIA SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_SPANISH_COSTA_RICA
-#define SUBLANG_SPANISH_COSTA_RICA SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC
-#define SUBLANG_SPANISH_DOMINICAN_REPUBLIC SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_SPANISH_ECUADOR
-#define SUBLANG_SPANISH_ECUADOR SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_SPANISH_EL_SALVADOR
-#define SUBLANG_SPANISH_EL_SALVADOR SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_SPANISH_GUATEMALA
-#define SUBLANG_SPANISH_GUATEMALA SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_SPANISH_HONDURAS
-#define SUBLANG_SPANISH_HONDURAS SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_SPANISH_MEXICAN
-#define SUBLANG_SPANISH_MEXICAN SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_SPANISH_MODERN
-#define SUBLANG_SPANISH_MODERN SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_SPANISH_NICARAGUA
-#define SUBLANG_SPANISH_NICARAGUA SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_SPANISH_PANAMA
-#define SUBLANG_SPANISH_PANAMA SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_SPANISH_PARAGUAY
-#define SUBLANG_SPANISH_PARAGUAY SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_SPANISH_PERU
-#define SUBLANG_SPANISH_PERU SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_SPANISH_PUERTO_RICO
-#define SUBLANG_SPANISH_PUERTO_RICO SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_SPANISH_URUGUAY
-#define SUBLANG_SPANISH_URUGUAY SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_SPANISH_VENEZUELA
-#define SUBLANG_SPANISH_VENEZUELA SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_SWEDISH
-#define SUBLANG_SWEDISH SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_SWEDISH_FINLAND
-#define SUBLANG_SWEDISH_FINLAND SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_URDU_INDIA
-#define SUBLANG_URDU_INDIA SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_URDU_PAKISTAN
-#define SUBLANG_URDU_PAKISTAN SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_UZBEK_CYRILLIC
-#define SUBLANG_UZBEK_CYRILLIC SUBLANG_DEFAULT
-#endif
-#ifndef SUBLANG_UZBEK_LATIN
-#define SUBLANG_UZBEK_LATIN SUBLANG_DEFAULT
-#endif
-
-
-#endif // __WIN32__
-
-#define LNG(wxlang, canonical, winlang, winsublang, layout, desc) \
-    info.Language = wxlang;                               \
-    info.CanonicalName = wxT(canonical);                  \
-    info.LayoutDirection = layout;                        \
-    info.Description = wxT(desc);                         \
-    SETWINLANG(info, winlang, winsublang)                 \
-    AddLanguage(info);
-
-void wxLocale::InitLanguagesDB()
-{
-   wxLanguageInfo info;
-   wxStringTokenizer tkn;
-
-   LNG(wxLANGUAGE_ABKHAZIAN,                  "ab"   , 0              , 0                                 , wxLayout_LeftToRight, "Abkhazian")
-   LNG(wxLANGUAGE_AFAR,                       "aa"   , 0              , 0                                 , wxLayout_LeftToRight, "Afar")
-   LNG(wxLANGUAGE_AFRIKAANS,                  "af_ZA", LANG_AFRIKAANS , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Afrikaans")
-   LNG(wxLANGUAGE_ALBANIAN,                   "sq_AL", LANG_ALBANIAN  , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Albanian")
-   LNG(wxLANGUAGE_AMHARIC,                    "am"   , 0              , 0                                 , wxLayout_LeftToRight, "Amharic")
-   LNG(wxLANGUAGE_ARABIC,                     "ar"   , LANG_ARABIC    , SUBLANG_DEFAULT                   , wxLayout_RightToLeft, "Arabic")
-   LNG(wxLANGUAGE_ARABIC_ALGERIA,             "ar_DZ", LANG_ARABIC    , SUBLANG_ARABIC_ALGERIA            , wxLayout_RightToLeft, "Arabic (Algeria)")
-   LNG(wxLANGUAGE_ARABIC_BAHRAIN,             "ar_BH", LANG_ARABIC    , SUBLANG_ARABIC_BAHRAIN            , wxLayout_RightToLeft, "Arabic (Bahrain)")
-   LNG(wxLANGUAGE_ARABIC_EGYPT,               "ar_EG", LANG_ARABIC    , SUBLANG_ARABIC_EGYPT              , wxLayout_RightToLeft, "Arabic (Egypt)")
-   LNG(wxLANGUAGE_ARABIC_IRAQ,                "ar_IQ", LANG_ARABIC    , SUBLANG_ARABIC_IRAQ               , wxLayout_RightToLeft, "Arabic (Iraq)")
-   LNG(wxLANGUAGE_ARABIC_JORDAN,              "ar_JO", LANG_ARABIC    , SUBLANG_ARABIC_JORDAN             , wxLayout_RightToLeft, "Arabic (Jordan)")
-   LNG(wxLANGUAGE_ARABIC_KUWAIT,              "ar_KW", LANG_ARABIC    , SUBLANG_ARABIC_KUWAIT             , wxLayout_RightToLeft, "Arabic (Kuwait)")
-   LNG(wxLANGUAGE_ARABIC_LEBANON,             "ar_LB", LANG_ARABIC    , SUBLANG_ARABIC_LEBANON            , wxLayout_RightToLeft, "Arabic (Lebanon)")
-   LNG(wxLANGUAGE_ARABIC_LIBYA,               "ar_LY", LANG_ARABIC    , SUBLANG_ARABIC_LIBYA              , wxLayout_RightToLeft, "Arabic (Libya)")
-   LNG(wxLANGUAGE_ARABIC_MOROCCO,             "ar_MA", LANG_ARABIC    , SUBLANG_ARABIC_MOROCCO            , wxLayout_RightToLeft, "Arabic (Morocco)")
-   LNG(wxLANGUAGE_ARABIC_OMAN,                "ar_OM", LANG_ARABIC    , SUBLANG_ARABIC_OMAN               , wxLayout_RightToLeft, "Arabic (Oman)")
-   LNG(wxLANGUAGE_ARABIC_QATAR,               "ar_QA", LANG_ARABIC    , SUBLANG_ARABIC_QATAR              , wxLayout_RightToLeft, "Arabic (Qatar)")
-   LNG(wxLANGUAGE_ARABIC_SAUDI_ARABIA,        "ar_SA", LANG_ARABIC    , SUBLANG_ARABIC_SAUDI_ARABIA       , wxLayout_RightToLeft, "Arabic (Saudi Arabia)")
-   LNG(wxLANGUAGE_ARABIC_SUDAN,               "ar_SD", 0              , 0                                 , wxLayout_RightToLeft, "Arabic (Sudan)")
-   LNG(wxLANGUAGE_ARABIC_SYRIA,               "ar_SY", LANG_ARABIC    , SUBLANG_ARABIC_SYRIA              , wxLayout_RightToLeft, "Arabic (Syria)")
-   LNG(wxLANGUAGE_ARABIC_TUNISIA,             "ar_TN", LANG_ARABIC    , SUBLANG_ARABIC_TUNISIA            , wxLayout_RightToLeft, "Arabic (Tunisia)")
-   LNG(wxLANGUAGE_ARABIC_UAE,                 "ar_AE", LANG_ARABIC    , SUBLANG_ARABIC_UAE                , wxLayout_RightToLeft, "Arabic (Uae)")
-   LNG(wxLANGUAGE_ARABIC_YEMEN,               "ar_YE", LANG_ARABIC    , SUBLANG_ARABIC_YEMEN              , wxLayout_RightToLeft, "Arabic (Yemen)")
-   LNG(wxLANGUAGE_ARMENIAN,                   "hy"   , LANG_ARMENIAN  , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Armenian")
-   LNG(wxLANGUAGE_ASSAMESE,                   "as"   , LANG_ASSAMESE  , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Assamese")
-   LNG(wxLANGUAGE_ASTURIAN,                   "ast"  , 0              , 0                                 , wxLayout_LeftToRight, "Asturian")
-   LNG(wxLANGUAGE_AYMARA,                     "ay"   , 0              , 0                                 , wxLayout_LeftToRight, "Aymara")
-   LNG(wxLANGUAGE_AZERI,                      "az"   , LANG_AZERI     , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Azeri")
-   LNG(wxLANGUAGE_AZERI_CYRILLIC,             "az"   , LANG_AZERI     , SUBLANG_AZERI_CYRILLIC            , wxLayout_LeftToRight, "Azeri (Cyrillic)")
-   LNG(wxLANGUAGE_AZERI_LATIN,                "az"   , LANG_AZERI     , SUBLANG_AZERI_LATIN               , wxLayout_LeftToRight, "Azeri (Latin)")
-   LNG(wxLANGUAGE_BASHKIR,                    "ba"   , 0              , 0                                 , wxLayout_LeftToRight, "Bashkir")
-   LNG(wxLANGUAGE_BASQUE,                     "eu_ES", LANG_BASQUE    , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Basque")
-   LNG(wxLANGUAGE_BELARUSIAN,                 "be_BY", LANG_BELARUSIAN, SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Belarusian")
-   LNG(wxLANGUAGE_BENGALI,                    "bn"   , LANG_BENGALI   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Bengali")
-   LNG(wxLANGUAGE_BHUTANI,                    "dz"   , 0              , 0                                 , wxLayout_LeftToRight, "Bhutani")
-   LNG(wxLANGUAGE_BIHARI,                     "bh"   , 0              , 0                                 , wxLayout_LeftToRight, "Bihari")
-   LNG(wxLANGUAGE_BISLAMA,                    "bi"   , 0              , 0                                 , wxLayout_LeftToRight, "Bislama")
-   LNG(wxLANGUAGE_BRETON,                     "br"   , 0              , 0                                 , wxLayout_LeftToRight, "Breton")
-   LNG(wxLANGUAGE_BULGARIAN,                  "bg_BG", LANG_BULGARIAN , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Bulgarian")
-   LNG(wxLANGUAGE_BURMESE,                    "my"   , 0              , 0                                 , wxLayout_LeftToRight, "Burmese")
-   LNG(wxLANGUAGE_CAMBODIAN,                  "km"   , 0              , 0                                 , wxLayout_LeftToRight, "Cambodian")
-   LNG(wxLANGUAGE_CATALAN,                    "ca_ES", LANG_CATALAN   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Catalan")
-   LNG(wxLANGUAGE_CHINESE,                    "zh_TW", LANG_CHINESE   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Chinese")
-   LNG(wxLANGUAGE_CHINESE_SIMPLIFIED,         "zh_CN", LANG_CHINESE   , SUBLANG_CHINESE_SIMPLIFIED        , wxLayout_LeftToRight, "Chinese (Simplified)")
-   LNG(wxLANGUAGE_CHINESE_TRADITIONAL,        "zh_TW", LANG_CHINESE   , SUBLANG_CHINESE_TRADITIONAL       , wxLayout_LeftToRight, "Chinese (Traditional)")
-   LNG(wxLANGUAGE_CHINESE_HONGKONG,           "zh_HK", LANG_CHINESE   , SUBLANG_CHINESE_HONGKONG          , wxLayout_LeftToRight, "Chinese (Hongkong)")
-   LNG(wxLANGUAGE_CHINESE_MACAU,              "zh_MO", LANG_CHINESE   , SUBLANG_CHINESE_MACAU             , wxLayout_LeftToRight, "Chinese (Macau)")
-   LNG(wxLANGUAGE_CHINESE_SINGAPORE,          "zh_SG", LANG_CHINESE   , SUBLANG_CHINESE_SINGAPORE         , wxLayout_LeftToRight, "Chinese (Singapore)")
-   LNG(wxLANGUAGE_CHINESE_TAIWAN,             "zh_TW", LANG_CHINESE   , SUBLANG_CHINESE_TRADITIONAL       , wxLayout_LeftToRight, "Chinese (Taiwan)")
-   LNG(wxLANGUAGE_CORSICAN,                   "co"   , 0              , 0                                 , wxLayout_LeftToRight, "Corsican")
-   LNG(wxLANGUAGE_CROATIAN,                   "hr_HR", LANG_CROATIAN  , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Croatian")
-   LNG(wxLANGUAGE_CZECH,                      "cs_CZ", LANG_CZECH     , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Czech")
-   LNG(wxLANGUAGE_DANISH,                     "da_DK", LANG_DANISH    , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Danish")
-   LNG(wxLANGUAGE_DUTCH,                      "nl_NL", LANG_DUTCH     , SUBLANG_DUTCH                     , wxLayout_LeftToRight, "Dutch")
-   LNG(wxLANGUAGE_DUTCH_BELGIAN,              "nl_BE", LANG_DUTCH     , SUBLANG_DUTCH_BELGIAN             , wxLayout_LeftToRight, "Dutch (Belgian)")
-   LNG(wxLANGUAGE_ENGLISH,                    "en_GB", LANG_ENGLISH   , SUBLANG_ENGLISH_UK                , wxLayout_LeftToRight, "English")
-   LNG(wxLANGUAGE_ENGLISH_UK,                 "en_GB", LANG_ENGLISH   , SUBLANG_ENGLISH_UK                , wxLayout_LeftToRight, "English (U.K.)")
-   LNG(wxLANGUAGE_ENGLISH_US,                 "en_US", LANG_ENGLISH   , SUBLANG_ENGLISH_US                , wxLayout_LeftToRight, "English (U.S.)")
-   LNG(wxLANGUAGE_ENGLISH_AUSTRALIA,          "en_AU", LANG_ENGLISH   , SUBLANG_ENGLISH_AUS               , wxLayout_LeftToRight, "English (Australia)")
-   LNG(wxLANGUAGE_ENGLISH_BELIZE,             "en_BZ", LANG_ENGLISH   , SUBLANG_ENGLISH_BELIZE            , wxLayout_LeftToRight, "English (Belize)")
-   LNG(wxLANGUAGE_ENGLISH_BOTSWANA,           "en_BW", 0              , 0                                 , wxLayout_LeftToRight, "English (Botswana)")
-   LNG(wxLANGUAGE_ENGLISH_CANADA,             "en_CA", LANG_ENGLISH   , SUBLANG_ENGLISH_CAN               , wxLayout_LeftToRight, "English (Canada)")
-   LNG(wxLANGUAGE_ENGLISH_CARIBBEAN,          "en_CB", LANG_ENGLISH   , SUBLANG_ENGLISH_CARIBBEAN         , wxLayout_LeftToRight, "English (Caribbean)")
-   LNG(wxLANGUAGE_ENGLISH_DENMARK,            "en_DK", 0              , 0                                 , wxLayout_LeftToRight, "English (Denmark)")
-   LNG(wxLANGUAGE_ENGLISH_EIRE,               "en_IE", LANG_ENGLISH   , SUBLANG_ENGLISH_EIRE              , wxLayout_LeftToRight, "English (Eire)")
-   LNG(wxLANGUAGE_ENGLISH_JAMAICA,            "en_JM", LANG_ENGLISH   , SUBLANG_ENGLISH_JAMAICA           , wxLayout_LeftToRight, "English (Jamaica)")
-   LNG(wxLANGUAGE_ENGLISH_NEW_ZEALAND,        "en_NZ", LANG_ENGLISH   , SUBLANG_ENGLISH_NZ                , wxLayout_LeftToRight, "English (New Zealand)")
-   LNG(wxLANGUAGE_ENGLISH_PHILIPPINES,        "en_PH", LANG_ENGLISH   , SUBLANG_ENGLISH_PHILIPPINES       , wxLayout_LeftToRight, "English (Philippines)")
-   LNG(wxLANGUAGE_ENGLISH_SOUTH_AFRICA,       "en_ZA", LANG_ENGLISH   , SUBLANG_ENGLISH_SOUTH_AFRICA      , wxLayout_LeftToRight, "English (South Africa)")
-   LNG(wxLANGUAGE_ENGLISH_TRINIDAD,           "en_TT", LANG_ENGLISH   , SUBLANG_ENGLISH_TRINIDAD          , wxLayout_LeftToRight, "English (Trinidad)")
-   LNG(wxLANGUAGE_ENGLISH_ZIMBABWE,           "en_ZW", LANG_ENGLISH   , SUBLANG_ENGLISH_ZIMBABWE          , wxLayout_LeftToRight, "English (Zimbabwe)")
-   LNG(wxLANGUAGE_ESPERANTO,                  "eo"   , 0              , 0                                 , wxLayout_LeftToRight, "Esperanto")
-   LNG(wxLANGUAGE_ESTONIAN,                   "et_EE", LANG_ESTONIAN  , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Estonian")
-   LNG(wxLANGUAGE_FAEROESE,                   "fo_FO", LANG_FAEROESE  , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Faeroese")
-   LNG(wxLANGUAGE_FARSI,                      "fa_IR", LANG_FARSI     , SUBLANG_DEFAULT                   , wxLayout_RightToLeft, "Farsi")
-   LNG(wxLANGUAGE_FIJI,                       "fj"   , 0              , 0                                 , wxLayout_LeftToRight, "Fiji")
-   LNG(wxLANGUAGE_FINNISH,                    "fi_FI", LANG_FINNISH   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Finnish")
-   LNG(wxLANGUAGE_FRENCH,                     "fr_FR", LANG_FRENCH    , SUBLANG_FRENCH                    , wxLayout_LeftToRight, "French")
-   LNG(wxLANGUAGE_FRENCH_BELGIAN,             "fr_BE", LANG_FRENCH    , SUBLANG_FRENCH_BELGIAN            , wxLayout_LeftToRight, "French (Belgian)")
-   LNG(wxLANGUAGE_FRENCH_CANADIAN,            "fr_CA", LANG_FRENCH    , SUBLANG_FRENCH_CANADIAN           , wxLayout_LeftToRight, "French (Canadian)")
-   LNG(wxLANGUAGE_FRENCH_LUXEMBOURG,          "fr_LU", LANG_FRENCH    , SUBLANG_FRENCH_LUXEMBOURG         , wxLayout_LeftToRight, "French (Luxembourg)")
-   LNG(wxLANGUAGE_FRENCH_MONACO,              "fr_MC", LANG_FRENCH    , SUBLANG_FRENCH_MONACO             , wxLayout_LeftToRight, "French (Monaco)")
-   LNG(wxLANGUAGE_FRENCH_SWISS,               "fr_CH", LANG_FRENCH    , SUBLANG_FRENCH_SWISS              , wxLayout_LeftToRight, "French (Swiss)")
-   LNG(wxLANGUAGE_FRISIAN,                    "fy"   , 0              , 0                                 , wxLayout_LeftToRight, "Frisian")
-   LNG(wxLANGUAGE_GALICIAN,                   "gl_ES", 0              , 0                                 , wxLayout_LeftToRight, "Galician")
-   LNG(wxLANGUAGE_GEORGIAN,                   "ka_GE", LANG_GEORGIAN  , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Georgian")
-   LNG(wxLANGUAGE_GERMAN,                     "de_DE", LANG_GERMAN    , SUBLANG_GERMAN                    , wxLayout_LeftToRight, "German")
-   LNG(wxLANGUAGE_GERMAN_AUSTRIAN,            "de_AT", LANG_GERMAN    , SUBLANG_GERMAN_AUSTRIAN           , wxLayout_LeftToRight, "German (Austrian)")
-   LNG(wxLANGUAGE_GERMAN_BELGIUM,             "de_BE", 0              , 0                                 , wxLayout_LeftToRight, "German (Belgium)")
-   LNG(wxLANGUAGE_GERMAN_LIECHTENSTEIN,       "de_LI", LANG_GERMAN    , SUBLANG_GERMAN_LIECHTENSTEIN      , wxLayout_LeftToRight, "German (Liechtenstein)")
-   LNG(wxLANGUAGE_GERMAN_LUXEMBOURG,          "de_LU", LANG_GERMAN    , SUBLANG_GERMAN_LUXEMBOURG         , wxLayout_LeftToRight, "German (Luxembourg)")
-   LNG(wxLANGUAGE_GERMAN_SWISS,               "de_CH", LANG_GERMAN    , SUBLANG_GERMAN_SWISS              , wxLayout_LeftToRight, "German (Swiss)")
-   LNG(wxLANGUAGE_GREEK,                      "el_GR", LANG_GREEK     , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Greek")
-   LNG(wxLANGUAGE_GREENLANDIC,                "kl_GL", 0              , 0                                 , wxLayout_LeftToRight, "Greenlandic")
-   LNG(wxLANGUAGE_GUARANI,                    "gn"   , 0              , 0                                 , wxLayout_LeftToRight, "Guarani")
-   LNG(wxLANGUAGE_GUJARATI,                   "gu"   , LANG_GUJARATI  , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Gujarati")
-   LNG(wxLANGUAGE_HAUSA,                      "ha"   , 0              , 0                                 , wxLayout_LeftToRight, "Hausa")
-   LNG(wxLANGUAGE_HEBREW,                     "he_IL", LANG_HEBREW    , SUBLANG_DEFAULT                   , wxLayout_RightToLeft, "Hebrew")
-   LNG(wxLANGUAGE_HINDI,                      "hi_IN", LANG_HINDI     , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Hindi")
-   LNG(wxLANGUAGE_HUNGARIAN,                  "hu_HU", LANG_HUNGARIAN , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Hungarian")
-   LNG(wxLANGUAGE_ICELANDIC,                  "is_IS", LANG_ICELANDIC , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Icelandic")
-   LNG(wxLANGUAGE_INDONESIAN,                 "id_ID", LANG_INDONESIAN, SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Indonesian")
-   LNG(wxLANGUAGE_INTERLINGUA,                "ia"   , 0              , 0                                 , wxLayout_LeftToRight, "Interlingua")
-   LNG(wxLANGUAGE_INTERLINGUE,                "ie"   , 0              , 0                                 , wxLayout_LeftToRight, "Interlingue")
-   LNG(wxLANGUAGE_INUKTITUT,                  "iu"   , 0              , 0                                 , wxLayout_LeftToRight, "Inuktitut")
-   LNG(wxLANGUAGE_INUPIAK,                    "ik"   , 0              , 0                                 , wxLayout_LeftToRight, "Inupiak")
-   LNG(wxLANGUAGE_IRISH,                      "ga_IE", 0              , 0                                 , wxLayout_LeftToRight, "Irish")
-   LNG(wxLANGUAGE_ITALIAN,                    "it_IT", LANG_ITALIAN   , SUBLANG_ITALIAN                   , wxLayout_LeftToRight, "Italian")
-   LNG(wxLANGUAGE_ITALIAN_SWISS,              "it_CH", LANG_ITALIAN   , SUBLANG_ITALIAN_SWISS             , wxLayout_LeftToRight, "Italian (Swiss)")
-   LNG(wxLANGUAGE_JAPANESE,                   "ja_JP", LANG_JAPANESE  , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Japanese")
-   LNG(wxLANGUAGE_JAVANESE,                   "jw"   , 0              , 0                                 , wxLayout_LeftToRight, "Javanese")
-   LNG(wxLANGUAGE_KANNADA,                    "kn"   , LANG_KANNADA   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Kannada")
-   LNG(wxLANGUAGE_KASHMIRI,                   "ks"   , LANG_KASHMIRI  , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Kashmiri")
-   LNG(wxLANGUAGE_KASHMIRI_INDIA,             "ks_IN", LANG_KASHMIRI  , SUBLANG_KASHMIRI_INDIA            , wxLayout_LeftToRight, "Kashmiri (India)")
-   LNG(wxLANGUAGE_KAZAKH,                     "kk"   , LANG_KAZAK     , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Kazakh")
-   LNG(wxLANGUAGE_KERNEWEK,                   "kw_GB", 0              , 0                                 , wxLayout_LeftToRight, "Kernewek")
-   LNG(wxLANGUAGE_KINYARWANDA,                "rw"   , 0              , 0                                 , wxLayout_LeftToRight, "Kinyarwanda")
-   LNG(wxLANGUAGE_KIRGHIZ,                    "ky"   , 0              , 0                                 , wxLayout_LeftToRight, "Kirghiz")
-   LNG(wxLANGUAGE_KIRUNDI,                    "rn"   , 0              , 0                                 , wxLayout_LeftToRight, "Kirundi")
-   LNG(wxLANGUAGE_KONKANI,                    ""     , LANG_KONKANI   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Konkani")
-   LNG(wxLANGUAGE_KOREAN,                     "ko_KR", LANG_KOREAN    , SUBLANG_KOREAN                    , wxLayout_LeftToRight, "Korean")
-   LNG(wxLANGUAGE_KURDISH,                    "ku_TR", 0              , 0                                 , wxLayout_LeftToRight, "Kurdish")
-   LNG(wxLANGUAGE_LAOTHIAN,                   "lo"   , 0              , 0                                 , wxLayout_LeftToRight, "Laothian")
-   LNG(wxLANGUAGE_LATIN,                      "la"   , 0              , 0                                 , wxLayout_LeftToRight, "Latin")
-   LNG(wxLANGUAGE_LATVIAN,                    "lv_LV", LANG_LATVIAN   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Latvian")
-   LNG(wxLANGUAGE_LINGALA,                    "ln"   , 0              , 0                                 , wxLayout_LeftToRight, "Lingala")
-   LNG(wxLANGUAGE_LITHUANIAN,                 "lt_LT", LANG_LITHUANIAN, SUBLANG_LITHUANIAN                , wxLayout_LeftToRight, "Lithuanian")
-   LNG(wxLANGUAGE_MACEDONIAN,                 "mk_MK", LANG_MACEDONIAN, SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Macedonian")
-   LNG(wxLANGUAGE_MALAGASY,                   "mg"   , 0              , 0                                 , wxLayout_LeftToRight, "Malagasy")
-   LNG(wxLANGUAGE_MALAY,                      "ms_MY", LANG_MALAY     , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Malay")
-   LNG(wxLANGUAGE_MALAYALAM,                  "ml"   , LANG_MALAYALAM , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Malayalam")
-   LNG(wxLANGUAGE_MALAY_BRUNEI_DARUSSALAM,    "ms_BN", LANG_MALAY     , SUBLANG_MALAY_BRUNEI_DARUSSALAM   , wxLayout_LeftToRight, "Malay (Brunei Darussalam)")
-   LNG(wxLANGUAGE_MALAY_MALAYSIA,             "ms_MY", LANG_MALAY     , SUBLANG_MALAY_MALAYSIA            , wxLayout_LeftToRight, "Malay (Malaysia)")
-   LNG(wxLANGUAGE_MALTESE,                    "mt_MT", 0              , 0                                 , wxLayout_LeftToRight, "Maltese")
-   LNG(wxLANGUAGE_MANIPURI,                   ""     , LANG_MANIPURI  , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Manipuri")
-   LNG(wxLANGUAGE_MAORI,                      "mi"   , 0              , 0                                 , wxLayout_LeftToRight, "Maori")
-   LNG(wxLANGUAGE_MARATHI,                    "mr_IN", LANG_MARATHI   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Marathi")
-   LNG(wxLANGUAGE_MOLDAVIAN,                  "mo"   , 0              , 0                                 , wxLayout_LeftToRight, "Moldavian")
-   LNG(wxLANGUAGE_MONGOLIAN,                  "mn"   , 0              , 0                                 , wxLayout_LeftToRight, "Mongolian")
-   LNG(wxLANGUAGE_NAURU,                      "na"   , 0              , 0                                 , wxLayout_LeftToRight, "Nauru")
-   LNG(wxLANGUAGE_NEPALI,                     "ne_NP", LANG_NEPALI    , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Nepali")
-   LNG(wxLANGUAGE_NEPALI_INDIA,               "ne_IN", LANG_NEPALI    , SUBLANG_NEPALI_INDIA              , wxLayout_LeftToRight, "Nepali (India)")
-   LNG(wxLANGUAGE_NORWEGIAN_BOKMAL,           "nb_NO", LANG_NORWEGIAN , SUBLANG_NORWEGIAN_BOKMAL          , wxLayout_LeftToRight, "Norwegian (Bokmal)")
-   LNG(wxLANGUAGE_NORWEGIAN_NYNORSK,          "nn_NO", LANG_NORWEGIAN , SUBLANG_NORWEGIAN_NYNORSK         , wxLayout_LeftToRight, "Norwegian (Nynorsk)")
-   LNG(wxLANGUAGE_OCCITAN,                    "oc"   , 0              , 0                                 , wxLayout_LeftToRight, "Occitan")
-   LNG(wxLANGUAGE_ORIYA,                      "or"   , LANG_ORIYA     , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Oriya")
-   LNG(wxLANGUAGE_OROMO,                      "om"   , 0              , 0                                 , wxLayout_LeftToRight, "(Afan) Oromo")
-   LNG(wxLANGUAGE_PASHTO,                     "ps"   , 0              , 0                                 , wxLayout_LeftToRight, "Pashto, Pushto")
-   LNG(wxLANGUAGE_POLISH,                     "pl_PL", LANG_POLISH    , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Polish")
-   LNG(wxLANGUAGE_PORTUGUESE,                 "pt_PT", LANG_PORTUGUESE, SUBLANG_PORTUGUESE                , wxLayout_LeftToRight, "Portuguese")
-   LNG(wxLANGUAGE_PORTUGUESE_BRAZILIAN,       "pt_BR", LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN      , wxLayout_LeftToRight, "Portuguese (Brazilian)")
-   LNG(wxLANGUAGE_PUNJABI,                    "pa"   , LANG_PUNJABI   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Punjabi")
-   LNG(wxLANGUAGE_QUECHUA,                    "qu"   , 0              , 0                                 , wxLayout_LeftToRight, "Quechua")
-   LNG(wxLANGUAGE_RHAETO_ROMANCE,             "rm"   , 0              , 0                                 , wxLayout_LeftToRight, "Rhaeto-Romance")
-   LNG(wxLANGUAGE_ROMANIAN,                   "ro_RO", LANG_ROMANIAN  , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Romanian")
-   LNG(wxLANGUAGE_RUSSIAN,                    "ru_RU", LANG_RUSSIAN   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Russian")
-   LNG(wxLANGUAGE_RUSSIAN_UKRAINE,            "ru_UA", 0              , 0                                 , wxLayout_LeftToRight, "Russian (Ukraine)")
-   LNG(wxLANGUAGE_SAMI,                       "se_NO", LANG_SAMI      , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Northern Sami")
-   LNG(wxLANGUAGE_SAMOAN,                     "sm"   , 0              , 0                                 , wxLayout_LeftToRight, "Samoan")
-   LNG(wxLANGUAGE_SANGHO,                     "sg"   , 0              , 0                                 , wxLayout_LeftToRight, "Sangho")
-   LNG(wxLANGUAGE_SANSKRIT,                   "sa"   , LANG_SANSKRIT  , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Sanskrit")
-   LNG(wxLANGUAGE_SCOTS_GAELIC,               "gd"   , 0              , 0                                 , wxLayout_LeftToRight, "Scots Gaelic")
-   LNG(wxLANGUAGE_SERBIAN,                    "sr_RS", LANG_SERBIAN   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Serbian")
-   LNG(wxLANGUAGE_SERBIAN_CYRILLIC,           "sr_RS", LANG_SERBIAN   , SUBLANG_SERBIAN_CYRILLIC          , wxLayout_LeftToRight, "Serbian (Cyrillic)")
-   LNG(wxLANGUAGE_SERBIAN_LATIN,              "sr_RS@latin", LANG_SERBIAN   , SUBLANG_SERBIAN_LATIN             , wxLayout_LeftToRight, "Serbian (Latin)")
-   LNG(wxLANGUAGE_SERBIAN_CYRILLIC,           "sr_YU", LANG_SERBIAN   , SUBLANG_SERBIAN_CYRILLIC          , wxLayout_LeftToRight, "Serbian (Cyrillic)")
-   LNG(wxLANGUAGE_SERBIAN_LATIN,              "sr_YU@latin", LANG_SERBIAN   , SUBLANG_SERBIAN_LATIN             , wxLayout_LeftToRight, "Serbian (Latin)")
-   LNG(wxLANGUAGE_SERBO_CROATIAN,             "sh"   , 0              , 0                                 , wxLayout_LeftToRight, "Serbo-Croatian")
-   LNG(wxLANGUAGE_SESOTHO,                    "st"   , 0              , 0                                 , wxLayout_LeftToRight, "Sesotho")
-   LNG(wxLANGUAGE_SETSWANA,                   "tn"   , 0              , 0                                 , wxLayout_LeftToRight, "Setswana")
-   LNG(wxLANGUAGE_SHONA,                      "sn"   , 0              , 0                                 , wxLayout_LeftToRight, "Shona")
-   LNG(wxLANGUAGE_SINDHI,                     "sd"   , LANG_SINDHI    , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Sindhi")
-   LNG(wxLANGUAGE_SINHALESE,                  "si"   , 0              , 0                                 , wxLayout_LeftToRight, "Sinhalese")
-   LNG(wxLANGUAGE_SISWATI,                    "ss"   , 0              , 0                                 , wxLayout_LeftToRight, "Siswati")
-   LNG(wxLANGUAGE_SLOVAK,                     "sk_SK", LANG_SLOVAK    , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Slovak")
-   LNG(wxLANGUAGE_SLOVENIAN,                  "sl_SI", LANG_SLOVENIAN , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Slovenian")
-   LNG(wxLANGUAGE_SOMALI,                     "so"   , 0              , 0                                 , wxLayout_LeftToRight, "Somali")
-   LNG(wxLANGUAGE_SPANISH,                    "es_ES", LANG_SPANISH   , SUBLANG_SPANISH                   , wxLayout_LeftToRight, "Spanish")
-   LNG(wxLANGUAGE_SPANISH_ARGENTINA,          "es_AR", LANG_SPANISH   , SUBLANG_SPANISH_ARGENTINA         , wxLayout_LeftToRight, "Spanish (Argentina)")
-   LNG(wxLANGUAGE_SPANISH_BOLIVIA,            "es_BO", LANG_SPANISH   , SUBLANG_SPANISH_BOLIVIA           , wxLayout_LeftToRight, "Spanish (Bolivia)")
-   LNG(wxLANGUAGE_SPANISH_CHILE,              "es_CL", LANG_SPANISH   , SUBLANG_SPANISH_CHILE             , wxLayout_LeftToRight, "Spanish (Chile)")
-   LNG(wxLANGUAGE_SPANISH_COLOMBIA,           "es_CO", LANG_SPANISH   , SUBLANG_SPANISH_COLOMBIA          , wxLayout_LeftToRight, "Spanish (Colombia)")
-   LNG(wxLANGUAGE_SPANISH_COSTA_RICA,         "es_CR", LANG_SPANISH   , SUBLANG_SPANISH_COSTA_RICA        , wxLayout_LeftToRight, "Spanish (Costa Rica)")
-   LNG(wxLANGUAGE_SPANISH_DOMINICAN_REPUBLIC, "es_DO", LANG_SPANISH   , SUBLANG_SPANISH_DOMINICAN_REPUBLIC, wxLayout_LeftToRight, "Spanish (Dominican republic)")
-   LNG(wxLANGUAGE_SPANISH_ECUADOR,            "es_EC", LANG_SPANISH   , SUBLANG_SPANISH_ECUADOR           , wxLayout_LeftToRight, "Spanish (Ecuador)")
-   LNG(wxLANGUAGE_SPANISH_EL_SALVADOR,        "es_SV", LANG_SPANISH   , SUBLANG_SPANISH_EL_SALVADOR       , wxLayout_LeftToRight, "Spanish (El Salvador)")
-   LNG(wxLANGUAGE_SPANISH_GUATEMALA,          "es_GT", LANG_SPANISH   , SUBLANG_SPANISH_GUATEMALA         , wxLayout_LeftToRight, "Spanish (Guatemala)")
-   LNG(wxLANGUAGE_SPANISH_HONDURAS,           "es_HN", LANG_SPANISH   , SUBLANG_SPANISH_HONDURAS          , wxLayout_LeftToRight, "Spanish (Honduras)")
-   LNG(wxLANGUAGE_SPANISH_MEXICAN,            "es_MX", LANG_SPANISH   , SUBLANG_SPANISH_MEXICAN           , wxLayout_LeftToRight, "Spanish (Mexican)")
-   LNG(wxLANGUAGE_SPANISH_MODERN,             "es_ES", LANG_SPANISH   , SUBLANG_SPANISH_MODERN            , wxLayout_LeftToRight, "Spanish (Modern)")
-   LNG(wxLANGUAGE_SPANISH_NICARAGUA,          "es_NI", LANG_SPANISH   , SUBLANG_SPANISH_NICARAGUA         , wxLayout_LeftToRight, "Spanish (Nicaragua)")
-   LNG(wxLANGUAGE_SPANISH_PANAMA,             "es_PA", LANG_SPANISH   , SUBLANG_SPANISH_PANAMA            , wxLayout_LeftToRight, "Spanish (Panama)")
-   LNG(wxLANGUAGE_SPANISH_PARAGUAY,           "es_PY", LANG_SPANISH   , SUBLANG_SPANISH_PARAGUAY          , wxLayout_LeftToRight, "Spanish (Paraguay)")
-   LNG(wxLANGUAGE_SPANISH_PERU,               "es_PE", LANG_SPANISH   , SUBLANG_SPANISH_PERU              , wxLayout_LeftToRight, "Spanish (Peru)")
-   LNG(wxLANGUAGE_SPANISH_PUERTO_RICO,        "es_PR", LANG_SPANISH   , SUBLANG_SPANISH_PUERTO_RICO       , wxLayout_LeftToRight, "Spanish (Puerto Rico)")
-   LNG(wxLANGUAGE_SPANISH_URUGUAY,            "es_UY", LANG_SPANISH   , SUBLANG_SPANISH_URUGUAY           , wxLayout_LeftToRight, "Spanish (Uruguay)")
-   LNG(wxLANGUAGE_SPANISH_US,                 "es_US", 0              , 0                                 , wxLayout_LeftToRight, "Spanish (U.S.)")
-   LNG(wxLANGUAGE_SPANISH_VENEZUELA,          "es_VE", LANG_SPANISH   , SUBLANG_SPANISH_VENEZUELA         , wxLayout_LeftToRight, "Spanish (Venezuela)")
-   LNG(wxLANGUAGE_SUNDANESE,                  "su"   , 0              , 0                                 , wxLayout_LeftToRight, "Sundanese")
-   LNG(wxLANGUAGE_SWAHILI,                    "sw_KE", LANG_SWAHILI   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Swahili")
-   LNG(wxLANGUAGE_SWEDISH,                    "sv_SE", LANG_SWEDISH   , SUBLANG_SWEDISH                   , wxLayout_LeftToRight, "Swedish")
-   LNG(wxLANGUAGE_SWEDISH_FINLAND,            "sv_FI", LANG_SWEDISH   , SUBLANG_SWEDISH_FINLAND           , wxLayout_LeftToRight, "Swedish (Finland)")
-   LNG(wxLANGUAGE_TAGALOG,                    "tl_PH", 0              , 0                                 , wxLayout_LeftToRight, "Tagalog")
-   LNG(wxLANGUAGE_TAJIK,                      "tg"   , 0              , 0                                 , wxLayout_LeftToRight, "Tajik")
-   LNG(wxLANGUAGE_TAMIL,                      "ta"   , LANG_TAMIL     , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Tamil")
-   LNG(wxLANGUAGE_TATAR,                      "tt"   , LANG_TATAR     , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Tatar")
-   LNG(wxLANGUAGE_TELUGU,                     "te"   , LANG_TELUGU    , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Telugu")
-   LNG(wxLANGUAGE_THAI,                       "th_TH", LANG_THAI      , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Thai")
-   LNG(wxLANGUAGE_TIBETAN,                    "bo"   , 0              , 0                                 , wxLayout_LeftToRight, "Tibetan")
-   LNG(wxLANGUAGE_TIGRINYA,                   "ti"   , 0              , 0                                 , wxLayout_LeftToRight, "Tigrinya")
-   LNG(wxLANGUAGE_TONGA,                      "to"   , 0              , 0                                 , wxLayout_LeftToRight, "Tonga")
-   LNG(wxLANGUAGE_TSONGA,                     "ts"   , 0              , 0                                 , wxLayout_LeftToRight, "Tsonga")
-   LNG(wxLANGUAGE_TURKISH,                    "tr_TR", LANG_TURKISH   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Turkish")
-   LNG(wxLANGUAGE_TURKMEN,                    "tk"   , 0              , 0                                 , wxLayout_LeftToRight, "Turkmen")
-   LNG(wxLANGUAGE_TWI,                        "tw"   , 0              , 0                                 , wxLayout_LeftToRight, "Twi")
-   LNG(wxLANGUAGE_UIGHUR,                     "ug"   , 0              , 0                                 , wxLayout_LeftToRight, "Uighur")
-   LNG(wxLANGUAGE_UKRAINIAN,                  "uk_UA", LANG_UKRAINIAN , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Ukrainian")
-   LNG(wxLANGUAGE_URDU,                       "ur"   , LANG_URDU      , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Urdu")
-   LNG(wxLANGUAGE_URDU_INDIA,                 "ur_IN", LANG_URDU      , SUBLANG_URDU_INDIA                , wxLayout_LeftToRight, "Urdu (India)")
-   LNG(wxLANGUAGE_URDU_PAKISTAN,              "ur_PK", LANG_URDU      , SUBLANG_URDU_PAKISTAN             , wxLayout_LeftToRight, "Urdu (Pakistan)")
-   LNG(wxLANGUAGE_UZBEK,                      "uz"   , LANG_UZBEK     , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Uzbek")
-   LNG(wxLANGUAGE_UZBEK_CYRILLIC,             "uz"   , LANG_UZBEK     , SUBLANG_UZBEK_CYRILLIC            , wxLayout_LeftToRight, "Uzbek (Cyrillic)")
-   LNG(wxLANGUAGE_UZBEK_LATIN,                "uz"   , LANG_UZBEK     , SUBLANG_UZBEK_LATIN               , wxLayout_LeftToRight, "Uzbek (Latin)")
-   LNG(wxLANGUAGE_VALENCIAN,                  "ca_ES@valencia", 0              , 0                                 , wxLayout_LeftToRight, "Valencian (Southern Catalan)")
-   LNG(wxLANGUAGE_VIETNAMESE,                 "vi_VN", LANG_VIETNAMESE, SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Vietnamese")
-   LNG(wxLANGUAGE_VOLAPUK,                    "vo"   , 0              , 0                                 , wxLayout_LeftToRight, "Volapuk")
-   LNG(wxLANGUAGE_WELSH,                      "cy"   , 0              , 0                                 , wxLayout_LeftToRight, "Welsh")
-   LNG(wxLANGUAGE_WOLOF,                      "wo"   , 0              , 0                                 , wxLayout_LeftToRight, "Wolof")
-   LNG(wxLANGUAGE_XHOSA,                      "xh"   , 0              , 0                                 , wxLayout_LeftToRight, "Xhosa")
-   LNG(wxLANGUAGE_YIDDISH,                    "yi"   , 0              , 0                                 , wxLayout_LeftToRight, "Yiddish")
-   LNG(wxLANGUAGE_YORUBA,                     "yo"   , 0              , 0                                 , wxLayout_LeftToRight, "Yoruba")
-   LNG(wxLANGUAGE_ZHUANG,                     "za"   , 0              , 0                                 , wxLayout_LeftToRight, "Zhuang")
-   LNG(wxLANGUAGE_ZULU,                       "zu"   , 0              , 0                                 , wxLayout_LeftToRight, "Zulu")
-
-}
-#undef LNG
-
-// --- --- --- generated code ends here --- --- ---
-
 #endif // wxUSE_INTL
diff --git a/src/common/languageinfo.cpp b/src/common/languageinfo.cpp
new file mode 100644 (file)
index 0000000..57c2883
--- /dev/null
@@ -0,0 +1,789 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        src/common/language.cpp
+// Purpose:     wxLocale::InitLanguagesDB()
+// Author:      Vadim Zeitlin, Vaclav Slavik
+// Created:     2010-04-23
+// RCS-ID:      $Id$
+// Copyright:   (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+// ============================================================================
+// declaration
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+
+#include "wx/intl.h"
+
+#if wxUSE_INTL
+
+#ifdef __WIN32__
+    #include "wx/msw/private.h"
+#endif
+
+// ----------------------------------------------------------------------------
+// default languages table & initialization
+// ----------------------------------------------------------------------------
+
+
+// --- --- --- generated code begins here --- --- ---
+
+// This table is generated by misc/languages/genlang.py
+// When making changes, please put them into misc/languages/langtabl.txt
+
+#if !defined(__WIN32__) || defined(__WXMICROWIN__)
+
+#define SETWINLANG(info,lang,sublang)
+
+#else
+
+#define SETWINLANG(info,lang,sublang) \
+    info.WinLang = lang, info.WinSublang = sublang;
+
+#ifndef LANG_AFRIKAANS
+#define LANG_AFRIKAANS (0)
+#endif
+#ifndef LANG_ALBANIAN
+#define LANG_ALBANIAN (0)
+#endif
+#ifndef LANG_ARABIC
+#define LANG_ARABIC (0)
+#endif
+#ifndef LANG_ARMENIAN
+#define LANG_ARMENIAN (0)
+#endif
+#ifndef LANG_ASSAMESE
+#define LANG_ASSAMESE (0)
+#endif
+#ifndef LANG_AZERI
+#define LANG_AZERI (0)
+#endif
+#ifndef LANG_BASQUE
+#define LANG_BASQUE (0)
+#endif
+#ifndef LANG_BELARUSIAN
+#define LANG_BELARUSIAN (0)
+#endif
+#ifndef LANG_BENGALI
+#define LANG_BENGALI (0)
+#endif
+#ifndef LANG_BULGARIAN
+#define LANG_BULGARIAN (0)
+#endif
+#ifndef LANG_CATALAN
+#define LANG_CATALAN (0)
+#endif
+#ifndef LANG_CHINESE
+#define LANG_CHINESE (0)
+#endif
+#ifndef LANG_CROATIAN
+#define LANG_CROATIAN (0)
+#endif
+#ifndef LANG_CZECH
+#define LANG_CZECH (0)
+#endif
+#ifndef LANG_DANISH
+#define LANG_DANISH (0)
+#endif
+#ifndef LANG_DUTCH
+#define LANG_DUTCH (0)
+#endif
+#ifndef LANG_ENGLISH
+#define LANG_ENGLISH (0)
+#endif
+#ifndef LANG_ESTONIAN
+#define LANG_ESTONIAN (0)
+#endif
+#ifndef LANG_FAEROESE
+#define LANG_FAEROESE (0)
+#endif
+#ifndef LANG_FARSI
+#define LANG_FARSI (0)
+#endif
+#ifndef LANG_FINNISH
+#define LANG_FINNISH (0)
+#endif
+#ifndef LANG_FRENCH
+#define LANG_FRENCH (0)
+#endif
+#ifndef LANG_GEORGIAN
+#define LANG_GEORGIAN (0)
+#endif
+#ifndef LANG_GERMAN
+#define LANG_GERMAN (0)
+#endif
+#ifndef LANG_GREEK
+#define LANG_GREEK (0)
+#endif
+#ifndef LANG_GUJARATI
+#define LANG_GUJARATI (0)
+#endif
+#ifndef LANG_HEBREW
+#define LANG_HEBREW (0)
+#endif
+#ifndef LANG_HINDI
+#define LANG_HINDI (0)
+#endif
+#ifndef LANG_HUNGARIAN
+#define LANG_HUNGARIAN (0)
+#endif
+#ifndef LANG_ICELANDIC
+#define LANG_ICELANDIC (0)
+#endif
+#ifndef LANG_INDONESIAN
+#define LANG_INDONESIAN (0)
+#endif
+#ifndef LANG_ITALIAN
+#define LANG_ITALIAN (0)
+#endif
+#ifndef LANG_JAPANESE
+#define LANG_JAPANESE (0)
+#endif
+#ifndef LANG_KANNADA
+#define LANG_KANNADA (0)
+#endif
+#ifndef LANG_KASHMIRI
+#define LANG_KASHMIRI (0)
+#endif
+#ifndef LANG_KAZAK
+#define LANG_KAZAK (0)
+#endif
+#ifndef LANG_KONKANI
+#define LANG_KONKANI (0)
+#endif
+#ifndef LANG_KOREAN
+#define LANG_KOREAN (0)
+#endif
+#ifndef LANG_LATVIAN
+#define LANG_LATVIAN (0)
+#endif
+#ifndef LANG_LITHUANIAN
+#define LANG_LITHUANIAN (0)
+#endif
+#ifndef LANG_MACEDONIAN
+#define LANG_MACEDONIAN (0)
+#endif
+#ifndef LANG_MALAY
+#define LANG_MALAY (0)
+#endif
+#ifndef LANG_MALAYALAM
+#define LANG_MALAYALAM (0)
+#endif
+#ifndef LANG_MANIPURI
+#define LANG_MANIPURI (0)
+#endif
+#ifndef LANG_MARATHI
+#define LANG_MARATHI (0)
+#endif
+#ifndef LANG_NEPALI
+#define LANG_NEPALI (0)
+#endif
+#ifndef LANG_NORWEGIAN
+#define LANG_NORWEGIAN (0)
+#endif
+#ifndef LANG_ORIYA
+#define LANG_ORIYA (0)
+#endif
+#ifndef LANG_POLISH
+#define LANG_POLISH (0)
+#endif
+#ifndef LANG_PORTUGUESE
+#define LANG_PORTUGUESE (0)
+#endif
+#ifndef LANG_PUNJABI
+#define LANG_PUNJABI (0)
+#endif
+#ifndef LANG_ROMANIAN
+#define LANG_ROMANIAN (0)
+#endif
+#ifndef LANG_RUSSIAN
+#define LANG_RUSSIAN (0)
+#endif
+#ifndef LANG_SAMI
+#define LANG_SAMI (0)
+#endif
+#ifndef LANG_SANSKRIT
+#define LANG_SANSKRIT (0)
+#endif
+#ifndef LANG_SERBIAN
+#define LANG_SERBIAN (0)
+#endif
+#ifndef LANG_SINDHI
+#define LANG_SINDHI (0)
+#endif
+#ifndef LANG_SLOVAK
+#define LANG_SLOVAK (0)
+#endif
+#ifndef LANG_SLOVENIAN
+#define LANG_SLOVENIAN (0)
+#endif
+#ifndef LANG_SPANISH
+#define LANG_SPANISH (0)
+#endif
+#ifndef LANG_SWAHILI
+#define LANG_SWAHILI (0)
+#endif
+#ifndef LANG_SWEDISH
+#define LANG_SWEDISH (0)
+#endif
+#ifndef LANG_TAMIL
+#define LANG_TAMIL (0)
+#endif
+#ifndef LANG_TATAR
+#define LANG_TATAR (0)
+#endif
+#ifndef LANG_TELUGU
+#define LANG_TELUGU (0)
+#endif
+#ifndef LANG_THAI
+#define LANG_THAI (0)
+#endif
+#ifndef LANG_TURKISH
+#define LANG_TURKISH (0)
+#endif
+#ifndef LANG_UKRAINIAN
+#define LANG_UKRAINIAN (0)
+#endif
+#ifndef LANG_URDU
+#define LANG_URDU (0)
+#endif
+#ifndef LANG_UZBEK
+#define LANG_UZBEK (0)
+#endif
+#ifndef LANG_VIETNAMESE
+#define LANG_VIETNAMESE (0)
+#endif
+#ifndef SUBLANG_ARABIC_ALGERIA
+#define SUBLANG_ARABIC_ALGERIA SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ARABIC_BAHRAIN
+#define SUBLANG_ARABIC_BAHRAIN SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ARABIC_EGYPT
+#define SUBLANG_ARABIC_EGYPT SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ARABIC_IRAQ
+#define SUBLANG_ARABIC_IRAQ SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ARABIC_JORDAN
+#define SUBLANG_ARABIC_JORDAN SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ARABIC_KUWAIT
+#define SUBLANG_ARABIC_KUWAIT SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ARABIC_LEBANON
+#define SUBLANG_ARABIC_LEBANON SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ARABIC_LIBYA
+#define SUBLANG_ARABIC_LIBYA SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ARABIC_MOROCCO
+#define SUBLANG_ARABIC_MOROCCO SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ARABIC_OMAN
+#define SUBLANG_ARABIC_OMAN SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ARABIC_QATAR
+#define SUBLANG_ARABIC_QATAR SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ARABIC_SAUDI_ARABIA
+#define SUBLANG_ARABIC_SAUDI_ARABIA SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ARABIC_SYRIA
+#define SUBLANG_ARABIC_SYRIA SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ARABIC_TUNISIA
+#define SUBLANG_ARABIC_TUNISIA SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ARABIC_UAE
+#define SUBLANG_ARABIC_UAE SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ARABIC_YEMEN
+#define SUBLANG_ARABIC_YEMEN SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_AZERI_CYRILLIC
+#define SUBLANG_AZERI_CYRILLIC SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_AZERI_LATIN
+#define SUBLANG_AZERI_LATIN SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_CHINESE_SIMPLIFIED
+#define SUBLANG_CHINESE_SIMPLIFIED SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_CHINESE_TRADITIONAL
+#define SUBLANG_CHINESE_TRADITIONAL SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_CHINESE_HONGKONG
+#define SUBLANG_CHINESE_HONGKONG SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_CHINESE_MACAU
+#define SUBLANG_CHINESE_MACAU SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_CHINESE_SINGAPORE
+#define SUBLANG_CHINESE_SINGAPORE SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_DUTCH
+#define SUBLANG_DUTCH SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_DUTCH_BELGIAN
+#define SUBLANG_DUTCH_BELGIAN SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ENGLISH_UK
+#define SUBLANG_ENGLISH_UK SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ENGLISH_US
+#define SUBLANG_ENGLISH_US SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ENGLISH_AUS
+#define SUBLANG_ENGLISH_AUS SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ENGLISH_BELIZE
+#define SUBLANG_ENGLISH_BELIZE SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ENGLISH_CAN
+#define SUBLANG_ENGLISH_CAN SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ENGLISH_CARIBBEAN
+#define SUBLANG_ENGLISH_CARIBBEAN SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ENGLISH_EIRE
+#define SUBLANG_ENGLISH_EIRE SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ENGLISH_JAMAICA
+#define SUBLANG_ENGLISH_JAMAICA SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ENGLISH_NZ
+#define SUBLANG_ENGLISH_NZ SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ENGLISH_PHILIPPINES
+#define SUBLANG_ENGLISH_PHILIPPINES SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ENGLISH_SOUTH_AFRICA
+#define SUBLANG_ENGLISH_SOUTH_AFRICA SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ENGLISH_TRINIDAD
+#define SUBLANG_ENGLISH_TRINIDAD SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ENGLISH_ZIMBABWE
+#define SUBLANG_ENGLISH_ZIMBABWE SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_FRENCH
+#define SUBLANG_FRENCH SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_FRENCH_BELGIAN
+#define SUBLANG_FRENCH_BELGIAN SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_FRENCH_CANADIAN
+#define SUBLANG_FRENCH_CANADIAN SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_FRENCH_LUXEMBOURG
+#define SUBLANG_FRENCH_LUXEMBOURG SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_FRENCH_MONACO
+#define SUBLANG_FRENCH_MONACO SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_FRENCH_SWISS
+#define SUBLANG_FRENCH_SWISS SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_GERMAN
+#define SUBLANG_GERMAN SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_GERMAN_AUSTRIAN
+#define SUBLANG_GERMAN_AUSTRIAN SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_GERMAN_LIECHTENSTEIN
+#define SUBLANG_GERMAN_LIECHTENSTEIN SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_GERMAN_LUXEMBOURG
+#define SUBLANG_GERMAN_LUXEMBOURG SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_GERMAN_SWISS
+#define SUBLANG_GERMAN_SWISS SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ITALIAN
+#define SUBLANG_ITALIAN SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_ITALIAN_SWISS
+#define SUBLANG_ITALIAN_SWISS SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_KASHMIRI_INDIA
+#define SUBLANG_KASHMIRI_INDIA SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_KOREAN
+#define SUBLANG_KOREAN SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_LITHUANIAN
+#define SUBLANG_LITHUANIAN SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM
+#define SUBLANG_MALAY_BRUNEI_DARUSSALAM SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_MALAY_MALAYSIA
+#define SUBLANG_MALAY_MALAYSIA SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_NEPALI_INDIA
+#define SUBLANG_NEPALI_INDIA SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_NORWEGIAN_BOKMAL
+#define SUBLANG_NORWEGIAN_BOKMAL SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_NORWEGIAN_NYNORSK
+#define SUBLANG_NORWEGIAN_NYNORSK SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_PORTUGUESE
+#define SUBLANG_PORTUGUESE SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_PORTUGUESE_BRAZILIAN
+#define SUBLANG_PORTUGUESE_BRAZILIAN SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_SERBIAN_CYRILLIC
+#define SUBLANG_SERBIAN_CYRILLIC SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_SERBIAN_LATIN
+#define SUBLANG_SERBIAN_LATIN SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_SPANISH
+#define SUBLANG_SPANISH SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_SPANISH_ARGENTINA
+#define SUBLANG_SPANISH_ARGENTINA SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_SPANISH_BOLIVIA
+#define SUBLANG_SPANISH_BOLIVIA SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_SPANISH_CHILE
+#define SUBLANG_SPANISH_CHILE SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_SPANISH_COLOMBIA
+#define SUBLANG_SPANISH_COLOMBIA SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_SPANISH_COSTA_RICA
+#define SUBLANG_SPANISH_COSTA_RICA SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC
+#define SUBLANG_SPANISH_DOMINICAN_REPUBLIC SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_SPANISH_ECUADOR
+#define SUBLANG_SPANISH_ECUADOR SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_SPANISH_EL_SALVADOR
+#define SUBLANG_SPANISH_EL_SALVADOR SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_SPANISH_GUATEMALA
+#define SUBLANG_SPANISH_GUATEMALA SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_SPANISH_HONDURAS
+#define SUBLANG_SPANISH_HONDURAS SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_SPANISH_MEXICAN
+#define SUBLANG_SPANISH_MEXICAN SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_SPANISH_MODERN
+#define SUBLANG_SPANISH_MODERN SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_SPANISH_NICARAGUA
+#define SUBLANG_SPANISH_NICARAGUA SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_SPANISH_PANAMA
+#define SUBLANG_SPANISH_PANAMA SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_SPANISH_PARAGUAY
+#define SUBLANG_SPANISH_PARAGUAY SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_SPANISH_PERU
+#define SUBLANG_SPANISH_PERU SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_SPANISH_PUERTO_RICO
+#define SUBLANG_SPANISH_PUERTO_RICO SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_SPANISH_URUGUAY
+#define SUBLANG_SPANISH_URUGUAY SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_SPANISH_VENEZUELA
+#define SUBLANG_SPANISH_VENEZUELA SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_SWEDISH
+#define SUBLANG_SWEDISH SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_SWEDISH_FINLAND
+#define SUBLANG_SWEDISH_FINLAND SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_URDU_INDIA
+#define SUBLANG_URDU_INDIA SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_URDU_PAKISTAN
+#define SUBLANG_URDU_PAKISTAN SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_UZBEK_CYRILLIC
+#define SUBLANG_UZBEK_CYRILLIC SUBLANG_DEFAULT
+#endif
+#ifndef SUBLANG_UZBEK_LATIN
+#define SUBLANG_UZBEK_LATIN SUBLANG_DEFAULT
+#endif
+
+
+#endif // __WIN32__
+
+#define LNG(wxlang, canonical, winlang, winsublang, layout, desc) \
+    info.Language = wxlang;                               \
+    info.CanonicalName = wxT(canonical);                  \
+    info.LayoutDirection = layout;                        \
+    info.Description = wxT(desc);                         \
+    SETWINLANG(info, winlang, winsublang)                 \
+    AddLanguage(info);
+
+void wxLocale::InitLanguagesDB()
+{
+   wxLanguageInfo info;
+   wxStringTokenizer tkn;
+
+   LNG(wxLANGUAGE_ABKHAZIAN,                  "ab"   , 0              , 0                                 , wxLayout_LeftToRight, "Abkhazian")
+   LNG(wxLANGUAGE_AFAR,                       "aa"   , 0              , 0                                 , wxLayout_LeftToRight, "Afar")
+   LNG(wxLANGUAGE_AFRIKAANS,                  "af_ZA", LANG_AFRIKAANS , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Afrikaans")
+   LNG(wxLANGUAGE_ALBANIAN,                   "sq_AL", LANG_ALBANIAN  , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Albanian")
+   LNG(wxLANGUAGE_AMHARIC,                    "am"   , 0              , 0                                 , wxLayout_LeftToRight, "Amharic")
+   LNG(wxLANGUAGE_ARABIC,                     "ar"   , LANG_ARABIC    , SUBLANG_DEFAULT                   , wxLayout_RightToLeft, "Arabic")
+   LNG(wxLANGUAGE_ARABIC_ALGERIA,             "ar_DZ", LANG_ARABIC    , SUBLANG_ARABIC_ALGERIA            , wxLayout_RightToLeft, "Arabic (Algeria)")
+   LNG(wxLANGUAGE_ARABIC_BAHRAIN,             "ar_BH", LANG_ARABIC    , SUBLANG_ARABIC_BAHRAIN            , wxLayout_RightToLeft, "Arabic (Bahrain)")
+   LNG(wxLANGUAGE_ARABIC_EGYPT,               "ar_EG", LANG_ARABIC    , SUBLANG_ARABIC_EGYPT              , wxLayout_RightToLeft, "Arabic (Egypt)")
+   LNG(wxLANGUAGE_ARABIC_IRAQ,                "ar_IQ", LANG_ARABIC    , SUBLANG_ARABIC_IRAQ               , wxLayout_RightToLeft, "Arabic (Iraq)")
+   LNG(wxLANGUAGE_ARABIC_JORDAN,              "ar_JO", LANG_ARABIC    , SUBLANG_ARABIC_JORDAN             , wxLayout_RightToLeft, "Arabic (Jordan)")
+   LNG(wxLANGUAGE_ARABIC_KUWAIT,              "ar_KW", LANG_ARABIC    , SUBLANG_ARABIC_KUWAIT             , wxLayout_RightToLeft, "Arabic (Kuwait)")
+   LNG(wxLANGUAGE_ARABIC_LEBANON,             "ar_LB", LANG_ARABIC    , SUBLANG_ARABIC_LEBANON            , wxLayout_RightToLeft, "Arabic (Lebanon)")
+   LNG(wxLANGUAGE_ARABIC_LIBYA,               "ar_LY", LANG_ARABIC    , SUBLANG_ARABIC_LIBYA              , wxLayout_RightToLeft, "Arabic (Libya)")
+   LNG(wxLANGUAGE_ARABIC_MOROCCO,             "ar_MA", LANG_ARABIC    , SUBLANG_ARABIC_MOROCCO            , wxLayout_RightToLeft, "Arabic (Morocco)")
+   LNG(wxLANGUAGE_ARABIC_OMAN,                "ar_OM", LANG_ARABIC    , SUBLANG_ARABIC_OMAN               , wxLayout_RightToLeft, "Arabic (Oman)")
+   LNG(wxLANGUAGE_ARABIC_QATAR,               "ar_QA", LANG_ARABIC    , SUBLANG_ARABIC_QATAR              , wxLayout_RightToLeft, "Arabic (Qatar)")
+   LNG(wxLANGUAGE_ARABIC_SAUDI_ARABIA,        "ar_SA", LANG_ARABIC    , SUBLANG_ARABIC_SAUDI_ARABIA       , wxLayout_RightToLeft, "Arabic (Saudi Arabia)")
+   LNG(wxLANGUAGE_ARABIC_SUDAN,               "ar_SD", 0              , 0                                 , wxLayout_RightToLeft, "Arabic (Sudan)")
+   LNG(wxLANGUAGE_ARABIC_SYRIA,               "ar_SY", LANG_ARABIC    , SUBLANG_ARABIC_SYRIA              , wxLayout_RightToLeft, "Arabic (Syria)")
+   LNG(wxLANGUAGE_ARABIC_TUNISIA,             "ar_TN", LANG_ARABIC    , SUBLANG_ARABIC_TUNISIA            , wxLayout_RightToLeft, "Arabic (Tunisia)")
+   LNG(wxLANGUAGE_ARABIC_UAE,                 "ar_AE", LANG_ARABIC    , SUBLANG_ARABIC_UAE                , wxLayout_RightToLeft, "Arabic (Uae)")
+   LNG(wxLANGUAGE_ARABIC_YEMEN,               "ar_YE", LANG_ARABIC    , SUBLANG_ARABIC_YEMEN              , wxLayout_RightToLeft, "Arabic (Yemen)")
+   LNG(wxLANGUAGE_ARMENIAN,                   "hy"   , LANG_ARMENIAN  , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Armenian")
+   LNG(wxLANGUAGE_ASSAMESE,                   "as"   , LANG_ASSAMESE  , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Assamese")
+   LNG(wxLANGUAGE_ASTURIAN,                   "ast"  , 0              , 0                                 , wxLayout_LeftToRight, "Asturian")
+   LNG(wxLANGUAGE_AYMARA,                     "ay"   , 0              , 0                                 , wxLayout_LeftToRight, "Aymara")
+   LNG(wxLANGUAGE_AZERI,                      "az"   , LANG_AZERI     , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Azeri")
+   LNG(wxLANGUAGE_AZERI_CYRILLIC,             "az"   , LANG_AZERI     , SUBLANG_AZERI_CYRILLIC            , wxLayout_LeftToRight, "Azeri (Cyrillic)")
+   LNG(wxLANGUAGE_AZERI_LATIN,                "az"   , LANG_AZERI     , SUBLANG_AZERI_LATIN               , wxLayout_LeftToRight, "Azeri (Latin)")
+   LNG(wxLANGUAGE_BASHKIR,                    "ba"   , 0              , 0                                 , wxLayout_LeftToRight, "Bashkir")
+   LNG(wxLANGUAGE_BASQUE,                     "eu_ES", LANG_BASQUE    , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Basque")
+   LNG(wxLANGUAGE_BELARUSIAN,                 "be_BY", LANG_BELARUSIAN, SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Belarusian")
+   LNG(wxLANGUAGE_BENGALI,                    "bn"   , LANG_BENGALI   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Bengali")
+   LNG(wxLANGUAGE_BHUTANI,                    "dz"   , 0              , 0                                 , wxLayout_LeftToRight, "Bhutani")
+   LNG(wxLANGUAGE_BIHARI,                     "bh"   , 0              , 0                                 , wxLayout_LeftToRight, "Bihari")
+   LNG(wxLANGUAGE_BISLAMA,                    "bi"   , 0              , 0                                 , wxLayout_LeftToRight, "Bislama")
+   LNG(wxLANGUAGE_BRETON,                     "br"   , 0              , 0                                 , wxLayout_LeftToRight, "Breton")
+   LNG(wxLANGUAGE_BULGARIAN,                  "bg_BG", LANG_BULGARIAN , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Bulgarian")
+   LNG(wxLANGUAGE_BURMESE,                    "my"   , 0              , 0                                 , wxLayout_LeftToRight, "Burmese")
+   LNG(wxLANGUAGE_CAMBODIAN,                  "km"   , 0              , 0                                 , wxLayout_LeftToRight, "Cambodian")
+   LNG(wxLANGUAGE_CATALAN,                    "ca_ES", LANG_CATALAN   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Catalan")
+   LNG(wxLANGUAGE_CHINESE,                    "zh_TW", LANG_CHINESE   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Chinese")
+   LNG(wxLANGUAGE_CHINESE_SIMPLIFIED,         "zh_CN", LANG_CHINESE   , SUBLANG_CHINESE_SIMPLIFIED        , wxLayout_LeftToRight, "Chinese (Simplified)")
+   LNG(wxLANGUAGE_CHINESE_TRADITIONAL,        "zh_TW", LANG_CHINESE   , SUBLANG_CHINESE_TRADITIONAL       , wxLayout_LeftToRight, "Chinese (Traditional)")
+   LNG(wxLANGUAGE_CHINESE_HONGKONG,           "zh_HK", LANG_CHINESE   , SUBLANG_CHINESE_HONGKONG          , wxLayout_LeftToRight, "Chinese (Hongkong)")
+   LNG(wxLANGUAGE_CHINESE_MACAU,              "zh_MO", LANG_CHINESE   , SUBLANG_CHINESE_MACAU             , wxLayout_LeftToRight, "Chinese (Macau)")
+   LNG(wxLANGUAGE_CHINESE_SINGAPORE,          "zh_SG", LANG_CHINESE   , SUBLANG_CHINESE_SINGAPORE         , wxLayout_LeftToRight, "Chinese (Singapore)")
+   LNG(wxLANGUAGE_CHINESE_TAIWAN,             "zh_TW", LANG_CHINESE   , SUBLANG_CHINESE_TRADITIONAL       , wxLayout_LeftToRight, "Chinese (Taiwan)")
+   LNG(wxLANGUAGE_CORSICAN,                   "co"   , 0              , 0                                 , wxLayout_LeftToRight, "Corsican")
+   LNG(wxLANGUAGE_CROATIAN,                   "hr_HR", LANG_CROATIAN  , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Croatian")
+   LNG(wxLANGUAGE_CZECH,                      "cs_CZ", LANG_CZECH     , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Czech")
+   LNG(wxLANGUAGE_DANISH,                     "da_DK", LANG_DANISH    , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Danish")
+   LNG(wxLANGUAGE_DUTCH,                      "nl_NL", LANG_DUTCH     , SUBLANG_DUTCH                     , wxLayout_LeftToRight, "Dutch")
+   LNG(wxLANGUAGE_DUTCH_BELGIAN,              "nl_BE", LANG_DUTCH     , SUBLANG_DUTCH_BELGIAN             , wxLayout_LeftToRight, "Dutch (Belgian)")
+   LNG(wxLANGUAGE_ENGLISH,                    "en_GB", LANG_ENGLISH   , SUBLANG_ENGLISH_UK                , wxLayout_LeftToRight, "English")
+   LNG(wxLANGUAGE_ENGLISH_UK,                 "en_GB", LANG_ENGLISH   , SUBLANG_ENGLISH_UK                , wxLayout_LeftToRight, "English (U.K.)")
+   LNG(wxLANGUAGE_ENGLISH_US,                 "en_US", LANG_ENGLISH   , SUBLANG_ENGLISH_US                , wxLayout_LeftToRight, "English (U.S.)")
+   LNG(wxLANGUAGE_ENGLISH_AUSTRALIA,          "en_AU", LANG_ENGLISH   , SUBLANG_ENGLISH_AUS               , wxLayout_LeftToRight, "English (Australia)")
+   LNG(wxLANGUAGE_ENGLISH_BELIZE,             "en_BZ", LANG_ENGLISH   , SUBLANG_ENGLISH_BELIZE            , wxLayout_LeftToRight, "English (Belize)")
+   LNG(wxLANGUAGE_ENGLISH_BOTSWANA,           "en_BW", 0              , 0                                 , wxLayout_LeftToRight, "English (Botswana)")
+   LNG(wxLANGUAGE_ENGLISH_CANADA,             "en_CA", LANG_ENGLISH   , SUBLANG_ENGLISH_CAN               , wxLayout_LeftToRight, "English (Canada)")
+   LNG(wxLANGUAGE_ENGLISH_CARIBBEAN,          "en_CB", LANG_ENGLISH   , SUBLANG_ENGLISH_CARIBBEAN         , wxLayout_LeftToRight, "English (Caribbean)")
+   LNG(wxLANGUAGE_ENGLISH_DENMARK,            "en_DK", 0              , 0                                 , wxLayout_LeftToRight, "English (Denmark)")
+   LNG(wxLANGUAGE_ENGLISH_EIRE,               "en_IE", LANG_ENGLISH   , SUBLANG_ENGLISH_EIRE              , wxLayout_LeftToRight, "English (Eire)")
+   LNG(wxLANGUAGE_ENGLISH_JAMAICA,            "en_JM", LANG_ENGLISH   , SUBLANG_ENGLISH_JAMAICA           , wxLayout_LeftToRight, "English (Jamaica)")
+   LNG(wxLANGUAGE_ENGLISH_NEW_ZEALAND,        "en_NZ", LANG_ENGLISH   , SUBLANG_ENGLISH_NZ                , wxLayout_LeftToRight, "English (New Zealand)")
+   LNG(wxLANGUAGE_ENGLISH_PHILIPPINES,        "en_PH", LANG_ENGLISH   , SUBLANG_ENGLISH_PHILIPPINES       , wxLayout_LeftToRight, "English (Philippines)")
+   LNG(wxLANGUAGE_ENGLISH_SOUTH_AFRICA,       "en_ZA", LANG_ENGLISH   , SUBLANG_ENGLISH_SOUTH_AFRICA      , wxLayout_LeftToRight, "English (South Africa)")
+   LNG(wxLANGUAGE_ENGLISH_TRINIDAD,           "en_TT", LANG_ENGLISH   , SUBLANG_ENGLISH_TRINIDAD          , wxLayout_LeftToRight, "English (Trinidad)")
+   LNG(wxLANGUAGE_ENGLISH_ZIMBABWE,           "en_ZW", LANG_ENGLISH   , SUBLANG_ENGLISH_ZIMBABWE          , wxLayout_LeftToRight, "English (Zimbabwe)")
+   LNG(wxLANGUAGE_ESPERANTO,                  "eo"   , 0              , 0                                 , wxLayout_LeftToRight, "Esperanto")
+   LNG(wxLANGUAGE_ESTONIAN,                   "et_EE", LANG_ESTONIAN  , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Estonian")
+   LNG(wxLANGUAGE_FAEROESE,                   "fo_FO", LANG_FAEROESE  , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Faeroese")
+   LNG(wxLANGUAGE_FARSI,                      "fa_IR", LANG_FARSI     , SUBLANG_DEFAULT                   , wxLayout_RightToLeft, "Farsi")
+   LNG(wxLANGUAGE_FIJI,                       "fj"   , 0              , 0                                 , wxLayout_LeftToRight, "Fiji")
+   LNG(wxLANGUAGE_FINNISH,                    "fi_FI", LANG_FINNISH   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Finnish")
+   LNG(wxLANGUAGE_FRENCH,                     "fr_FR", LANG_FRENCH    , SUBLANG_FRENCH                    , wxLayout_LeftToRight, "French")
+   LNG(wxLANGUAGE_FRENCH_BELGIAN,             "fr_BE", LANG_FRENCH    , SUBLANG_FRENCH_BELGIAN            , wxLayout_LeftToRight, "French (Belgian)")
+   LNG(wxLANGUAGE_FRENCH_CANADIAN,            "fr_CA", LANG_FRENCH    , SUBLANG_FRENCH_CANADIAN           , wxLayout_LeftToRight, "French (Canadian)")
+   LNG(wxLANGUAGE_FRENCH_LUXEMBOURG,          "fr_LU", LANG_FRENCH    , SUBLANG_FRENCH_LUXEMBOURG         , wxLayout_LeftToRight, "French (Luxembourg)")
+   LNG(wxLANGUAGE_FRENCH_MONACO,              "fr_MC", LANG_FRENCH    , SUBLANG_FRENCH_MONACO             , wxLayout_LeftToRight, "French (Monaco)")
+   LNG(wxLANGUAGE_FRENCH_SWISS,               "fr_CH", LANG_FRENCH    , SUBLANG_FRENCH_SWISS              , wxLayout_LeftToRight, "French (Swiss)")
+   LNG(wxLANGUAGE_FRISIAN,                    "fy"   , 0              , 0                                 , wxLayout_LeftToRight, "Frisian")
+   LNG(wxLANGUAGE_GALICIAN,                   "gl_ES", 0              , 0                                 , wxLayout_LeftToRight, "Galician")
+   LNG(wxLANGUAGE_GEORGIAN,                   "ka_GE", LANG_GEORGIAN  , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Georgian")
+   LNG(wxLANGUAGE_GERMAN,                     "de_DE", LANG_GERMAN    , SUBLANG_GERMAN                    , wxLayout_LeftToRight, "German")
+   LNG(wxLANGUAGE_GERMAN_AUSTRIAN,            "de_AT", LANG_GERMAN    , SUBLANG_GERMAN_AUSTRIAN           , wxLayout_LeftToRight, "German (Austrian)")
+   LNG(wxLANGUAGE_GERMAN_BELGIUM,             "de_BE", 0              , 0                                 , wxLayout_LeftToRight, "German (Belgium)")
+   LNG(wxLANGUAGE_GERMAN_LIECHTENSTEIN,       "de_LI", LANG_GERMAN    , SUBLANG_GERMAN_LIECHTENSTEIN      , wxLayout_LeftToRight, "German (Liechtenstein)")
+   LNG(wxLANGUAGE_GERMAN_LUXEMBOURG,          "de_LU", LANG_GERMAN    , SUBLANG_GERMAN_LUXEMBOURG         , wxLayout_LeftToRight, "German (Luxembourg)")
+   LNG(wxLANGUAGE_GERMAN_SWISS,               "de_CH", LANG_GERMAN    , SUBLANG_GERMAN_SWISS              , wxLayout_LeftToRight, "German (Swiss)")
+   LNG(wxLANGUAGE_GREEK,                      "el_GR", LANG_GREEK     , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Greek")
+   LNG(wxLANGUAGE_GREENLANDIC,                "kl_GL", 0              , 0                                 , wxLayout_LeftToRight, "Greenlandic")
+   LNG(wxLANGUAGE_GUARANI,                    "gn"   , 0              , 0                                 , wxLayout_LeftToRight, "Guarani")
+   LNG(wxLANGUAGE_GUJARATI,                   "gu"   , LANG_GUJARATI  , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Gujarati")
+   LNG(wxLANGUAGE_HAUSA,                      "ha"   , 0              , 0                                 , wxLayout_LeftToRight, "Hausa")
+   LNG(wxLANGUAGE_HEBREW,                     "he_IL", LANG_HEBREW    , SUBLANG_DEFAULT                   , wxLayout_RightToLeft, "Hebrew")
+   LNG(wxLANGUAGE_HINDI,                      "hi_IN", LANG_HINDI     , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Hindi")
+   LNG(wxLANGUAGE_HUNGARIAN,                  "hu_HU", LANG_HUNGARIAN , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Hungarian")
+   LNG(wxLANGUAGE_ICELANDIC,                  "is_IS", LANG_ICELANDIC , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Icelandic")
+   LNG(wxLANGUAGE_INDONESIAN,                 "id_ID", LANG_INDONESIAN, SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Indonesian")
+   LNG(wxLANGUAGE_INTERLINGUA,                "ia"   , 0              , 0                                 , wxLayout_LeftToRight, "Interlingua")
+   LNG(wxLANGUAGE_INTERLINGUE,                "ie"   , 0              , 0                                 , wxLayout_LeftToRight, "Interlingue")
+   LNG(wxLANGUAGE_INUKTITUT,                  "iu"   , 0              , 0                                 , wxLayout_LeftToRight, "Inuktitut")
+   LNG(wxLANGUAGE_INUPIAK,                    "ik"   , 0              , 0                                 , wxLayout_LeftToRight, "Inupiak")
+   LNG(wxLANGUAGE_IRISH,                      "ga_IE", 0              , 0                                 , wxLayout_LeftToRight, "Irish")
+   LNG(wxLANGUAGE_ITALIAN,                    "it_IT", LANG_ITALIAN   , SUBLANG_ITALIAN                   , wxLayout_LeftToRight, "Italian")
+   LNG(wxLANGUAGE_ITALIAN_SWISS,              "it_CH", LANG_ITALIAN   , SUBLANG_ITALIAN_SWISS             , wxLayout_LeftToRight, "Italian (Swiss)")
+   LNG(wxLANGUAGE_JAPANESE,                   "ja_JP", LANG_JAPANESE  , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Japanese")
+   LNG(wxLANGUAGE_JAVANESE,                   "jw"   , 0              , 0                                 , wxLayout_LeftToRight, "Javanese")
+   LNG(wxLANGUAGE_KANNADA,                    "kn"   , LANG_KANNADA   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Kannada")
+   LNG(wxLANGUAGE_KASHMIRI,                   "ks"   , LANG_KASHMIRI  , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Kashmiri")
+   LNG(wxLANGUAGE_KASHMIRI_INDIA,             "ks_IN", LANG_KASHMIRI  , SUBLANG_KASHMIRI_INDIA            , wxLayout_LeftToRight, "Kashmiri (India)")
+   LNG(wxLANGUAGE_KAZAKH,                     "kk"   , LANG_KAZAK     , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Kazakh")
+   LNG(wxLANGUAGE_KERNEWEK,                   "kw_GB", 0              , 0                                 , wxLayout_LeftToRight, "Kernewek")
+   LNG(wxLANGUAGE_KINYARWANDA,                "rw"   , 0              , 0                                 , wxLayout_LeftToRight, "Kinyarwanda")
+   LNG(wxLANGUAGE_KIRGHIZ,                    "ky"   , 0              , 0                                 , wxLayout_LeftToRight, "Kirghiz")
+   LNG(wxLANGUAGE_KIRUNDI,                    "rn"   , 0              , 0                                 , wxLayout_LeftToRight, "Kirundi")
+   LNG(wxLANGUAGE_KONKANI,                    ""     , LANG_KONKANI   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Konkani")
+   LNG(wxLANGUAGE_KOREAN,                     "ko_KR", LANG_KOREAN    , SUBLANG_KOREAN                    , wxLayout_LeftToRight, "Korean")
+   LNG(wxLANGUAGE_KURDISH,                    "ku_TR", 0              , 0                                 , wxLayout_LeftToRight, "Kurdish")
+   LNG(wxLANGUAGE_LAOTHIAN,                   "lo"   , 0              , 0                                 , wxLayout_LeftToRight, "Laothian")
+   LNG(wxLANGUAGE_LATIN,                      "la"   , 0              , 0                                 , wxLayout_LeftToRight, "Latin")
+   LNG(wxLANGUAGE_LATVIAN,                    "lv_LV", LANG_LATVIAN   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Latvian")
+   LNG(wxLANGUAGE_LINGALA,                    "ln"   , 0              , 0                                 , wxLayout_LeftToRight, "Lingala")
+   LNG(wxLANGUAGE_LITHUANIAN,                 "lt_LT", LANG_LITHUANIAN, SUBLANG_LITHUANIAN                , wxLayout_LeftToRight, "Lithuanian")
+   LNG(wxLANGUAGE_MACEDONIAN,                 "mk_MK", LANG_MACEDONIAN, SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Macedonian")
+   LNG(wxLANGUAGE_MALAGASY,                   "mg"   , 0              , 0                                 , wxLayout_LeftToRight, "Malagasy")
+   LNG(wxLANGUAGE_MALAY,                      "ms_MY", LANG_MALAY     , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Malay")
+   LNG(wxLANGUAGE_MALAYALAM,                  "ml"   , LANG_MALAYALAM , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Malayalam")
+   LNG(wxLANGUAGE_MALAY_BRUNEI_DARUSSALAM,    "ms_BN", LANG_MALAY     , SUBLANG_MALAY_BRUNEI_DARUSSALAM   , wxLayout_LeftToRight, "Malay (Brunei Darussalam)")
+   LNG(wxLANGUAGE_MALAY_MALAYSIA,             "ms_MY", LANG_MALAY     , SUBLANG_MALAY_MALAYSIA            , wxLayout_LeftToRight, "Malay (Malaysia)")
+   LNG(wxLANGUAGE_MALTESE,                    "mt_MT", 0              , 0                                 , wxLayout_LeftToRight, "Maltese")
+   LNG(wxLANGUAGE_MANIPURI,                   ""     , LANG_MANIPURI  , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Manipuri")
+   LNG(wxLANGUAGE_MAORI,                      "mi"   , 0              , 0                                 , wxLayout_LeftToRight, "Maori")
+   LNG(wxLANGUAGE_MARATHI,                    "mr_IN", LANG_MARATHI   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Marathi")
+   LNG(wxLANGUAGE_MOLDAVIAN,                  "mo"   , 0              , 0                                 , wxLayout_LeftToRight, "Moldavian")
+   LNG(wxLANGUAGE_MONGOLIAN,                  "mn"   , 0              , 0                                 , wxLayout_LeftToRight, "Mongolian")
+   LNG(wxLANGUAGE_NAURU,                      "na"   , 0              , 0                                 , wxLayout_LeftToRight, "Nauru")
+   LNG(wxLANGUAGE_NEPALI,                     "ne_NP", LANG_NEPALI    , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Nepali")
+   LNG(wxLANGUAGE_NEPALI_INDIA,               "ne_IN", LANG_NEPALI    , SUBLANG_NEPALI_INDIA              , wxLayout_LeftToRight, "Nepali (India)")
+   LNG(wxLANGUAGE_NORWEGIAN_BOKMAL,           "nb_NO", LANG_NORWEGIAN , SUBLANG_NORWEGIAN_BOKMAL          , wxLayout_LeftToRight, "Norwegian (Bokmal)")
+   LNG(wxLANGUAGE_NORWEGIAN_NYNORSK,          "nn_NO", LANG_NORWEGIAN , SUBLANG_NORWEGIAN_NYNORSK         , wxLayout_LeftToRight, "Norwegian (Nynorsk)")
+   LNG(wxLANGUAGE_OCCITAN,                    "oc"   , 0              , 0                                 , wxLayout_LeftToRight, "Occitan")
+   LNG(wxLANGUAGE_ORIYA,                      "or"   , LANG_ORIYA     , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Oriya")
+   LNG(wxLANGUAGE_OROMO,                      "om"   , 0              , 0                                 , wxLayout_LeftToRight, "(Afan) Oromo")
+   LNG(wxLANGUAGE_PASHTO,                     "ps"   , 0              , 0                                 , wxLayout_LeftToRight, "Pashto, Pushto")
+   LNG(wxLANGUAGE_POLISH,                     "pl_PL", LANG_POLISH    , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Polish")
+   LNG(wxLANGUAGE_PORTUGUESE,                 "pt_PT", LANG_PORTUGUESE, SUBLANG_PORTUGUESE                , wxLayout_LeftToRight, "Portuguese")
+   LNG(wxLANGUAGE_PORTUGUESE_BRAZILIAN,       "pt_BR", LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN      , wxLayout_LeftToRight, "Portuguese (Brazilian)")
+   LNG(wxLANGUAGE_PUNJABI,                    "pa"   , LANG_PUNJABI   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Punjabi")
+   LNG(wxLANGUAGE_QUECHUA,                    "qu"   , 0              , 0                                 , wxLayout_LeftToRight, "Quechua")
+   LNG(wxLANGUAGE_RHAETO_ROMANCE,             "rm"   , 0              , 0                                 , wxLayout_LeftToRight, "Rhaeto-Romance")
+   LNG(wxLANGUAGE_ROMANIAN,                   "ro_RO", LANG_ROMANIAN  , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Romanian")
+   LNG(wxLANGUAGE_RUSSIAN,                    "ru_RU", LANG_RUSSIAN   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Russian")
+   LNG(wxLANGUAGE_RUSSIAN_UKRAINE,            "ru_UA", 0              , 0                                 , wxLayout_LeftToRight, "Russian (Ukraine)")
+   LNG(wxLANGUAGE_SAMI,                       "se_NO", LANG_SAMI      , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Northern Sami")
+   LNG(wxLANGUAGE_SAMOAN,                     "sm"   , 0              , 0                                 , wxLayout_LeftToRight, "Samoan")
+   LNG(wxLANGUAGE_SANGHO,                     "sg"   , 0              , 0                                 , wxLayout_LeftToRight, "Sangho")
+   LNG(wxLANGUAGE_SANSKRIT,                   "sa"   , LANG_SANSKRIT  , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Sanskrit")
+   LNG(wxLANGUAGE_SCOTS_GAELIC,               "gd"   , 0              , 0                                 , wxLayout_LeftToRight, "Scots Gaelic")
+   LNG(wxLANGUAGE_SERBIAN,                    "sr_RS", LANG_SERBIAN   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Serbian")
+   LNG(wxLANGUAGE_SERBIAN_CYRILLIC,           "sr_RS", LANG_SERBIAN   , SUBLANG_SERBIAN_CYRILLIC          , wxLayout_LeftToRight, "Serbian (Cyrillic)")
+   LNG(wxLANGUAGE_SERBIAN_LATIN,              "sr_RS@latin", LANG_SERBIAN   , SUBLANG_SERBIAN_LATIN             , wxLayout_LeftToRight, "Serbian (Latin)")
+   LNG(wxLANGUAGE_SERBIAN_CYRILLIC,           "sr_YU", LANG_SERBIAN   , SUBLANG_SERBIAN_CYRILLIC          , wxLayout_LeftToRight, "Serbian (Cyrillic)")
+   LNG(wxLANGUAGE_SERBIAN_LATIN,              "sr_YU@latin", LANG_SERBIAN   , SUBLANG_SERBIAN_LATIN             , wxLayout_LeftToRight, "Serbian (Latin)")
+   LNG(wxLANGUAGE_SERBO_CROATIAN,             "sh"   , 0              , 0                                 , wxLayout_LeftToRight, "Serbo-Croatian")
+   LNG(wxLANGUAGE_SESOTHO,                    "st"   , 0              , 0                                 , wxLayout_LeftToRight, "Sesotho")
+   LNG(wxLANGUAGE_SETSWANA,                   "tn"   , 0              , 0                                 , wxLayout_LeftToRight, "Setswana")
+   LNG(wxLANGUAGE_SHONA,                      "sn"   , 0              , 0                                 , wxLayout_LeftToRight, "Shona")
+   LNG(wxLANGUAGE_SINDHI,                     "sd"   , LANG_SINDHI    , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Sindhi")
+   LNG(wxLANGUAGE_SINHALESE,                  "si"   , 0              , 0                                 , wxLayout_LeftToRight, "Sinhalese")
+   LNG(wxLANGUAGE_SISWATI,                    "ss"   , 0              , 0                                 , wxLayout_LeftToRight, "Siswati")
+   LNG(wxLANGUAGE_SLOVAK,                     "sk_SK", LANG_SLOVAK    , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Slovak")
+   LNG(wxLANGUAGE_SLOVENIAN,                  "sl_SI", LANG_SLOVENIAN , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Slovenian")
+   LNG(wxLANGUAGE_SOMALI,                     "so"   , 0              , 0                                 , wxLayout_LeftToRight, "Somali")
+   LNG(wxLANGUAGE_SPANISH,                    "es_ES", LANG_SPANISH   , SUBLANG_SPANISH                   , wxLayout_LeftToRight, "Spanish")
+   LNG(wxLANGUAGE_SPANISH_ARGENTINA,          "es_AR", LANG_SPANISH   , SUBLANG_SPANISH_ARGENTINA         , wxLayout_LeftToRight, "Spanish (Argentina)")
+   LNG(wxLANGUAGE_SPANISH_BOLIVIA,            "es_BO", LANG_SPANISH   , SUBLANG_SPANISH_BOLIVIA           , wxLayout_LeftToRight, "Spanish (Bolivia)")
+   LNG(wxLANGUAGE_SPANISH_CHILE,              "es_CL", LANG_SPANISH   , SUBLANG_SPANISH_CHILE             , wxLayout_LeftToRight, "Spanish (Chile)")
+   LNG(wxLANGUAGE_SPANISH_COLOMBIA,           "es_CO", LANG_SPANISH   , SUBLANG_SPANISH_COLOMBIA          , wxLayout_LeftToRight, "Spanish (Colombia)")
+   LNG(wxLANGUAGE_SPANISH_COSTA_RICA,         "es_CR", LANG_SPANISH   , SUBLANG_SPANISH_COSTA_RICA        , wxLayout_LeftToRight, "Spanish (Costa Rica)")
+   LNG(wxLANGUAGE_SPANISH_DOMINICAN_REPUBLIC, "es_DO", LANG_SPANISH   , SUBLANG_SPANISH_DOMINICAN_REPUBLIC, wxLayout_LeftToRight, "Spanish (Dominican republic)")
+   LNG(wxLANGUAGE_SPANISH_ECUADOR,            "es_EC", LANG_SPANISH   , SUBLANG_SPANISH_ECUADOR           , wxLayout_LeftToRight, "Spanish (Ecuador)")
+   LNG(wxLANGUAGE_SPANISH_EL_SALVADOR,        "es_SV", LANG_SPANISH   , SUBLANG_SPANISH_EL_SALVADOR       , wxLayout_LeftToRight, "Spanish (El Salvador)")
+   LNG(wxLANGUAGE_SPANISH_GUATEMALA,          "es_GT", LANG_SPANISH   , SUBLANG_SPANISH_GUATEMALA         , wxLayout_LeftToRight, "Spanish (Guatemala)")
+   LNG(wxLANGUAGE_SPANISH_HONDURAS,           "es_HN", LANG_SPANISH   , SUBLANG_SPANISH_HONDURAS          , wxLayout_LeftToRight, "Spanish (Honduras)")
+   LNG(wxLANGUAGE_SPANISH_MEXICAN,            "es_MX", LANG_SPANISH   , SUBLANG_SPANISH_MEXICAN           , wxLayout_LeftToRight, "Spanish (Mexican)")
+   LNG(wxLANGUAGE_SPANISH_MODERN,             "es_ES", LANG_SPANISH   , SUBLANG_SPANISH_MODERN            , wxLayout_LeftToRight, "Spanish (Modern)")
+   LNG(wxLANGUAGE_SPANISH_NICARAGUA,          "es_NI", LANG_SPANISH   , SUBLANG_SPANISH_NICARAGUA         , wxLayout_LeftToRight, "Spanish (Nicaragua)")
+   LNG(wxLANGUAGE_SPANISH_PANAMA,             "es_PA", LANG_SPANISH   , SUBLANG_SPANISH_PANAMA            , wxLayout_LeftToRight, "Spanish (Panama)")
+   LNG(wxLANGUAGE_SPANISH_PARAGUAY,           "es_PY", LANG_SPANISH   , SUBLANG_SPANISH_PARAGUAY          , wxLayout_LeftToRight, "Spanish (Paraguay)")
+   LNG(wxLANGUAGE_SPANISH_PERU,               "es_PE", LANG_SPANISH   , SUBLANG_SPANISH_PERU              , wxLayout_LeftToRight, "Spanish (Peru)")
+   LNG(wxLANGUAGE_SPANISH_PUERTO_RICO,        "es_PR", LANG_SPANISH   , SUBLANG_SPANISH_PUERTO_RICO       , wxLayout_LeftToRight, "Spanish (Puerto Rico)")
+   LNG(wxLANGUAGE_SPANISH_URUGUAY,            "es_UY", LANG_SPANISH   , SUBLANG_SPANISH_URUGUAY           , wxLayout_LeftToRight, "Spanish (Uruguay)")
+   LNG(wxLANGUAGE_SPANISH_US,                 "es_US", 0              , 0                                 , wxLayout_LeftToRight, "Spanish (U.S.)")
+   LNG(wxLANGUAGE_SPANISH_VENEZUELA,          "es_VE", LANG_SPANISH   , SUBLANG_SPANISH_VENEZUELA         , wxLayout_LeftToRight, "Spanish (Venezuela)")
+   LNG(wxLANGUAGE_SUNDANESE,                  "su"   , 0              , 0                                 , wxLayout_LeftToRight, "Sundanese")
+   LNG(wxLANGUAGE_SWAHILI,                    "sw_KE", LANG_SWAHILI   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Swahili")
+   LNG(wxLANGUAGE_SWEDISH,                    "sv_SE", LANG_SWEDISH   , SUBLANG_SWEDISH                   , wxLayout_LeftToRight, "Swedish")
+   LNG(wxLANGUAGE_SWEDISH_FINLAND,            "sv_FI", LANG_SWEDISH   , SUBLANG_SWEDISH_FINLAND           , wxLayout_LeftToRight, "Swedish (Finland)")
+   LNG(wxLANGUAGE_TAGALOG,                    "tl_PH", 0              , 0                                 , wxLayout_LeftToRight, "Tagalog")
+   LNG(wxLANGUAGE_TAJIK,                      "tg"   , 0              , 0                                 , wxLayout_LeftToRight, "Tajik")
+   LNG(wxLANGUAGE_TAMIL,                      "ta"   , LANG_TAMIL     , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Tamil")
+   LNG(wxLANGUAGE_TATAR,                      "tt"   , LANG_TATAR     , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Tatar")
+   LNG(wxLANGUAGE_TELUGU,                     "te"   , LANG_TELUGU    , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Telugu")
+   LNG(wxLANGUAGE_THAI,                       "th_TH", LANG_THAI      , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Thai")
+   LNG(wxLANGUAGE_TIBETAN,                    "bo"   , 0              , 0                                 , wxLayout_LeftToRight, "Tibetan")
+   LNG(wxLANGUAGE_TIGRINYA,                   "ti"   , 0              , 0                                 , wxLayout_LeftToRight, "Tigrinya")
+   LNG(wxLANGUAGE_TONGA,                      "to"   , 0              , 0                                 , wxLayout_LeftToRight, "Tonga")
+   LNG(wxLANGUAGE_TSONGA,                     "ts"   , 0              , 0                                 , wxLayout_LeftToRight, "Tsonga")
+   LNG(wxLANGUAGE_TURKISH,                    "tr_TR", LANG_TURKISH   , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Turkish")
+   LNG(wxLANGUAGE_TURKMEN,                    "tk"   , 0              , 0                                 , wxLayout_LeftToRight, "Turkmen")
+   LNG(wxLANGUAGE_TWI,                        "tw"   , 0              , 0                                 , wxLayout_LeftToRight, "Twi")
+   LNG(wxLANGUAGE_UIGHUR,                     "ug"   , 0              , 0                                 , wxLayout_LeftToRight, "Uighur")
+   LNG(wxLANGUAGE_UKRAINIAN,                  "uk_UA", LANG_UKRAINIAN , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Ukrainian")
+   LNG(wxLANGUAGE_URDU,                       "ur"   , LANG_URDU      , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Urdu")
+   LNG(wxLANGUAGE_URDU_INDIA,                 "ur_IN", LANG_URDU      , SUBLANG_URDU_INDIA                , wxLayout_LeftToRight, "Urdu (India)")
+   LNG(wxLANGUAGE_URDU_PAKISTAN,              "ur_PK", LANG_URDU      , SUBLANG_URDU_PAKISTAN             , wxLayout_LeftToRight, "Urdu (Pakistan)")
+   LNG(wxLANGUAGE_UZBEK,                      "uz"   , LANG_UZBEK     , SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Uzbek")
+   LNG(wxLANGUAGE_UZBEK_CYRILLIC,             "uz"   , LANG_UZBEK     , SUBLANG_UZBEK_CYRILLIC            , wxLayout_LeftToRight, "Uzbek (Cyrillic)")
+   LNG(wxLANGUAGE_UZBEK_LATIN,                "uz"   , LANG_UZBEK     , SUBLANG_UZBEK_LATIN               , wxLayout_LeftToRight, "Uzbek (Latin)")
+   LNG(wxLANGUAGE_VALENCIAN,                  "ca_ES@valencia", 0              , 0                                 , wxLayout_LeftToRight, "Valencian (Southern Catalan)")
+   LNG(wxLANGUAGE_VIETNAMESE,                 "vi_VN", LANG_VIETNAMESE, SUBLANG_DEFAULT                   , wxLayout_LeftToRight, "Vietnamese")
+   LNG(wxLANGUAGE_VOLAPUK,                    "vo"   , 0              , 0                                 , wxLayout_LeftToRight, "Volapuk")
+   LNG(wxLANGUAGE_WELSH,                      "cy"   , 0              , 0                                 , wxLayout_LeftToRight, "Welsh")
+   LNG(wxLANGUAGE_WOLOF,                      "wo"   , 0              , 0                                 , wxLayout_LeftToRight, "Wolof")
+   LNG(wxLANGUAGE_XHOSA,                      "xh"   , 0              , 0                                 , wxLayout_LeftToRight, "Xhosa")
+   LNG(wxLANGUAGE_YIDDISH,                    "yi"   , 0              , 0                                 , wxLayout_LeftToRight, "Yiddish")
+   LNG(wxLANGUAGE_YORUBA,                     "yo"   , 0              , 0                                 , wxLayout_LeftToRight, "Yoruba")
+   LNG(wxLANGUAGE_ZHUANG,                     "za"   , 0              , 0                                 , wxLayout_LeftToRight, "Zhuang")
+   LNG(wxLANGUAGE_ZULU,                       "zu"   , 0              , 0                                 , wxLayout_LeftToRight, "Zulu")
+
+}
+#undef LNG
+
+// --- --- --- generated code ends here --- --- ---
+
+#endif // wxUSE_INTL
diff --git a/src/common/translation.cpp b/src/common/translation.cpp
new file mode 100644 (file)
index 0000000..4c841af
--- /dev/null
@@ -0,0 +1,1745 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        src/common/translation.cpp
+// Purpose:     Internationalization and localisation for wxWidgets
+// Author:      Vadim Zeitlin, Vaclav Slavik,
+//              Michael N. Filippov <michael@idisys.iae.nsk.su>
+//              (2003/09/30 - PluralForms support)
+// Created:     2010-04-23
+// RCS-ID:      $Id$
+// Copyright:   (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+// ============================================================================
+// declaration
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+
+#if wxUSE_INTL
+
+#ifndef WX_PRECOMP
+    #include "wx/dynarray.h"
+    #include "wx/string.h"
+    #include "wx/intl.h"
+    #include "wx/log.h"
+    #include "wx/utils.h"
+    #include "wx/hashmap.h"
+    #include "wx/module.h"
+#endif // WX_PRECOMP
+
+// standard headers
+#include <ctype.h>
+#include <stdlib.h>
+
+#include "wx/file.h"
+#include "wx/filename.h"
+#include "wx/tokenzr.h"
+#include "wx/fontmap.h"
+#include "wx/scopedptr.h"
+#include "wx/stdpaths.h"
+#include "wx/hashset.h"
+
+// ----------------------------------------------------------------------------
+// simple types
+// ----------------------------------------------------------------------------
+
+typedef wxUint32 size_t32;
+
+// ----------------------------------------------------------------------------
+// constants
+// ----------------------------------------------------------------------------
+
+// magic number identifying the .mo format file
+const size_t32 MSGCATALOG_MAGIC    = 0x950412de;
+const size_t32 MSGCATALOG_MAGIC_SW = 0xde120495;
+
+#define TRACE_I18N wxS("i18n")
+
+// the constants describing the format of ll_CC locale string
+static const size_t LEN_LANG = 2;
+
+// ----------------------------------------------------------------------------
+// global functions
+// ----------------------------------------------------------------------------
+
+namespace
+{
+
+// get just the language part
+inline wxString ExtractLang(const wxString& langFull)
+{
+    return langFull.Left(LEN_LANG);
+}
+
+} // anonymous namespace
+
+
+// ============================================================================
+// implementation
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// Plural forms parser
+// ----------------------------------------------------------------------------
+
+/*
+                                Simplified Grammar
+
+Expression:
+    LogicalOrExpression '?' Expression ':' Expression
+    LogicalOrExpression
+
+LogicalOrExpression:
+    LogicalAndExpression "||" LogicalOrExpression   // to (a || b) || c
+    LogicalAndExpression
+
+LogicalAndExpression:
+    EqualityExpression "&&" LogicalAndExpression    // to (a && b) && c
+    EqualityExpression
+
+EqualityExpression:
+    RelationalExpression "==" RelationalExperession
+    RelationalExpression "!=" RelationalExperession
+    RelationalExpression
+
+RelationalExpression:
+    MultiplicativeExpression '>' MultiplicativeExpression
+    MultiplicativeExpression '<' MultiplicativeExpression
+    MultiplicativeExpression ">=" MultiplicativeExpression
+    MultiplicativeExpression "<=" MultiplicativeExpression
+    MultiplicativeExpression
+
+MultiplicativeExpression:
+    PmExpression '%' PmExpression
+    PmExpression
+
+PmExpression:
+    N
+    Number
+    '(' Expression ')'
+*/
+
+class wxPluralFormsToken
+{
+public:
+    enum Type
+    {
+        T_ERROR, T_EOF, T_NUMBER, T_N, T_PLURAL, T_NPLURALS, T_EQUAL, T_ASSIGN,
+        T_GREATER, T_GREATER_OR_EQUAL, T_LESS, T_LESS_OR_EQUAL,
+        T_REMINDER, T_NOT_EQUAL,
+        T_LOGICAL_AND, T_LOGICAL_OR, T_QUESTION, T_COLON, T_SEMICOLON,
+        T_LEFT_BRACKET, T_RIGHT_BRACKET
+    };
+    Type type() const { return m_type; }
+    void setType(Type type) { m_type = type; }
+    // for T_NUMBER only
+    typedef int Number;
+    Number number() const { return m_number; }
+    void setNumber(Number num) { m_number = num; }
+private:
+    Type m_type;
+    Number m_number;
+};
+
+
+class wxPluralFormsScanner
+{
+public:
+    wxPluralFormsScanner(const char* s);
+    const wxPluralFormsToken& token() const { return m_token; }
+    bool nextToken();  // returns false if error
+private:
+    const char* m_s;
+    wxPluralFormsToken m_token;
+};
+
+wxPluralFormsScanner::wxPluralFormsScanner(const char* s) : m_s(s)
+{
+    nextToken();
+}
+
+bool wxPluralFormsScanner::nextToken()
+{
+    wxPluralFormsToken::Type type = wxPluralFormsToken::T_ERROR;
+    while (isspace((unsigned char) *m_s))
+    {
+        ++m_s;
+    }
+    if (*m_s == 0)
+    {
+        type = wxPluralFormsToken::T_EOF;
+    }
+    else if (isdigit((unsigned char) *m_s))
+    {
+        wxPluralFormsToken::Number number = *m_s++ - '0';
+        while (isdigit((unsigned char) *m_s))
+        {
+            number = number * 10 + (*m_s++ - '0');
+        }
+        m_token.setNumber(number);
+        type = wxPluralFormsToken::T_NUMBER;
+    }
+    else if (isalpha((unsigned char) *m_s))
+    {
+        const char* begin = m_s++;
+        while (isalnum((unsigned char) *m_s))
+        {
+            ++m_s;
+        }
+        size_t size = m_s - begin;
+        if (size == 1 && memcmp(begin, "n", size) == 0)
+        {
+            type = wxPluralFormsToken::T_N;
+        }
+        else if (size == 6 && memcmp(begin, "plural", size) == 0)
+        {
+            type = wxPluralFormsToken::T_PLURAL;
+        }
+        else if (size == 8 && memcmp(begin, "nplurals", size) == 0)
+        {
+            type = wxPluralFormsToken::T_NPLURALS;
+        }
+    }
+    else if (*m_s == '=')
+    {
+        ++m_s;
+        if (*m_s == '=')
+        {
+            ++m_s;
+            type = wxPluralFormsToken::T_EQUAL;
+        }
+        else
+        {
+            type = wxPluralFormsToken::T_ASSIGN;
+        }
+    }
+    else if (*m_s == '>')
+    {
+        ++m_s;
+        if (*m_s == '=')
+        {
+            ++m_s;
+            type = wxPluralFormsToken::T_GREATER_OR_EQUAL;
+        }
+        else
+        {
+            type = wxPluralFormsToken::T_GREATER;
+        }
+    }
+    else if (*m_s == '<')
+    {
+        ++m_s;
+        if (*m_s == '=')
+        {
+            ++m_s;
+            type = wxPluralFormsToken::T_LESS_OR_EQUAL;
+        }
+        else
+        {
+            type = wxPluralFormsToken::T_LESS;
+        }
+    }
+    else if (*m_s == '%')
+    {
+        ++m_s;
+        type = wxPluralFormsToken::T_REMINDER;
+    }
+    else if (*m_s == '!' && m_s[1] == '=')
+    {
+        m_s += 2;
+        type = wxPluralFormsToken::T_NOT_EQUAL;
+    }
+    else if (*m_s == '&' && m_s[1] == '&')
+    {
+        m_s += 2;
+        type = wxPluralFormsToken::T_LOGICAL_AND;
+    }
+    else if (*m_s == '|' && m_s[1] == '|')
+    {
+        m_s += 2;
+        type = wxPluralFormsToken::T_LOGICAL_OR;
+    }
+    else if (*m_s == '?')
+    {
+        ++m_s;
+        type = wxPluralFormsToken::T_QUESTION;
+    }
+    else if (*m_s == ':')
+    {
+        ++m_s;
+        type = wxPluralFormsToken::T_COLON;
+    } else if (*m_s == ';') {
+        ++m_s;
+        type = wxPluralFormsToken::T_SEMICOLON;
+    }
+    else if (*m_s == '(')
+    {
+        ++m_s;
+        type = wxPluralFormsToken::T_LEFT_BRACKET;
+    }
+    else if (*m_s == ')')
+    {
+        ++m_s;
+        type = wxPluralFormsToken::T_RIGHT_BRACKET;
+    }
+    m_token.setType(type);
+    return type != wxPluralFormsToken::T_ERROR;
+}
+
+class wxPluralFormsNode;
+
+// NB: Can't use wxDEFINE_SCOPED_PTR_TYPE because wxPluralFormsNode is not
+//     fully defined yet:
+class wxPluralFormsNodePtr
+{
+public:
+    wxPluralFormsNodePtr(wxPluralFormsNode *p = NULL) : m_p(p) {}
+    ~wxPluralFormsNodePtr();
+    wxPluralFormsNode& operator*() const { return *m_p; }
+    wxPluralFormsNode* operator->() const { return m_p; }
+    wxPluralFormsNode* get() const { return m_p; }
+    wxPluralFormsNode* release();
+    void reset(wxPluralFormsNode *p);
+
+private:
+    wxPluralFormsNode *m_p;
+};
+
+class wxPluralFormsNode
+{
+public:
+    wxPluralFormsNode(const wxPluralFormsToken& token) : m_token(token) {}
+    const wxPluralFormsToken& token() const { return m_token; }
+    const wxPluralFormsNode* node(size_t i) const
+        { return m_nodes[i].get(); }
+    void setNode(size_t i, wxPluralFormsNode* n);
+    wxPluralFormsNode* releaseNode(size_t i);
+    wxPluralFormsToken::Number evaluate(wxPluralFormsToken::Number n) const;
+
+private:
+    wxPluralFormsToken m_token;
+    wxPluralFormsNodePtr m_nodes[3];
+};
+
+wxPluralFormsNodePtr::~wxPluralFormsNodePtr()
+{
+    delete m_p;
+}
+wxPluralFormsNode* wxPluralFormsNodePtr::release()
+{
+    wxPluralFormsNode *p = m_p;
+    m_p = NULL;
+    return p;
+}
+void wxPluralFormsNodePtr::reset(wxPluralFormsNode *p)
+{
+    if (p != m_p)
+    {
+        delete m_p;
+        m_p = p;
+    }
+}
+
+
+void wxPluralFormsNode::setNode(size_t i, wxPluralFormsNode* n)
+{
+    m_nodes[i].reset(n);
+}
+
+wxPluralFormsNode*  wxPluralFormsNode::releaseNode(size_t i)
+{
+    return m_nodes[i].release();
+}
+
+wxPluralFormsToken::Number
+wxPluralFormsNode::evaluate(wxPluralFormsToken::Number n) const
+{
+    switch (token().type())
+    {
+        // leaf
+        case wxPluralFormsToken::T_NUMBER:
+            return token().number();
+        case wxPluralFormsToken::T_N:
+            return n;
+        // 2 args
+        case wxPluralFormsToken::T_EQUAL:
+            return node(0)->evaluate(n) == node(1)->evaluate(n);
+        case wxPluralFormsToken::T_NOT_EQUAL:
+            return node(0)->evaluate(n) != node(1)->evaluate(n);
+        case wxPluralFormsToken::T_GREATER:
+            return node(0)->evaluate(n) > node(1)->evaluate(n);
+        case wxPluralFormsToken::T_GREATER_OR_EQUAL:
+            return node(0)->evaluate(n) >= node(1)->evaluate(n);
+        case wxPluralFormsToken::T_LESS:
+            return node(0)->evaluate(n) < node(1)->evaluate(n);
+        case wxPluralFormsToken::T_LESS_OR_EQUAL:
+            return node(0)->evaluate(n) <= node(1)->evaluate(n);
+        case wxPluralFormsToken::T_REMINDER:
+            {
+                wxPluralFormsToken::Number number = node(1)->evaluate(n);
+                if (number != 0)
+                {
+                    return node(0)->evaluate(n) % number;
+                }
+                else
+                {
+                    return 0;
+                }
+            }
+        case wxPluralFormsToken::T_LOGICAL_AND:
+            return node(0)->evaluate(n) && node(1)->evaluate(n);
+        case wxPluralFormsToken::T_LOGICAL_OR:
+            return node(0)->evaluate(n) || node(1)->evaluate(n);
+        // 3 args
+        case wxPluralFormsToken::T_QUESTION:
+            return node(0)->evaluate(n)
+                ? node(1)->evaluate(n)
+                : node(2)->evaluate(n);
+        default:
+            return 0;
+    }
+}
+
+
+class wxPluralFormsCalculator
+{
+public:
+    wxPluralFormsCalculator() : m_nplurals(0), m_plural(0) {}
+
+    // input: number, returns msgstr index
+    int evaluate(int n) const;
+
+    // input: text after "Plural-Forms:" (e.g. "nplurals=2; plural=(n != 1);"),
+    // if s == 0, creates default handler
+    // returns 0 if error
+    static wxPluralFormsCalculator* make(const char* s = 0);
+
+    ~wxPluralFormsCalculator() {}
+
+    void  init(wxPluralFormsToken::Number nplurals, wxPluralFormsNode* plural);
+
+private:
+    wxPluralFormsToken::Number m_nplurals;
+    wxPluralFormsNodePtr m_plural;
+};
+
+wxDEFINE_SCOPED_PTR_TYPE(wxPluralFormsCalculator)
+
+void wxPluralFormsCalculator::init(wxPluralFormsToken::Number nplurals,
+                                wxPluralFormsNode* plural)
+{
+    m_nplurals = nplurals;
+    m_plural.reset(plural);
+}
+
+int wxPluralFormsCalculator::evaluate(int n) const
+{
+    if (m_plural.get() == 0)
+    {
+        return 0;
+    }
+    wxPluralFormsToken::Number number = m_plural->evaluate(n);
+    if (number < 0 || number > m_nplurals)
+    {
+        return 0;
+    }
+    return number;
+}
+
+
+class wxPluralFormsParser
+{
+public:
+    wxPluralFormsParser(wxPluralFormsScanner& scanner) : m_scanner(scanner) {}
+    bool parse(wxPluralFormsCalculator& rCalculator);
+
+private:
+    wxPluralFormsNode* parsePlural();
+    // stops at T_SEMICOLON, returns 0 if error
+    wxPluralFormsScanner& m_scanner;
+    const wxPluralFormsToken& token() const;
+    bool nextToken();
+
+    wxPluralFormsNode* expression();
+    wxPluralFormsNode* logicalOrExpression();
+    wxPluralFormsNode* logicalAndExpression();
+    wxPluralFormsNode* equalityExpression();
+    wxPluralFormsNode* multiplicativeExpression();
+    wxPluralFormsNode* relationalExpression();
+    wxPluralFormsNode* pmExpression();
+};
+
+bool wxPluralFormsParser::parse(wxPluralFormsCalculator& rCalculator)
+{
+    if (token().type() != wxPluralFormsToken::T_NPLURALS)
+        return false;
+    if (!nextToken())
+        return false;
+    if (token().type() != wxPluralFormsToken::T_ASSIGN)
+        return false;
+    if (!nextToken())
+        return false;
+    if (token().type() != wxPluralFormsToken::T_NUMBER)
+        return false;
+    wxPluralFormsToken::Number nplurals = token().number();
+    if (!nextToken())
+        return false;
+    if (token().type() != wxPluralFormsToken::T_SEMICOLON)
+        return false;
+    if (!nextToken())
+        return false;
+    if (token().type() != wxPluralFormsToken::T_PLURAL)
+        return false;
+    if (!nextToken())
+        return false;
+    if (token().type() != wxPluralFormsToken::T_ASSIGN)
+        return false;
+    if (!nextToken())
+        return false;
+    wxPluralFormsNode* plural = parsePlural();
+    if (plural == 0)
+        return false;
+    if (token().type() != wxPluralFormsToken::T_SEMICOLON)
+        return false;
+    if (!nextToken())
+        return false;
+    if (token().type() != wxPluralFormsToken::T_EOF)
+        return false;
+    rCalculator.init(nplurals, plural);
+    return true;
+}
+
+wxPluralFormsNode* wxPluralFormsParser::parsePlural()
+{
+    wxPluralFormsNode* p = expression();
+    if (p == NULL)
+    {
+        return NULL;
+    }
+    wxPluralFormsNodePtr n(p);
+    if (token().type() != wxPluralFormsToken::T_SEMICOLON)
+    {
+        return NULL;
+    }
+    return n.release();
+}
+
+const wxPluralFormsToken& wxPluralFormsParser::token() const
+{
+    return m_scanner.token();
+}
+
+bool wxPluralFormsParser::nextToken()
+{
+    if (!m_scanner.nextToken())
+        return false;
+    return true;
+}
+
+wxPluralFormsNode* wxPluralFormsParser::expression()
+{
+    wxPluralFormsNode* p = logicalOrExpression();
+    if (p == NULL)
+        return NULL;
+    wxPluralFormsNodePtr n(p);
+    if (token().type() == wxPluralFormsToken::T_QUESTION)
+    {
+        wxPluralFormsNodePtr qn(new wxPluralFormsNode(token()));
+        if (!nextToken())
+        {
+            return 0;
+        }
+        p = expression();
+        if (p == 0)
+        {
+            return 0;
+        }
+        qn->setNode(1, p);
+        if (token().type() != wxPluralFormsToken::T_COLON)
+        {
+            return 0;
+        }
+        if (!nextToken())
+        {
+            return 0;
+        }
+        p = expression();
+        if (p == 0)
+        {
+            return 0;
+        }
+        qn->setNode(2, p);
+        qn->setNode(0, n.release());
+        return qn.release();
+    }
+    return n.release();
+}
+
+wxPluralFormsNode*wxPluralFormsParser::logicalOrExpression()
+{
+    wxPluralFormsNode* p = logicalAndExpression();
+    if (p == NULL)
+        return NULL;
+    wxPluralFormsNodePtr ln(p);
+    if (token().type() == wxPluralFormsToken::T_LOGICAL_OR)
+    {
+        wxPluralFormsNodePtr un(new wxPluralFormsNode(token()));
+        if (!nextToken())
+        {
+            return 0;
+        }
+        p = logicalOrExpression();
+        if (p == 0)
+        {
+            return 0;
+        }
+        wxPluralFormsNodePtr rn(p);    // right
+        if (rn->token().type() == wxPluralFormsToken::T_LOGICAL_OR)
+        {
+            // see logicalAndExpression comment
+            un->setNode(0, ln.release());
+            un->setNode(1, rn->releaseNode(0));
+            rn->setNode(0, un.release());
+            return rn.release();
+        }
+
+
+        un->setNode(0, ln.release());
+        un->setNode(1, rn.release());
+        return un.release();
+    }
+    return ln.release();
+}
+
+wxPluralFormsNode* wxPluralFormsParser::logicalAndExpression()
+{
+    wxPluralFormsNode* p = equalityExpression();
+    if (p == NULL)
+        return NULL;
+    wxPluralFormsNodePtr ln(p);   // left
+    if (token().type() == wxPluralFormsToken::T_LOGICAL_AND)
+    {
+        wxPluralFormsNodePtr un(new wxPluralFormsNode(token()));  // up
+        if (!nextToken())
+        {
+            return NULL;
+        }
+        p = logicalAndExpression();
+        if (p == 0)
+        {
+            return NULL;
+        }
+        wxPluralFormsNodePtr rn(p);    // right
+        if (rn->token().type() == wxPluralFormsToken::T_LOGICAL_AND)
+        {
+// transform 1 && (2 && 3) -> (1 && 2) && 3
+//     u                  r
+// l       r     ->   u      3
+//       2   3      l   2
+            un->setNode(0, ln.release());
+            un->setNode(1, rn->releaseNode(0));
+            rn->setNode(0, un.release());
+            return rn.release();
+        }
+
+        un->setNode(0, ln.release());
+        un->setNode(1, rn.release());
+        return un.release();
+    }
+    return ln.release();
+}
+
+wxPluralFormsNode* wxPluralFormsParser::equalityExpression()
+{
+    wxPluralFormsNode* p = relationalExpression();
+    if (p == NULL)
+        return NULL;
+    wxPluralFormsNodePtr n(p);
+    if (token().type() == wxPluralFormsToken::T_EQUAL
+        || token().type() == wxPluralFormsToken::T_NOT_EQUAL)
+    {
+        wxPluralFormsNodePtr qn(new wxPluralFormsNode(token()));
+        if (!nextToken())
+        {
+            return NULL;
+        }
+        p = relationalExpression();
+        if (p == NULL)
+        {
+            return NULL;
+        }
+        qn->setNode(1, p);
+        qn->setNode(0, n.release());
+        return qn.release();
+    }
+    return n.release();
+}
+
+wxPluralFormsNode* wxPluralFormsParser::relationalExpression()
+{
+    wxPluralFormsNode* p = multiplicativeExpression();
+    if (p == NULL)
+        return NULL;
+    wxPluralFormsNodePtr n(p);
+    if (token().type() == wxPluralFormsToken::T_GREATER
+            || token().type() == wxPluralFormsToken::T_LESS
+            || token().type() == wxPluralFormsToken::T_GREATER_OR_EQUAL
+            || token().type() == wxPluralFormsToken::T_LESS_OR_EQUAL)
+    {
+        wxPluralFormsNodePtr qn(new wxPluralFormsNode(token()));
+        if (!nextToken())
+        {
+            return NULL;
+        }
+        p = multiplicativeExpression();
+        if (p == NULL)
+        {
+            return NULL;
+        }
+        qn->setNode(1, p);
+        qn->setNode(0, n.release());
+        return qn.release();
+    }
+    return n.release();
+}
+
+wxPluralFormsNode* wxPluralFormsParser::multiplicativeExpression()
+{
+    wxPluralFormsNode* p = pmExpression();
+    if (p == NULL)
+        return NULL;
+    wxPluralFormsNodePtr n(p);
+    if (token().type() == wxPluralFormsToken::T_REMINDER)
+    {
+        wxPluralFormsNodePtr qn(new wxPluralFormsNode(token()));
+        if (!nextToken())
+        {
+            return NULL;
+        }
+        p = pmExpression();
+        if (p == NULL)
+        {
+            return NULL;
+        }
+        qn->setNode(1, p);
+        qn->setNode(0, n.release());
+        return qn.release();
+    }
+    return n.release();
+}
+
+wxPluralFormsNode* wxPluralFormsParser::pmExpression()
+{
+    wxPluralFormsNodePtr n;
+    if (token().type() == wxPluralFormsToken::T_N
+        || token().type() == wxPluralFormsToken::T_NUMBER)
+    {
+        n.reset(new wxPluralFormsNode(token()));
+        if (!nextToken())
+        {
+            return NULL;
+        }
+    }
+    else if (token().type() == wxPluralFormsToken::T_LEFT_BRACKET) {
+        if (!nextToken())
+        {
+            return NULL;
+        }
+        wxPluralFormsNode* p = expression();
+        if (p == NULL)
+        {
+            return NULL;
+        }
+        n.reset(p);
+        if (token().type() != wxPluralFormsToken::T_RIGHT_BRACKET)
+        {
+            return NULL;
+        }
+        if (!nextToken())
+        {
+            return NULL;
+        }
+    }
+    else
+    {
+        return NULL;
+    }
+    return n.release();
+}
+
+wxPluralFormsCalculator* wxPluralFormsCalculator::make(const char* s)
+{
+    wxPluralFormsCalculatorPtr calculator(new wxPluralFormsCalculator);
+    if (s != NULL)
+    {
+        wxPluralFormsScanner scanner(s);
+        wxPluralFormsParser p(scanner);
+        if (!p.parse(*calculator))
+        {
+            return NULL;
+        }
+    }
+    return calculator.release();
+}
+
+
+
+
+// ----------------------------------------------------------------------------
+// wxMsgCatalogFile corresponds to one disk-file message catalog.
+//
+// This is a "low-level" class and is used only by wxMsgCatalog
+// NOTE: for the documentation of the binary catalog (.MO) files refer to
+//       the GNU gettext manual:
+//       http://www.gnu.org/software/autoconf/manual/gettext/MO-Files.html
+// ----------------------------------------------------------------------------
+
+WX_DECLARE_EXPORTED_STRING_HASH_MAP(wxString, wxMessagesHash);
+
+class wxMsgCatalogFile
+{
+public:
+    // ctor & dtor
+    wxMsgCatalogFile();
+    ~wxMsgCatalogFile();
+
+    // load the catalog from disk
+    bool Load(const wxString& filename,
+              wxPluralFormsCalculatorPtr& rPluralFormsCalculator);
+
+    // fills the hash with string-translation pairs
+    bool FillHash(wxMessagesHash& hash, const wxString& msgIdCharset) const;
+
+    // return the charset of the strings in this catalog or empty string if
+    // none/unknown
+    wxString GetCharset() const { return m_charset; }
+
+private:
+    // this implementation is binary compatible with GNU gettext() version 0.10
+
+    // an entry in the string table
+    struct wxMsgTableEntry
+    {
+        size_t32   nLen;           // length of the string
+        size_t32   ofsString;      // pointer to the string
+    };
+
+    // header of a .mo file
+    struct wxMsgCatalogHeader
+    {
+        size_t32  magic,          // offset +00:  magic id
+                  revision,       //        +04:  revision
+                  numStrings;     //        +08:  number of strings in the file
+        size_t32  ofsOrigTable,   //        +0C:  start of original string table
+                  ofsTransTable;  //        +10:  start of translated string table
+        size_t32  nHashSize,      //        +14:  hash table size
+                  ofsHashTable;   //        +18:  offset of hash table start
+    };
+
+    // all data is stored here
+    wxMemoryBuffer m_data;
+
+    // data description
+    size_t32          m_numStrings;   // number of strings in this domain
+    wxMsgTableEntry  *m_pOrigTable,   // pointer to original   strings
+                     *m_pTransTable;  //            translated
+
+    wxString m_charset;               // from the message catalog header
+
+
+    // swap the 2 halves of 32 bit integer if needed
+    size_t32 Swap(size_t32 ui) const
+    {
+        return m_bSwapped ? (ui << 24) | ((ui & 0xff00) << 8) |
+                            ((ui >> 8) & 0xff00) | (ui >> 24)
+                            : ui;
+    }
+
+    // just return the pointer to the start of the data as "char *" to
+    // facilitate doing pointer arithmetic with it
+    char *StringData() const
+    {
+        return static_cast<char *>(m_data.GetData());
+    }
+
+    const char *StringAtOfs(wxMsgTableEntry *pTable, size_t32 n) const
+    {
+        const wxMsgTableEntry * const ent = pTable + n;
+
+        // this check could fail for a corrupt message catalog
+        size_t32 ofsString = Swap(ent->ofsString);
+        if ( ofsString + Swap(ent->nLen) > m_data.GetDataLen())
+        {
+            return NULL;
+        }
+
+        return StringData() + ofsString;
+    }
+
+    bool m_bSwapped;   // wrong endianness?
+
+    wxDECLARE_NO_COPY_CLASS(wxMsgCatalogFile);
+};
+
+
+// ----------------------------------------------------------------------------
+// wxMsgCatalog corresponds to one loaded message catalog.
+//
+// This is a "low-level" class and is used only by wxLocale (that's why
+// it's designed to be stored in a linked list)
+// ----------------------------------------------------------------------------
+
+class wxMsgCatalog
+{
+public:
+#if !wxUSE_UNICODE
+    wxMsgCatalog() { m_conv = NULL; }
+    ~wxMsgCatalog();
+#endif
+
+    // load the catalog from disk
+    bool Load(const wxString& filename,
+              const wxString& domain,
+              const wxString& msgIdCharset);
+
+    // get name of the catalog
+    wxString GetDomain() const { return m_domain; }
+
+    // get the translated string: returns NULL if not found
+    const wxString *GetString(const wxString& sz, size_t n = size_t(-1)) const;
+
+    // public variable pointing to the next element in a linked list (or NULL)
+    wxMsgCatalog *m_pNext;
+
+private:
+    wxMessagesHash  m_messages; // all messages in the catalog
+    wxString        m_domain;   // name of the domain
+
+#if !wxUSE_UNICODE
+    // the conversion corresponding to this catalog charset if we installed it
+    // as the global one
+    wxCSConv *m_conv;
+#endif
+
+    wxPluralFormsCalculatorPtr  m_pluralFormsCalculator;
+};
+
+// ----------------------------------------------------------------------------
+// wxMsgCatalogFile clas
+// ----------------------------------------------------------------------------
+
+wxMsgCatalogFile::wxMsgCatalogFile()
+{
+}
+
+wxMsgCatalogFile::~wxMsgCatalogFile()
+{
+}
+
+// open disk file and read in it's contents
+bool wxMsgCatalogFile::Load(const wxString& filename,
+                            wxPluralFormsCalculatorPtr& rPluralFormsCalculator)
+{
+    wxFile fileMsg(filename);
+    if ( !fileMsg.IsOpened() )
+        return false;
+
+    // get the file size (assume it is less than 4Gb...)
+    wxFileOffset lenFile = fileMsg.Length();
+    if ( lenFile == wxInvalidOffset )
+        return false;
+
+    size_t nSize = wx_truncate_cast(size_t, lenFile);
+    wxASSERT_MSG( nSize == lenFile + size_t(0), wxS("message catalog bigger than 4GB?") );
+
+    // read the whole file in memory
+    if ( fileMsg.Read(m_data.GetWriteBuf(nSize), nSize) != lenFile )
+        return false;
+
+    m_data.UngetWriteBuf(nSize);
+
+
+    // examine header
+    bool bValid = m_data.GetDataLen() > sizeof(wxMsgCatalogHeader);
+
+    const wxMsgCatalogHeader *pHeader = (wxMsgCatalogHeader *)m_data.GetData();
+    if ( bValid ) {
+        // we'll have to swap all the integers if it's true
+        m_bSwapped = pHeader->magic == MSGCATALOG_MAGIC_SW;
+
+        // check the magic number
+        bValid = m_bSwapped || pHeader->magic == MSGCATALOG_MAGIC;
+    }
+
+    if ( !bValid ) {
+        // it's either too short or has incorrect magic number
+        wxLogWarning(_("'%s' is not a valid message catalog."), filename.c_str());
+
+        return false;
+    }
+
+    // initialize
+    m_numStrings  = Swap(pHeader->numStrings);
+    m_pOrigTable  = (wxMsgTableEntry *)(StringData() +
+                    Swap(pHeader->ofsOrigTable));
+    m_pTransTable = (wxMsgTableEntry *)(StringData() +
+                    Swap(pHeader->ofsTransTable));
+
+    // now parse catalog's header and try to extract catalog charset and
+    // plural forms formula from it:
+
+    const char* headerData = StringAtOfs(m_pOrigTable, 0);
+    if ( headerData && headerData[0] == '\0' )
+    {
+        // Extract the charset:
+        const char * const header = StringAtOfs(m_pTransTable, 0);
+        const char *
+            cset = strstr(header, "Content-Type: text/plain; charset=");
+        if ( cset )
+        {
+            cset += 34; // strlen("Content-Type: text/plain; charset=")
+
+            const char * const csetEnd = strchr(cset, '\n');
+            if ( csetEnd )
+            {
+                m_charset = wxString(cset, csetEnd - cset);
+                if ( m_charset == wxS("CHARSET") )
+                {
+                    // "CHARSET" is not valid charset, but lazy translator
+                    m_charset.empty();
+                }
+            }
+        }
+        // else: incorrectly filled Content-Type header
+
+        // Extract plural forms:
+        const char * plurals = strstr(header, "Plural-Forms:");
+        if ( plurals )
+        {
+            plurals += 13; // strlen("Plural-Forms:")
+            const char * const pluralsEnd = strchr(plurals, '\n');
+            if ( pluralsEnd )
+            {
+                const size_t pluralsLen = pluralsEnd - plurals;
+                wxCharBuffer buf(pluralsLen);
+                strncpy(buf.data(), plurals, pluralsLen);
+                wxPluralFormsCalculator * const
+                    pCalculator = wxPluralFormsCalculator::make(buf);
+                if ( pCalculator )
+                {
+                    rPluralFormsCalculator.reset(pCalculator);
+                }
+                else
+                {
+                    wxLogVerbose(_("Failed to parse Plural-Forms: '%s'"),
+                                 buf.data());
+                }
+            }
+        }
+
+        if ( !rPluralFormsCalculator.get() )
+            rPluralFormsCalculator.reset(wxPluralFormsCalculator::make());
+    }
+
+    // everything is fine
+    return true;
+}
+
+bool wxMsgCatalogFile::FillHash(wxMessagesHash& hash,
+                                const wxString& msgIdCharset) const
+{
+    wxUnusedVar(msgIdCharset); // silence warning in Unicode build
+
+    // conversion to use to convert catalog strings to the GUI encoding
+    wxMBConv *inputConv = NULL;
+    wxMBConv *inputConvPtr = NULL; // same as inputConv but safely deleteable
+
+    if ( !m_charset.empty() )
+    {
+#if !wxUSE_UNICODE && wxUSE_FONTMAP
+        // determine if we need any conversion at all
+        wxFontEncoding encCat = wxFontMapperBase::GetEncodingFromName(m_charset);
+        if ( encCat != wxLocale::GetSystemEncoding() )
+#endif
+        {
+            inputConvPtr =
+            inputConv = new wxCSConv(m_charset);
+        }
+    }
+    else // no need or not possible to convert the encoding
+    {
+#if wxUSE_UNICODE
+        // we must somehow convert the narrow strings in the message catalog to
+        // wide strings, so use the default conversion if we have no charset
+        inputConv = wxConvCurrent;
+#endif
+    }
+
+#if !wxUSE_UNICODE
+    // conversion to apply to msgid strings before looking them up: we only
+    // need it if the msgids are neither in 7 bit ASCII nor in the same
+    // encoding as the catalog
+    wxCSConv *sourceConv = msgIdCharset.empty() || (msgIdCharset == m_charset)
+                            ? NULL
+                            : new wxCSConv(msgIdCharset);
+#endif // !wxUSE_UNICODE
+
+    for (size_t32 i = 0; i < m_numStrings; i++)
+    {
+        const char *data = StringAtOfs(m_pOrigTable, i);
+        if (!data)
+            return false; // may happen for invalid MO files
+
+        wxString msgid;
+#if wxUSE_UNICODE
+        msgid = wxString(data, *inputConv);
+#else // ASCII
+        if ( inputConv && sourceConv )
+            msgid = wxString(inputConv->cMB2WC(data), *sourceConv);
+        else
+            msgid = data;
+#endif // wxUSE_UNICODE
+
+        data = StringAtOfs(m_pTransTable, i);
+        if (!data)
+            return false; // may happen for invalid MO files
+
+        size_t length = Swap(m_pTransTable[i].nLen);
+        size_t offset = 0;
+        size_t index = 0;
+        while (offset < length)
+        {
+            const char * const str = data + offset;
+
+            wxString msgstr;
+#if wxUSE_UNICODE
+            msgstr = wxString(str, *inputConv);
+#else
+            if ( inputConv )
+                msgstr = wxString(inputConv->cMB2WC(str), *wxConvUI);
+            else
+                msgstr = str;
+#endif // wxUSE_UNICODE/!wxUSE_UNICODE
+
+            if ( !msgstr.empty() )
+            {
+                hash[index == 0 ? msgid : msgid + wxChar(index)] = msgstr;
+            }
+
+            // skip this string
+            // IMPORTANT: accesses to the 'data' pointer are valid only for
+            //            the first 'length+1' bytes (GNU specs says that the
+            //            final NUL is not counted in length); using wxStrnlen()
+            //            we make sure we don't access memory beyond the valid range
+            //            (which otherwise may happen for invalid MO files):
+            offset += wxStrnlen(str, length - offset) + 1;
+            ++index;
+        }
+    }
+
+#if !wxUSE_UNICODE
+    delete sourceConv;
+#endif
+    delete inputConvPtr;
+
+    return true;
+}
+
+
+// ----------------------------------------------------------------------------
+// wxMsgCatalog class
+// ----------------------------------------------------------------------------
+
+#if !wxUSE_UNICODE
+wxMsgCatalog::~wxMsgCatalog()
+{
+    if ( m_conv )
+    {
+        if ( wxConvUI == m_conv )
+        {
+            // we only change wxConvUI if it points to wxConvLocal so we reset
+            // it back to it too
+            wxConvUI = &wxConvLocal;
+        }
+
+        delete m_conv;
+    }
+}
+#endif // !wxUSE_UNICODE
+
+bool wxMsgCatalog::Load(const wxString& filename,
+                        const wxString& domain,
+                        const wxString& msgIdCharset)
+{
+    wxMsgCatalogFile file;
+
+    m_domain = domain;
+
+    if ( !file.Load(filename, m_pluralFormsCalculator) )
+        return false;
+
+    if ( !file.FillHash(m_messages, msgIdCharset) )
+        return false;
+
+    return true;
+}
+
+const wxString *wxMsgCatalog::GetString(const wxString& str, size_t n) const
+{
+    int index = 0;
+    if (n != size_t(-1))
+    {
+        index = m_pluralFormsCalculator->evaluate(n);
+    }
+    wxMessagesHash::const_iterator i;
+    if (index != 0)
+    {
+        i = m_messages.find(wxString(str) + wxChar(index));   // plural
+    }
+    else
+    {
+        i = m_messages.find(str);
+    }
+
+    if ( i != m_messages.end() )
+    {
+        return &i->second;
+    }
+    else
+        return NULL;
+}
+
+
+// ----------------------------------------------------------------------------
+// wxTranslations
+// ----------------------------------------------------------------------------
+
+namespace
+{
+
+wxTranslations *gs_translations = NULL;
+bool gs_translationsOwned = false;
+
+} // anonymous namespace
+
+
+/*static*/
+wxTranslations *wxTranslations::Get()
+{
+    return gs_translations;
+}
+
+/*static*/
+void wxTranslations::Set(wxTranslations *t)
+{
+    if ( gs_translationsOwned )
+        delete gs_translations;
+    gs_translations = t;
+    gs_translationsOwned = true;
+}
+
+/*static*/
+void wxTranslations::SetNonOwned(wxTranslations *t)
+{
+    if ( gs_translationsOwned )
+        delete gs_translations;
+    gs_translations = t;
+    gs_translationsOwned = false;
+}
+
+
+wxTranslations::wxTranslations()
+{
+    m_pMsgCat = NULL;
+    m_loader = new wxFileTranslationsLoader;
+}
+
+
+wxTranslations::~wxTranslations()
+{
+    delete m_loader;
+
+    // free catalogs memory
+    wxMsgCatalog *pTmpCat;
+    while ( m_pMsgCat != NULL )
+    {
+        pTmpCat = m_pMsgCat;
+        m_pMsgCat = m_pMsgCat->m_pNext;
+        delete pTmpCat;
+    }
+}
+
+
+void wxTranslations::SetLoader(wxTranslationsLoader *loader)
+{
+    wxCHECK_RET( loader, "loader can't be NULL" );
+
+    delete m_loader;
+    m_loader = loader;
+}
+
+
+void wxTranslations::SetLanguage(wxLanguage lang)
+{
+    if ( lang == wxLANGUAGE_DEFAULT )
+        SetLanguage("");
+    else
+        SetLanguage(wxLocale::GetLanguageCanonicalName(lang));
+}
+
+void wxTranslations::SetLanguage(const wxString& lang)
+{
+    m_lang = lang;
+}
+
+
+bool wxTranslations::AddStdCatalog()
+{
+    if ( !AddCatalog(wxS("wxstd")) )
+        return false;
+
+    // there may be a catalog with toolkit specific overrides, it is not
+    // an error if this does not exist
+    wxString port(wxPlatformInfo::Get().GetPortIdName());
+    if ( !port.empty() )
+    {
+        AddCatalog(port.BeforeFirst(wxS('/')).MakeLower());
+    }
+
+    return true;
+}
+
+
+bool wxTranslations::AddCatalog(const wxString& domain)
+{
+    return AddCatalog(domain, wxLANGUAGE_ENGLISH_US);
+}
+
+#if !wxUSE_UNICODE
+bool wxTranslations::AddCatalog(const wxString& domain,
+                                wxLanguage msgIdLanguage,
+                                const wxString& msgIdCharset)
+{
+    m_msgIdCharset[domain] = msgIdCharset;
+    return AddCatalog(domain, msgIdLanguage);
+}
+#endif // !wxUSE_UNICODE
+
+bool wxTranslations::AddCatalog(const wxString& domain,
+                                wxLanguage msgIdLanguage)
+{
+    const wxString msgIdLang = wxLocale::GetLanguageCanonicalName(msgIdLanguage);
+    const wxString domain_lang = ChooseLanguageForDomain(domain, msgIdLang);
+
+    if ( domain_lang.empty() )
+    {
+        wxLogTrace(TRACE_I18N,
+                    wxS("no suitable translation for domain '%s' found"),
+                    domain);
+        return false;
+    }
+
+    wxLogTrace(TRACE_I18N,
+                wxS("adding '%s' translation for domain '%s' (msgid language '%s')"),
+                domain_lang, domain, msgIdLang);
+
+    // It is OK to not load catalog if the msgid language and m_language match,
+    // in which case we can directly display the texts embedded in program's
+    // source code:
+    if ( msgIdLang == domain_lang )
+        return true;
+
+    wxCHECK_MSG( m_loader, false, "loader can't be NULL" );
+    return m_loader->LoadCatalog(this, domain, domain_lang);
+}
+
+
+// check if the given catalog is loaded
+bool wxTranslations::IsLoaded(const wxString& domain) const
+{
+    return FindCatalog(domain) != NULL;
+}
+
+
+bool wxTranslations::LoadCatalogFile(const wxString& filename,
+                                     const wxString& domain)
+{
+    wxMsgCatalog *pMsgCat = new wxMsgCatalog;
+
+#if wxUSE_UNICODE
+    const bool ok = pMsgCat->Load(filename, domain, wxEmptyString/*unused*/);
+#else
+    const bool ok = pMsgCat->Load(filename, domain,
+                                  m_msgIdCharset[domain]);
+#endif
+
+    if ( !ok )
+    {
+        // don't add it because it couldn't be loaded anyway
+        delete pMsgCat;
+        return false;
+    }
+
+    // add it to the head of the list so that in GetString it will
+    // be searched before the catalogs added earlier
+    pMsgCat->m_pNext = m_pMsgCat;
+    m_pMsgCat = pMsgCat;
+
+    return true;
+}
+
+
+wxString wxTranslations::ChooseLanguageForDomain(const wxString& WXUNUSED(domain),
+                                                 const wxString& WXUNUSED(msgIdLang))
+{
+    // explicitly set language should always be respected
+    if ( !m_lang.empty() )
+        return m_lang;
+
+    // TODO: if the default language is used, pick the best (by comparing
+    //       available languages with user's preferences), instead of blindly
+    //       trusting availability of system language translation
+    return wxLocale::GetLanguageCanonicalName(wxLocale::GetSystemLanguage());
+}
+
+
+namespace
+{
+WX_DECLARE_HASH_SET(wxString, wxStringHash, wxStringEqual,
+                    wxLocaleUntranslatedStrings);
+}
+
+/* static */
+const wxString& wxTranslations::GetUntranslatedString(const wxString& str)
+{
+    static wxLocaleUntranslatedStrings s_strings;
+
+    wxLocaleUntranslatedStrings::iterator i = s_strings.find(str);
+    if ( i == s_strings.end() )
+        return *s_strings.insert(str).first;
+
+    return *i;
+}
+
+
+const wxString& wxTranslations::GetString(const wxString& origString,
+                                          const wxString& domain) const
+{
+    return GetString(origString, origString, size_t(-1), domain);
+}
+
+const wxString& wxTranslations::GetString(const wxString& origString,
+                                          const wxString& origString2,
+                                          size_t n,
+                                          const wxString& domain) const
+{
+    if ( origString.empty() )
+        return GetUntranslatedString(origString);
+
+    const wxString *trans = NULL;
+    wxMsgCatalog *pMsgCat;
+
+    if ( !domain.empty() )
+    {
+        pMsgCat = FindCatalog(domain);
+
+        // does the catalog exist?
+        if ( pMsgCat != NULL )
+            trans = pMsgCat->GetString(origString, n);
+    }
+    else
+    {
+        // search in all domains
+        for ( pMsgCat = m_pMsgCat; pMsgCat != NULL; pMsgCat = pMsgCat->m_pNext )
+        {
+            trans = pMsgCat->GetString(origString, n);
+            if ( trans != NULL )   // take the first found
+                break;
+        }
+    }
+
+    if ( trans == NULL )
+    {
+        wxLogTrace
+        (
+            TRACE_I18N,
+            "string \"%s\"%s not found in %slocale '%s'.",
+            origString,
+            ((long)n) != -1 ? wxString::Format("[%ld]", (long)n) : wxString(),
+            !domain.empty() ? wxString::Format("domain '%s' ", domain) : wxString(),
+            m_lang
+        );
+
+        if (n == size_t(-1))
+            return GetUntranslatedString(origString);
+        else
+            return GetUntranslatedString(n == 1 ? origString : origString2);
+    }
+
+    return *trans;
+}
+
+
+wxString wxTranslations::GetHeaderValue(const wxString& header,
+                                        const wxString& domain) const
+{
+    if ( header.empty() )
+        return wxEmptyString;
+
+    const wxString *trans = NULL;
+    wxMsgCatalog *pMsgCat;
+
+    if ( !domain.empty() )
+    {
+        pMsgCat = FindCatalog(domain);
+
+        // does the catalog exist?
+        if ( pMsgCat == NULL )
+            return wxEmptyString;
+
+        trans = pMsgCat->GetString(wxEmptyString, (size_t)-1);
+    }
+    else
+    {
+        // search in all domains
+        for ( pMsgCat = m_pMsgCat; pMsgCat != NULL; pMsgCat = pMsgCat->m_pNext )
+        {
+            trans = pMsgCat->GetString(wxEmptyString, (size_t)-1);
+            if ( trans != NULL )   // take the first found
+                break;
+        }
+    }
+
+    if ( !trans || trans->empty() )
+        return wxEmptyString;
+
+    size_t found = trans->find(header);
+    if ( found == wxString::npos )
+        return wxEmptyString;
+
+    found += header.length() + 2 /* ': ' */;
+
+    // Every header is separated by \n
+
+    size_t endLine = trans->find(wxS('\n'), found);
+    size_t len = (endLine == wxString::npos) ?
+                wxString::npos : (endLine - found);
+
+    return trans->substr(found, len);
+}
+
+
+// find catalog by name in a linked list, return NULL if !found
+wxMsgCatalog *wxTranslations::FindCatalog(const wxString& domain) const
+{
+    // linear search in the linked list
+    wxMsgCatalog *pMsgCat;
+    for ( pMsgCat = m_pMsgCat; pMsgCat != NULL; pMsgCat = pMsgCat->m_pNext )
+    {
+        if ( pMsgCat->GetDomain() == domain )
+            return pMsgCat;
+    }
+
+    return NULL;
+}
+
+// ----------------------------------------------------------------------------
+// wxFileTranslationsLoader
+// ----------------------------------------------------------------------------
+
+namespace
+{
+
+// the list of the directories to search for message catalog files
+wxArrayString gs_searchPrefixes;
+
+// return the directories to search for message catalogs under the given
+// prefix, separated by wxPATH_SEP
+wxString GetMsgCatalogSubdirs(const wxString& prefix, const wxString& lang)
+{
+    // Search first in Unix-standard prefix/lang/LC_MESSAGES, then in
+    // prefix/lang and finally in just prefix.
+    //
+    // Note that we use LC_MESSAGES on all platforms and not just Unix, because
+    // it doesn't cost much to look into one more directory and doing it this
+    // way has two important benefits:
+    // a) we don't break compatibility with wx-2.6 and older by stopping to
+    //    look in a directory where the catalogs used to be and thus silently
+    //    breaking apps after they are recompiled against the latest wx
+    // b) it makes it possible to package app's support files in the same
+    //    way on all target platforms
+    const wxString pathPrefix = wxFileName(prefix, lang).GetFullPath();
+
+    wxString searchPath;
+    searchPath.reserve(4*pathPrefix.length());
+    searchPath << pathPrefix << wxFILE_SEP_PATH << "LC_MESSAGES" << wxPATH_SEP
+            << prefix << wxFILE_SEP_PATH << wxPATH_SEP
+            << pathPrefix;
+
+    return searchPath;
+}
+
+// construct the search path for the given language
+static wxString GetFullSearchPath(const wxString& lang)
+{
+    // first take the entries explicitly added by the program
+    wxArrayString paths;
+    paths.reserve(gs_searchPrefixes.size() + 1);
+    size_t n,
+        count = gs_searchPrefixes.size();
+    for ( n = 0; n < count; n++ )
+    {
+        paths.Add(GetMsgCatalogSubdirs(gs_searchPrefixes[n], lang));
+    }
+
+
+#if wxUSE_STDPATHS
+    // then look in the standard location
+    const wxString stdp = wxStandardPaths::Get().
+        GetLocalizedResourcesDir(lang, wxStandardPaths::ResourceCat_Messages);
+
+    if ( paths.Index(stdp) == wxNOT_FOUND )
+        paths.Add(stdp);
+#endif // wxUSE_STDPATHS
+
+    // last look in default locations
+#ifdef __UNIX__
+    // LC_PATH is a standard env var containing the search path for the .mo
+    // files
+    const char *pszLcPath = wxGetenv("LC_PATH");
+    if ( pszLcPath )
+    {
+        const wxString lcp = GetMsgCatalogSubdirs(pszLcPath, lang);
+        if ( paths.Index(lcp) == wxNOT_FOUND )
+            paths.Add(lcp);
+    }
+
+    // also add the one from where wxWin was installed:
+    wxString wxp = wxGetInstallPrefix();
+    if ( !wxp.empty() )
+    {
+        wxp = GetMsgCatalogSubdirs(wxp + wxS("/share/locale"), lang);
+        if ( paths.Index(wxp) == wxNOT_FOUND )
+            paths.Add(wxp);
+    }
+#endif // __UNIX__
+
+
+    // finally construct the full search path
+    wxString searchPath;
+    searchPath.reserve(500);
+    count = paths.size();
+    for ( n = 0; n < count; n++ )
+    {
+        searchPath += paths[n];
+        if ( n != count - 1 )
+            searchPath += wxPATH_SEP;
+    }
+
+    return searchPath;
+}
+
+} // anonymous namespace
+
+
+void wxFileTranslationsLoader::AddCatalogLookupPathPrefix(const wxString& prefix)
+{
+    if ( gs_searchPrefixes.Index(prefix) == wxNOT_FOUND )
+    {
+        gs_searchPrefixes.Add(prefix);
+    }
+    //else: already have it
+}
+
+
+bool wxFileTranslationsLoader::LoadCatalog(wxTranslations *translations,
+                                           const wxString& domain,
+                                           const wxString& lang)
+{
+    wxCHECK_MSG( lang.length() >= LEN_LANG, false,
+                 "invalid language specification" );
+
+    wxString searchPath;
+
+#if wxUSE_FONTMAP
+    // first look for the catalog for this language and the current locale:
+    // notice that we don't use the system name for the locale as this would
+    // force us to install catalogs in different locations depending on the
+    // system but always use the canonical name
+    wxFontEncoding encSys = wxLocale::GetSystemEncoding();
+    if ( encSys != wxFONTENCODING_SYSTEM )
+    {
+        wxString fullname(lang);
+        fullname << wxS('.') << wxFontMapperBase::GetEncodingName(encSys);
+        searchPath << GetFullSearchPath(fullname) << wxPATH_SEP;
+    }
+#endif // wxUSE_FONTMAP
+
+    searchPath += GetFullSearchPath(lang);
+    if ( lang.length() > LEN_LANG && lang[LEN_LANG] == wxS('_') )
+    {
+        // also add just base locale name: for things like "fr_BE" (Belgium
+        // French) we should use fall back on plain "fr" if no Belgium-specific
+        // message catalogs exist
+        searchPath << wxPATH_SEP
+                    << GetFullSearchPath(ExtractLang(lang));
+    }
+
+    wxLogTrace(TRACE_I18N, wxS("Looking for \"%s.mo\" in search path \"%s\""),
+                domain, searchPath);
+
+    wxFileName fn(domain);
+    fn.SetExt(wxS("mo"));
+
+    wxString strFullName;
+    if ( !wxFindFileInPath(&strFullName, searchPath, fn.GetFullPath()) )
+    {
+        wxLogVerbose(_("catalog file for domain '%s' not found."), domain);
+        wxLogTrace(TRACE_I18N, wxS("Catalog \"%s.mo\" not found"), domain);
+        return false;
+    }
+
+    // open file and read its data
+    wxLogVerbose(_("using catalog '%s' from '%s'."), domain, strFullName.c_str());
+    wxLogTrace(TRACE_I18N, wxS("Using catalog \"%s\"."), strFullName.c_str());
+
+    return translations->LoadCatalogFile(strFullName, domain);
+}
+
+// ----------------------------------------------------------------------------
+// wxTranslationsModule module (for destruction of gs_translations)
+// ----------------------------------------------------------------------------
+
+class wxTranslationsModule: public wxModule
+{
+    DECLARE_DYNAMIC_CLASS(wxTranslationsModule)
+    public:
+        wxTranslationsModule() {}
+
+        bool OnInit()
+        {
+            return true;
+        }
+
+        void OnExit()
+        {
+            if ( gs_translationsOwned )
+                delete gs_translations;
+            gs_translations = NULL;
+            gs_translationsOwned = true;
+        }
+};
+
+IMPLEMENT_DYNAMIC_CLASS(wxTranslationsModule, wxModule)
+
+#endif // wxUSE_INTL
index 6e906aa01d491c4e571ec2d653f435dda6b76f56..987857ebe6b4eaac6a7ef955c064ba06a016c998 100644 (file)
@@ -271,6 +271,7 @@ wx/ioswrap.h
 wx/ipc.h
 wx/ipcbase.h
 wx/kbdstate.h
+wx/language.h
 wx/link.h
 wx/list.h
 wx/listimpl.cpp
@@ -322,6 +323,7 @@ wx/timer.h
 wx/tls.h
 wx/tokenzr.h
 wx/tracker.h
+wx/translation.h
 wx/txtstrm.h
 wx/typeinfo.h
 wx/types.h
index e5708a4c2eda3da6fd0a213e787e7c827d3fa18f..708fe15c05dd9e745ded941f7ecbe4c5024cf880 100644 (file)
@@ -176,6 +176,7 @@ wx/ioswrap.h
 wx/ipc.h
 wx/ipcbase.h
 wx/kbdstate.h
+wx/language.h
 wx/link.h
 wx/list.h
 wx/listimpl.cpp
@@ -227,6 +228,7 @@ wx/timer.h
 wx/tls.h
 wx/tokenzr.h
 wx/tracker.h
+wx/translation.h
 wx/txtstrm.h
 wx/typeinfo.h
 wx/types.h
index 4af78798b0f39ea4b19e8c8a449b274f3eee5e66..3480e3148671a4199054673f05e003a74cdbeb48 100644 (file)
@@ -200,6 +200,7 @@ wx/ioswrap.h
 wx/ipc.h
 wx/ipcbase.h
 wx/kbdstate.h
+wx/language.h
 wx/link.h
 wx/list.h
 wx/listimpl.cpp
@@ -251,6 +252,7 @@ wx/timer.h
 wx/tls.h
 wx/tokenzr.h
 wx/tracker.h
+wx/translation.h
 wx/txtstrm.h
 wx/typeinfo.h
 wx/types.h