From 1c6aa2bfc38736be097000cd3767efb7d01f98cd Mon Sep 17 00:00:00 2001 From: Aotumuri Date: Sat, 26 Jul 2025 03:08:35 +0900 Subject: [PATCH] Improve language code matching logic for locale fallback (#1534) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description: This pull request improves the logic for matching language codes to supported languages. Now, the function tries to find the most specific language by splitting the input code with “-” or “_”, and searching from the longest combination to the shortest. If no direct match is found, it searches for all supported language codes that start with the same base (first two letters) and chooses the most specific one. If nothing matches, it defaults to English. ## Please complete the following: - [x] I have added screenshots for all UI updates - [x] I process any text displayed to the user through translateText() and I've added it to the en.json file - [x] I have added relevant tests to the test directory - [x] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced - [x] I have read and accepted the CLA aggreement (only required once). ## Please put your Discord username so you can be contacted if a bug or regression is found: aorumuri --- resources/lang/{pt_BR.json => pt-BR.json} | 2 +- resources/lang/{sv_SE.json => sv-SE.json} | 2 +- resources/lang/{zh_CN.json => zh-CN.json} | 2 +- src/client/LangSelector.ts | 24 +++++++++++++++-------- 4 files changed, 19 insertions(+), 11 deletions(-) rename resources/lang/{pt_BR.json => pt-BR.json} (99%) rename resources/lang/{sv_SE.json => sv-SE.json} (99%) rename resources/lang/{zh_CN.json => zh-CN.json} (99%) diff --git a/resources/lang/pt_BR.json b/resources/lang/pt-BR.json similarity index 99% rename from resources/lang/pt_BR.json rename to resources/lang/pt-BR.json index f058409fc..c615438e6 100644 --- a/resources/lang/pt_BR.json +++ b/resources/lang/pt-BR.json @@ -167,7 +167,7 @@ "en": "Brazilian Portuguese", "native": "Português brasileiro", "svg": "br", - "lang_code": "pt_BR" + "lang_code": "pt-BR" }, "game_mode": { "ffa": "Free for All", diff --git a/resources/lang/sv_SE.json b/resources/lang/sv-SE.json similarity index 99% rename from resources/lang/sv_SE.json rename to resources/lang/sv-SE.json index 4415ccc85..0c50034c5 100644 --- a/resources/lang/sv_SE.json +++ b/resources/lang/sv-SE.json @@ -3,7 +3,7 @@ "en": "Swedish", "native": "Svenska", "svg": "se", - "lang_code": "sv_SE" + "lang_code": "sv-SE" }, "common": { "close": "Stäng" diff --git a/resources/lang/zh_CN.json b/resources/lang/zh-CN.json similarity index 99% rename from resources/lang/zh_CN.json rename to resources/lang/zh-CN.json index 700a910e9..becaf5649 100644 --- a/resources/lang/zh_CN.json +++ b/resources/lang/zh-CN.json @@ -3,7 +3,7 @@ "en": "Chinese Simplified", "native": "简体中文", "svg": "cn", - "lang_code": "zh_CN" + "lang_code": "zh-CN" }, "common": { "close": "关闭" diff --git a/src/client/LangSelector.ts b/src/client/LangSelector.ts index 783ecdced..d65f3c4d1 100644 --- a/src/client/LangSelector.ts +++ b/src/client/LangSelector.ts @@ -21,14 +21,14 @@ import ja from "../../resources/lang/ja.json"; import ko from "../../resources/lang/ko.json"; import nl from "../../resources/lang/nl.json"; import pl from "../../resources/lang/pl.json"; -import pt_BR from "../../resources/lang/pt_BR.json"; +import pt_BR from "../../resources/lang/pt-BR.json"; import ru from "../../resources/lang/ru.json"; import sh from "../../resources/lang/sh.json"; -import sv_SE from "../../resources/lang/sv_SE.json"; +import sv_SE from "../../resources/lang/sv-SE.json"; import tp from "../../resources/lang/tp.json"; import tr from "../../resources/lang/tr.json"; import uk from "../../resources/lang/uk.json"; -import zh_CN from "../../resources/lang/zh_CN.json"; +import zh_CN from "../../resources/lang/zh-CN.json"; @customElement("lang-selector") export class LangSelector extends LitElement { @@ -55,7 +55,7 @@ export class LangSelector extends LitElement { ja, nl, pl, - pt_BR, + "pt-BR": pt_BR, ru, sh, tr, @@ -65,8 +65,8 @@ export class LangSelector extends LitElement { he, da, fi, - sv_SE, - zh_CN, + "sv-SE": sv_SE, + "zh-CN": zh_CN, ko, gl, }; @@ -93,8 +93,16 @@ export class LangSelector extends LitElement { private getClosestSupportedLang(lang: string): string { if (!lang) return "en"; if (lang in this.languageMap) return lang; - const base = lang.split("-")[0]; - if (base in this.languageMap) return base; + + const base = lang.slice(0, 2); + const candidates = Object.keys(this.languageMap).filter((key) => + key.startsWith(base), + ); + if (candidates.length > 0) { + candidates.sort((a, b) => b.length - a.length); // More specific first + return candidates[0]; + } + return "en"; }