From b4fc24b73f006addb378852ebb93225b59662f1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Verschelde?= Date: Thu, 16 Sep 2021 09:27:56 +0200 Subject: [PATCH] Implement `OS::get_locale_language()` helper method This method extracts the 2 or 3-letter language code from `OS::get_locale()`, making it easier for users to identify the "main" language code for users that might have different OS locales due to different OS or region, but should be matched to the same translation (e.g. "generic" Spanish). Fixes #40703. (cherry picked from commit def99c7baf1880e3efc0b60b9eb035be8a7edb14) --- core/bind/core_bind.cpp | 5 +++++ core/bind/core_bind.h | 1 + core/os/os.cpp | 6 ++++++ core/os/os.h | 1 + doc/classes/OS.xml | 17 ++++++++++++----- doc/classes/TranslationServer.xml | 8 +++++--- 6 files changed, 30 insertions(+), 8 deletions(-) diff --git a/core/bind/core_bind.cpp b/core/bind/core_bind.cpp index f2e2e734e69..653db1670ad 100644 --- a/core/bind/core_bind.cpp +++ b/core/bind/core_bind.cpp @@ -527,6 +527,10 @@ String _OS::get_locale() const { return OS::get_singleton()->get_locale(); } +String _OS::get_locale_language() const { + return OS::get_singleton()->get_locale_language(); +} + String _OS::get_latin_keyboard_variant() const { switch (OS::get_singleton()->get_latin_keyboard_variant()) { case OS::LATIN_KEYBOARD_QWERTY: @@ -1333,6 +1337,7 @@ void _OS::_bind_methods() { ClassDB::bind_method(D_METHOD("get_ticks_usec"), &_OS::get_ticks_usec); ClassDB::bind_method(D_METHOD("get_splash_tick_msec"), &_OS::get_splash_tick_msec); ClassDB::bind_method(D_METHOD("get_locale"), &_OS::get_locale); + ClassDB::bind_method(D_METHOD("get_locale_language"), &_OS::get_locale_language); ClassDB::bind_method(D_METHOD("get_latin_keyboard_variant"), &_OS::get_latin_keyboard_variant); ClassDB::bind_method(D_METHOD("get_model_name"), &_OS::get_model_name); diff --git a/core/bind/core_bind.h b/core/bind/core_bind.h index 387d4cce392..2a52f760912 100644 --- a/core/bind/core_bind.h +++ b/core/bind/core_bind.h @@ -256,6 +256,7 @@ public: Vector get_cmdline_args(); String get_locale() const; + String get_locale_language() const; String get_latin_keyboard_variant() const; int keyboard_get_layout_count() const; int keyboard_get_current_layout() const; diff --git a/core/os/os.cpp b/core/os/os.cpp index 33f731422f7..dfeb820b546 100644 --- a/core/os/os.cpp +++ b/core/os/os.cpp @@ -284,6 +284,12 @@ String OS::get_locale() const { return "en"; } +// Non-virtual helper to extract the 2 or 3-letter language code from +// `get_locale()` in a way that's consistent for all platforms. +String OS::get_locale_language() const { + return get_locale().left(3).replace("_", ""); +} + // Helper function to ensure that a dir name/path will be valid on the OS String OS::get_safe_dir_name(const String &p_dir_name, bool p_allow_dir_separator) const { Vector invalid_chars = String(": * ? \" < > |").split(" "); diff --git a/core/os/os.h b/core/os/os.h index 58ba104e6d4..cd763a61c3d 100644 --- a/core/os/os.h +++ b/core/os/os.h @@ -427,6 +427,7 @@ public: RenderThreadMode get_render_thread_mode() const { return _render_thread_mode; } virtual String get_locale() const; + String get_locale_language() const; String get_safe_dir_name(const String &p_dir_name, bool p_allow_dir_separator = false) const; virtual String get_godot_dir_name() const; diff --git a/doc/classes/OS.xml b/doc/classes/OS.xml index 6e99df7d3f4..5047006d39a 100644 --- a/doc/classes/OS.xml +++ b/doc/classes/OS.xml @@ -256,14 +256,21 @@ - Returns the host OS locale as a string of the form [code]language_Script_COUNTRY_VARIANT@extra[/code]. - [code]language[/code] - 2 or 3 letter [url=https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes]language code[/url], in lower case. - [code]Script[/code] - optional, 4 letter [url=https://en.wikipedia.org/wiki/ISO_15924]script code[/url], in title case. - [code]COUNTRY[/code] - optional, 2 or 3 letter [url=https://en.wikipedia.org/wiki/ISO_3166-1]country code[/url], in upper case. - [code]VARIANT[/code] - optional, language variant, region and sort order. Variant can have any number of underscored key words. + Returns the host OS locale as a string of the form [code]language_Script_COUNTRY_VARIANT@extra[/code]. If you want only the language code and not the fully specified locale from the OS, you can use [method get_locale_language]. + [code]language[/code] - 2 or 3-letter [url=https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes]language code[/url], in lower case. + [code]Script[/code] - optional, 4-letter [url=https://en.wikipedia.org/wiki/ISO_15924]script code[/url], in title case. + [code]COUNTRY[/code] - optional, 2 or 3-letter [url=https://en.wikipedia.org/wiki/ISO_3166-1]country code[/url], in upper case. + [code]VARIANT[/code] - optional, language variant, region and sort order. Variant can have any number of underscored keywords. [code]extra[/code] - optional, semicolon separated list of additional key words. Currency, calendar, sort order and numbering system information. + + + + Returns the host OS locale's 2 or 3-letter [url=https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes]language code[/url] as a string which should be consistent on all platforms. This is equivalent to extracting the [code]language[/code] part of the [method get_locale] string. + This can be used to narrow down fully specified locale strings to only the "common" language code, when you don't need the additional information about country code or variants. For example, for a French Canadian user with [code]fr_CA[/code] locale, this would return [code]fr[/code]. + + diff --git a/doc/classes/TranslationServer.xml b/doc/classes/TranslationServer.xml index 9a4fe66a4f7..9c4f8a5c64c 100644 --- a/doc/classes/TranslationServer.xml +++ b/doc/classes/TranslationServer.xml @@ -27,13 +27,14 @@ - Returns an Array of all loaded locales of the game. + Returns an array of all loaded locales of the project. - Returns the current locale of the game. + Returns the current locale of the project. + See also [method OS.get_locale] and [method OS.get_locale_language] to query the locale of the user system. @@ -54,7 +55,8 @@ - Sets the locale of the game. + Sets the locale of the project. The [code]locale[/code] string will be standardized to match known locales (e.g. [code]en-US[/code] would be matched to [code]en_US[/code]). + If translations have been loaded beforehand for the new locale, they will be applied.