summaryrefslogtreecommitdiff
path: root/src/wx
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2025-05-25 14:22:30 +0200
committerCarl Hetherington <cth@carlh.net>2025-05-27 09:36:37 +0200
commit5661c34574fdac778dba0e3c3503f5792c41bb3c (patch)
treebd1022ef2dae2abe880714123bfebdb868edc91b /src/wx
parenta8f06a40096a0cbd56c42602f8dc1ce4857af0d8 (diff)
Move i18n setup into 3 separate platform files.
Diffstat (limited to 'src/wx')
-rw-r--r--src/wx/i18n_setup.h30
-rw-r--r--src/wx/i18n_setup_linux.cc71
-rw-r--r--src/wx/i18n_setup_osx.cc95
-rw-r--r--src/wx/i18n_setup_windows.cc62
-rw-r--r--src/wx/wscript5
-rw-r--r--src/wx/wx_util.cc116
-rw-r--r--src/wx/wx_util.h1
7 files changed, 262 insertions, 118 deletions
diff --git a/src/wx/i18n_setup.h b/src/wx/i18n_setup.h
new file mode 100644
index 000000000..1ed4071c4
--- /dev/null
+++ b/src/wx/i18n_setup.h
@@ -0,0 +1,30 @@
+/*
+ Copyright (C) 2025 Carl Hetherington <cth@carlh.net>
+
+ This file is part of DCP-o-matic.
+
+ DCP-o-matic is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ DCP-o-matic is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+
+namespace dcpomatic {
+namespace wx {
+
+
+void setup_i18n();
+
+
+}
+}
diff --git a/src/wx/i18n_setup_linux.cc b/src/wx/i18n_setup_linux.cc
new file mode 100644
index 000000000..286ce4065
--- /dev/null
+++ b/src/wx/i18n_setup_linux.cc
@@ -0,0 +1,71 @@
+/*
+ Copyright (C) 2025 Carl Hetherington <cth@carlh.net>
+
+ This file is part of DCP-o-matic.
+
+ DCP-o-matic is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ DCP-o-matic is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+
+#include "i18n_setup.h"
+#include "wx_util.h"
+#include "lib/config.h"
+#include "lib/i18n_setup.h"
+#include <wx/wx.h>
+
+
+void
+dcpomatic::wx::setup_i18n()
+{
+ int language = wxLANGUAGE_DEFAULT;
+
+ auto config_lang = Config::instance()->language();
+ if (config_lang && !config_lang->empty ()) {
+ auto const li = wxLocale::FindLanguageInfo(std_to_wx (config_lang.get ()));
+ if (li) {
+ language = li->Language;
+ }
+ }
+
+ wxLocale* locale = nullptr;
+ if (wxLocale::IsAvailable (language)) {
+ locale = new wxLocale(language, wxLOCALE_LOAD_DEFAULT);
+
+ locale->AddCatalogLookupPathPrefix(std_to_wx(LINUX_LOCALE_PREFIX));
+
+ /* We have to include the wxWidgets .mo in our distribution,
+ so we rename it to avoid clashes with any other installation
+ of wxWidgets.
+ */
+ locale->AddCatalog(char_to_wx("dcpomatic2-wxstd"));
+
+ /* Fedora 29 (at least) installs wxstd3.mo instead of wxstd.mo */
+ locale->AddCatalog(char_to_wx("wxstd3"));
+
+ locale->AddCatalog(char_to_wx("wxstd"));
+ locale->AddCatalog(char_to_wx("libdcpomatic2-wx"));
+ locale->AddCatalog(char_to_wx("dcpomatic2"));
+
+ if (!locale->IsOk()) {
+ delete locale;
+ locale = new wxLocale (wxLANGUAGE_ENGLISH);
+ }
+ }
+
+ if (locale) {
+ dcpomatic::setup_i18n(wx_to_std(locale->GetCanonicalName()));
+ }
+}
+
diff --git a/src/wx/i18n_setup_osx.cc b/src/wx/i18n_setup_osx.cc
new file mode 100644
index 000000000..da1eb221f
--- /dev/null
+++ b/src/wx/i18n_setup_osx.cc
@@ -0,0 +1,95 @@
+/*
+ Copyright (C) 2025 Carl Hetherington <cth@carlh.net>
+
+ This file is part of DCP-o-matic.
+
+ DCP-o-matic is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ DCP-o-matic is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+
+#include "i18n_setup.h"
+#include "wx_util.h"
+#include "lib/config.h"
+#include "lib/i18n_setup.h"
+#include <wx/wx.h>
+#if wxCHECK_VERSION(3, 1, 6)
+#include <wx/uilocale.h>
+#endif
+#include <CoreFoundation/CoreFoundation.h>
+
+
+using std::string;
+
+
+void
+dcpomatic::wx::setup_i18n()
+{
+ wxLog::EnableLogging();
+
+#if wxCHECK_VERSION(3, 1, 6)
+ wxUILocale::UseDefault();
+#endif
+
+ auto get_locale_value = [](CFLocaleKey key) {
+ CFLocaleRef cflocale = CFLocaleCopyCurrent();
+ auto value = (CFStringRef) CFLocaleGetValue(cflocale, key);
+ char buffer[64];
+ CFStringGetCString(value, buffer, sizeof(buffer), kCFStringEncodingUTF8);
+ CFRelease(cflocale);
+ return string(buffer);
+ };
+
+ auto translations = new wxTranslations();
+
+ auto config_lang = Config::instance()->language();
+ if (config_lang && !config_lang->empty()) {
+ translations->SetLanguage(std_to_wx(*config_lang));
+ } else {
+ /* We want to use the user's preferred language. It seems that if we use the wxWidgets default we will get the
+ * language for the locale, which may not be what we want (e.g. for a machine in Germany, configured for DE locale,
+ * but with the preferred language set to English).
+ *
+ * Instead, the the language code from macOS then get the corresponding canonical language string with region,
+ * which wxTranslations::SetLanguage will accept.
+ */
+ auto const language_code = get_locale_value(kCFLocaleLanguageCode);
+ /* Ideally this would be wxUILocale (as wxLocale is deprecated) but we want to keep this building
+ * with the old wxWidgets we use for the older macOS builds.
+ */
+ auto const info = wxLocale::FindLanguageInfo(std_to_wx(language_code));
+ if (info) {
+#if wxCHECK_VERSION(3, 1, 6)
+ translations->SetLanguage(info->GetCanonicalWithRegion());
+#else
+ translations->SetLanguage(info->CanonicalName);
+#endif
+ }
+ }
+
+#ifdef DCPOMATIC_DEBUG
+ wxFileTranslationsLoader::AddCatalogLookupPathPrefix(char_to_wx("build/src/wx/mo"));
+ wxFileTranslationsLoader::AddCatalogLookupPathPrefix(char_to_wx("build/src/tools/mo"));
+#endif
+
+ translations->AddStdCatalog();
+ translations->AddCatalog(char_to_wx("libdcpomatic2-wx"));
+ translations->AddCatalog(char_to_wx("dcpomatic2"));
+
+ wxTranslations::Set(translations);
+
+ dcpomatic::setup_i18n(config_lang.get_value_or(""));
+}
+
+
diff --git a/src/wx/i18n_setup_windows.cc b/src/wx/i18n_setup_windows.cc
new file mode 100644
index 000000000..0fc4ecdd5
--- /dev/null
+++ b/src/wx/i18n_setup_windows.cc
@@ -0,0 +1,62 @@
+/*
+ Copyright (C) 2025 Carl Hetherington <cth@carlh.net>
+
+ This file is part of DCP-o-matic.
+
+ DCP-o-matic is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ DCP-o-matic is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+
+#include "i18n_setup.h"
+#include "wx_util.h"
+#include "lib/i18n_setup.h"
+#include <wx/wx.h>
+
+
+
+void
+dcpomatic::wx::setup_i18n()
+{
+ int language = wxLANGUAGE_DEFAULT;
+
+ auto config_lang = Config::instance()->language();
+ if (config_lang && !config_lang->empty()) {
+ if (auto const li = wxLocale::FindLanguageInfo(std_to_wx(config_lang.get()))) {
+ language = li->Language;
+ }
+ }
+
+ wxLocale* locale = nullptr;
+ if (wxLocale::IsAvailable(language)) {
+ locale = new wxLocale(language, wxLOCALE_LOAD_DEFAULT);
+
+ locale->AddCatalogLookupPathPrefix(std_to_wx(mo_path().string()));
+ locale->AddCatalog(char_to_wx("wxstd-3.1"));
+
+ locale->AddCatalog(char_to_wx("wxstd"));
+ locale->AddCatalog(char_to_wx("libdcpomatic2-wx"));
+ locale->AddCatalog(char_to_wx("dcpomatic2"));
+
+ if (!locale->IsOk()) {
+ delete locale;
+ locale = new wxLocale(wxLANGUAGE_ENGLISH);
+ }
+ }
+
+ if (locale) {
+ dcpomatic::setup_i18n(wx_to_std(locale->GetCanonicalName()));
+ }
+}
+
diff --git a/src/wx/wscript b/src/wx/wscript
index 6bb10511b..3dfc157e2 100644
--- a/src/wx/wscript
+++ b/src/wx/wscript
@@ -341,14 +341,17 @@ def build(bld):
obj.name = 'libdcpomatic2-wx'
obj.export_includes = ['..']
obj.uselib = 'BOOST_FILESYSTEM BOOST_THREAD BOOST_REGEX WXWIDGETS DCP SUB ZIP CXML RTAUDIO ICU AVUTIL '
+ obj.source = sources
if bld.env.TARGET_LINUX:
obj.uselib += 'GTK GL GLU '
+ obj.source += ' i18n_setup_linux.cc'
if bld.env.TARGET_WINDOWS_64 or bld.env.TARGET_WINDOWS_32:
obj.uselib += 'WINSOCK2 OLE32 DSOUND WINMM KSUSER GL GLU GLEW '
+ obj.source += ' i18n_setup_windows.cc'
if bld.env.TARGET_OSX:
obj.framework = ['CoreAudio', 'OpenGL']
+ obj.source += ' i18n_setup_osx.cc'
obj.use = 'libdcpomatic2'
- obj.source = sources
obj.target = 'dcpomatic2-wx'
i18n.po_to_mo(os.path.join('src', 'wx'), 'libdcpomatic2-wx', bld)
diff --git a/src/wx/wx_util.cc b/src/wx/wx_util.cc
index 932e4e0bd..afea3b209 100644
--- a/src/wx/wx_util.cc
+++ b/src/wx/wx_util.cc
@@ -421,122 +421,6 @@ checked_set(RegionSubtagWidget* widget, optional<dcp::LanguageTag::RegionSubtag>
}
-#ifdef DCPOMATIC_OSX
-
-void
-dcpomatic_setup_i18n()
-{
- wxLog::EnableLogging();
-
-#if wxCHECK_VERSION(3, 1, 6)
- wxUILocale::UseDefault();
-#endif
-
- auto get_locale_value = [](CFLocaleKey key) {
- CFLocaleRef cflocale = CFLocaleCopyCurrent();
- auto value = (CFStringRef) CFLocaleGetValue(cflocale, key);
- char buffer[64];
- CFStringGetCString(value, buffer, sizeof(buffer), kCFStringEncodingUTF8);
- CFRelease(cflocale);
- return string(buffer);
- };
-
- auto translations = new wxTranslations();
-
- auto config_lang = Config::instance()->language();
- if (config_lang && !config_lang->empty()) {
- translations->SetLanguage(std_to_wx(*config_lang));
- } else {
- /* We want to use the user's preferred language. It seems that if we use the wxWidgets default we will get the
- * language for the locale, which may not be what we want (e.g. for a machine in Germany, configured for DE locale,
- * but with the preferred language set to English).
- *
- * Instead, the the language code from macOS then get the corresponding canonical language string with region,
- * which wxTranslations::SetLanguage will accept.
- */
- auto const language_code = get_locale_value(kCFLocaleLanguageCode);
- /* Ideally this would be wxUILocale (as wxLocale is deprecated) but we want to keep this building
- * with the old wxWidgets we use for the older macOS builds.
- */
- auto const info = wxLocale::FindLanguageInfo(std_to_wx(language_code));
- if (info) {
-#if wxCHECK_VERSION(3, 1, 6)
- translations->SetLanguage(info->GetCanonicalWithRegion());
-#else
- translations->SetLanguage(info->CanonicalName);
-#endif
- }
- }
-
-#ifdef DCPOMATIC_DEBUG
- wxFileTranslationsLoader::AddCatalogLookupPathPrefix(char_to_wx("build/src/wx/mo"));
- wxFileTranslationsLoader::AddCatalogLookupPathPrefix(char_to_wx("build/src/tools/mo"));
-#endif
-
- translations->AddStdCatalog();
- translations->AddCatalog(char_to_wx("libdcpomatic2-wx"));
- translations->AddCatalog(char_to_wx("dcpomatic2"));
-
- wxTranslations::Set(translations);
-
- dcpomatic_setup_gettext_i18n(config_lang.get_value_or(""));
-}
-
-#else
-
-void
-dcpomatic_setup_i18n ()
-{
- int language = wxLANGUAGE_DEFAULT;
-
- auto config_lang = Config::instance()->language ();
- if (config_lang && !config_lang->empty ()) {
- auto const li = wxLocale::FindLanguageInfo (std_to_wx (config_lang.get ()));
- if (li) {
- language = li->Language;
- }
- }
-
- wxLocale* locale = nullptr;
- if (wxLocale::IsAvailable (language)) {
- locale = new wxLocale (language, wxLOCALE_LOAD_DEFAULT);
-
-#ifdef DCPOMATIC_WINDOWS
- locale->AddCatalogLookupPathPrefix (std_to_wx (mo_path().string()));
- locale->AddCatalog(char_to_wx("wxstd-3.1"));
-#endif
-
-#ifdef DCPOMATIC_LINUX
- locale->AddCatalogLookupPathPrefix(std_to_wx(LINUX_LOCALE_PREFIX));
-
- /* We have to include the wxWidgets .mo in our distribution,
- so we rename it to avoid clashes with any other installation
- of wxWidgets.
- */
- locale->AddCatalog(char_to_wx("dcpomatic2-wxstd"));
-
- /* Fedora 29 (at least) installs wxstd3.mo instead of wxstd.mo */
- locale->AddCatalog(char_to_wx("wxstd3"));
-#endif
-
- locale->AddCatalog(char_to_wx("wxstd"));
- locale->AddCatalog(char_to_wx("libdcpomatic2-wx"));
- locale->AddCatalog(char_to_wx("dcpomatic2"));
-
- if (!locale->IsOk()) {
- delete locale;
- locale = new wxLocale (wxLANGUAGE_ENGLISH);
- }
- }
-
- if (locale) {
- dcpomatic_setup_gettext_i18n (wx_to_std (locale->GetCanonicalName ()));
- }
-}
-
-#endif
-
-
int
wx_get (wxSpinCtrl* w)
{
diff --git a/src/wx/wx_util.h b/src/wx/wx_util.h
index 92cdd349b..114caab15 100644
--- a/src/wx/wx_util.h
+++ b/src/wx/wx_util.h
@@ -108,7 +108,6 @@ extern wxString std_to_wx (std::string);
/** Convert UTF8-encoded char array to wxString */
extern wxString char_to_wx(char const* s);
-extern void dcpomatic_setup_i18n ();
extern wxString context_translation(char const* s);
extern std::string string_client_data (wxClientData* o);
extern wxString time_to_timecode (dcpomatic::DCPTime t, double fps);