Quellcode durchsuchen

Add support for non-ISO locale identifiers via renames map

Windows apparently uses "no" for Norwegian Bokmål, even though its
ISO 639-1 language code is "nb"... Closes #12479.

Also did some non-intrusive cleanup while at it.
Rémi Verschelde vor 7 Jahren
Ursprung
Commit
981ef0be59
3 geänderte Dateien mit 75 neuen und 65 gelöschten Zeilen
  1. 73 63
      core/translation.cpp
  2. 1 2
      core/translation.h
  3. 1 0
      editor/editor_settings.cpp

+ 73 - 63
core/translation.cpp

@@ -753,65 +753,17 @@ static const char *locale_names[] = {
 	0
 	0
 };
 };
 
 
-bool TranslationServer::is_locale_valid(const String &p_locale) {
-
-	const char **ptr = locale_list;
-
-	while (*ptr) {
-
-		if (*ptr == p_locale)
-			return true;
-		ptr++;
-	}
-
-	return false;
-}
-
-Vector<String> TranslationServer::get_all_locales() {
-
-	Vector<String> locales;
-
-	const char **ptr = locale_list;
-
-	while (*ptr) {
-		locales.push_back(*ptr);
-		ptr++;
-	}
-
-	return locales;
-}
-
-Vector<String> TranslationServer::get_all_locale_names() {
-
-	Vector<String> locales;
-
-	const char **ptr = locale_names;
-
-	while (*ptr) {
-		locales.push_back(*ptr);
-		ptr++;
-	}
-
-	return locales;
-}
+static const char *locale_renames[][2] = {
+	{ "no", "nb" },
+	{ NULL, NULL }
+};
 
 
 static String get_trimmed_locale(const String &p_locale) {
 static String get_trimmed_locale(const String &p_locale) {
 
 
 	return p_locale.substr(0, 2);
 	return p_locale.substr(0, 2);
 }
 }
 
 
