Merge branch 'ui-locale'

Add wxUILocale class providing functionality which can be implemented
portably for all major platforms, including macOS, and doesn't force
the change of the global C locale, unlike wxLocale.

See https://github.com/wxWidgets/wxWidgets/pull/2464
This commit is contained in:
Vadim Zeitlin
2021-08-26 15:49:57 +02:00
41 changed files with 1978 additions and 655 deletions

View File

@@ -581,6 +581,8 @@ ALL_BASE_HEADERS = \
wx/generic/fswatcher.h \
wx/secretstore.h \
wx/lzmastream.h \
wx/localedefs.h \
wx/uilocale.h \
$(BASE_PLATFORM_HDR) \
wx/fs_inet.h \
wx/protocol/file.h \
@@ -766,6 +768,8 @@ ALL_PORTS_BASE_HEADERS = \
wx/generic/fswatcher.h \
wx/secretstore.h \
wx/lzmastream.h \
wx/localedefs.h \
wx/uilocale.h \
wx/unix/app.h \
wx/unix/apptbase.h \
wx/unix/apptrait.h \
@@ -905,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 \
@@ -924,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 \
@@ -944,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 \
@@ -1093,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 \
@@ -1235,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 \
@@ -1365,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 \
@@ -1477,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 \
@@ -2357,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 \
@@ -2382,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 \
@@ -2421,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 \
@@ -2444,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 \
@@ -2467,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 \
@@ -2490,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 \
@@ -2513,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 \
@@ -4259,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 \
@@ -4296,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 \
@@ -4318,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
@@ -6252,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 \
@@ -6289,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 \
@@ -6311,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
@@ -8297,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 \
@@ -8334,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 \
@@ -8356,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
@@ -8380,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 \
@@ -8417,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 \
@@ -8439,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
@@ -15995,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
@@ -16007,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
@@ -16067,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
@@ -16085,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
@@ -21272,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
@@ -21284,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
@@ -21344,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
@@ -21362,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
@@ -26549,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
@@ -26561,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
@@ -26621,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
@@ -26639,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
@@ -27023,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
@@ -27035,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
@@ -27095,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
@@ -27113,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

View File

@@ -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
</set>
<set var="BASE_UNIX_HDR" hints="files">
$(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
</set>
<set var="BASE_AND_GUI_WIN32_SRC" hints="files">
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
</set>
<set var="BASE_COREFOUNDATION_HDR" hints="files">
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
</set>
<set var="BASE_AND_GUI_CMN_SRC" hints="files">
src/common/event.cpp
@@ -735,6 +739,8 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
wx/generic/fswatcher.h
wx/secretstore.h
wx/lzmastream.h
wx/localedefs.h
wx/uilocale.h
</set>

View File

@@ -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
@@ -651,6 +655,8 @@ set(BASE_CMN_HDR
wx/fswatcher.h
wx/generic/fswatcher.h
wx/lzmastream.h
wx/localedefs.h
wx/uilocale.h
)
set(NET_UNIX_SRC

View File

@@ -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
@@ -574,6 +578,7 @@ BASE_CMN_HDR =
wx/link.h
wx/list.h
wx/listimpl.cpp
wx/localedefs.h
wx/log.h
wx/longlong.h
wx/lzmastream.h
@@ -632,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

View File

@@ -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) $<

View File

@@ -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

View File

@@ -605,6 +605,26 @@
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)common_%(Filename).obj</ObjectFileName>
</ClCompile>
<ClCompile Include="..\..\src\common\lzmastream.cpp" />
<ClCompile Include="..\..\src\msw\uilocale.cpp">
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='DLL Release|Win32'">$(IntDir)msw_%(Filename).obj</ObjectFileName>
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='DLL Debug|Win32'">$(IntDir)msw_%(Filename).obj</ObjectFileName>
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)msw_%(Filename).obj</ObjectFileName>
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)msw_%(Filename).obj</ObjectFileName>
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'">$(IntDir)msw_%(Filename).obj</ObjectFileName>
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'">$(IntDir)msw_%(Filename).obj</ObjectFileName>
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)msw_%(Filename).obj</ObjectFileName>
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)msw_%(Filename).obj</ObjectFileName>
</ClCompile>
<ClCompile Include="..\..\src\common\uilocale.cpp">
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='DLL Release|Win32'">$(IntDir)common_%(Filename).obj</ObjectFileName>
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='DLL Debug|Win32'">$(IntDir)common_%(Filename).obj</ObjectFileName>
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)common_%(Filename).obj</ObjectFileName>
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)common_%(Filename).obj</ObjectFileName>
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='DLL Release|x64'">$(IntDir)common_%(Filename).obj</ObjectFileName>
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'">$(IntDir)common_%(Filename).obj</ObjectFileName>
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)common_%(Filename).obj</ObjectFileName>
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)common_%(Filename).obj</ObjectFileName>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\..\src\msw\version.rc">
@@ -823,6 +843,8 @@
<ClInclude Include="..\..\include\wx\secretstore.h" />
<ClInclude Include="..\..\include\wx\evtloopsrc.h" />
<ClInclude Include="..\..\include\wx\lzmastream.h" />
<ClInclude Include="..\..\include\wx\localedefs.h" />
<ClInclude Include="..\..\include\wx\uilocale.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">

View File

@@ -261,6 +261,9 @@
<ClCompile Include="..\..\src\common\txtstrm.cpp">
<Filter>Common Sources</Filter>
</ClCompile>
<ClCompile Include="..\..\src\common\uilocale.cpp">
<Filter>Common Sources</Filter>
</ClCompile>
<ClCompile Include="..\..\src\common\unichar.cpp">
<Filter>Common Sources</Filter>
</ClCompile>
@@ -360,6 +363,9 @@
<ClCompile Include="..\..\src\msw\timer.cpp">
<Filter>MSW Sources</Filter>
</ClCompile>
<ClCompile Include="..\..\src\msw\uilocale.cpp">
<Filter>MSW Sources</Filter>
</ClCompile>
<ClCompile Include="..\..\src\msw\utils.cpp">
<Filter>MSW Sources</Filter>
</ClCompile>
@@ -598,6 +604,9 @@
<ClInclude Include="..\..\include\wx\listimpl.cpp">
<Filter>Common Headers</Filter>
</ClInclude>
<ClInclude Include="..\..\include\wx\localedefs.h">
<Filter>Common Headers</Filter>
</ClInclude>
<ClInclude Include="..\..\include\wx\log.h">
<Filter>Common Headers</Filter>
</ClInclude>
@@ -859,6 +868,9 @@
<ClInclude Include="..\..\include\wx\types.h">
<Filter>Common Headers</Filter>
</ClInclude>
<ClInclude Include="..\..\include\wx\uilocale.h">
<Filter>Common Headers</Filter>
</ClInclude>
<ClInclude Include="..\..\include\wx\unichar.h">
<Filter>Common Headers</Filter>
</ClInclude>

View File

@@ -1249,6 +1249,74 @@
RelativePath="..\..\src\common\txtstrm.cpp"
>
</File>
<File
RelativePath="..\..\src\common\uilocale.cpp"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswud\base\common_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswu\base\common_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="DLL Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswuddll\base\common_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="DLL Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswudll\base\common_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|x64"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswud_x64\base\common_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswu_x64\base\common_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="DLL Debug|x64"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswuddll_x64\base\common_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="DLL Release|x64"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswudll_x64\base\common_uilocale.obj"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\..\src\common\unichar.cpp"
>
@@ -1446,6 +1514,74 @@
RelativePath="..\..\src\msw\timer.cpp"
>
</File>
<File
RelativePath="..\..\src\msw\uilocale.cpp"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswud\base\msw_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswu\base\msw_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="DLL Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswuddll\base\msw_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="DLL Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswudll\base\msw_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|x64"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswud_x64\base\msw_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswu_x64\base\msw_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="DLL Debug|x64"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswuddll_x64\base\msw_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="DLL Release|x64"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswudll_x64\base\msw_uilocale.obj"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\..\src\msw\utils.cpp"
>
@@ -2103,6 +2239,10 @@
RelativePath="..\..\include\wx\list.h"
>
</File>
<File
RelativePath="..\..\include\wx\localedefs.h"
>
</File>
<File
RelativePath="..\..\include\wx\log.h"
>
@@ -2343,6 +2483,10 @@
RelativePath="..\..\include\wx\types.h"
>
</File>
<File
RelativePath="..\..\include\wx\uilocale.h"
>
</File>
<File
RelativePath="..\..\include\wx\unichar.h"
>

View File

@@ -1245,6 +1245,74 @@
RelativePath="..\..\src\common\txtstrm.cpp"
>
</File>
<File
RelativePath="..\..\src\common\uilocale.cpp"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswud\base\common_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswu\base\common_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="DLL Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswuddll\base\common_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="DLL Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswudll\base\common_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|x64"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswud_x64\base\common_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswu_x64\base\common_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="DLL Debug|x64"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswuddll_x64\base\common_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="DLL Release|x64"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswudll_x64\base\common_uilocale.obj"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\..\src\common\unichar.cpp"
>
@@ -1442,6 +1510,74 @@
RelativePath="..\..\src\msw\timer.cpp"
>
</File>
<File
RelativePath="..\..\src\msw\uilocale.cpp"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswud\base\msw_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswu\base\msw_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="DLL Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswuddll\base\msw_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="DLL Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswudll\base\msw_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|x64"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswud_x64\base\msw_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|x64"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswu_x64\base\msw_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="DLL Debug|x64"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswuddll_x64\base\msw_uilocale.obj"
/>
</FileConfiguration>
<FileConfiguration
Name="DLL Release|x64"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="vc_mswudll_x64\base\msw_uilocale.obj"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\..\src\msw\utils.cpp"
>
@@ -2099,6 +2235,10 @@
RelativePath="..\..\include\wx\list.h"
>
</File>
<File
RelativePath="..\..\include\wx\localedefs.h"
>
</File>
<File
RelativePath="..\..\include\wx\log.h"
>
@@ -2339,6 +2479,10 @@
RelativePath="..\..\include\wx\types.h"
>
</File>
<File
RelativePath="..\..\include\wx\uilocale.h"
>
</File>
<File
RelativePath="..\..\include\wx\unichar.h"
>

