diff --git a/Makefile.in b/Makefile.in index c24df6bdc2..519cf77147 100644 --- a/Makefile.in +++ b/Makefile.in @@ -582,6 +582,7 @@ ALL_BASE_HEADERS = \ wx/secretstore.h \ wx/lzmastream.h \ wx/localedefs.h \ + wx/uilocale.h \ $(BASE_PLATFORM_HDR) \ wx/fs_inet.h \ wx/protocol/file.h \ @@ -768,6 +769,7 @@ ALL_PORTS_BASE_HEADERS = \ wx/secretstore.h \ wx/lzmastream.h \ wx/localedefs.h \ + wx/uilocale.h \ wx/unix/app.h \ wx/unix/apptbase.h \ wx/unix/apptrait.h \ @@ -907,6 +909,7 @@ ALL_BASE_SOURCES = \ src/generic/fswatcherg.cpp \ src/common/secretstore.cpp \ src/common/lzmastream.cpp \ + src/common/uilocale.cpp \ src/common/fdiodispatcher.cpp \ src/common/selectdispatcher.cpp \ src/unix/appunix.cpp \ @@ -926,6 +929,7 @@ ALL_BASE_SOURCES = \ src/unix/fswatcher_inotify.cpp \ src/unix/stdpaths.cpp \ src/unix/secretstore.cpp \ + src/unix/uilocale.cpp \ src/msw/basemsw.cpp \ src/msw/crashrpt.cpp \ src/msw/debughlp.cpp \ @@ -946,6 +950,7 @@ ALL_BASE_SOURCES = \ src/msw/utilsexc.cpp \ src/msw/fswatcher.cpp \ src/msw/secretstore.cpp \ + src/msw/uilocale.cpp \ $(BASE_OSX_SRC) \ src/common/event.cpp \ src/common/fs_mem.cpp \ @@ -1095,6 +1100,7 @@ MONODLL_OBJECTS = \ monodll_fswatcherg.o \ monodll_common_secretstore.o \ monodll_lzmastream.o \ + monodll_common_uilocale.o \ $(__BASE_PLATFORM_SRC_OBJECTS) \ monodll_event.o \ monodll_fs_mem.o \ @@ -1237,6 +1243,7 @@ MONOLIB_OBJECTS = \ monolib_fswatcherg.o \ monolib_common_secretstore.o \ monolib_lzmastream.o \ + monolib_common_uilocale.o \ $(__BASE_PLATFORM_SRC_OBJECTS_1) \ monolib_event.o \ monolib_fs_mem.o \ @@ -1367,6 +1374,7 @@ BASEDLL_OBJECTS = \ basedll_fswatcherg.o \ basedll_common_secretstore.o \ basedll_lzmastream.o \ + basedll_common_uilocale.o \ $(__BASE_PLATFORM_SRC_OBJECTS_2) \ basedll_event.o \ basedll_fs_mem.o \ @@ -1479,6 +1487,7 @@ BASELIB_OBJECTS = \ baselib_fswatcherg.o \ baselib_common_secretstore.o \ baselib_lzmastream.o \ + baselib_common_uilocale.o \ $(__BASE_PLATFORM_SRC_OBJECTS_3) \ baselib_event.o \ baselib_fs_mem.o \ @@ -2359,6 +2368,7 @@ COND_TOOLKIT_OSX_COCOA_BASE_OSX_SRC = \ src/osx/core/strconv_cf.cpp \ src/osx/cocoa/utils_base.mm \ src/osx/core/secretstore.cpp \ + src/osx/core/uilocale.cpp \ src/common/fdiodispatcher.cpp \ src/common/selectdispatcher.cpp \ src/unix/appunix.cpp \ @@ -2384,6 +2394,7 @@ COND_TOOLKIT_OSX_IPHONE_BASE_OSX_SRC = \ src/osx/core/strconv_cf.cpp \ src/osx/cocoa/utils_base.mm \ src/osx/core/secretstore.cpp \ + src/osx/core/uilocale.cpp \ src/common/fdiodispatcher.cpp \ src/common/selectdispatcher.cpp \ src/unix/appunix.cpp \ @@ -2423,7 +2434,8 @@ COND_TOOLKIT_COCOA_BASE_OSX_SRC = \ src/osx/core/evtloop_cf.cpp \ src/osx/core/strconv_cf.cpp \ src/osx/cocoa/utils_base.mm \ - src/osx/core/secretstore.cpp + src/osx/core/secretstore.cpp \ + src/osx/core/uilocale.cpp @COND_TOOLKIT_COCOA@BASE_OSX_SRC = $(COND_TOOLKIT_COCOA_BASE_OSX_SRC) COND_TOOLKIT_GTK_BASE_OSX_SRC = \ src/common/fdiodispatcher.cpp \ @@ -2446,7 +2458,8 @@ COND_TOOLKIT_GTK_BASE_OSX_SRC = \ src/osx/core/evtloop_cf.cpp \ src/osx/core/strconv_cf.cpp \ src/osx/cocoa/utils_base.mm \ - src/osx/core/secretstore.cpp + src/osx/core/secretstore.cpp \ + src/osx/core/uilocale.cpp @COND_TOOLKIT_GTK@BASE_OSX_SRC = $(COND_TOOLKIT_GTK_BASE_OSX_SRC) COND_TOOLKIT_X11_BASE_OSX_SRC = \ src/common/fdiodispatcher.cpp \ @@ -2469,7 +2482,8 @@ COND_TOOLKIT_X11_BASE_OSX_SRC = \ src/osx/core/evtloop_cf.cpp \ src/osx/core/strconv_cf.cpp \ src/osx/cocoa/utils_base.mm \ - src/osx/core/secretstore.cpp + src/osx/core/secretstore.cpp \ + src/osx/core/uilocale.cpp @COND_TOOLKIT_X11@BASE_OSX_SRC = $(COND_TOOLKIT_X11_BASE_OSX_SRC) COND_TOOLKIT_MOTIF_BASE_OSX_SRC = \ src/common/fdiodispatcher.cpp \ @@ -2492,7 +2506,8 @@ COND_TOOLKIT_MOTIF_BASE_OSX_SRC = \ src/osx/core/evtloop_cf.cpp \ src/osx/core/strconv_cf.cpp \ src/osx/cocoa/utils_base.mm \ - src/osx/core/secretstore.cpp + src/osx/core/secretstore.cpp \ + src/osx/core/uilocale.cpp @COND_TOOLKIT_MOTIF@BASE_OSX_SRC = $(COND_TOOLKIT_MOTIF_BASE_OSX_SRC) COND_TOOLKIT__BASE_OSX_SRC = \ src/common/fdiodispatcher.cpp \ @@ -2515,7 +2530,8 @@ COND_TOOLKIT__BASE_OSX_SRC = \ src/osx/core/evtloop_cf.cpp \ src/osx/core/strconv_cf.cpp \ src/osx/cocoa/utils_base.mm \ - src/osx/core/secretstore.cpp + src/osx/core/secretstore.cpp \ + src/osx/core/uilocale.cpp @COND_TOOLKIT_@BASE_OSX_SRC = $(COND_TOOLKIT__BASE_OSX_SRC) COND_TOOLKIT_OSX_COCOA_BASE_OSX_HDR = \ wx/osx/core/cfdataref.h \ @@ -4261,6 +4277,7 @@ COND_PLATFORM_MACOSX_1___BASE_PLATFORM_SRC_OBJECTS = \ monodll_strconv_cf.o \ monodll_utils_base.o \ monodll_core_secretstore.o \ + monodll_core_uilocale.o \ monodll_fdiodispatcher.o \ monodll_selectdispatcher.o \ monodll_appunix.o \ @@ -4298,7 +4315,8 @@ COND_PLATFORM_UNIX_1___BASE_PLATFORM_SRC_OBJECTS = \ monodll_unix_mimetype.o \ monodll_fswatcher_inotify.o \ monodll_unix_stdpaths.o \ - monodll_unix_secretstore.o + monodll_unix_secretstore.o \ + monodll_unix_uilocale.o @COND_PLATFORM_UNIX_1@__BASE_PLATFORM_SRC_OBJECTS = $(COND_PLATFORM_UNIX_1___BASE_PLATFORM_SRC_OBJECTS) COND_PLATFORM_WIN32_1___BASE_PLATFORM_SRC_OBJECTS = \ monodll_basemsw.o \ @@ -4320,7 +4338,8 @@ COND_PLATFORM_WIN32_1___BASE_PLATFORM_SRC_OBJECTS = \ monodll_msw_utils.o \ monodll_utilsexc.o \ monodll_fswatcher.o \ - monodll_msw_secretstore.o + monodll_msw_secretstore.o \ + monodll_msw_uilocale.o @COND_PLATFORM_WIN32_1@__BASE_PLATFORM_SRC_OBJECTS = $(COND_PLATFORM_WIN32_1___BASE_PLATFORM_SRC_OBJECTS) @COND_PLATFORM_WIN32_1@__BASE_AND_GUI_PLATFORM_SRC_OBJECTS \ @COND_PLATFORM_WIN32_1@ = monodll_msw_main.o monodll_volume.o @@ -6254,6 +6273,7 @@ COND_PLATFORM_MACOSX_1___BASE_PLATFORM_SRC_OBJECTS_1 = \ monolib_strconv_cf.o \ monolib_utils_base.o \ monolib_core_secretstore.o \ + monolib_core_uilocale.o \ monolib_fdiodispatcher.o \ monolib_selectdispatcher.o \ monolib_appunix.o \ @@ -6291,7 +6311,8 @@ COND_PLATFORM_UNIX_1___BASE_PLATFORM_SRC_OBJECTS_1 = \ monolib_unix_mimetype.o \ monolib_fswatcher_inotify.o \ monolib_unix_stdpaths.o \ - monolib_unix_secretstore.o + monolib_unix_secretstore.o \ + monolib_unix_uilocale.o @COND_PLATFORM_UNIX_1@__BASE_PLATFORM_SRC_OBJECTS_1 = $(COND_PLATFORM_UNIX_1___BASE_PLATFORM_SRC_OBJECTS_1) COND_PLATFORM_WIN32_1___BASE_PLATFORM_SRC_OBJECTS_1 = \ monolib_basemsw.o \ @@ -6313,7 +6334,8 @@ COND_PLATFORM_WIN32_1___BASE_PLATFORM_SRC_OBJECTS_1 = \ monolib_msw_utils.o \ monolib_utilsexc.o \ monolib_fswatcher.o \ - monolib_msw_secretstore.o + monolib_msw_secretstore.o \ + monolib_msw_uilocale.o @COND_PLATFORM_WIN32_1@__BASE_PLATFORM_SRC_OBJECTS_1 = $(COND_PLATFORM_WIN32_1___BASE_PLATFORM_SRC_OBJECTS_1) @COND_PLATFORM_WIN32_1@__BASE_AND_GUI_PLATFORM_SRC_OBJECTS_1 \ @COND_PLATFORM_WIN32_1@ = monolib_msw_main.o monolib_volume.o @@ -8299,6 +8321,7 @@ COND_PLATFORM_MACOSX_1___BASE_PLATFORM_SRC_OBJECTS_2 = \ basedll_strconv_cf.o \ basedll_utils_base.o \ basedll_core_secretstore.o \ + basedll_core_uilocale.o \ basedll_fdiodispatcher.o \ basedll_selectdispatcher.o \ basedll_appunix.o \ @@ -8336,7 +8359,8 @@ COND_PLATFORM_UNIX_1___BASE_PLATFORM_SRC_OBJECTS_2 = \ basedll_unix_mimetype.o \ basedll_fswatcher_inotify.o \ basedll_unix_stdpaths.o \ - basedll_unix_secretstore.o + basedll_unix_secretstore.o \ + basedll_unix_uilocale.o @COND_PLATFORM_UNIX_1@__BASE_PLATFORM_SRC_OBJECTS_2 = $(COND_PLATFORM_UNIX_1___BASE_PLATFORM_SRC_OBJECTS_2) COND_PLATFORM_WIN32_1___BASE_PLATFORM_SRC_OBJECTS_2 = \ basedll_basemsw.o \ @@ -8358,7 +8382,8 @@ COND_PLATFORM_WIN32_1___BASE_PLATFORM_SRC_OBJECTS_2 = \ basedll_msw_utils.o \ basedll_utilsexc.o \ basedll_fswatcher.o \ - basedll_msw_secretstore.o + basedll_msw_secretstore.o \ + basedll_msw_uilocale.o @COND_PLATFORM_WIN32_1@__BASE_PLATFORM_SRC_OBJECTS_2 = $(COND_PLATFORM_WIN32_1___BASE_PLATFORM_SRC_OBJECTS_2) @COND_PLATFORM_WIN32_1@__BASE_AND_GUI_PLATFORM_SRC_OBJECTS_2 \ @COND_PLATFORM_WIN32_1@ = basedll_main.o basedll_volume.o @@ -8382,6 +8407,7 @@ COND_PLATFORM_MACOSX_1___BASE_PLATFORM_SRC_OBJECTS_3 = \ baselib_strconv_cf.o \ baselib_utils_base.o \ baselib_core_secretstore.o \ + baselib_core_uilocale.o \ baselib_fdiodispatcher.o \ baselib_selectdispatcher.o \ baselib_appunix.o \ @@ -8419,7 +8445,8 @@ COND_PLATFORM_UNIX_1___BASE_PLATFORM_SRC_OBJECTS_3 = \ baselib_unix_mimetype.o \ baselib_fswatcher_inotify.o \ baselib_unix_stdpaths.o \ - baselib_unix_secretstore.o + baselib_unix_secretstore.o \ + baselib_unix_uilocale.o @COND_PLATFORM_UNIX_1@__BASE_PLATFORM_SRC_OBJECTS_3 = $(COND_PLATFORM_UNIX_1___BASE_PLATFORM_SRC_OBJECTS_3) COND_PLATFORM_WIN32_1___BASE_PLATFORM_SRC_OBJECTS_3 = \ baselib_basemsw.o \ @@ -8441,7 +8468,8 @@ COND_PLATFORM_WIN32_1___BASE_PLATFORM_SRC_OBJECTS_3 = \ baselib_msw_utils.o \ baselib_utilsexc.o \ baselib_fswatcher.o \ - baselib_msw_secretstore.o + baselib_msw_secretstore.o \ + baselib_msw_uilocale.o @COND_PLATFORM_WIN32_1@__BASE_PLATFORM_SRC_OBJECTS_3 = $(COND_PLATFORM_WIN32_1___BASE_PLATFORM_SRC_OBJECTS_3) @COND_PLATFORM_WIN32_1@__BASE_AND_GUI_PLATFORM_SRC_OBJECTS_3 \ @COND_PLATFORM_WIN32_1@ = baselib_main.o baselib_volume.o @@ -15997,6 +16025,9 @@ monodll_common_secretstore.o: $(srcdir)/src/common/secretstore.cpp $(MONODLL_ODE monodll_lzmastream.o: $(srcdir)/src/common/lzmastream.cpp $(MONODLL_ODEP) $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/lzmastream.cpp +monodll_common_uilocale.o: $(srcdir)/src/common/uilocale.cpp $(MONODLL_ODEP) + $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/uilocale.cpp + monodll_unix_mimetype.o: $(srcdir)/src/unix/mimetype.cpp $(MONODLL_ODEP) $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/unix/mimetype.cpp @@ -16009,6 +16040,9 @@ monodll_unix_stdpaths.o: $(srcdir)/src/unix/stdpaths.cpp $(MONODLL_ODEP) monodll_unix_secretstore.o: $(srcdir)/src/unix/secretstore.cpp $(MONODLL_ODEP) $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/unix/secretstore.cpp +monodll_unix_uilocale.o: $(srcdir)/src/unix/uilocale.cpp $(MONODLL_ODEP) + $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/unix/uilocale.cpp + monodll_basemsw.o: $(srcdir)/src/msw/basemsw.cpp $(MONODLL_ODEP) $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/msw/basemsw.cpp @@ -16069,6 +16103,9 @@ monodll_fswatcher.o: $(srcdir)/src/msw/fswatcher.cpp $(MONODLL_ODEP) monodll_msw_secretstore.o: $(srcdir)/src/msw/secretstore.cpp $(MONODLL_ODEP) $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/msw/secretstore.cpp +monodll_msw_uilocale.o: $(srcdir)/src/msw/uilocale.cpp $(MONODLL_ODEP) + $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/msw/uilocale.cpp + monodll_core_mimetype.o: $(srcdir)/src/osx/core/mimetype.cpp $(MONODLL_ODEP) $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/osx/core/mimetype.cpp @@ -16087,6 +16124,9 @@ monodll_utils_base.o: $(srcdir)/src/osx/cocoa/utils_base.mm $(MONODLL_ODEP) monodll_core_secretstore.o: $(srcdir)/src/osx/core/secretstore.cpp $(MONODLL_ODEP) $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/osx/core/secretstore.cpp +monodll_core_uilocale.o: $(srcdir)/src/osx/core/uilocale.cpp $(MONODLL_ODEP) + $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/osx/core/uilocale.cpp + monodll_fswatcher_fsevents.o: $(srcdir)/src/osx/fswatcher_fsevents.cpp $(MONODLL_ODEP) $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/osx/fswatcher_fsevents.cpp @@ -21274,6 +21314,9 @@ monolib_common_secretstore.o: $(srcdir)/src/common/secretstore.cpp $(MONOLIB_ODE monolib_lzmastream.o: $(srcdir)/src/common/lzmastream.cpp $(MONOLIB_ODEP) $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/lzmastream.cpp +monolib_common_uilocale.o: $(srcdir)/src/common/uilocale.cpp $(MONOLIB_ODEP) + $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/uilocale.cpp + monolib_unix_mimetype.o: $(srcdir)/src/unix/mimetype.cpp $(MONOLIB_ODEP) $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/unix/mimetype.cpp @@ -21286,6 +21329,9 @@ monolib_unix_stdpaths.o: $(srcdir)/src/unix/stdpaths.cpp $(MONOLIB_ODEP) monolib_unix_secretstore.o: $(srcdir)/src/unix/secretstore.cpp $(MONOLIB_ODEP) $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/unix/secretstore.cpp +monolib_unix_uilocale.o: $(srcdir)/src/unix/uilocale.cpp $(MONOLIB_ODEP) + $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/unix/uilocale.cpp + monolib_basemsw.o: $(srcdir)/src/msw/basemsw.cpp $(MONOLIB_ODEP) $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/msw/basemsw.cpp @@ -21346,6 +21392,9 @@ monolib_fswatcher.o: $(srcdir)/src/msw/fswatcher.cpp $(MONOLIB_ODEP) monolib_msw_secretstore.o: $(srcdir)/src/msw/secretstore.cpp $(MONOLIB_ODEP) $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/msw/secretstore.cpp +monolib_msw_uilocale.o: $(srcdir)/src/msw/uilocale.cpp $(MONOLIB_ODEP) + $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/msw/uilocale.cpp + monolib_core_mimetype.o: $(srcdir)/src/osx/core/mimetype.cpp $(MONOLIB_ODEP) $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/osx/core/mimetype.cpp @@ -21364,6 +21413,9 @@ monolib_utils_base.o: $(srcdir)/src/osx/cocoa/utils_base.mm $(MONOLIB_ODEP) monolib_core_secretstore.o: $(srcdir)/src/osx/core/secretstore.cpp $(MONOLIB_ODEP) $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/osx/core/secretstore.cpp +monolib_core_uilocale.o: $(srcdir)/src/osx/core/uilocale.cpp $(MONOLIB_ODEP) + $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/osx/core/uilocale.cpp + monolib_fswatcher_fsevents.o: $(srcdir)/src/osx/fswatcher_fsevents.cpp $(MONOLIB_ODEP) $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/osx/fswatcher_fsevents.cpp @@ -26551,6 +26603,9 @@ basedll_common_secretstore.o: $(srcdir)/src/common/secretstore.cpp $(BASEDLL_ODE basedll_lzmastream.o: $(srcdir)/src/common/lzmastream.cpp $(BASEDLL_ODEP) $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/common/lzmastream.cpp +basedll_common_uilocale.o: $(srcdir)/src/common/uilocale.cpp $(BASEDLL_ODEP) + $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/common/uilocale.cpp + basedll_unix_mimetype.o: $(srcdir)/src/unix/mimetype.cpp $(BASEDLL_ODEP) $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/unix/mimetype.cpp @@ -26563,6 +26618,9 @@ basedll_unix_stdpaths.o: $(srcdir)/src/unix/stdpaths.cpp $(BASEDLL_ODEP) basedll_unix_secretstore.o: $(srcdir)/src/unix/secretstore.cpp $(BASEDLL_ODEP) $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/unix/secretstore.cpp +basedll_unix_uilocale.o: $(srcdir)/src/unix/uilocale.cpp $(BASEDLL_ODEP) + $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/unix/uilocale.cpp + basedll_basemsw.o: $(srcdir)/src/msw/basemsw.cpp $(BASEDLL_ODEP) $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/msw/basemsw.cpp @@ -26623,6 +26681,9 @@ basedll_fswatcher.o: $(srcdir)/src/msw/fswatcher.cpp $(BASEDLL_ODEP) basedll_msw_secretstore.o: $(srcdir)/src/msw/secretstore.cpp $(BASEDLL_ODEP) $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/msw/secretstore.cpp +basedll_msw_uilocale.o: $(srcdir)/src/msw/uilocale.cpp $(BASEDLL_ODEP) + $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/msw/uilocale.cpp + basedll_core_mimetype.o: $(srcdir)/src/osx/core/mimetype.cpp $(BASEDLL_ODEP) $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/osx/core/mimetype.cpp @@ -26641,6 +26702,9 @@ basedll_utils_base.o: $(srcdir)/src/osx/cocoa/utils_base.mm $(BASEDLL_ODEP) basedll_core_secretstore.o: $(srcdir)/src/osx/core/secretstore.cpp $(BASEDLL_ODEP) $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/osx/core/secretstore.cpp +basedll_core_uilocale.o: $(srcdir)/src/osx/core/uilocale.cpp $(BASEDLL_ODEP) + $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/osx/core/uilocale.cpp + basedll_fswatcher_fsevents.o: $(srcdir)/src/osx/fswatcher_fsevents.cpp $(BASEDLL_ODEP) $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/osx/fswatcher_fsevents.cpp @@ -27025,6 +27089,9 @@ baselib_common_secretstore.o: $(srcdir)/src/common/secretstore.cpp $(BASELIB_ODE baselib_lzmastream.o: $(srcdir)/src/common/lzmastream.cpp $(BASELIB_ODEP) $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/common/lzmastream.cpp +baselib_common_uilocale.o: $(srcdir)/src/common/uilocale.cpp $(BASELIB_ODEP) + $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/common/uilocale.cpp + baselib_unix_mimetype.o: $(srcdir)/src/unix/mimetype.cpp $(BASELIB_ODEP) $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/unix/mimetype.cpp @@ -27037,6 +27104,9 @@ baselib_unix_stdpaths.o: $(srcdir)/src/unix/stdpaths.cpp $(BASELIB_ODEP) baselib_unix_secretstore.o: $(srcdir)/src/unix/secretstore.cpp $(BASELIB_ODEP) $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/unix/secretstore.cpp +baselib_unix_uilocale.o: $(srcdir)/src/unix/uilocale.cpp $(BASELIB_ODEP) + $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/unix/uilocale.cpp + baselib_basemsw.o: $(srcdir)/src/msw/basemsw.cpp $(BASELIB_ODEP) $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/msw/basemsw.cpp @@ -27097,6 +27167,9 @@ baselib_fswatcher.o: $(srcdir)/src/msw/fswatcher.cpp $(BASELIB_ODEP) baselib_msw_secretstore.o: $(srcdir)/src/msw/secretstore.cpp $(BASELIB_ODEP) $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/msw/secretstore.cpp +baselib_msw_uilocale.o: $(srcdir)/src/msw/uilocale.cpp $(BASELIB_ODEP) + $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/msw/uilocale.cpp + baselib_core_mimetype.o: $(srcdir)/src/osx/core/mimetype.cpp $(BASELIB_ODEP) $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/osx/core/mimetype.cpp @@ -27115,6 +27188,9 @@ baselib_utils_base.o: $(srcdir)/src/osx/cocoa/utils_base.mm $(BASELIB_ODEP) baselib_core_secretstore.o: $(srcdir)/src/osx/core/secretstore.cpp $(BASELIB_ODEP) $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/osx/core/secretstore.cpp +baselib_core_uilocale.o: $(srcdir)/src/osx/core/uilocale.cpp $(BASELIB_ODEP) + $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/osx/core/uilocale.cpp + baselib_fswatcher_fsevents.o: $(srcdir)/src/osx/fswatcher_fsevents.cpp $(BASELIB_ODEP) $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/osx/fswatcher_fsevents.cpp diff --git a/build/bakefiles/files.bkl b/build/bakefiles/files.bkl index 32dca4cde8..afa23f0bcc 100644 --- a/build/bakefiles/files.bkl +++ b/build/bakefiles/files.bkl @@ -115,6 +115,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! src/unix/fswatcher_inotify.cpp src/unix/stdpaths.cpp src/unix/secretstore.cpp + src/unix/uilocale.cpp $(BASE_UNIX_AND_DARWIN_NOTWXMAC_HDR) @@ -146,6 +147,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! src/msw/utilsexc.cpp src/msw/fswatcher.cpp src/msw/secretstore.cpp + src/msw/uilocale.cpp src/msw/main.cpp @@ -187,6 +189,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! src/osx/core/strconv_cf.cpp src/osx/cocoa/utils_base.mm src/osx/core/secretstore.cpp + src/osx/core/uilocale.cpp wx/osx/core/cfdataref.h @@ -561,6 +564,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! src/generic/fswatcherg.cpp src/common/secretstore.cpp src/common/lzmastream.cpp + src/common/uilocale.cpp src/common/event.cpp @@ -736,6 +740,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! wx/secretstore.h wx/lzmastream.h wx/localedefs.h + wx/uilocale.h diff --git a/build/cmake/files.cmake b/build/cmake/files.cmake index 535259b3a5..df46473e51 100644 --- a/build/cmake/files.cmake +++ b/build/cmake/files.cmake @@ -47,6 +47,7 @@ set(BASE_UNIX_SRC src/unix/fswatcher_inotify.cpp src/unix/secretstore.cpp src/unix/stdpaths.cpp + src/unix/uilocale.cpp ) set(BASE_UNIX_HDR @@ -76,6 +77,7 @@ set(BASE_WIN32_SRC src/msw/utils.cpp src/msw/utilsexc.cpp src/msw/fswatcher.cpp + src/msw/uilocale.cpp ) set(BASE_AND_GUI_WIN32_SRC @@ -114,6 +116,7 @@ set(BASE_COREFOUNDATION_SRC src/osx/core/secretstore.cpp src/osx/core/strconv_cf.cpp src/osx/cocoa/utils_base.mm + src/osx/core/uilocale.cpp ) set(BASE_COREFOUNDATION_HDR @@ -475,6 +478,7 @@ set(BASE_CMN_SRC src/common/fswatchercmn.cpp src/generic/fswatcherg.cpp src/common/lzmastream.cpp + src/common/uilocale.cpp ) set(BASE_AND_GUI_CMN_SRC @@ -652,6 +656,7 @@ set(BASE_CMN_HDR wx/generic/fswatcher.h wx/lzmastream.h wx/localedefs.h + wx/uilocale.h ) set(NET_UNIX_SRC diff --git a/build/files b/build/files index 574cbb6e37..eafe03673d 100644 --- a/build/files +++ b/build/files @@ -71,6 +71,7 @@ BASE_UNIX_SRC = src/unix/fswatcher_inotify.cpp src/unix/secretstore.cpp src/unix/stdpaths.cpp + src/unix/uilocale.cpp BASE_UNIX_HDR = $(BASE_UNIX_AND_DARWIN_NOTWXMAC_HDR) @@ -98,6 +99,7 @@ BASE_WIN32_SRC = src/msw/stdpaths.cpp src/msw/thread.cpp src/msw/timer.cpp + src/msw/uilocale.cpp src/msw/utils.cpp src/msw/utilsexc.cpp src/msw/fswatcher.cpp @@ -139,6 +141,7 @@ BASE_COREFOUNDATION_SRC = src/osx/core/evtloop_cf.cpp src/osx/core/secretstore.cpp src/osx/core/strconv_cf.cpp + src/osx/core/uilocale.cpp src/osx/cocoa/utils_base.mm BASE_COREFOUNDATION_HDR = @@ -481,6 +484,7 @@ BASE_CMN_SRC = src/common/tokenzr.cpp src/common/translation.cpp src/common/txtstrm.cpp + src/common/uilocale.cpp src/common/unichar.cpp src/common/uri.cpp src/common/ustring.cpp @@ -633,6 +637,7 @@ BASE_CMN_HDR = wx/txtstrm.h wx/typeinfo.h wx/types.h + wx/uilocale.h wx/unichar.h wx/uri.h wx/ustring.h diff --git a/build/msw/makefile.gcc b/build/msw/makefile.gcc index 4ed7edba02..fcb8ae9aa3 100644 --- a/build/msw/makefile.gcc +++ b/build/msw/makefile.gcc @@ -477,6 +477,7 @@ MONODLL_OBJECTS = \ $(OBJS)\monodll_fswatcherg.o \ $(OBJS)\monodll_common_secretstore.o \ $(OBJS)\monodll_lzmastream.o \ + $(OBJS)\monodll_common_uilocale.o \ $(OBJS)\monodll_basemsw.o \ $(OBJS)\monodll_crashrpt.o \ $(OBJS)\monodll_debughlp.o \ @@ -497,6 +498,7 @@ MONODLL_OBJECTS = \ $(OBJS)\monodll_utilsexc.o \ $(OBJS)\monodll_fswatcher.o \ $(OBJS)\monodll_msw_secretstore.o \ + $(OBJS)\monodll_msw_uilocale.o \ $(OBJS)\monodll_event.o \ $(OBJS)\monodll_fs_mem.o \ $(OBJS)\monodll_msgout.o \ @@ -633,6 +635,7 @@ MONOLIB_OBJECTS = \ $(OBJS)\monolib_fswatcherg.o \ $(OBJS)\monolib_common_secretstore.o \ $(OBJS)\monolib_lzmastream.o \ + $(OBJS)\monolib_common_uilocale.o \ $(OBJS)\monolib_basemsw.o \ $(OBJS)\monolib_crashrpt.o \ $(OBJS)\monolib_debughlp.o \ @@ -653,6 +656,7 @@ MONOLIB_OBJECTS = \ $(OBJS)\monolib_utilsexc.o \ $(OBJS)\monolib_fswatcher.o \ $(OBJS)\monolib_msw_secretstore.o \ + $(OBJS)\monolib_msw_uilocale.o \ $(OBJS)\monolib_event.o \ $(OBJS)\monolib_fs_mem.o \ $(OBJS)\monolib_msgout.o \ @@ -783,6 +787,7 @@ BASEDLL_OBJECTS = \ $(OBJS)\basedll_fswatcherg.o \ $(OBJS)\basedll_common_secretstore.o \ $(OBJS)\basedll_lzmastream.o \ + $(OBJS)\basedll_common_uilocale.o \ $(OBJS)\basedll_basemsw.o \ $(OBJS)\basedll_crashrpt.o \ $(OBJS)\basedll_debughlp.o \ @@ -803,6 +808,7 @@ BASEDLL_OBJECTS = \ $(OBJS)\basedll_utilsexc.o \ $(OBJS)\basedll_fswatcher.o \ $(OBJS)\basedll_msw_secretstore.o \ + $(OBJS)\basedll_msw_uilocale.o \ $(OBJS)\basedll_event.o \ $(OBJS)\basedll_fs_mem.o \ $(OBJS)\basedll_msgout.o \ @@ -914,6 +920,7 @@ BASELIB_OBJECTS = \ $(OBJS)\baselib_fswatcherg.o \ $(OBJS)\baselib_common_secretstore.o \ $(OBJS)\baselib_lzmastream.o \ + $(OBJS)\baselib_common_uilocale.o \ $(OBJS)\baselib_basemsw.o \ $(OBJS)\baselib_crashrpt.o \ $(OBJS)\baselib_debughlp.o \ @@ -934,6 +941,7 @@ BASELIB_OBJECTS = \ $(OBJS)\baselib_utilsexc.o \ $(OBJS)\baselib_fswatcher.o \ $(OBJS)\baselib_msw_secretstore.o \ + $(OBJS)\baselib_msw_uilocale.o \ $(OBJS)\baselib_event.o \ $(OBJS)\baselib_fs_mem.o \ $(OBJS)\baselib_msgout.o \ @@ -7144,6 +7152,9 @@ $(OBJS)\monodll_common_secretstore.o: ../../src/common/secretstore.cpp $(OBJS)\monodll_lzmastream.o: ../../src/common/lzmastream.cpp $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $< +$(OBJS)\monodll_common_uilocale.o: ../../src/common/uilocale.cpp + $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $< + $(OBJS)\monodll_basemsw.o: ../../src/msw/basemsw.cpp $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $< @@ -7204,6 +7215,9 @@ $(OBJS)\monodll_fswatcher.o: ../../src/msw/fswatcher.cpp $(OBJS)\monodll_msw_secretstore.o: ../../src/msw/secretstore.cpp $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $< +$(OBJS)\monodll_msw_uilocale.o: ../../src/msw/uilocale.cpp + $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $< + $(OBJS)\monodll_event.o: ../../src/common/event.cpp $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $< @@ -9712,6 +9726,9 @@ $(OBJS)\monolib_common_secretstore.o: ../../src/common/secretstore.cpp $(OBJS)\monolib_lzmastream.o: ../../src/common/lzmastream.cpp $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $< +$(OBJS)\monolib_common_uilocale.o: ../../src/common/uilocale.cpp + $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $< + $(OBJS)\monolib_basemsw.o: ../../src/msw/basemsw.cpp $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $< @@ -9772,6 +9789,9 @@ $(OBJS)\monolib_fswatcher.o: ../../src/msw/fswatcher.cpp $(OBJS)\monolib_msw_secretstore.o: ../../src/msw/secretstore.cpp $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $< +$(OBJS)\monolib_msw_uilocale.o: ../../src/msw/uilocale.cpp + $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $< + $(OBJS)\monolib_event.o: ../../src/common/event.cpp $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $< @@ -12280,6 +12300,9 @@ $(OBJS)\basedll_common_secretstore.o: ../../src/common/secretstore.cpp $(OBJS)\basedll_lzmastream.o: ../../src/common/lzmastream.cpp $(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $< +$(OBJS)\basedll_common_uilocale.o: ../../src/common/uilocale.cpp + $(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $< + $(OBJS)\basedll_basemsw.o: ../../src/msw/basemsw.cpp $(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $< @@ -12340,6 +12363,9 @@ $(OBJS)\basedll_fswatcher.o: ../../src/msw/fswatcher.cpp $(OBJS)\basedll_msw_secretstore.o: ../../src/msw/secretstore.cpp $(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $< +$(OBJS)\basedll_msw_uilocale.o: ../../src/msw/uilocale.cpp + $(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $< + $(OBJS)\basedll_event.o: ../../src/common/event.cpp $(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $< @@ -12625,6 +12651,9 @@ $(OBJS)\baselib_common_secretstore.o: ../../src/common/secretstore.cpp $(OBJS)\baselib_lzmastream.o: ../../src/common/lzmastream.cpp $(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $< +$(OBJS)\baselib_common_uilocale.o: ../../src/common/uilocale.cpp + $(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $< + $(OBJS)\baselib_basemsw.o: ../../src/msw/basemsw.cpp $(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $< @@ -12685,6 +12714,9 @@ $(OBJS)\baselib_fswatcher.o: ../../src/msw/fswatcher.cpp $(OBJS)\baselib_msw_secretstore.o: ../../src/msw/secretstore.cpp $(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $< +$(OBJS)\baselib_msw_uilocale.o: ../../src/msw/uilocale.cpp + $(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $< + $(OBJS)\baselib_event.o: ../../src/common/event.cpp $(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $< diff --git a/build/msw/makefile.vc b/build/msw/makefile.vc index d8557a9f40..42d2c0634e 100644 --- a/build/msw/makefile.vc +++ b/build/msw/makefile.vc @@ -510,6 +510,7 @@ MONODLL_OBJECTS = \ $(OBJS)\monodll_fswatcherg.obj \ $(OBJS)\monodll_common_secretstore.obj \ $(OBJS)\monodll_lzmastream.obj \ + $(OBJS)\monodll_common_uilocale.obj \ $(OBJS)\monodll_basemsw.obj \ $(OBJS)\monodll_crashrpt.obj \ $(OBJS)\monodll_debughlp.obj \ @@ -530,6 +531,7 @@ MONODLL_OBJECTS = \ $(OBJS)\monodll_utilsexc.obj \ $(OBJS)\monodll_fswatcher.obj \ $(OBJS)\monodll_msw_secretstore.obj \ + $(OBJS)\monodll_msw_uilocale.obj \ $(OBJS)\monodll_event.obj \ $(OBJS)\monodll_fs_mem.obj \ $(OBJS)\monodll_msgout.obj \ @@ -675,6 +677,7 @@ MONOLIB_OBJECTS = \ $(OBJS)\monolib_fswatcherg.obj \ $(OBJS)\monolib_common_secretstore.obj \ $(OBJS)\monolib_lzmastream.obj \ + $(OBJS)\monolib_common_uilocale.obj \ $(OBJS)\monolib_basemsw.obj \ $(OBJS)\monolib_crashrpt.obj \ $(OBJS)\monolib_debughlp.obj \ @@ -695,6 +698,7 @@ MONOLIB_OBJECTS = \ $(OBJS)\monolib_utilsexc.obj \ $(OBJS)\monolib_fswatcher.obj \ $(OBJS)\monolib_msw_secretstore.obj \ + $(OBJS)\monolib_msw_uilocale.obj \ $(OBJS)\monolib_event.obj \ $(OBJS)\monolib_fs_mem.obj \ $(OBJS)\monolib_msgout.obj \ @@ -834,6 +838,7 @@ BASEDLL_OBJECTS = \ $(OBJS)\basedll_fswatcherg.obj \ $(OBJS)\basedll_common_secretstore.obj \ $(OBJS)\basedll_lzmastream.obj \ + $(OBJS)\basedll_common_uilocale.obj \ $(OBJS)\basedll_basemsw.obj \ $(OBJS)\basedll_crashrpt.obj \ $(OBJS)\basedll_debughlp.obj \ @@ -854,6 +859,7 @@ BASEDLL_OBJECTS = \ $(OBJS)\basedll_utilsexc.obj \ $(OBJS)\basedll_fswatcher.obj \ $(OBJS)\basedll_msw_secretstore.obj \ + $(OBJS)\basedll_msw_uilocale.obj \ $(OBJS)\basedll_event.obj \ $(OBJS)\basedll_fs_mem.obj \ $(OBJS)\basedll_msgout.obj \ @@ -977,6 +983,7 @@ BASELIB_OBJECTS = \ $(OBJS)\baselib_fswatcherg.obj \ $(OBJS)\baselib_common_secretstore.obj \ $(OBJS)\baselib_lzmastream.obj \ + $(OBJS)\baselib_common_uilocale.obj \ $(OBJS)\baselib_basemsw.obj \ $(OBJS)\baselib_crashrpt.obj \ $(OBJS)\baselib_debughlp.obj \ @@ -997,6 +1004,7 @@ BASELIB_OBJECTS = \ $(OBJS)\baselib_utilsexc.obj \ $(OBJS)\baselib_fswatcher.obj \ $(OBJS)\baselib_msw_secretstore.obj \ + $(OBJS)\baselib_msw_uilocale.obj \ $(OBJS)\baselib_event.obj \ $(OBJS)\baselib_fs_mem.obj \ $(OBJS)\baselib_msgout.obj \ @@ -7575,6 +7583,9 @@ $(OBJS)\monodll_common_secretstore.obj: ..\..\src\common\secretstore.cpp $(OBJS)\monodll_lzmastream.obj: ..\..\src\common\lzmastream.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\lzmastream.cpp +$(OBJS)\monodll_common_uilocale.obj: ..\..\src\common\uilocale.cpp + $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\uilocale.cpp + $(OBJS)\monodll_basemsw.obj: ..\..\src\msw\basemsw.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\msw\basemsw.cpp @@ -7635,6 +7646,9 @@ $(OBJS)\monodll_fswatcher.obj: ..\..\src\msw\fswatcher.cpp $(OBJS)\monodll_msw_secretstore.obj: ..\..\src\msw\secretstore.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\msw\secretstore.cpp +$(OBJS)\monodll_msw_uilocale.obj: ..\..\src\msw\uilocale.cpp + $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\msw\uilocale.cpp + $(OBJS)\monodll_event.obj: ..\..\src\common\event.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\event.cpp @@ -10143,6 +10157,9 @@ $(OBJS)\monolib_common_secretstore.obj: ..\..\src\common\secretstore.cpp $(OBJS)\monolib_lzmastream.obj: ..\..\src\common\lzmastream.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\lzmastream.cpp +$(OBJS)\monolib_common_uilocale.obj: ..\..\src\common\uilocale.cpp + $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\uilocale.cpp + $(OBJS)\monolib_basemsw.obj: ..\..\src\msw\basemsw.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\msw\basemsw.cpp @@ -10203,6 +10220,9 @@ $(OBJS)\monolib_fswatcher.obj: ..\..\src\msw\fswatcher.cpp $(OBJS)\monolib_msw_secretstore.obj: ..\..\src\msw\secretstore.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\msw\secretstore.cpp +$(OBJS)\monolib_msw_uilocale.obj: ..\..\src\msw\uilocale.cpp + $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\msw\uilocale.cpp + $(OBJS)\monolib_event.obj: ..\..\src\common\event.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\event.cpp @@ -12711,6 +12731,9 @@ $(OBJS)\basedll_common_secretstore.obj: ..\..\src\common\secretstore.cpp $(OBJS)\basedll_lzmastream.obj: ..\..\src\common\lzmastream.cpp $(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\lzmastream.cpp +$(OBJS)\basedll_common_uilocale.obj: ..\..\src\common\uilocale.cpp + $(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\uilocale.cpp + $(OBJS)\basedll_basemsw.obj: ..\..\src\msw\basemsw.cpp $(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) ..\..\src\msw\basemsw.cpp @@ -12771,6 +12794,9 @@ $(OBJS)\basedll_fswatcher.obj: ..\..\src\msw\fswatcher.cpp $(OBJS)\basedll_msw_secretstore.obj: ..\..\src\msw\secretstore.cpp $(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) ..\..\src\msw\secretstore.cpp +$(OBJS)\basedll_msw_uilocale.obj: ..\..\src\msw\uilocale.cpp + $(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) ..\..\src\msw\uilocale.cpp + $(OBJS)\basedll_event.obj: ..\..\src\common\event.cpp $(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\event.cpp @@ -13056,6 +13082,9 @@ $(OBJS)\baselib_common_secretstore.obj: ..\..\src\common\secretstore.cpp $(OBJS)\baselib_lzmastream.obj: ..\..\src\common\lzmastream.cpp $(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\common\lzmastream.cpp +$(OBJS)\baselib_common_uilocale.obj: ..\..\src\common\uilocale.cpp + $(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\common\uilocale.cpp + $(OBJS)\baselib_basemsw.obj: ..\..\src\msw\basemsw.cpp $(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\msw\basemsw.cpp @@ -13116,6 +13145,9 @@ $(OBJS)\baselib_fswatcher.obj: ..\..\src\msw\fswatcher.cpp $(OBJS)\baselib_msw_secretstore.obj: ..\..\src\msw\secretstore.cpp $(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\msw\secretstore.cpp +$(OBJS)\baselib_msw_uilocale.obj: ..\..\src\msw\uilocale.cpp + $(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\msw\uilocale.cpp + $(OBJS)\baselib_event.obj: ..\..\src\common\event.cpp $(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\common\event.cpp diff --git a/build/msw/wx_base.vcxproj b/build/msw/wx_base.vcxproj index 8f8c9ae262..16a1d225c1 100644 --- a/build/msw/wx_base.vcxproj +++ b/build/msw/wx_base.vcxproj @@ -605,6 +605,26 @@ $(IntDir)common_%(Filename).obj + + $(IntDir)msw_%(Filename).obj + $(IntDir)msw_%(Filename).obj + $(IntDir)msw_%(Filename).obj + $(IntDir)msw_%(Filename).obj + $(IntDir)msw_%(Filename).obj + $(IntDir)msw_%(Filename).obj + $(IntDir)msw_%(Filename).obj + $(IntDir)msw_%(Filename).obj + + + $(IntDir)common_%(Filename).obj + $(IntDir)common_%(Filename).obj + $(IntDir)common_%(Filename).obj + $(IntDir)common_%(Filename).obj + $(IntDir)common_%(Filename).obj + $(IntDir)common_%(Filename).obj + $(IntDir)common_%(Filename).obj + $(IntDir)common_%(Filename).obj + @@ -824,6 +844,7 @@ + diff --git a/build/msw/wx_base.vcxproj.filters b/build/msw/wx_base.vcxproj.filters index 4c57355ba1..33a96e5ef0 100644 --- a/build/msw/wx_base.vcxproj.filters +++ b/build/msw/wx_base.vcxproj.filters @@ -261,6 +261,9 @@ Common Sources + + Common Sources + Common Sources @@ -360,6 +363,9 @@ MSW Sources + + MSW Sources + MSW Sources @@ -862,6 +868,9 @@ Common Headers + + Common Headers + Common Headers diff --git a/build/msw/wx_vc8_base.vcproj b/build/msw/wx_vc8_base.vcproj index 69963dce91..feb02ea5e3 100644 --- a/build/msw/wx_vc8_base.vcproj +++ b/build/msw/wx_vc8_base.vcproj @@ -1249,6 +1249,74 @@ RelativePath="..\..\src\common\txtstrm.cpp" > + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1446,6 +1514,74 @@ RelativePath="..\..\src\msw\timer.cpp" > + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2347,6 +2483,10 @@ RelativePath="..\..\include\wx\types.h" > + + diff --git a/build/msw/wx_vc9_base.vcproj b/build/msw/wx_vc9_base.vcproj index 1776e4de02..33df8ce65f 100644 --- a/build/msw/wx_vc9_base.vcproj +++ b/build/msw/wx_vc9_base.vcproj @@ -1245,6 +1245,74 @@ RelativePath="..\..\src\common\txtstrm.cpp" > + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1442,6 +1510,74 @@ RelativePath="..\..\src\msw\timer.cpp" > + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2343,6 +2479,10 @@ RelativePath="..\..\include\wx\types.h" > + + diff --git a/include/wx/intl.h b/include/wx/intl.h index b5c3458d6c..ab871ea6aa 100644 --- a/include/wx/intl.h +++ b/include/wx/intl.h @@ -90,6 +90,8 @@ enum wxLocaleInitFlags #endif }; +// NOTE: This class is deprecated, use wxUILocale and wxTranslations instead. + class WXDLLIMPEXP_BASE wxLocale { public: diff --git a/include/wx/private/uilocale.h b/include/wx/private/uilocale.h new file mode 100644 index 0000000000..89ce17a63c --- /dev/null +++ b/include/wx/private/uilocale.h @@ -0,0 +1,43 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/private/uilocale.h +// Purpose: wxUILocaleImpl class declaration +// Author: Vadim Zeitlin +// Created: 2021-08-01 +// Copyright: (c) 2021 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PRIVATE_UILOCALE_H_ +#define _WX_PRIVATE_UILOCALE_H_ + +#include "wx/localedefs.h" +#include "wx/string.h" + +// ---------------------------------------------------------------------------- +// wxUILocaleImpl provides the implementation of public wxUILocale functions +// ---------------------------------------------------------------------------- + +class wxUILocaleImpl +{ +public: + // This function is implemented in platform-specific code and returns the + // object used by default, i.e. if wxUILocale::UseDefault() is not called. + // This object corresponds to the traditional "C" locale. + // + // It should never return NULL. + static wxUILocaleImpl* CreateStdC(); + + // Similarly, this one returns the object corresponding to the default user + // locale settings which is used if wxUILocale::UseDefault() was called. + // + // It may return NULL in case of failure. + static wxUILocaleImpl* CreateUserDefault(); + + // Functions corresponding to wxUILocale ones. + virtual wxString GetName() const = 0; + virtual wxString GetInfo(wxLocaleInfo index, wxLocaleCategory cat) const = 0; + + virtual ~wxUILocaleImpl() { } +}; + +#endif // _WX_PRIVATE_UILOCALE_H_ diff --git a/include/wx/uilocale.h b/include/wx/uilocale.h new file mode 100644 index 0000000000..f3aa9a2bb3 --- /dev/null +++ b/include/wx/uilocale.h @@ -0,0 +1,66 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/uilocale.h +// Purpose: wxUILocale class declaration. +// Author: Vadim Zeitlin +// Created: 2021-07-31 +// Copyright: (c) 2021 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_UILOCALE_H_ +#define _WX_UILOCALE_H_ + +#include "wx/defs.h" + +#if wxUSE_INTL + +#include "wx/localedefs.h" +#include "wx/string.h" + +class wxUILocaleImpl; + +// ---------------------------------------------------------------------------- +// wxUILocale allows to use the default UI locale and get information about it +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxUILocale +{ +public: + // Configure the UI to use the default user locale. + static bool UseDefault(); + + // Get the object corresponding to the currently used locale. + static const wxUILocale& GetCurrent(); + + // Get the platform-dependent name of the current locale. + wxString GetName() const; + + // Query the locale for the specified information. + wxString GetInfo(wxLocaleInfo index, + wxLocaleCategory cat = wxLOCALE_CAT_DEFAULT) const; + + // Note that this class is not supposed to be used polymorphically, hence + // its dtor is not virtual. + ~wxUILocale(); + +private: + // Ctor is private, use static accessor to get objects of this class. + wxUILocale() : m_impl(NULL) { } + + // Used by UseDefault(). + // + // Note that this object takes ownership of the provided pointer and will + // delete it in dtor. + void SetImpl(wxUILocaleImpl* impl); + + + static wxUILocale ms_current; + + wxUILocaleImpl* m_impl; + + wxDECLARE_NO_COPY_CLASS(wxUILocale); +}; + +#endif // wxUSE_INTL + +#endif // _WX_UILOCALE_H_ diff --git a/interface/wx/intl.h b/interface/wx/intl.h index 7cd5ab6964..92d1bab62d 100644 --- a/interface/wx/intl.h +++ b/interface/wx/intl.h @@ -69,7 +69,7 @@ struct wxLanguageInfo /** The category of locale settings. - @see wxLocale::GetInfo() + @see wxLocale::GetInfo(), wxUILocale::GetInfo() */ enum wxLocaleCategory { @@ -108,6 +108,8 @@ enum wxLocaleCategory All of these values are used with @c wxLOCALE_CAT_DATE in wxLocale::GetInfo() or, more typically, with @c wxLOCALE_CAT_DEFAULT as they only apply to a single category. + + @see wxUILocale::GetInfo() */ enum wxLocaleInfo { @@ -172,6 +174,13 @@ enum wxLocaleInfo wxLocale class encapsulates all language-dependent settings and is a generalization of the C locale concept. + @note While this class can still be used in wxMSW and wxGTK ports, it + doesn't work in wxOSX where it is impossible to change the application + UI locale after launching it. Worse, since macOS 11 (Big Sur), using + wxLocale can break application display due to bugs in C locale support + in macOS itself. Because of this, it is recommended to use wxUILocale + instead of this class for the applications targeting macOS. + In wxWidgets this class manages current locale. It also initializes and activates wxTranslations object that manages message catalogs. @@ -441,6 +450,9 @@ public: /** Get the values of a locale datum in the OS locale. + This function shouldn't be used in the new code, use + wxUILocale::GetInfo() instead. + This function is similar to GetInfo() and, in fact, identical to it under non-MSW systems. Under MSW it differs from it when no locale had been explicitly set: GetInfo() returns the values corresponding to the diff --git a/interface/wx/uilocale.h b/interface/wx/uilocale.h new file mode 100644 index 0000000000..d31eaf1b89 --- /dev/null +++ b/interface/wx/uilocale.h @@ -0,0 +1,106 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/uilocale.h +// Purpose: Interface of wxUILocale +// Author: Vadim Zeitlin +// Created: 2021-08-01 +// Copyright: (c) 2021 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +/** + Query and modify locale used for the UI by the current platform. + + UI locale determines all culture-dependent conventions used in the user + interface, including numbers, currencies and dates formatting. It also + determines the language used by the native dialogs, such as wxFileDialog, + where different labels use the language corresponding to the current UI + locale. + + The UI locale is, in general, different from C locale set by the standard + @c setlocale() function and affecting C standard library functions such as + @c printf(), @c scanf(), @c strftime() and many others. Unfortunately, the + relationship between C and UI locales is not the same depending on the + platform: with wxGTK they must be the same, but under macOS C locale must + not be changed, as doing this exposes bugs in the system. Because of this, + applications can't generally count on C locale being set to any particular + value and it is best to avoid using it, including implicitly via the + standard C functions, in portable code. Instead, consider using + wxNumberFormatter for parsing and formatting numbers according to the + current UI locale or wxString::FromCDouble() and wxString::ToCDouble() + functions for doing it always using period as decimal separator. + + Localized applications should call wxUILocale::UseDefault() on startup to + explicitly indicate that they opt-in using the current UI locale, even if + this results in changing the global C locale, as is the case in wxGTK. Note + that some platforms (MSW and macOS) will use default user locale for their + standard dialogs even if this function is not called, but it is still + necessary to call it to use the correct number and date formats and to + avoid mixing messages in the user language with default formats not + corresponding to it. + + Please also note that under macOS to really use the user locale, it must be + listed as a supported language in the application @c Info.plist file under + @c CFBundleLocalizations key. + + Unlike wxLocale class, this class doesn't affect the translations used by + the application, see wxTranslations for doing this. + + @library{wxbase} + @since 3.1.6 + */ +class wxUILocale +{ +public: + /** + Configure the UI to use the default user locale. + + Localized applications should call this functions as early as possible + during the program startup, e.g. in the very beginning of the + overridden wxApp::OnInit(). + + Note that under most Unix systems (but not macOS) this function changes + the C locale to the locale specified by the environment variables and + so affects the results of calling C functions such as @c sprintf() etc + which can use comma, rather than period, as decimal separator. The + wxString::ToCDouble() and wxString::FromCDouble() functions can be used + for parsing and formatting floating point numbers using period as + decimal separator independently of the current locale. + + @return @true on success or @false if the default locale couldn't be set + */ + static bool UseDefault(); + + /** + Get the object corresponding to the currently used locale. + + If UseDefault() had been called, this object corresponds to the default + user locale. Otherwise it corresponds to a generic locale similar to + "C" locale, i.e. always uses period as decimal separator and m/d/y date + format. + */ + static const wxUILocale& GetCurrent(); + + /** + Get the platform-dependent name of the current locale. + + This name can be used in diagnostic messages. + */ + wxString GetName() const; + + /** + Query the locale for the specified information. + + This function returns the value of the locale-specific option specified + by the given @a index. + + @param index + One of the elements of wxLocaleInfo enum. + @param cat + The category to use with the given index or wxLOCALE_CAT_DEFAULT if + the index can only apply to a single category. + @return + The option value or empty string if the function failed. + */ + wxString GetInfo(wxLocaleInfo index, + wxLocaleCategory cat = wxLOCALE_CAT_DEFAULT) const; +}; diff --git a/samples/internat/internat.cpp b/samples/internat/internat.cpp index 21abd20e1c..2bd0af7af0 100644 --- a/samples/internat/internat.cpp +++ b/samples/internat/internat.cpp @@ -37,6 +37,7 @@ #include "wx/platinfo.h" #include "wx/spinctrl.h" #include "wx/translation.h" +#include "wx/uilocale.h" #ifndef wxHAS_IMAGES_IN_RESOURCES #include "../sample.xpm" @@ -73,15 +74,13 @@ protected: Locale_Set, Locale_Skip } m_setLocale; - - wxLocale m_locale; // locale we'll be using }; // Define a new frame type class MyFrame: public wxFrame { public: - MyFrame(wxLocale& m_locale); + MyFrame(); public: void OnTestLocaleAvail(wxCommandEvent& event); @@ -228,9 +227,7 @@ bool MyApp::OnInit() if ( m_setLocale == Locale_Set ) { - // don't use wxLOCALE_LOAD_DEFAULT flag so that Init() doesn't return - // false just because it failed to load wxstd catalog - if ( !m_locale.Init(wxLANGUAGE_DEFAULT, wxLOCALE_DONT_LOAD_DEFAULT) ) + if ( !wxUILocale::UseDefault() ) { wxLogWarning("Failed to initialize the default system locale."); } @@ -272,7 +269,7 @@ bool MyApp::OnInit() } // Create the main frame window - MyFrame *frame = new MyFrame(m_locale); + MyFrame *frame = new MyFrame(); // Show the frame frame->Show(true); @@ -285,7 +282,7 @@ bool MyApp::OnInit() // ---------------------------------------------------------------------------- // main frame constructor -MyFrame::MyFrame(wxLocale& locale) +MyFrame::MyFrame() : wxFrame(NULL, wxID_ANY, _("International wxWidgets App")) @@ -352,14 +349,18 @@ MyFrame::MyFrame(wxLocale& locale) wxSizer* const topSizer = new wxBoxSizer(wxVERTICAL); - wxString localeInfo; - wxString locale = locale.GetLocale(); - wxString sysname = locale.GetSysName(); - wxString canname = locale.GetCanonicalName(); - localeInfo.Printf("Current locale: %s (system name: %s, canonical name: %s)", - locale, sysname, canname ); - - topSizer->Add(new wxStaticText(panel, wxID_ANY, localeInfo), + // create controls showing the locale being used + topSizer->Add(new wxStaticText + ( + panel, + wxID_ANY, + wxString::Format + ( + _("Current UI locale: %s; C locale: %s"), + wxUILocale::GetCurrent().GetName(), + setlocale(LC_ALL, NULL) + ) + ), wxSizerFlags().Center().Border()); // create some controls affected by the locale diff --git a/src/common/intl.cpp b/src/common/intl.cpp index d9b166557d..c6c82186d2 100644 --- a/src/common/intl.cpp +++ b/src/common/intl.cpp @@ -1601,6 +1601,10 @@ wxString wxTranslateFromUnicodeFormat(const wxString& fmt) #if defined(__WINDOWS__) +// This function is also used by wxUILocaleImpl, so don't make it private. +extern wxString +wxGetInfoFromLCID(LCID lcid, wxLocaleInfo index, wxLocaleCategory cat); + namespace { @@ -1624,10 +1628,38 @@ LCTYPE GetLCTYPEFormatFromLocalInfo(wxLocaleInfo index) return 0; } +// This private function additionally checks consistency of the decimal +// separator settings between MSW and CRT. wxString -GetInfoFromLCID(LCID lcid, - wxLocaleInfo index, - wxLocaleCategory cat = wxLOCALE_CAT_DEFAULT) +GetInfoFromLCID(LCID lcid, wxLocaleInfo index, wxLocaleCategory cat) +{ + const wxString str = wxGetInfoFromLCID(lcid, index, cat); + + if ( !str.empty() && index == wxLOCALE_DECIMAL_POINT ) + { + // As we get our decimal point separator from Win32 and not the + // CRT there is a possibility of mismatch between them and this + // can easily happen if the user code called setlocale() + // instead of using wxLocale to change the locale. And this can + // result in very strange bugs elsewhere in the code as the + // assumptions that formatted strings do use the decimal + // separator actually fail, so check for it here. + wxASSERT_MSG + ( + wxString::Format("%.3f", 1.23).find(str) != wxString::npos, + "Decimal separator mismatch -- did you use setlocale()?" + "If so, use wxLocale to change the locale instead." + ); + } + + return str; +} + +} // anonymous namespace + +// This function is also used by wxUILocaleImpl, so don't make it private. +wxString +wxGetInfoFromLCID(LCID lcid, wxLocaleInfo index, wxLocaleCategory cat) { wxString str; @@ -1650,20 +1682,6 @@ GetInfoFromLCID(LCID lcid, WXSIZEOF(buf)) ) { str = buf; - - // As we get our decimal point separator from Win32 and not the - // CRT there is a possibility of mismatch between them and this - // can easily happen if the user code called setlocale() - // instead of using wxLocale to change the locale. And this can - // result in very strange bugs elsewhere in the code as the - // assumptions that formatted strings do use the decimal - // separator actually fail, so check for it here. - wxASSERT_MSG - ( - wxString::Format("%.3f", 1.23).find(str) != wxString::npos, - "Decimal separator mismatch -- did you use setlocale()?" - "If so, use wxLocale to change the locale instead." - ); } break; @@ -1686,12 +1704,12 @@ GetInfoFromLCID(LCID lcid, // alternate representation here) { const wxString - datefmt = GetInfoFromLCID(lcid, wxLOCALE_SHORT_DATE_FMT); + datefmt = wxGetInfoFromLCID(lcid, wxLOCALE_SHORT_DATE_FMT, cat); if ( datefmt.empty() ) break; const wxString - timefmt = GetInfoFromLCID(lcid, wxLOCALE_TIME_FMT); + timefmt = wxGetInfoFromLCID(lcid, wxLOCALE_TIME_FMT, cat); if ( timefmt.empty() ) break; @@ -1706,8 +1724,6 @@ GetInfoFromLCID(LCID lcid, return str; } -} // anonymous namespace - /* static */ wxString wxLocale::GetInfo(wxLocaleInfo index, wxLocaleCategory cat) { @@ -1766,34 +1782,19 @@ wxString wxLocale::GetOSInfo(wxLocaleInfo index, wxLocaleCategory cat) #elif defined(__WXOSX__) -/* static */ -wxString wxLocale::GetInfo(wxLocaleInfo index, wxLocaleCategory WXUNUSED(cat)) +// This function is also used by wxUILocaleImpl, so don't make it private. +extern wxString +wxGetInfoFromCFLocale(CFLocaleRef cfloc, wxLocaleInfo index, wxLocaleCategory WXUNUSED(cat)) { - CFLocaleRef userLocaleRefRaw; - if ( wxGetLocale() ) - { - userLocaleRefRaw = CFLocaleCreate - ( - kCFAllocatorDefault, - wxCFStringRef(wxGetLocale()->GetCanonicalName()) - ); - } - else // no current locale, use the default one - { - userLocaleRefRaw = CFLocaleCopyCurrent(); - } - - wxCFRef userLocaleRef(userLocaleRefRaw); - CFStringRef cfstr = 0; switch ( index ) { case wxLOCALE_THOUSANDS_SEP: - cfstr = (CFStringRef) CFLocaleGetValue(userLocaleRef, kCFLocaleGroupingSeparator); + cfstr = (CFStringRef) CFLocaleGetValue(cfloc, kCFLocaleGroupingSeparator); break; case wxLOCALE_DECIMAL_POINT: - cfstr = (CFStringRef) CFLocaleGetValue(userLocaleRef, kCFLocaleDecimalSeparator); + cfstr = (CFStringRef) CFLocaleGetValue(cfloc, kCFLocaleDecimalSeparator); break; case wxLOCALE_SHORT_DATE_FMT: @@ -1823,7 +1824,7 @@ wxString wxLocale::GetInfo(wxLocaleInfo index, wxLocaleCategory WXUNUSED(cat)) return wxString(); } wxCFRef dateFormatter( CFDateFormatterCreate - (NULL, userLocaleRef, dateStyle, timeStyle)); + (NULL, cfloc, dateStyle, timeStyle)); wxCFStringRef cfs = wxCFRetain( CFDateFormatterGetFormat(dateFormatter )); wxString format = wxTranslateFromUnicodeFormat(cfs.AsString()); // we always want full years @@ -1840,6 +1841,28 @@ wxString wxLocale::GetInfo(wxLocaleInfo index, wxLocaleCategory WXUNUSED(cat)) return str.AsString(); } +/* static */ +wxString wxLocale::GetInfo(wxLocaleInfo index, wxLocaleCategory cat) +{ + CFLocaleRef userLocaleRefRaw; + if ( wxGetLocale() ) + { + userLocaleRefRaw = CFLocaleCreate + ( + kCFAllocatorDefault, + wxCFStringRef(wxGetLocale()->GetCanonicalName()) + ); + } + else // no current locale, use the default one + { + userLocaleRefRaw = CFLocaleCopyCurrent(); + } + + wxCFRef userLocaleRef(userLocaleRefRaw); + + return wxGetInfoFromCFLocale(userLocaleRef, index, cat); +} + #else // !__WINDOWS__ && !__WXOSX__, assume generic POSIX namespace diff --git a/src/common/uilocale.cpp b/src/common/uilocale.cpp new file mode 100644 index 0000000000..bf79b77189 --- /dev/null +++ b/src/common/uilocale.cpp @@ -0,0 +1,90 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/common/uilocale.cpp +// Purpose: wxUILocale implementation +// Author: Vadim Zeitlin +// Created: 2021-07-31 +// Copyright: (c) 2021 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#if wxUSE_INTL + +#include "wx/uilocale.h" + +#include "wx/private/uilocale.h" + +// ---------------------------------------------------------------------------- +// global variables +// ---------------------------------------------------------------------------- + +// This static global variable doesn't need to be protected from concurrent +// access as it's only supposed to be used from the UI thread. +/* static */ +wxUILocale wxUILocale::ms_current; + +// ============================================================================ +// implementation +// ============================================================================ + +/* static */ +bool wxUILocale::UseDefault() +{ + // We don't attempt to optimize this function by checking whether + // ms_current is already set to the user default locale, as we're + // supposed to be called just once during the program lifetime anyhow. + + wxUILocaleImpl* const impl = wxUILocaleImpl::CreateUserDefault(); + if ( !impl ) + return false; + + ms_current.SetImpl(impl); + + return true; +} + +/* static */ +const wxUILocale& wxUILocale::GetCurrent() +{ + // We initialize it on demand. + if ( !ms_current.m_impl ) + { + ms_current.SetImpl(wxUILocaleImpl::CreateStdC()); + } + + return ms_current; +} + +void wxUILocale::SetImpl(wxUILocaleImpl* impl) +{ + delete m_impl; + + m_impl = impl; +} + +wxString wxUILocale::GetName() const +{ + return m_impl->GetName(); +} + +wxString wxUILocale::GetInfo(wxLocaleInfo index, wxLocaleCategory cat) const +{ + return m_impl->GetInfo(index, cat); +} + +wxUILocale::~wxUILocale() +{ + delete m_impl; +} + +#endif // wxUSE_INTL diff --git a/src/msw/uilocale.cpp b/src/msw/uilocale.cpp new file mode 100644 index 0000000000..21070de0c0 --- /dev/null +++ b/src/msw/uilocale.cpp @@ -0,0 +1,101 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/msw/uilocale.cpp +// Purpose: wxUILocale implementation for MSW +// Author: Vadim Zeitlin +// Created: 2021-07-31 +// Copyright: (c) 2021 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#if wxUSE_INTL + +#include "wx/private/uilocale.h" + +#include "wx/dynlib.h" + +#include "wx/msw/private.h" + +#ifndef LOCALE_SNAME +#define LOCALE_SNAME 0x5c +#endif + +// This function is defined in src/common/intl.cpp, just declare it here for +// now before refactoring the code. +wxString wxGetInfoFromLCID(LCID lcid, wxLocaleInfo index, wxLocaleCategory cat); + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxUILocale implementation for MSW +// ---------------------------------------------------------------------------- + +// TODO-XP: Replace this with an implementation using GetLocaleInfoEx() when we +// don't support XP any longer. +class wxUILocaleImplLCID : public wxUILocaleImpl +{ +public: + explicit wxUILocaleImplLCID(LCID lcid) + : m_lcid(lcid) + { + } + + wxString GetName() const wxOVERRIDE + { + wxChar buf[256]; + buf[0] = wxT('\0'); + + // Try using newer constant available since Vista which produces names + // more similar to the other platforms. + if ( wxGetWinVersion() >= wxWinVersion_Vista ) + { + ::GetLocaleInfo(m_lcid, LOCALE_SNAME, buf, WXSIZEOF(buf)); + } + else // TODO-XP: Drop this branch. + { + // This name constant is available under all systems, including + // pre-Vista ones. + ::GetLocaleInfo(m_lcid, LOCALE_SENGLANGUAGE, buf, WXSIZEOF(buf)); + } + + return buf; + } + + wxString GetInfo(wxLocaleInfo index, wxLocaleCategory cat) const wxOVERRIDE + { + return wxGetInfoFromLCID(m_lcid, index, cat); + } + +private: + const LCID m_lcid; + + wxDECLARE_NO_COPY_CLASS(wxUILocaleImplLCID); +}; + +/* static */ +wxUILocaleImpl* wxUILocaleImpl::CreateStdC() +{ + // There is no LCID for "C" locale, but US English is basically the same. + LCID lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT); + return new wxUILocaleImplLCID(lcid); +} + +/* static */ +wxUILocaleImpl* wxUILocaleImpl::CreateUserDefault() +{ + return new wxUILocaleImplLCID(LOCALE_USER_DEFAULT); +} + +#endif // wxUSE_INTL diff --git a/src/osx/core/uilocale.cpp b/src/osx/core/uilocale.cpp new file mode 100644 index 0000000000..3309343739 --- /dev/null +++ b/src/osx/core/uilocale.cpp @@ -0,0 +1,92 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/osx/core/uilocale.cpp +// Purpose: wxUILocale implementation for macOS +// Author: Vadim Zeitlin +// Created: 2021-08-01 +// Copyright: (c) 2021 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#if wxUSE_INTL + +#include "wx/private/uilocale.h" + +#include "wx/osx/core/cfref.h" +#include "wx/osx/core/cfstring.h" + +#include +#include + +extern wxString +wxGetInfoFromCFLocale(CFLocaleRef cfloc, wxLocaleInfo index, wxLocaleCategory cat); + +namespace +{ + +// ---------------------------------------------------------------------------- +// wxUILocale implementation using Core Foundation +// ---------------------------------------------------------------------------- + +class wxUILocaleImplCF : public wxUILocaleImpl +{ +public: + explicit wxUILocaleImplCF(const wxCFRef& cfloc) + : m_cfloc(cfloc) + { + } + + wxString GetName() const wxOVERRIDE; + wxString GetInfo(wxLocaleInfo index, wxLocaleCategory cat) const wxOVERRIDE; + +private: + wxCFRef m_cfloc; + + wxDECLARE_NO_COPY_CLASS(wxUILocaleImplCF); +}; + +} // anonymous namespace + +// ============================================================================ +// implementation +// ============================================================================ + +wxString +wxUILocaleImplCF::GetName() const +{ + return wxCFStringRef::AsString(CFLocaleGetIdentifier(m_cfloc)); +} + +wxString +wxUILocaleImplCF::GetInfo(wxLocaleInfo index, wxLocaleCategory cat) const +{ + return wxGetInfoFromCFLocale(m_cfloc, index, cat); +} + +/* static */ +wxUILocaleImpl* wxUILocaleImpl::CreateStdC() +{ + CFLocaleRef cfloc = CFLocaleCreate(kCFAllocatorDefault, wxCFStringRef("C")); + if ( !cfloc ) + return NULL; + + return new wxUILocaleImplCF(cfloc); +} + +/* static */ +wxUILocaleImpl* wxUILocaleImpl::CreateUserDefault() +{ + return new wxUILocaleImplCF(CFLocaleCopyCurrent()); +} + +#endif // wxUSE_INTL diff --git a/src/unix/uilocale.cpp b/src/unix/uilocale.cpp new file mode 100644 index 0000000000..a817ad899d --- /dev/null +++ b/src/unix/uilocale.cpp @@ -0,0 +1,91 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/unix/uilocale.cpp +// Purpose: wxUILocale implementation for Unix systems +// Author: Vadim Zeitlin +// Created: 2021-08-01 +// Copyright: (c) 2021 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#if wxUSE_INTL + +#include "wx/private/uilocale.h" + +#include "wx/intl.h" + +#include + +namespace +{ + +// ---------------------------------------------------------------------------- +// wxUILocale implementation using standard Unix/C functions +// ---------------------------------------------------------------------------- + +class wxUILocaleImplUnix : public wxUILocaleImpl +{ +public: + // Locale argument may be NULL to not change it at all. + explicit wxUILocaleImplUnix(const char* locale); + + wxString GetName() const wxOVERRIDE; + wxString GetInfo(wxLocaleInfo index, wxLocaleCategory cat) const wxOVERRIDE; + +private: + wxDECLARE_NO_COPY_CLASS(wxUILocaleImplUnix); +}; + +} // anonymous namespace + +// ============================================================================ +// implementation +// ============================================================================ + +wxUILocaleImplUnix::wxUILocaleImplUnix(const char* locale) +{ + if ( locale ) + setlocale(LC_ALL, locale); +} + +wxString +wxUILocaleImplUnix::GetName() const +{ + return wxString::FromAscii(setlocale(LC_ALL, NULL)); +} + +wxString +wxUILocaleImplUnix::GetInfo(wxLocaleInfo index, wxLocaleCategory cat) const +{ + // Currently we rely on the user code not calling setlocale() itself, so + // that the current locale is still the same as was set in the ctor. + // + // If this assumption turns out to be wrong, we could use wxLocaleSetter to + // temporarily change the locale here (maybe only if setlocale(NULL) result + // differs from the expected one). + return wxLocale::GetInfo(index, cat); +} + +/* static */ +wxUILocaleImpl* wxUILocaleImpl::CreateStdC() +{ + return new wxUILocaleImplUnix(NULL); +} + +/* static */ +wxUILocaleImpl* wxUILocaleImpl::CreateUserDefault() +{ + return new wxUILocaleImplUnix(""); +} + +#endif // wxUSE_INTL diff --git a/tests/intl/intltest.cpp b/tests/intl/intltest.cpp index c19628b4c0..d6db0c8a56 100644 --- a/tests/intl/intltest.cpp +++ b/tests/intl/intltest.cpp @@ -18,6 +18,7 @@ #endif // WX_PRECOMP #include "wx/intl.h" +#include "wx/uilocale.h" #if wxUSE_INTL @@ -239,4 +240,17 @@ TEST_CASE("wxLocale::Default", "[locale]") #endif // wxUSE_UNICODE +// This test doesn't run by default as it only works in locales using decimal +// point as separator, which doesn't need to be the case. +TEST_CASE("wxUILocale::GetInfo", "[.][uilocale]") +{ + REQUIRE( wxUILocale::UseDefault() ); + + const wxUILocale& loc = wxUILocale::GetCurrent(); + + WARN( "Using locale " << loc.GetName() ); + + CHECK( loc.GetInfo(wxLOCALE_DECIMAL_POINT) == "." ); +} + #endif // wxUSE_INTL