From f285d763cc3cec1b0cabd93fc2611ca47eef31d8 Mon Sep 17 00:00:00 2001 From: Jaehyuk-Lee Date: Thu, 15 Jan 2026 19:08:37 +0900 Subject: [PATCH 1/4] i18n: update language selection to auto-detect browser languages --- util/coverage/coverage.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/util/coverage/coverage.ts b/util/coverage/coverage.ts index ae2bed5d23c..7260b6927e7 100644 --- a/util/coverage/coverage.ts +++ b/util/coverage/coverage.ts @@ -1,6 +1,13 @@ import contentList from '../../resources/content_list'; import ContentType from '../../resources/content_type'; -import { isLang, Lang, langMap, langToLocale, languages } from '../../resources/languages'; +import { + browserLanguagesToLang, + isLang, + Lang, + langMap, + langToLocale, + languages, +} from '../../resources/languages'; import { UnreachableCode } from '../../resources/not_reached'; import ZoneInfo from '../../resources/zone_info'; import { LocaleObject, LocaleText } from '../../types/trigger'; @@ -1356,7 +1363,7 @@ const buildLanguageSelect = (container: HTMLElement, lang: Lang) => { document.addEventListener('DOMContentLoaded', () => { // Allow for `coverage.html?lang=de` style constructions. const params = new URLSearchParams(window.location.search); - const langStr = params.get('lang') ?? 'en'; + const langStr = params.get('lang') ?? browserLanguagesToLang(navigator.languages); // TODO: left for now as backwards compatibility with user css. Remove this later?? document.body.classList.add(`lang-${langStr}`); const lang = langStr !== null && isLang(langStr) ? langStr : 'en'; From c0cf1de6ef9081c8da0358d7467d975672a1a820 Mon Sep 17 00:00:00 2001 From: Jaehyuk-Lee Date: Thu, 15 Jan 2026 19:54:11 +0900 Subject: [PATCH 2/4] i18n: fix Korean translation for coverage report error message --- util/coverage/coverage.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/coverage/coverage.ts b/util/coverage/coverage.ts index 7260b6927e7..a43ffb52437 100644 --- a/util/coverage/coverage.ts +++ b/util/coverage/coverage.ts @@ -519,7 +519,7 @@ const miscStrings = { fr: 'Erreur : Lancez npm run coverage-report pour générer des données.', ja: 'エラー:npm run coverage-report を実行し、データを生成しよう。', cn: '错误:请先运行 npm run coverage-report 以生成数据。', - ko: '에러: 데이터를 생성하려면 node npm run coverage-report를 실행하세요.', + ko: '에러: 데이터를 생성하려면 npm run coverage-report를 실행하세요.', tc: '錯誤:請先運行 npm run coverage-report 來產生資料。', }, // Indicator that content is unsupported From 8cbefb1ec20893b67d42eac921b79921c854c446 Mon Sep 17 00:00:00 2001 From: Jaehyuk-Lee Date: Thu, 15 Jan 2026 19:55:27 +0900 Subject: [PATCH 3/4] i18n: refactor browserLanguagesToLang to use navigator.languages directly --- resources/languages.ts | 5 ++--- ui/raidboss/raidemulator.ts | 2 +- util/coverage/coverage.ts | 2 +- util/logtools/web_splitter.ts | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/resources/languages.ts b/resources/languages.ts index 06116f4e780..38b9fee80f6 100644 --- a/resources/languages.ts +++ b/resources/languages.ts @@ -89,8 +89,7 @@ export const langToLocale = (lang: Lang): string => { }[lang]; }; -export const browserLanguagesToLang = (languagesArr: readonly string[]): Lang => { - // languagesArr receives only `navigator.languages` as input +export const browserLanguagesToLang = (): Lang => { const mapLanguage = (lang: string): string => { // Handle Chinese variants if (lang.startsWith('zh-')) { @@ -107,7 +106,7 @@ export const browserLanguagesToLang = (languagesArr: readonly string[]): Lang => } return lang.slice(0, 2); }; - const lang = [...languagesArr, 'en'] + const lang = [...navigator.languages, 'en'] .map(mapLanguage) .filter((l) => languages.includes(l as Lang))[0]; return isLang(lang) ? lang : 'en'; diff --git a/ui/raidboss/raidemulator.ts b/ui/raidboss/raidemulator.ts index 5eb4165b6be..1c204d636a4 100644 --- a/ui/raidboss/raidemulator.ts +++ b/ui/raidboss/raidemulator.ts @@ -151,7 +151,7 @@ const raidEmulatorOnLoad = async () => { if (!websocketConnected) { // Find the most appropriate lang code to use based on browser language priority - const browserLang = browserLanguagesToLang(navigator.languages); + const browserLang = browserLanguagesToLang(); applyTranslation(browserLang); options.ParserLanguage = browserLang; diff --git a/util/coverage/coverage.ts b/util/coverage/coverage.ts index a43ffb52437..86959954596 100644 --- a/util/coverage/coverage.ts +++ b/util/coverage/coverage.ts @@ -1363,7 +1363,7 @@ const buildLanguageSelect = (container: HTMLElement, lang: Lang) => { document.addEventListener('DOMContentLoaded', () => { // Allow for `coverage.html?lang=de` style constructions. const params = new URLSearchParams(window.location.search); - const langStr = params.get('lang') ?? browserLanguagesToLang(navigator.languages); + const langStr = params.get('lang') ?? browserLanguagesToLang(); // TODO: left for now as backwards compatibility with user css. Remove this later?? document.body.classList.add(`lang-${langStr}`); const lang = langStr !== null && isLang(langStr) ? langStr : 'en'; diff --git a/util/logtools/web_splitter.ts b/util/logtools/web_splitter.ts index 578b98598b9..622df5f8a5b 100644 --- a/util/logtools/web_splitter.ts +++ b/util/logtools/web_splitter.ts @@ -349,7 +349,7 @@ const downloadFile = (output: string[], filename: string): void => { }; const onLoaded = () => { - const lang = browserLanguagesToLang(navigator.languages); + const lang = browserLanguagesToLang(); const table = getElement('fight-table'); const fileDrop = getElement('filedrop'); From c20f49e5b06cd13afde41a42c0d27578b3cb4e5b Mon Sep 17 00:00:00 2001 From: Jaehyuk-Lee Date: Sun, 18 Jan 2026 14:50:39 +0900 Subject: [PATCH 4/4] i18n: add localesToLang function --- resources/languages.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/resources/languages.ts b/resources/languages.ts index 38b9fee80f6..8c30546e8a6 100644 --- a/resources/languages.ts +++ b/resources/languages.ts @@ -89,7 +89,7 @@ export const langToLocale = (lang: Lang): string => { }[lang]; }; -export const browserLanguagesToLang = (): Lang => { +export const localesToLang = (locales: readonly string[]): Lang => { const mapLanguage = (lang: string): string => { // Handle Chinese variants if (lang.startsWith('zh-')) { @@ -106,8 +106,10 @@ export const browserLanguagesToLang = (): Lang => { } return lang.slice(0, 2); }; - const lang = [...navigator.languages, 'en'] + const lang = [...locales, 'en'] .map(mapLanguage) .filter((l) => languages.includes(l as Lang))[0]; return isLang(lang) ? lang : 'en'; }; + +export const browserLanguagesToLang = (): Lang => localesToLang(navigator.languages);