Merge pull request #12492 from akien-mga/locale-no

Add support for non-ISO "no" locale on Windows
This commit is contained in:
Rémi Verschelde 2017-10-30 09:09:25 +01:00 committed by GitHub
commit 8fb223fb15
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 75 additions and 65 deletions

View File

@ -753,65 +753,17 @@ static const char *locale_names[] = {
0 0
}; };
bool TranslationServer::is_locale_valid(const String &p_locale) { static const char *locale_renames[][2] = {
{ "no", "nb" },
const char **ptr = locale_list; { NULL, NULL }
};
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 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 = TranslationServer::standardize_locale(p_locale);
String univ_locale = p_locale.replace("-", "_");
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_EXPLAIN("Invalid locale: " + trimmed_locale);
ERR_FAIL_COND(!is_valid_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) {
// replaces '-' with '_' for macOS Sierra-style locales const char **ptr = locale_list;
while (*ptr) {
if (*ptr == p_locale)
return true;
ptr++;
}
return false;
}
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_EXPLAIN("Invalid locale: " + trimmed_locale);
ERR_FAIL_COND(!is_valid_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);

View File

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

View File

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