View File

@@ -527,6 +527,8 @@ public:
virtual wxSize GetSize() const wxOVERRIDE;
private:
wxString FormatDate() const;
wxDateTime m_date;
};
#else // !wxUSE_DATEPICKCTRL

View File

@@ -430,8 +430,6 @@ private:
void DoSetDigitsAndUpdate(unsigned digits);
wxString m_format;
wxDECLARE_DYNAMIC_CLASS(wxSpinCtrlDouble);
};

View File

@@ -13,19 +13,10 @@
#define _WX_INTL_H_
#include "wx/defs.h"
#include "wx/localedefs.h"
#include "wx/string.h"
#include "wx/translation.h"
// Make wxLayoutDirection enum available without need for wxUSE_INTL so wxWindow, wxApp
// and other classes are not distrubed by wxUSE_INTL
enum wxLayoutDirection
{
wxLayout_Default,
wxLayout_LeftToRight,
wxLayout_RightToLeft
};
#if wxUSE_INTL
#include "wx/fontenc.h"
@@ -50,86 +41,6 @@ class WXDLLIMPEXP_FWD_BASE wxLanguageInfoArray;
// locale support
// ============================================================================
// ----------------------------------------------------------------------------
// wxLanguageInfo: encapsulates wxLanguage to OS native lang.desc.
// translation information
// ----------------------------------------------------------------------------
struct WXDLLIMPEXP_BASE wxLanguageInfo
{
int Language; // wxLanguage id
wxString CanonicalName; // Canonical name, e.g. fr_FR
#ifdef __WINDOWS__
wxUint32 WinLang, // Win32 language identifiers
WinSublang;
#endif // __WINDOWS__
wxString Description; // human-readable name of the language
wxLayoutDirection LayoutDirection;
#ifdef __WINDOWS__
// return the LCID corresponding to this language
wxUint32 GetLCID() const;
#endif // __WINDOWS__
// return the locale name corresponding to this language usable with
// setlocale() on the current system or empty string if this locale is not
// supported
wxString GetLocaleName() const;
// Call setlocale() and return non-null value if it works for this language.
//
// This function is mostly for internal use, as changing locale involves
// more than just calling setlocale() on some platforms, use wxLocale to
// do everything that needs to be done instead of calling this method.
const char* TrySetLocale() const;
};
// ----------------------------------------------------------------------------
// wxLocaleCategory: the category of locale settings
// ----------------------------------------------------------------------------
enum wxLocaleCategory
{
// (any) numbers
wxLOCALE_CAT_NUMBER,
// date/time
wxLOCALE_CAT_DATE,
// monetary value
wxLOCALE_CAT_MONEY,
// default category for wxLocaleInfo values which only apply to a single
// category (e.g. wxLOCALE_SHORT_DATE_FMT)
wxLOCALE_CAT_DEFAULT,
wxLOCALE_CAT_MAX
};
// ----------------------------------------------------------------------------
// wxLocaleInfo: the items understood by wxLocale::GetInfo()
// ----------------------------------------------------------------------------
enum wxLocaleInfo
{
// the thousands separator (for wxLOCALE_CAT_NUMBER or MONEY)
wxLOCALE_THOUSANDS_SEP,
// the character used as decimal point (for wxLOCALE_CAT_NUMBER or MONEY)
wxLOCALE_DECIMAL_POINT,
// the stftime()-formats used for short/long date and time representations
// (under some platforms short and long date formats are the same)
//
// NB: these elements should appear in this order, code in GetInfo() relies
// on it
wxLOCALE_SHORT_DATE_FMT,
wxLOCALE_LONG_DATE_FMT,
wxLOCALE_DATE_TIME_FMT,
wxLOCALE_TIME_FMT
};
// ----------------------------------------------------------------------------
// wxLocale: encapsulates all language dependent settings, including current
// message catalogs, date, time and currency formats (TODO) &c
@@ -145,6 +56,8 @@ enum wxLocaleInitFlags
#endif
};
// NOTE: This class is deprecated, use wxUILocale and wxTranslations instead.
class WXDLLIMPEXP_BASE wxLocale
{
public:

113
include/wx/localedefs.h Normal file
View File

@@ -0,0 +1,113 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/localedefs.h
// Purpose: Definitions of common locale-related constants and structs.
// Author: Vadim Zeitlin
// Created: 2021-07-31 (extracted from wx/intl.h)
// Copyright: (c) 2021 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_LOCALEDEFS_H_
#define _WX_LOCALEDEFS_H_
// ----------------------------------------------------------------------------
// wxLayoutDirection: used by wxWindow, wxDC etc
// ----------------------------------------------------------------------------
// Note that this one must be available even when wxUSE_INTL == 0 as it's used
// outside of locale code too.
enum wxLayoutDirection
{
wxLayout_Default,
wxLayout_LeftToRight,
wxLayout_RightToLeft
};
#if wxUSE_INTL
#include "wx/string.h"
// ----------------------------------------------------------------------------
// wxLocaleCategory: the category of locale settings
// ----------------------------------------------------------------------------
enum wxLocaleCategory
{
// (any) numbers
wxLOCALE_CAT_NUMBER,
// date/time
wxLOCALE_CAT_DATE,
// monetary value
wxLOCALE_CAT_MONEY,
// default category for wxLocaleInfo values which only apply to a single
// category (e.g. wxLOCALE_SHORT_DATE_FMT)
wxLOCALE_CAT_DEFAULT,
wxLOCALE_CAT_MAX
};
// ----------------------------------------------------------------------------
// wxLocaleInfo: the items understood by wxLocale::GetInfo()
// ----------------------------------------------------------------------------
enum wxLocaleInfo
{
// the thousands separator (for wxLOCALE_CAT_NUMBER or MONEY)
wxLOCALE_THOUSANDS_SEP,
// the character used as decimal point (for wxLOCALE_CAT_NUMBER or MONEY)
wxLOCALE_DECIMAL_POINT,
// the stftime()-formats used for short/long date and time representations
// (under some platforms short and long date formats are the same)
//
// NB: these elements should appear in this order, code in GetInfo() relies
// on it
wxLOCALE_SHORT_DATE_FMT,
wxLOCALE_LONG_DATE_FMT,
wxLOCALE_DATE_TIME_FMT,
wxLOCALE_TIME_FMT
};
// ----------------------------------------------------------------------------
// wxLanguageInfo: encapsulates wxLanguage to OS native lang.desc.
// translation information
// ----------------------------------------------------------------------------
struct WXDLLIMPEXP_BASE wxLanguageInfo
{
int Language; // wxLanguage id
wxString CanonicalName; // Canonical name, e.g. fr_FR
#ifdef __WINDOWS__
wxUint32 WinLang, // Win32 language identifiers
WinSublang;
#endif // __WINDOWS__
wxString Description; // human-readable name of the language
wxLayoutDirection LayoutDirection;
#ifdef __WINDOWS__
// return the LCID corresponding to this language
wxUint32 GetLCID() const;
#endif // __WINDOWS__
// return the locale name corresponding to this language usable with
// setlocale() on the current system or empty string if this locale is not
// supported
wxString GetLocaleName() const;
// Call setlocale() and return non-null value if it works for this language.
//
// This function is mostly for internal use, as changing locale involves
// more than just calling setlocale() on some platforms, use wxLocale to
// do everything that needs to be done instead of calling this method.
const char* TrySetLocale() const;
};
#endif // wxUSE_INTL
#endif // _WX_LOCALEDEFS_H_

View File

@@ -0,0 +1,28 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/msw/private/uilocale.h
// Purpose: MSW-specific locale-related helpers
// Author: Vadim Zeitlin
// Created: 2021-08-14
// Copyright: (c) 2021 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_MSW_PRIVATE_UILOCALE_H_
#define _WX_MSW_PRIVATE_UILOCALE_H_
#include "wx/msw/private.h" // Include <windows.h> to get LCID.
#ifndef LOCALE_SNAME
#define LOCALE_SNAME 0x5c
#endif
#ifndef LOCALE_CUSTOM_UI_DEFAULT
#define LOCALE_CUSTOM_UI_DEFAULT 0x1400
#endif
// Use the specific LCID for the current thread.
void wxUseLCID(LCID lcid);
// This function is defined in src/common/intl.cpp
wxString wxGetInfoFromLCID(LCID lcid, wxLocaleInfo index, wxLocaleCategory cat);
#endif // _WX_MSW_PRIVATE_UILOCALE_H_

View File

@@ -40,6 +40,13 @@ public:
int precision,
int style = Style_WithThousandsSep);
// Format the given number using one of the floating point formats and
// ensure that the result uses the correct decimal separator.
// Prefer using ToString() if possible, i.e. if format is "%g" or "%.Nf"
// which are supported by it directly.
static wxString Format(const wxString& format, double val);
// Parse a string representing a number, possibly with thousands separator.
//
// Return true on success and stores the result in the provided location

View File

@@ -0,0 +1,49 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/localeset.h
// Purpose: Define helper wxLocaleSetter class.
// Author: Vadim Zeitlin
// Created: 2021-08-03 (extracted from tests/testprec.h)
// Copyright: (c) 2021 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_LOCALESET_H_
#define _WX_PRIVATE_LOCALESET_H_
#include "wx/crt.h" // wxStrdupA()
#include <locale.h>
// Helper class setting the locale to the given one for its lifetime.
class wxLocaleSetter
{
public:
wxLocaleSetter(const char *loc)
: m_locOld(wxStrdupA(setlocale(LC_ALL, NULL)))
{
setlocale(LC_ALL, loc);
}
~wxLocaleSetter()
{
setlocale(LC_ALL, m_locOld);
free(m_locOld);
}
private:
char * const m_locOld;
wxDECLARE_NO_COPY_CLASS(wxLocaleSetter);
};
// An even simpler helper for setting the locale to "C" one during its lifetime.
class wxCLocaleSetter : private wxLocaleSetter
{
public:
wxCLocaleSetter() : wxLocaleSetter("C") { }
private:
wxDECLARE_NO_COPY_CLASS(wxCLocaleSetter);
};
#endif // _WX_PRIVATE_LOCALESET_H_