-static bool is_valid_locale(const String &p_locale) {
-
-	const char **ptr = locale_list;
-
-	while (*ptr) {
-		if (p_locale == *ptr)
-			return true;
-		ptr++;
-	}
-
-	return false;
-}
+///////////////////////////////////////////////
 
 
 PoolVector<String> Translation::_get_messages() const {
 PoolVector<String> Translation::_get_messages() const {
 
 
@@ -857,14 +809,13 @@ void Translation::_set_messages(const PoolVector<String> &p_messages) {
 
 
 void Translation::set_locale(const String &p_locale) {
 void Translation::set_locale(const String &p_locale) {
 
 
-	// replaces '-' with '_' for macOS Sierra-style locales
-	String univ_locale = p_locale.replace("-", "_");
+	String univ_locale = TranslationServer::standardize_locale(p_locale);
 
 
-	if (!is_valid_locale(univ_locale)) {
+	if (!TranslationServer::is_locale_valid(univ_locale)) {
 		String trimmed_locale = get_trimmed_locale(univ_locale);
 		String trimmed_locale = get_trimmed_locale(univ_locale);
 
 
-		ERR_EXPLAIN("Invalid Locale: " + trimmed_locale);
-		ERR_FAIL_COND(!is_valid_locale(trimmed_locale));
+		ERR_EXPLAIN("Invalid locale: " + trimmed_locale);
+		ERR_FAIL_COND(!TranslationServer::is_locale_valid(trimmed_locale));
 
 
 		locale = trimmed_locale;
 		locale = trimmed_locale;
 	} else {
 	} else {
@@ -929,16 +880,47 @@ Translation::Translation()
 
 
 ///////////////////////////////////////////////
 ///////////////////////////////////////////////
 
 
-void TranslationServer::set_locale(const String &p_locale) {
+bool TranslationServer::is_locale_valid(const String &p_locale) {
+
+	const char **ptr = locale_list;
+
+	while (*ptr) {
+
+		if (*ptr == p_locale)
+			return true;
+		ptr++;
+	}
+
+	return false;
+}
 
 
-	// replaces '-' with '_' for macOS Sierra-style locales
+String TranslationServer::standardize_locale(const String &p_locale) {
+
+	// Replaces '-' with '_' for macOS Sierra-style locales
 	String univ_locale = p_locale.replace("-", "_");
 	String univ_locale = p_locale.replace("-", "_");
 
 
-	if (!is_valid_locale(univ_locale)) {
+	// Handles known non-ISO locale names used e.g. on Windows
+	int idx = 0;
+	while (locale_renames[idx][0] != NULL) {
+		if (locale_renames[idx][0] == univ_locale) {
+			univ_locale = locale_renames[idx][1];
+			break;
+		}
+		idx++;
+	}
+
+	return univ_locale;
+}
+
+void TranslationServer::set_locale(const String &p_locale) {
+
+	String univ_locale = standardize_locale(p_locale);
+
+	if (!is_locale_valid(univ_locale)) {
 		String trimmed_locale = get_trimmed_locale(univ_locale);
 		String trimmed_locale = get_trimmed_locale(univ_locale);
 
 
-		ERR_EXPLAIN("Invalid Locale: " + trimmed_locale);
-		ERR_FAIL_COND(!is_valid_locale(trimmed_locale));
+		ERR_EXPLAIN("Invalid locale: " + trimmed_locale);
+		ERR_FAIL_COND(!is_locale_valid(trimmed_locale));
 
 
 		locale = trimmed_locale;
 		locale = trimmed_locale;
 	} else {
 	} else {
@@ -963,6 +945,34 @@ String TranslationServer::get_locale_name(const String &p_locale) const {
 	return locale_name_map[p_locale];
 	return locale_name_map[p_locale];
 }
 }
 
 
+Vector<String> TranslationServer::get_all_locales() {
+
+	Vector<String> locales;
+
+	const char **ptr = locale_list;
+
+	while (*ptr) {
+		locales.push_back(*ptr);
+		ptr++;
+	}
+
+	return locales;
+}
+
+Vector<String> TranslationServer::get_all_locale_names() {
+
+	Vector<String> locales;
+
+	const char **ptr = locale_names;
+
+	while (*ptr) {
+		locales.push_back(*ptr);
+		ptr++;
+	}
+
+	return locales;
+}
+
 void TranslationServer::add_translation(const Ref<Translation> &p_translation) {
 void TranslationServer::add_translation(const Ref<Translation> &p_translation) {
 
 
 	translations.insert(p_translation);
 	translations.insert(p_translation);

+ 1 - 2
core/translation.h

@@ -85,8 +85,6 @@ class TranslationServer : public Object {
 public:
 public:
 	_FORCE_INLINE_ static TranslationServer *get_singleton() { return singleton; }
 	_FORCE_INLINE_ static TranslationServer *get_singleton() { return singleton; }
 
 
-	//yes, portuguese is supported!
-
 	void set_enabled(bool p_enabled) { enabled = p_enabled; }
 	void set_enabled(bool p_enabled) { enabled = p_enabled; }
 	_FORCE_INLINE_ bool is_enabled() const { return enabled; }
 	_FORCE_INLINE_ bool is_enabled() const { return enabled; }
 
 
@@ -103,6 +101,7 @@ public:
 	static Vector<String> get_all_locales();
 	static Vector<String> get_all_locales();
 	static Vector<String> get_all_locale_names();
 	static Vector<String> get_all_locale_names();
 	static bool is_locale_valid(const String &p_locale);
 	static bool is_locale_valid(const String &p_locale);
+	static String standardize_locale(const String &p_locale);
 
 
 	void set_tool_translation(const Ref<Translation> &p_translation);
 	void set_tool_translation(const Ref<Translation> &p_translation);
 	StringName tool_translate(const StringName &p_message) const;
 	StringName tool_translate(const StringName &p_message) const;

+ 1 - 0
editor/editor_settings.cpp

@@ -544,6 +544,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
 	{
 	{
 		String lang_hint = "en";
 		String lang_hint = "en";
 		String host_lang = OS::get_singleton()->get_locale();
 		String host_lang = OS::get_singleton()->get_locale();
+		host_lang = TranslationServer::standardize_locale(host_lang);
 
 
 		String best;
 		String best;