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