View File

@@ -0,0 +1,52 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/uilocale.h
// Purpose: wxUILocaleImpl class declaration
// Author: Vadim Zeitlin
// Created: 2021-08-01
// Copyright: (c) 2021 Vadim Zeitlin <vadim@wxwidgets.org>
// 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();
// This function exists only for wxLocale compatibility and sets the locale
// corresponding to the given language.
//
// The language passed to this function is a valid language, i.e. neither
// wxLANGUAGE_UNKNOWN nor wxLANGUAGE_DEFAULT.
//
// It may return NULL in case of failure.
static wxUILocaleImpl* CreateForLanguage(const wxLanguageInfo& info);
// 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_

84
include/wx/uilocale.h Normal file
View File

@@ -0,0 +1,84 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/uilocale.h
// Purpose: wxUILocale class declaration.
// Author: Vadim Zeitlin
// Created: 2021-07-31
// Copyright: (c) 2021 Vadim Zeitlin <vadim@wxwidgets.org>
// 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();
// Use the locale corresponding to the given language.
//
// This is a compatibility function used by wxWidgets itself, don't use it
// in the new code.
static bool UseLanguage(const wxLanguageInfo& info);
// 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);
};
inline wxString wxGetUIDateFormat()
{
return wxUILocale::GetCurrent().GetInfo(wxLOCALE_SHORT_DATE_FMT);
}
#else // !wxUSE_INTL
inline wxString wxGetUIDateFormat()
{
return wxString(wxS("%x"));
}
#endif // wxUSE_INTL/!wxUSE_INTL
#endif // _WX_UILOCALE_H_

View File

@@ -0,0 +1,33 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/unix/private/uilocale.h
// Purpose: Various locale-related helpers used under Unix systems only
// Author: Vadim Zeitlin
// Created: 2021-08-14 (extracted from src/common/intl.cpp)
// Copyright: (c) 2021 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_UNIX_PRIVATE_UILOCALE_H_
#define _WX_UNIX_PRIVATE_UILOCALE_H_
#include "wx/string.h"
// get just the language part ("en" in "en_GB")
inline wxString ExtractLang(const wxString& langFull)
{
return langFull.BeforeFirst('_');
}
// get everything else (including the leading '_')
inline wxString ExtractNotLang(const wxString& langFull)
{
size_t pos = langFull.find('_');
if ( pos != wxString::npos )
return langFull.substr(pos);
else
return wxString();
}
const char *wxSetlocaleTryAll(int c, const wxString& lc);
#endif // _WX_UNIX_PRIVATE_UILOCALE_H_

View File

@@ -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
{
@@ -116,6 +118,9 @@ enum wxLocaleInfo
This value can be used with either wxLOCALE_CAT_NUMBER or
wxLOCALE_CAT_MONEY categories.
By default, i.e. when wxLOCALE_CAT_DEFAULT is used, the separator for
numbers is returned.
*/
wxLOCALE_THOUSANDS_SEP,
@@ -124,6 +129,9 @@ enum wxLocaleInfo
This value can be used with either wxLOCALE_CAT_NUMBER or
wxLOCALE_CAT_MONEY categories.
By default, i.e. when wxLOCALE_CAT_DEFAULT is used, the decimal point
for numbers is returned.
*/
wxLOCALE_DECIMAL_POINT,
@@ -166,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.
@@ -435,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

View File

@@ -8,11 +8,15 @@
/**
@class wxNumberFormatter
Helper class for formatting and parsing numbers with thousands separators.
Formatting and parsing numbers using the current UI locale conventions,
including support for using the correct decimal point character and
thousands separators.
This class contains only static functions, so users must not create instances
but directly call the member functions.
@see wxUILocale
@since 2.9.2
@library{wxbase}
@@ -32,7 +36,7 @@ public:
/**
If this flag is given, thousands separators will be inserted in the
number string representation as defined by the current locale.
number string representation as defined by the current UI locale.
*/
Style_WithThousandsSep = 0x01,
@@ -56,7 +60,7 @@ public:
Returns string representation of an integer number.
By default, the string will use thousands separators if appropriate for
the current locale. This can be avoided by passing Style_None as @a
the current UI locale. This can be avoided by passing Style_None as @a
flags in which case the call to the function has exactly the same
effect as <code>wxString::Format("%ld", val)</code>.
@@ -89,12 +93,22 @@ public:
static wxString
ToString(double val, int precision, int flags = Style_WithThousandsSep);
/**
Format the given number using one of the floating point formats and
ensure that the result uses the correct decimal separator.
Prefer using ToString() if possible, i.e. if format is "%g" or "%.Nf"
which are supported by it directly.
@since 3.1.6
*/
static wxString Format(const wxString& format, double val);
/**
Parse a string representation of a number possibly including thousands
separators.
These functions parse number representation in the current locale. On
These functions parse number representation in the current UI locale. On
success they return @true and store the result at the location pointed
to by @a val (which can't be @NULL), otherwise @false is returned.
@@ -114,7 +128,7 @@ public:
//@}
/**
Get the decimal separator for the current locale.
Get the decimal separator for the current UI locale.
Decimal separators is always defined and we fall back to returning '.'
in case of an error.
@@ -123,14 +137,14 @@ public:
/**
Get the thousands separator if grouping of the digits is used by the
current locale.
current UI locale.
The value returned in @a sep should be only used if the function
returns @true, otherwise no thousands separator should be used at all.
@param sep
Points to the variable receiving the thousands separator character
if it is used by the current locale. May be @NULL if only the
if it is used by the current UI locale. May be @NULL if only the
function return value is needed.
*/
static bool GetThousandsSeparatorIfUsed(wxChar *sep);

121
interface/wx/uilocale.h Normal file
View File

@@ -0,0 +1,121 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/uilocale.h
// Purpose: Interface of wxUILocale
// Author: Vadim Zeitlin
// Created: 2021-08-01
// Copyright: (c) 2021 Vadim Zeitlin <vadim@wxwidgets.org>
// 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;
};
/**
Return the format to use for formatting user-visible dates.
This is a simple wrapper function normally calling wxUILocale::GetInfo()
with wxLOCALE_SHORT_DATE_FMT argument, but which is also available when @c
wxUSE_INTL==0, i.e. support for internationalization is disabled at
compile-time, in which case it returns @c %x string, i.e. uses the current
C locale formatting rather than UI locale.
@see wxDateTime::Format()
@since 3.1.6
*/
wxString wxGetUIDateFormat();

View File

@@ -28,11 +28,17 @@
#include "wx/wx.h"
#endif
#include "wx/calctrl.h"
#include "wx/intl.h"
#include "wx/file.h"
#include "wx/grid.h"
#include "wx/log.h"
#include "wx/cmdline.h"
#include "wx/numformatter.h"
#include "wx/platinfo.h"
#include "wx/spinctrl.h"
#include "wx/translation.h"
#include "wx/uilocale.h"
#ifndef wxHAS_IMAGES_IN_RESOURCES
#include "../sample.xpm"
@@ -53,22 +59,29 @@
class MyApp: public wxApp
{
public:
MyApp() { m_lang = wxLANGUAGE_UNKNOWN; }
MyApp() { m_setLocale = Locale_Ask; }
virtual void OnInitCmdLine(wxCmdLineParser& parser) wxOVERRIDE;
virtual bool OnCmdLineParsed(wxCmdLineParser& parser) wxOVERRIDE;
virtual bool OnInit() wxOVERRIDE;
protected:
wxLanguage m_lang; // language specified by user
wxLocale m_locale; // locale we'll be using
// Specifies whether we should use the current locale or not. By default we
// ask the user about it, but it's possible to override this using the
// command line options.
enum
{
Locale_Ask,
Locale_Set,
Locale_Skip
} m_setLocale;
};
// Define a new frame type
class MyFrame: public wxFrame
{
public:
MyFrame(wxLocale& m_locale);
MyFrame();
public:
void OnTestLocaleAvail(wxCommandEvent& event);
@@ -80,14 +93,13 @@ public:
void OnPlay(wxCommandEvent& event);
void OnOpen(wxCommandEvent& event);
void OnSave(wxCommandEvent& event);
void OnTest1(wxCommandEvent& event);
void OnTest2(wxCommandEvent& event);
void OnTest3(wxCommandEvent& event);
void OnTestMsgBox(wxCommandEvent& event);
wxDECLARE_EVENT_TABLE();
wxLocale& m_locale;
};
// ----------------------------------------------------------------------------
@@ -114,59 +126,6 @@ enum
INTERNAT_MACRO_9
};
// language data
static const wxLanguage langIds[] =
{
wxLANGUAGE_DEFAULT,
wxLANGUAGE_FRENCH,
wxLANGUAGE_ITALIAN,
wxLANGUAGE_GERMAN,
wxLANGUAGE_RUSSIAN,
wxLANGUAGE_BULGARIAN,
wxLANGUAGE_CZECH,
wxLANGUAGE_POLISH,
wxLANGUAGE_SWEDISH,
#if wxUSE_UNICODE || defined(__WXMOTIF__)
wxLANGUAGE_JAPANESE,
#endif
#if wxUSE_UNICODE
wxLANGUAGE_GEORGIAN,
wxLANGUAGE_ENGLISH,
wxLANGUAGE_ENGLISH_US,
wxLANGUAGE_ARABIC,
wxLANGUAGE_ARABIC_EGYPT
#endif
};
// note that it makes no sense to translate these strings, they are
// shown before we set the locale anyhow
const wxString langNames[] =
{
"System default",
"French",
"Italian",
"German",
"Russian",
"Bulgarian",
"Czech",
"Polish",
"Swedish",
#if wxUSE_UNICODE || defined(__WXMOTIF__)
"Japanese",
#endif
#if wxUSE_UNICODE
"Georgian",
"English",
"English (U.S.)",
"Arabic",
"Arabic (Egypt)"
#endif
};
// the arrays must be in sync
wxCOMPILE_TIME_ASSERT( WXSIZEOF(langNames) == WXSIZEOF(langIds),
LangArraysMismatch );
// ----------------------------------------------------------------------------
// wxWidgets macros
// ----------------------------------------------------------------------------
@@ -181,6 +140,7 @@ wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(INTERNAT_PLAY, MyFrame::OnPlay)
EVT_MENU(wxID_OPEN, MyFrame::OnOpen)
EVT_MENU(wxID_SAVE, MyFrame::OnSave)
EVT_MENU(INTERNAT_TEST_1, MyFrame::OnTest1)
EVT_MENU(INTERNAT_TEST_2, MyFrame::OnTest2)
EVT_MENU(INTERNAT_TEST_3, MyFrame::OnTest3)
@@ -198,11 +158,16 @@ wxIMPLEMENT_APP(MyApp);
// ----------------------------------------------------------------------------
// command line arguments handling
static const char* OPTION_NO_LOCALE = "no-locale";
static const char* OPTION_SET_LOCALE = "set-locale";
void MyApp::OnInitCmdLine(wxCmdLineParser& parser)
{
parser.AddParam(_("locale"),
wxCMD_LINE_VAL_STRING,
wxCMD_LINE_PARAM_OPTIONAL);
parser.AddSwitch("n", OPTION_NO_LOCALE,
_("skip setting locale on startup"));
parser.AddSwitch("y", OPTION_SET_LOCALE,
_("do set locale on startup without asking"));
wxApp::OnInitCmdLine(parser);
}
@@ -212,17 +177,20 @@ bool MyApp::OnCmdLineParsed(wxCmdLineParser& parser)
if ( !wxApp::OnCmdLineParsed(parser) )
return false;
if ( parser.GetParamCount() )
if ( parser.Found(OPTION_NO_LOCALE) )
{
const wxString loc = parser.GetParam();
const wxLanguageInfo * const lang = wxLocale::FindLanguageInfo(loc);
if ( !lang )
m_setLocale = Locale_Skip;
}
if ( parser.Found(OPTION_SET_LOCALE) )
{
if ( m_setLocale == Locale_Skip )
{
wxLogError(_("Locale \"%s\" is unknown."), loc);
return false;
wxLogWarning("--%s option overrides --%s",
OPTION_SET_LOCALE, OPTION_NO_LOCALE);
}
m_lang = static_cast<wxLanguage>(lang->Language);
m_setLocale = Locale_Set;
}
return true;
@@ -234,57 +202,75 @@ bool MyApp::OnInit()
if ( !wxApp::OnInit() )
return false;
if ( m_lang == wxLANGUAGE_UNKNOWN )
// For demonstration purposes only, ask the user if they want to run the
// program using the current system language. In real programs, we would do
// it unconditionally for localized programs -- or never do it at all for
// the other ones.
const wxLanguageInfo* const
langInfo = wxLocale::GetLanguageInfo(wxLANGUAGE_DEFAULT);
const wxString
langDesc = langInfo ? langInfo->Description
: "the default system locale";
if ( m_setLocale == Locale_Ask )
{
int lng = wxGetSingleChoiceIndex
(
_("Please choose language:"),
_("Language"),
WXSIZEOF(langNames),
langNames
);
m_lang = lng == -1 ? wxLANGUAGE_DEFAULT : langIds[lng];
m_setLocale = wxMessageBox
(
wxString::Format
(
"Would you like to use the program in %s?",
langDesc
),
"wxWidgets i18n (internat) sample",
wxYES_NO
) == wxYES ? Locale_Set : Locale_Skip;
}
// 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(m_lang, wxLOCALE_DONT_LOAD_DEFAULT) )
if ( m_setLocale == Locale_Set )
{
wxLogWarning(_("This language is not supported by the system."));
if ( !wxUILocale::UseDefault() )
{
wxLogWarning("Failed to initialize the default system locale.");
}
// continue nevertheless
}
// normally this wouldn't be necessary as the catalog files would be found
// in the default locations, but when the program is not installed the
// catalogs are in the build directory where we wouldn't find them by
// default
wxLocale::AddCatalogLookupPathPrefix(".");
// Independently of whether we succeeded to set the locale or not, try
// to load the translations (for the default system language) here.
// Initialize the catalogs we'll be using
const wxLanguageInfo* pInfo = wxLocale::GetLanguageInfo(m_lang);
if (!m_locale.AddCatalog("internat"))
{
wxLogError(_("Couldn't find/load the 'internat' catalog for locale '%s'."),
pInfo ? pInfo->GetLocaleName() : _("unknown"));
}
// normally this wouldn't be necessary as the catalog files would be found
// in the default locations, but when the program is not installed the
// catalogs are in the build directory where we wouldn't find them by
// default
wxFileTranslationsLoader::AddCatalogLookupPathPrefix(".");
// Now try to add wxstd.mo so that loading "NOTEXIST.ING" file will produce
// a localized error message:
m_locale.AddCatalog("wxstd");
// NOTE: it's not an error if we couldn't find it!
// Create the object for message translation and set it up for global use.
wxTranslations* const trans = new wxTranslations();
wxTranslations::Set(trans);
// this catalog is installed in standard location on Linux systems and
// shows that you may make use of the standard message catalogs as well
//
// if it's not installed on your system, it is just silently ignored
// Initialize the catalogs we'll be using.
if ( !trans->AddCatalog("internat") )
{
wxLogError(_("Couldn't find/load 'internat' catalog for %s."),
langDesc);
}
// Now try to add wxstd.mo so that loading "NOTEXIST.ING" file will produce
// a localized error message:
trans->AddCatalog("wxstd");
// NOTE: it's not an error if we couldn't find it!
// this catalog is installed in standard location on Linux systems and
// shows that you may make use of the standard message catalogs as well
//
// if it's not installed on your system, it is just silently ignored
#ifdef USE_COREUTILS_MO
wxLocale::AddCatalogLookupPathPrefix("/usr/share/locale");
g_loadedCoreutilsMO = m_locale.AddCatalog("coreutils");
wxFileTranslationsLoader::AddCatalogLookupPathPrefix("/usr/share/locale");
g_loadedCoreutilsMO = trans->AddCatalog("coreutils");
#endif // USE_COREUTILS_MO
}
// Create the main frame window
MyFrame *frame = new MyFrame(m_locale);
MyFrame *frame = new MyFrame();
// Show the frame
frame->Show(true);
@@ -297,11 +283,10 @@ bool MyApp::OnInit()
// ----------------------------------------------------------------------------
// main frame constructor
MyFrame::MyFrame(wxLocale& locale)
MyFrame::MyFrame()
: wxFrame(NULL,
wxID_ANY,
_("International wxWidgets App")),
m_locale(locale)
_("International wxWidgets App"))
{
SetIcon(wxICON(sample));
@@ -316,6 +301,7 @@ MyFrame::MyFrame(wxLocale& locale)
wxMenu *test_menu = new wxMenu;
test_menu->Append(wxID_OPEN, _("&Open bogus file"), _("Shows a wxWidgets localized error message"));
test_menu->Append(wxID_SAVE, _("&Save dummy file"), _("Shows a localized standard dialog"));
test_menu->Append(INTERNAT_PLAY, _("&Play a game"), _("A little game; hint: 17 is a lucky number for many"));
test_menu->AppendSeparator();
test_menu->Append(INTERNAT_TEST_1, _("&1 _() (gettext)"), _("Tests the _() macro"));
@@ -360,13 +346,79 @@ MyFrame::MyFrame(wxLocale& locale)
// this demonstrates RTL support in wxStatusBar:
CreateStatusBar(1);
// this demonstrates RTL layout mirroring for Arabic locales
wxPanel* const panel = new wxPanel(this);
wxSizer* const topSizer = new wxBoxSizer(wxVERTICAL);
// 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
// this demonstrates RTL layout mirroring for Arabic locales and using
// locale-specific decimal separator in wxSpinCtrlDouble.
wxSizer *sizer = new wxBoxSizer(wxHORIZONTAL);
sizer->Add(new wxStaticText(this, wxID_ANY, _("First")),
wxSizerFlags().Border());
sizer->Add(new wxStaticText(this, wxID_ANY, _("Second")),
wxSizerFlags().Border());
SetSizer(sizer);
sizer->Add(new wxStaticText(panel, wxID_ANY, _("Numeric input:")),
wxSizerFlags().Center().Border());
wxSpinCtrlDouble* const spin = new wxSpinCtrlDouble(panel, wxID_ANY);
spin->SetDigits(2);
spin->SetValue(12.34);
sizer->Add(spin, wxSizerFlags().Center().Border());
topSizer->Add(sizer, wxSizerFlags().Center());
// show that week days and months names are translated too
topSizer->Add(new wxCalendarCtrl(panel, wxID_ANY),
wxSizerFlags().Center().Border());
// another control using locale-specific number and date format
wxGrid* const grid = new wxGrid(panel, wxID_ANY,
wxDefaultPosition, wxDefaultSize,
wxBORDER_SIMPLE);
grid->CreateGrid(2, 2);
grid->HideRowLabels();
grid->SetColLabelValue(0, _("Number"));
grid->SetColFormatFloat(0);
grid->SetCellValue(0, 0, wxNumberFormatter::ToString(3.14159265, -1));
grid->SetColLabelValue(1, _("Date"));
grid->SetColFormatDate(1);
grid->SetCellValue(0, 1, "Today");
topSizer->Add(grid, wxSizerFlags().Center().Border());
// show the difference (in decimal and thousand separator, hence use a
// floating point number > 1000) between wxString::Format() and
// wxNumberFormatter: the former uses the current C locale, while the
// latter uses the UI locale
topSizer->Add(new wxStaticText
(
panel,
wxID_ANY,
wxString::Format
(
_("Number in UI locale: %s; in C locale: %.2f"),
wxNumberFormatter::ToString(1234567.89, 2),
1234567.89
)
),
wxSizerFlags().Center().Border());
panel->SetSizer(topSizer);
topSizer->SetSizeHints(this);
}
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event) )
@@ -376,20 +428,10 @@ void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event) )
void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
{
wxString localeInfo;
wxString locale = m_locale.GetLocale();
wxString sysname = m_locale.GetSysName();
wxString canname = m_locale.GetCanonicalName();
localeInfo.Printf(_("Language: %s\nSystem locale name: %s\nCanonical locale name: %s\n"),
locale, sysname, canname );
wxMessageDialog dlg(
this,
wxString(_("I18n sample\n(c) 1998, 1999 Vadim Zeitlin and Julian Smart"))
+ "\n\n"
+ localeInfo,
_("About Internat"),
_("I18n sample\n(c) 1998, 1999 Vadim Zeitlin and Julian Smart"),
_("About Internat"),
wxOK | wxICON_INFORMATION
);
dlg.ShowModal();
@@ -510,6 +552,13 @@ void MyFrame::OnOpen(wxCommandEvent& WXUNUSED(event))
wxFile file("NOTEXIST.ING");
}
void MyFrame::OnSave(wxCommandEvent& WXUNUSED(event))
{
// show this file dialog just to check that the locale-specific elements in
// it (such as dates) follow the current locale convnetions
wxSaveFileSelector(_("Dummy file dialog"), ".ext", "dummy", this);
}
void MyFrame::OnTest1(wxCommandEvent& WXUNUSED(event))
{
const wxString& title = _("Testing _() (gettext)");

View File

@@ -28,6 +28,8 @@
#include "wx/choice.h"
#include "wx/imaglist.h"
#include "wx/renderer.h"
#include "wx/uilocale.h"
#if wxUSE_ACCESSIBILITY
#include "wx/access.h"
#endif // wxUSE_ACCESSIBILITY
@@ -1999,23 +2001,28 @@ bool wxDataViewDateRenderer::GetValue(wxVariant& value) const
return true;
}
wxString wxDataViewDateRenderer::FormatDate() const
{
return m_date.Format(wxGetUIDateFormat());
}
#if wxUSE_ACCESSIBILITY
wxString wxDataViewDateRenderer::GetAccessibleDescription() const
{
return m_date.FormatDate();
return FormatDate();
}
#endif // wxUSE_ACCESSIBILITY
bool wxDataViewDateRenderer::Render(wxRect cell, wxDC* dc, int state)
{
wxString tmp = m_date.FormatDate();
wxString tmp = FormatDate();
RenderText( tmp, 0, cell, dc, state );
return true;
}
wxSize wxDataViewDateRenderer::GetSize() const
{
return GetTextExtent(m_date.FormatDate());
return GetTextExtent(FormatDate());
}
#endif // (defined(wxHAS_GENERIC_DATAVIEWCTRL) || defined(__WXGTK__)) && wxUSE_DATEPICKCTRL

View File

@@ -43,18 +43,6 @@
#include <langinfo.h>
#endif
#ifdef __WIN32__
#include "wx/dynlib.h"
#include "wx/msw/private.h"
#ifndef LOCALE_SNAME
#define LOCALE_SNAME 0x5c
#endif
#ifndef LOCALE_CUSTOM_UI_DEFAULT
#define LOCALE_CUSTOM_UI_DEFAULT 0x1400
#endif
#endif
#include "wx/file.h"
#include "wx/filename.h"
#include "wx/tokenzr.h"
@@ -63,13 +51,18 @@
#include "wx/apptrait.h"
#include "wx/stdpaths.h"
#include "wx/hashset.h"
#include "wx/uilocale.h"
#if defined(__WXOSX__)
#ifdef __WIN32__
#include "wx/msw/private/uilocale.h"
#elif defined(__WXOSX__)
#include "wx/osx/core/cfref.h"
#include "wx/osx/core/cfstring.h"
#include <CoreFoundation/CFLocale.h>
#include <CoreFoundation/CFDateFormatter.h>
#include <CoreFoundation/CFString.h>
#elif defined(__UNIX__)
#include "wx/unix/private/uilocale.h"
#endif
// ----------------------------------------------------------------------------
@@ -88,31 +81,6 @@
static wxLocale *wxSetLocale(wxLocale *pLocale);
namespace
{
#if defined(__UNIX__)
// get just the language part ("en" in "en_GB")
inline wxString ExtractLang(const wxString& langFull)
{
return langFull.BeforeFirst('_');
}
// get everything else (including the leading '_')
inline wxString ExtractNotLang(const wxString& langFull)
{
size_t pos = langFull.find('_');
if ( pos != wxString::npos )
return langFull.substr(pos);
else
return wxString();
}
#endif // __UNIX__
} // anonymous namespace
// ----------------------------------------------------------------------------
// wxLanguageInfo
// ----------------------------------------------------------------------------
@@ -396,89 +364,6 @@ bool wxLocale::DoCommonPostInit(bool success,
return success;
}
#if defined(__UNIX__)
// Helper of wxSetlocaleTryAll() below which tries setting the given locale
// with and without UTF-8 suffix. Don't use this one directly.
static const char *wxSetlocaleTryUTF8(int c, const wxString& lc)
{
const char *l = NULL;
// NB: We prefer to set UTF-8 locale if it's possible and only fall back to
// non-UTF-8 locale if it fails, but this is not necessary under the
// supported macOS versions where xx_YY locales are just aliases to
// xx_YY.UTF-8 anyhow.
#if wxUSE_UNICODE && !defined(__WXMAC__)
if ( !lc.empty() )
{
wxString buf(lc);
wxString buf2;
buf2 = buf + wxS(".UTF-8");
l = wxSetlocale(c, buf2);
if ( !l )
{
buf2 = buf + wxS(".utf-8");
l = wxSetlocale(c, buf2);
}
if ( !l )
{
buf2 = buf + wxS(".UTF8");
l = wxSetlocale(c, buf2);
}
if ( !l )
{
buf2 = buf + wxS(".utf8");
l = wxSetlocale(c, buf2);
}
}
// if we can't set UTF-8 locale, try non-UTF-8 one:
if ( !l )
#endif // wxUSE_UNICODE && !__WXMAC__
l = wxSetlocale(c, lc);
return l;
}
// Try setting all possible versions of the given locale, i.e. with and without
// UTF-8 encoding, and with or without the "_territory" part.
static const char *wxSetlocaleTryAll(int c, const wxString& lc)
{
const char* l = wxSetlocaleTryUTF8(c, lc);
if ( !l )
{
const wxString& lcOnlyLang = ExtractLang(lc);
if ( lcOnlyLang != lc )
l = wxSetlocaleTryUTF8(c, lcOnlyLang);
}
return l;
}
#endif // __UNIX__
#ifdef __WIN32__
// Trivial wrapper for ::SetThreadUILanguage().
//
// TODO-XP: Drop this when we don't support XP any longer.
static void wxMSWSetThreadUILanguage(LANGID langid)
{
// SetThreadUILanguage() is available on XP, but with unclear
// behavior, so avoid calling it there.
if ( wxGetWinVersion() >= wxWinVersion_Vista )
{
wxLoadedDLL dllKernel32(wxS("kernel32.dll"));
typedef LANGID(WINAPI *SetThreadUILanguage_t)(LANGID);
SetThreadUILanguage_t pfnSetThreadUILanguage = NULL;
wxDL_INIT_FUNC(pfn, SetThreadUILanguage, dllKernel32);
if (pfnSetThreadUILanguage)
pfnSetThreadUILanguage(langid);
}
}
#endif // __WIN32__
bool wxLocale::Init(int lang, int flags)
{
#if WXWIN_COMPATIBILITY_2_8
@@ -522,76 +407,19 @@ bool wxLocale::Init(int lang, int flags)
#if defined(__UNIX__) || defined(__WIN32__)
bool ok = lang == wxLANGUAGE_DEFAULT ? wxUILocale::UseDefault()
: wxUILocale::UseLanguage(*info);
// Under (non-Darwn) Unix wxUILocale already set the C locale, but under
// the other platforms we still have to do it here.
#if defined(__WIN32__) || defined(__WXOSX__)
// We prefer letting the CRT to set its locale on its own when using
// default locale, as it does a better job of it than we do. We also have
// to do this when we didn't recognize the default language at all.
const char *retloc = lang == wxLANGUAGE_DEFAULT ? wxSetlocale(LC_ALL, "")
: NULL;
: info->TrySetLocale();
#if defined(__UNIX__)
if ( !retloc )
retloc = wxSetlocaleTryAll(LC_ALL, shortName);
if ( !retloc )
{
// Some C libraries (namely glibc) still use old ISO 639,
// so will translate the abbrev for them
wxString localeAlt;
const wxString& langOnly = ExtractLang(shortName);
if ( langOnly == wxS("he") )
localeAlt = wxS("iw") + ExtractNotLang(shortName);
else if ( langOnly == wxS("id") )
localeAlt = wxS("in") + ExtractNotLang(shortName);
else if ( langOnly == wxS("yi") )
localeAlt = wxS("ji") + ExtractNotLang(shortName);
else if ( langOnly == wxS("nb") )
localeAlt = wxS("no_NO");
else if ( langOnly == wxS("nn") )
localeAlt = wxS("no_NY");
if ( !localeAlt.empty() )
retloc = wxSetlocaleTryAll(LC_ALL, localeAlt);
}
#ifdef __AIX__
// at least in AIX 5.2 libc is buggy and the string returned from
// setlocale(LC_ALL) can't be passed back to it because it returns 6
// strings (one for each locale category), i.e. for C locale we get back
// "C C C C C C"
//
// this contradicts IBM own docs but this is not of much help, so just work
// around it in the crudest possible manner
char* p = const_cast<char*>(wxStrchr(retloc, ' '));
if ( p )
*p = '\0';
#endif // __AIX__
#elif defined(__WIN32__)
if ( lang == wxLANGUAGE_DEFAULT )
{
::SetThreadLocale(LOCALE_USER_DEFAULT);
wxMSWSetThreadUILanguage(LANG_USER_DEFAULT);
// CRT locale already set above.
}
else if ( info->WinLang == 0 )
{
wxLogWarning(wxS("Locale '%s' not supported by OS."), name);
retloc = "C";
}
else // language supported by Windows
{
const wxUint32 lcid = info->GetLCID();
// change locale used by Windows functions
::SetThreadLocale(lcid);
wxMSWSetThreadUILanguage(LANGIDFROMLCID(lcid));
// and also call setlocale() to change locale used by the CRT
retloc = info->TrySetLocale();
}
#if wxUSE_UNICODE && (defined(__VISUALC__) || defined(__MINGW32__))
// VC++ setlocale() (also used by Mingw) can't set locale to languages that
// can only be written using Unicode, therefore wxSetlocale() call fails
@@ -607,13 +435,15 @@ bool wxLocale::Init(int lang, int flags)
}
}
#endif // CRT not handling Unicode-only languages
#else
#error "Unsupported platform"
#endif
if ( !retloc )
ok = false;
#endif // __WIN32__
return DoCommonPostInit
(
retloc != NULL,
ok,
name,
// wxLANGUAGE_DEFAULT needs to be passed to wxTranslations as ""
// for correct detection of user's preferred language(s)
@@ -648,9 +478,6 @@ inline bool wxGetNonEmptyEnvVar(const wxString& name, wxString* value)
size_t i = 0,
count = ms_languagesDB->GetCount();
#if defined(__UNIX__)
// first get the string identifying the language from the environment
wxString langFull;
#ifdef __WXOSX__
wxCFRef<CFLocaleRef> userLocaleRef(CFLocaleCopyCurrent());
@@ -658,10 +485,34 @@ inline bool wxGetNonEmptyEnvVar(const wxString& name, wxString* value)
// az_Cyrl_AZ@calendar=buddhist;currency=JPY we just recreate the base info as expected by wx here
wxCFStringRef str(wxCFRetain((CFStringRef)CFLocaleGetValue(userLocaleRef, kCFLocaleLanguageCode)));
langFull = str.AsString()+"_";
const wxString langPrefix = str.AsString() + "_";
str.reset(wxCFRetain((CFStringRef)CFLocaleGetValue(userLocaleRef, kCFLocaleCountryCode)));
langFull += str.AsString();
#else
const wxString langFull = langPrefix + str.AsString();
int langOnlyMatchIndex = wxNOT_FOUND;
for ( i = 0; i < count; i++ )
{
const wxString& fullname = ms_languagesDB->Item(i).CanonicalName;
if ( langFull == fullname )
{
// Exact match, no need to look any further.
break;
}
if ( fullname.StartsWith(langPrefix) )
{
// Matched just the language, keep looking, but we'll keep this if
// we don't find an exact match later.
langOnlyMatchIndex = i;
}
}
if ( i == count && langOnlyMatchIndex != wxNOT_FOUND )
i = langOnlyMatchIndex;
#elif defined(__UNIX__)
// first get the string identifying the language from the environment
wxString langFull;
if (!wxGetNonEmptyEnvVar(wxS("LC_ALL"), &langFull) &&
!wxGetNonEmptyEnvVar(wxS("LC_MESSAGES"), &langFull) &&
!wxGetNonEmptyEnvVar(wxS("LANG"), &langFull))
@@ -670,8 +521,6 @@ inline bool wxGetNonEmptyEnvVar(const wxString& name, wxString* value)
return wxLANGUAGE_ENGLISH_US;
}
#endif
// the language string has the following form
//
// lang[_LANG][.encoding][@modifier]
@@ -1118,8 +967,7 @@ wxLocale::~wxLocale()
}
#ifdef __WIN32__
::SetThreadLocale(m_oldLCID);
wxMSWSetThreadUILanguage(LANGIDFROMLCID(m_oldLCID));
wxUseLCID(m_oldLCID);
#endif
}
@@ -1145,6 +993,13 @@ bool wxLocale::IsAvailable(int lang)
if ( !::IsValidLocale(info->GetLCID(), LCID_INSTALLED) )
return false;
#elif defined(__WXOSX__)
CFLocaleRef
cfloc = CFLocaleCreate(kCFAllocatorDefault, wxCFStringRef(info->CanonicalName));
if ( !cfloc )
return false;
CFRelease(cfloc);
#elif defined(__UNIX__)
// Test if setting the locale works, then set it back.
@@ -1601,6 +1456,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 +1483,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 +1537,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 +1559,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 +1579,6 @@ GetInfoFromLCID(LCID lcid,
return str;
}
} // anonymous namespace
/* static */
wxString wxLocale::GetInfo(wxLocaleInfo index, wxLocaleCategory cat)
{
@@ -1766,34 +1637,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<CFLocaleRef> 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 +1679,7 @@ wxString wxLocale::GetInfo(wxLocaleInfo index, wxLocaleCategory WXUNUSED(cat))
return wxString();
}
wxCFRef<CFDateFormatterRef> 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 +1696,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<CFLocaleRef> userLocaleRef(userLocaleRefRaw);
return wxGetInfoFromCFLocale(userLocaleRef, index, cat);
}
#else // !__WINDOWS__ && !__WXOSX__, assume generic POSIX
namespace
@@ -1935,22 +1813,34 @@ wxString wxLocale::GetInfo(wxLocaleInfo index, wxLocaleCategory cat)
switch ( index )
{
case wxLOCALE_THOUSANDS_SEP:
if ( cat == wxLOCALE_CAT_NUMBER )
return lc->thousands_sep;
else if ( cat == wxLOCALE_CAT_MONEY )
return lc->mon_thousands_sep;
switch ( cat )
{
case wxLOCALE_CAT_DEFAULT:
case wxLOCALE_CAT_NUMBER:
return lc->thousands_sep;
wxFAIL_MSG( "invalid wxLocaleCategory" );
case wxLOCALE_CAT_MONEY:
return lc->mon_thousands_sep;
default:
wxFAIL_MSG( "invalid wxLocaleCategory" );
}
break;
case wxLOCALE_DECIMAL_POINT:
if ( cat == wxLOCALE_CAT_NUMBER )
return lc->decimal_point;
else if ( cat == wxLOCALE_CAT_MONEY )
return lc->mon_decimal_point;
switch ( cat )
{
case wxLOCALE_CAT_DEFAULT:
case wxLOCALE_CAT_NUMBER:
return lc->decimal_point;
wxFAIL_MSG( "invalid wxLocaleCategory" );
case wxLOCALE_CAT_MONEY:
return lc->mon_decimal_point;
default:
wxFAIL_MSG( "invalid wxLocaleCategory" );
}
break;
case wxLOCALE_SHORT_DATE_FMT:

View File

@@ -16,84 +16,7 @@
#include "wx/numformatter.h"
#include "wx/intl.h"
#include <locale.h> // for setlocale and LC_ALL
// ----------------------------------------------------------------------------
// local helpers
// ----------------------------------------------------------------------------
namespace
{
// Contains information about the locale which was used to initialize our
// cached values of the decimal and thousands separators. Notice that it isn't
// enough to store just wxLocale because the user code may call setlocale()
// directly and storing just C locale string is not enough because we can use
// the OS API directly instead of the CRT ones on some platforms. So just store
// both.
class LocaleId
{
public:
LocaleId()
{
#if wxUSE_INTL
m_wxloc = NULL;
#endif // wxUSE_INTL
m_cloc = NULL;
}
~LocaleId()
{
Free();
}
#if wxUSE_INTL
// Return true if this is the first time this function is called for this
// object or if the program locale has changed since the last time it was
// called. Otherwise just return false indicating that updating locale-
// dependent information is not necessary.
bool NotInitializedOrHasChanged()
{
wxLocale * const wxloc = wxGetLocale();
const char * const cloc = setlocale(LC_ALL, NULL);
if ( m_wxloc || m_cloc )
{
if ( m_wxloc == wxloc && strcmp(m_cloc, cloc) == 0 )
return false;
Free();
}
//else: Not initialized yet.
m_wxloc = wxloc;
m_cloc = wxCRT_StrdupA(cloc);
return true;
}
#endif // wxUSE_INTL
private:
void Free()
{
#if wxUSE_INTL
free(m_cloc);
#endif // wxUSE_INTL
}
#if wxUSE_INTL
// Non-owned pointer to wxLocale which was used.
wxLocale *m_wxloc;
#endif // wxUSE_INTL
// Owned pointer to the C locale string.
char *m_cloc;
wxDECLARE_NO_COPY_CLASS(LocaleId);
};
} // anonymous namespace
#include "wx/uilocale.h"
// ============================================================================
// wxNumberFormatter implementation
@@ -111,14 +34,10 @@ wxChar wxNumberFormatter::GetDecimalSeparator()
// concurrently from more than one thread so it's not a real problem.
static wxChar s_decimalSeparator = 0;
// Remember the locale which was current when we initialized, we must redo
// the initialization if the locale changed.
static LocaleId s_localeUsedForInit;
if ( s_localeUsedForInit.NotInitializedOrHasChanged() )
if ( !s_decimalSeparator )
{
const wxString
s = wxLocale::GetInfo(wxLOCALE_DECIMAL_POINT, wxLOCALE_CAT_NUMBER);
s = wxUILocale::GetCurrent().GetInfo(wxLOCALE_DECIMAL_POINT, wxLOCALE_CAT_NUMBER);
if ( s.length() == 1 )
{
s_decimalSeparator = s[0];
@@ -141,12 +60,14 @@ bool wxNumberFormatter::GetThousandsSeparatorIfUsed(wxChar *sep)
{
#if wxUSE_INTL
static wxChar s_thousandsSeparator = 0;
static LocaleId s_localeUsedForInit;
static bool s_thousandsSeparatorInitialized = false;
if ( s_localeUsedForInit.NotInitializedOrHasChanged() )
if ( !s_thousandsSeparatorInitialized )
{
s_thousandsSeparatorInitialized = true;
const wxString
s = wxLocale::GetInfo(wxLOCALE_THOUSANDS_SEP, wxLOCALE_CAT_NUMBER);
s = wxUILocale::GetCurrent().GetInfo(wxLOCALE_THOUSANDS_SEP, wxLOCALE_CAT_NUMBER);
if ( s.length() == 1 )
{
s_thousandsSeparator = s[0];
@@ -172,6 +93,21 @@ bool wxNumberFormatter::GetThousandsSeparatorIfUsed(wxChar *sep)
// Conversion to string and helpers
// ----------------------------------------------------------------------------
namespace
{
void ReplaceSeparatorIfNecessary(wxString& s, wxChar sepOld, wxChar sepNew)
{
if ( sepNew != sepOld )
{
const size_t posSep = s.find(sepOld);
if ( posSep != wxString::npos )
s[posSep] = sepNew;
}
}
} // anonymous namespace
wxString wxNumberFormatter::PostProcessIntString(wxString s, int style)
{
if ( style & Style_WithThousandsSep )
@@ -206,7 +142,9 @@ wxString wxNumberFormatter::ToString(wxULongLong_t val, int style)
wxString wxNumberFormatter::ToString(double val, int precision, int style)
{
wxString s = wxString::FromDouble(val,precision);
wxString s = wxString::FromCDouble(val,precision);
ReplaceSeparatorIfNecessary(s, '.', GetDecimalSeparator());
if ( style & Style_WithThousandsSep )
AddThousandsSeparators(s);
@@ -217,6 +155,23 @@ wxString wxNumberFormatter::ToString(double val, int precision, int style)
return s;
}
wxString wxNumberFormatter::Format(const wxString& format, double val)
{
wxString s = wxString::Format(format, val);
const wxChar sep = GetDecimalSeparator();
if ( s.find(sep) == wxString::npos )
{
const wxChar other = sep == '.' ? ',' : '.';
const size_t posSep = s.find(other);
if ( posSep != wxString::npos )
s[posSep] = sep;
}
//else: it already uses the correct separator
return s;
}
void wxNumberFormatter::AddThousandsSeparators(wxString& s)
{
// Thousands separators for numbers in scientific format are not relevant.
@@ -330,5 +285,6 @@ bool wxNumberFormatter::FromString(wxString s, wxULongLong_t *val)
bool wxNumberFormatter::FromString(wxString s, double *val)
{
RemoveThousandsSeparators(s);
return s.ToDouble(val);
ReplaceSeparatorIfNecessary(s, GetDecimalSeparator(), '.');
return s.ToCDouble(val);
}

102
src/common/uilocale.cpp Normal file
View File

@@ -0,0 +1,102 @@
///////////////////////////////////////////////////////////////////////////////
// Name: src/common/uilocale.cpp
// Purpose: wxUILocale implementation
// Author: Vadim Zeitlin
// Created: 2021-07-31
// Copyright: (c) 2021 Vadim Zeitlin <vadim@wxwidgets.org>
// 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 */
bool wxUILocale::UseLanguage(const wxLanguageInfo& info)
{
wxUILocaleImpl* const impl = wxUILocaleImpl::CreateForLanguage(info);
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

View File

@@ -25,8 +25,10 @@
#include "wx/checkbox.h"
#endif // WX_PRECOMP
#include "wx/numformatter.h"
#include "wx/tokenzr.h"
#include "wx/renderer.h"
#include "wx/uilocale.h"
#include "wx/generic/private/grid.h"
#include "wx/private/window.h"
@@ -159,7 +161,7 @@ wxGridCellDateRenderer::wxGridCellDateRenderer(const wxString& outformat)
{
if ( outformat.empty() )
{
m_oformat = "%x"; // Localized date representation.
m_oformat = wxGetUIDateFormat();
}
else
{
@@ -839,7 +841,7 @@ wxString wxGridCellFloatRenderer::GetString(const wxGrid& grid, int row, int col
else
{
text = table->GetValue(row, col);
hasDouble = text.ToDouble(&val);
hasDouble = wxNumberFormatter::FromString(text, &val);
}
if ( hasDouble )
@@ -877,8 +879,7 @@ wxString wxGridCellFloatRenderer::GetString(const wxGrid& grid, int row, int col
m_format += wxT('f');
}
text.Printf(m_format, val);
text = wxNumberFormatter::Format(m_format, val);
}
//else: text already contains the string

View File

@@ -29,12 +29,14 @@
#include "wx/listbox.h"
#endif
#include "wx/numformatter.h"
#include "wx/valnum.h"
#include "wx/textfile.h"
#include "wx/spinctrl.h"
#include "wx/tokenzr.h"
#include "wx/renderer.h"
#include "wx/datectrl.h"
#include "wx/uilocale.h"
#include "wx/generic/gridsel.h"
#include "wx/generic/grideditors.h"
@@ -997,7 +999,7 @@ void wxGridCellFloatEditor::BeginEdit(int row, int col, wxGrid* grid)
const wxString value = table->GetValue(row, col);
if ( !value.empty() )
{
if ( !value.ToDouble(&m_value) )
if ( !wxNumberFormatter::FromString(value, &m_value) )
{
wxFAIL_MSG( wxT("this cell doesn't have float value") );
return;
@@ -1018,7 +1020,7 @@ bool wxGridCellFloatEditor::EndEdit(int WXUNUSED(row),
double value;
if ( !text.empty() )
{
if ( !text.ToDouble(&value) )
if ( !wxNumberFormatter::FromString(text, &value) )
return false;
}
else // new value is empty string
@@ -1060,20 +1062,9 @@ void wxGridCellFloatEditor::Reset()
void wxGridCellFloatEditor::StartingKey(wxKeyEvent& event)
{
int keycode = event.GetKeyCode();
char tmpbuf[2];
tmpbuf[0] = (char) keycode;
tmpbuf[1] = '\0';
wxString strbuf(tmpbuf, *wxConvCurrent);
#if wxUSE_INTL
bool is_decimal_point = ( strbuf ==
wxLocale::GetInfo(wxLOCALE_DECIMAL_POINT, wxLOCALE_CAT_NUMBER) );
#else
bool is_decimal_point = ( strbuf == wxT(".") );
#endif
if ( wxIsdigit(keycode) || keycode == '+' || keycode == '-'
|| is_decimal_point )
|| keycode == wxNumberFormatter::GetDecimalSeparator() )
{
wxGridCellTextEditor::StartingKey(event);
@@ -1197,7 +1188,7 @@ wxString wxGridCellFloatEditor::GetString()
m_format += wxT('f');
}
return wxString::Format(m_format, m_value);
return wxNumberFormatter::Format(m_format, m_value);
}
bool wxGridCellFloatEditor::IsAcceptedKey(wxKeyEvent& event)
@@ -1207,17 +1198,10 @@ bool wxGridCellFloatEditor::IsAcceptedKey(wxKeyEvent& event)
const int keycode = event.GetKeyCode();
if ( wxIsascii(keycode) )
{
#if wxUSE_INTL
const wxString decimalPoint =
wxLocale::GetInfo(wxLOCALE_DECIMAL_POINT, wxLOCALE_CAT_NUMBER);
#else
const wxString decimalPoint(wxT('.'));
#endif
// accept digits, 'e' as in '1e+6', also '-', '+', and '.'
if ( wxIsdigit(keycode) ||
tolower(keycode) == 'e' ||
keycode == decimalPoint ||
keycode == wxNumberFormatter::GetDecimalSeparator() ||
keycode == '+' ||
keycode == '-' )
{
@@ -1869,7 +1853,7 @@ wxGridCellDateEditor::wxGridCellDateEditor(const wxString& format)
void wxGridCellDateEditor::SetParameters(const wxString& params)
{
if ( params.empty() )
m_format = "%x";
m_format = wxGetUIDateFormat();
else
m_format = params;
}

View File

@@ -41,6 +41,7 @@ wxIMPLEMENT_DYNAMIC_CLASS(wxSpinDoubleEvent, wxNotifyEvent);
#if wxUSE_SPINBTN
#include "wx/numformatter.h"
#include "wx/valnum.h"
#include "wx/valtext.h"
@@ -764,12 +765,12 @@ void wxSpinCtrlDouble::DoSendEvent()
bool wxSpinCtrlDouble::DoTextToValue(const wxString& text, double *val)
{
return text.ToDouble(val);
return wxNumberFormatter::FromString(text, val);
}
wxString wxSpinCtrlDouble::DoValueToText(double val)
{
return wxString::Format(m_format, val);
return wxNumberFormatter::ToString(val, m_digits);
}
void wxSpinCtrlDouble::SetIncrement(double inc)
@@ -812,8 +813,6 @@ void wxSpinCtrlDouble::DoSetDigitsAndUpdate(unsigned digits)
void wxSpinCtrlDouble::DoSetDigits(unsigned digits)
{
m_digits = digits;
m_format.Printf(wxT("%%0.%ulf"), digits);
}
void wxSpinCtrlDouble::ResetTextValidator()

141
src/msw/uilocale.cpp Normal file
View File

@@ -0,0 +1,141 @@
///////////////////////////////////////////////////////////////////////////////
// Name: src/msw/uilocale.cpp
// Purpose: wxUILocale implementation for MSW
// Author: Vadim Zeitlin
// Created: 2021-07-31
// Copyright: (c) 2021 Vadim Zeitlin <vadim@wxwidgets.org>
// 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/msw/private/uilocale.h"
#include "wx/dynlib.h"
// ============================================================================
// implementation
// ============================================================================
// ----------------------------------------------------------------------------
// helper functions
// ----------------------------------------------------------------------------
namespace
{
// Trivial wrapper for ::SetThreadUILanguage().
//
// TODO-XP: Drop this when we don't support XP any longer.
static void wxMSWSetThreadUILanguage(LANGID langid)
{
// SetThreadUILanguage() is available on XP, but with unclear
// behavior, so avoid calling it there.
if ( wxGetWinVersion() >= wxWinVersion_Vista )
{
wxLoadedDLL dllKernel32(wxS("kernel32.dll"));
typedef LANGID(WINAPI *SetThreadUILanguage_t)(LANGID);
SetThreadUILanguage_t pfnSetThreadUILanguage = NULL;
wxDL_INIT_FUNC(pfn, SetThreadUILanguage, dllKernel32);
if (pfnSetThreadUILanguage)
pfnSetThreadUILanguage(langid);
}
}
} // anonymous namespace
void wxUseLCID(LCID lcid)
{
::SetThreadLocale(lcid);
wxMSWSetThreadUILanguage(LANGIDFROMLCID(lcid));
}
// ----------------------------------------------------------------------------
// 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)
{
wxUseLCID(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);
}
/* static */
wxUILocaleImpl* wxUILocaleImpl::CreateForLanguage(const wxLanguageInfo& info)
{
if ( info.WinLang == 0 )
{
wxLogWarning(wxS("Locale '%s' not supported by OS."), info.Description);
return NULL;
}
return new wxUILocaleImplLCID(info.GetLCID());
}
#endif // wxUSE_INTL

103
src/osx/core/uilocale.cpp Normal file
View File

@@ -0,0 +1,103 @@
///////////////////////////////////////////////////////////////////////////////
// Name: src/osx/core/uilocale.cpp
// Purpose: wxUILocale implementation for macOS
// Author: Vadim Zeitlin
// Created: 2021-08-01
// Copyright: (c) 2021 Vadim Zeitlin <vadim@wxwidgets.org>
// 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 <CoreFoundation/CFLocale.h>
#include <CoreFoundation/CFString.h>
extern wxString
wxGetInfoFromCFLocale(CFLocaleRef cfloc, wxLocaleInfo index, wxLocaleCategory cat);
namespace
{
// ----------------------------------------------------------------------------
// wxUILocale implementation using Core Foundation
// ----------------------------------------------------------------------------
class wxUILocaleImplCF : public wxUILocaleImpl
{
public:
explicit wxUILocaleImplCF(const wxCFRef<CFLocaleRef>& cfloc)
: m_cfloc(cfloc)
{
}
static wxUILocaleImplCF* Create(const wxString& name)
{
CFLocaleRef cfloc = CFLocaleCreate(kCFAllocatorDefault, wxCFStringRef(name));
if ( !cfloc )
return NULL;
return new wxUILocaleImplCF(cfloc);
}
wxString GetName() const wxOVERRIDE;
wxString GetInfo(wxLocaleInfo index, wxLocaleCategory cat) const wxOVERRIDE;
private:
wxCFRef<CFLocaleRef> 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()
{
return wxUILocaleImplCF::Create("C");
}
/* static */
wxUILocaleImpl* wxUILocaleImpl::CreateUserDefault()
{
return new wxUILocaleImplCF(CFLocaleCopyCurrent());
}
/* static */
wxUILocaleImpl* wxUILocaleImpl::CreateForLanguage(const wxLanguageInfo& info)
{
return wxUILocaleImplCF::Create(info.CanonicalName);
}
#endif // wxUSE_INTL

186
src/unix/uilocale.cpp Normal file
View File

@@ -0,0 +1,186 @@
///////////////////////////////////////////////////////////////////////////////
// Name: src/unix/uilocale.cpp
// Purpose: wxUILocale implementation for Unix systems
// Author: Vadim Zeitlin
// Created: 2021-08-01
// Copyright: (c) 2021 Vadim Zeitlin <vadim@wxwidgets.org>
// 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/unix/private/uilocale.h"
#include "wx/intl.h"
#include <locale.h>
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
// ============================================================================
// Helper of wxSetlocaleTryAll() below which tries setting the given locale
// with and without UTF-8 suffix. Don't use this one directly.
static const char *wxSetlocaleTryUTF8(int c, const wxString& lc)
{
const char *l = NULL;
// NB: We prefer to set UTF-8 locale if it's possible and only fall back to
// non-UTF-8 locale if it fails, but this is not necessary under the
// supported macOS versions where xx_YY locales are just aliases to
// xx_YY.UTF-8 anyhow.
#if wxUSE_UNICODE && !defined(__WXMAC__)
if ( !lc.empty() )
{
wxString buf(lc);
wxString buf2;
buf2 = buf + wxS(".UTF-8");
l = wxSetlocale(c, buf2);
if ( !l )
{
buf2 = buf + wxS(".utf-8");
l = wxSetlocale(c, buf2);
}
if ( !l )
{
buf2 = buf + wxS(".UTF8");
l = wxSetlocale(c, buf2);
}
if ( !l )
{
buf2 = buf + wxS(".utf8");
l = wxSetlocale(c, buf2);
}
}
// if we can't set UTF-8 locale, try non-UTF-8 one:
if ( !l )
#endif // wxUSE_UNICODE && !__WXMAC__
l = wxSetlocale(c, lc);
return l;
}
// Try setting all possible versions of the given locale, i.e. with and without
// UTF-8 encoding, and with or without the "_territory" part.
const char *wxSetlocaleTryAll(int c, const wxString& lc)
{
const char* l = wxSetlocaleTryUTF8(c, lc);
if ( !l )
{
const wxString& lcOnlyLang = ExtractLang(lc);
if ( lcOnlyLang != lc )
l = wxSetlocaleTryUTF8(c, lcOnlyLang);
}
return l;
}
// ----------------------------------------------------------------------------
// wxUILocale implementation for Unix
// ----------------------------------------------------------------------------
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("");
}
/* static */
wxUILocaleImpl* wxUILocaleImpl::CreateForLanguage(const wxLanguageInfo& info)
{
// Set the locale before creating the wxUILocaleImplUnix object in order to
// check if we succeed in doing it.
const wxString& shortName = info.CanonicalName;
if ( !wxSetlocaleTryAll(LC_ALL, shortName) )
{
// Some C libraries (namely glibc) still use old ISO 639,
// so will translate the abbrev for them
wxString localeAlt;
const wxString& langOnly = ExtractLang(shortName);
if ( langOnly == wxS("he") )
localeAlt = wxS("iw") + ExtractNotLang(shortName);
else if ( langOnly == wxS("id") )
localeAlt = wxS("in") + ExtractNotLang(shortName);
else if ( langOnly == wxS("yi") )
localeAlt = wxS("ji") + ExtractNotLang(shortName);
else if ( langOnly == wxS("nb") )
localeAlt = wxS("no_NO");
else if ( langOnly == wxS("nn") )
localeAlt = wxS("no_NY");
if ( localeAlt.empty() || !wxSetlocaleTryAll(LC_ALL, localeAlt) )
return NULL;
}
return new wxUILocaleImplUnix(NULL);
}
#endif // wxUSE_INTL

View File

@@ -33,6 +33,8 @@
#include "wx/stopwatch.h"
#endif
#include "wx/private/localeset.h"
#include "textentrytest.h"
#include "testableframe.h"
#include "asserthelper.h"
@@ -295,7 +297,7 @@ void TextCtrlTestCase::StreamInput()
#ifndef __WXOSX__
{
// Ensure we use decimal point and not a comma.
LocaleSetter setCLocale("C");
wxCLocaleSetter setCLocale;
*m_text << "stringinput"
<< 10

View File

@@ -22,6 +22,8 @@
#include "wx/wxcrt.h" // for wxStrstr()
#include "wx/private/localeset.h"
// to test Today() meaningfully we must be able to change the system date which
// is not usually the case, but if we're under Win32 we can try it -- define
// the macro below to do it
@@ -1304,7 +1306,7 @@ void DateTimeTestCase::TestDateTimeParse()
// the test strings here use "PM" which is not available in all locales so
// we need to use "C" locale for them
CLocaleSetter cloc;
wxCLocaleSetter cloc;
wxDateTime dt;
for ( size_t n = 0; n < WXSIZEOF(parseTestDates); n++ )

View File

@@ -22,6 +22,8 @@
#include "wx/stdpaths.h"
#include "wx/scopeguard.h"
#include "wx/private/localeset.h"
#ifdef __WINDOWS__
#include "wx/msw/registry.h"
#include "wx/msw/wrapshl.h"
@@ -493,7 +495,7 @@ TEST_CASE("wxFileName::GetHumanReadable", "[filename]")
{ "304 KB", 304351, 0, wxSIZE_CONV_SI },
};
CLocaleSetter loc; // we want to use "C" locale for LC_NUMERIC
wxCLocaleSetter loc; // we want to use "C" locale for LC_NUMERIC
// so that regardless of the system's locale
// the decimal point used by GetHumanReadableSize()
// is always '.'

View File

@@ -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

View File

@@ -22,6 +22,8 @@
#include "wx/txtstrm.h"
#include "wx/mstream.h"
#include "wx/private/localeset.h"
#if defined wxHAVE_TCHAR_SUPPORT && !defined HAVE_WCHAR_H
#define HAVE_WCHAR_H
#endif
@@ -1106,7 +1108,7 @@ void MBConvTestCase::LibcTests()
// supposed to use the same CRT -- no idea why and unfortunately gdb is too
// flaky to debug it)
#ifdef __VISUALC__
LocaleSetter loc("English_United States.1252");
wxLocaleSetter loc("English_United States.1252");
wxMBConvLibc convLibc;
TestCoder(

View File

@@ -24,6 +24,7 @@
#include "wx/wxchar.h"
#endif // WX_PRECOMP
#include "wx/private/localeset.h"
// NOTE: for more info about the specification of wxVsnprintf() behaviour you can
// refer to the following page of the GNU libc manual:
@@ -85,10 +86,10 @@ wxUnsafeSnprintf(T *buf, size_t len, const wxChar *fmt, ...)
// Explicitly set C locale to avoid check failures when running on machines
// with a locale where the decimal point is not '.'
class VsnprintfTestCase : CLocaleSetter
class VsnprintfTestCase : wxCLocaleSetter
{
public:
VsnprintfTestCase() : CLocaleSetter() { }
VsnprintfTestCase() : wxCLocaleSetter() { }
protected:
template<typename T>

View File

@@ -148,38 +148,6 @@ extern bool IsAutomaticTest();
extern bool IsRunningUnderXVFB();
// Helper class setting the locale to the given one for its lifetime.
class LocaleSetter
{
public:
LocaleSetter(const char *loc)
: m_locOld(wxStrdupA(setlocale(LC_ALL, NULL)))
{
setlocale(LC_ALL, loc);
}
~LocaleSetter()
{
setlocale(LC_ALL, m_locOld);
free(m_locOld);
}
private:
char * const m_locOld;
wxDECLARE_NO_COPY_CLASS(LocaleSetter);
};
// An even simpler helper for setting the locale to "C" one during its lifetime.
class CLocaleSetter : private LocaleSetter
{
public:
CLocaleSetter() : LocaleSetter("C") { }
private:
wxDECLARE_NO_COPY_CLASS(CLocaleSetter);
};
#if wxUSE_GUI
// Return true if the UI tests are enabled, used by WXUISIM_TEST().