فهرست منبع

fix: skip invalid Chinese locales

mblbr 1 هفته پیش
والد
کامیت
0d6552a60e
2فایلهای تغییر یافته به همراه15 افزوده شده و 1 حذف شده
  1. 9 1
      frontend/resources/vue/utils/localeSelection.js
  2. 6 0
      frontend/resources/vue/utils/localeSelection.test.mjs

+ 9 - 1
frontend/resources/vue/utils/localeSelection.js

@@ -10,7 +10,15 @@ export function selectBrowserLocale (availableLocales, browserLanguages) {
     const parts = lowerCandidate.split('-')
 
     if (parts[0] === 'zh') {
-      const script = new Intl.Locale(candidate).maximize().script
+      let script
+      try {
+        script = new Intl.Locale(candidate).maximize().script
+      } catch (error) {
+        if (error instanceof RangeError) {
+          continue
+        }
+        throw error
+      }
       const match = availableLocales.find(locale =>
         locale.toLowerCase().startsWith('zh-') &&
         new Intl.Locale(locale).maximize().script === script

+ 6 - 0
frontend/resources/vue/utils/localeSelection.test.mjs

@@ -37,3 +37,9 @@ test('selectBrowserLocale skips unavailable Chinese scripts and tries the next b
 test('selectBrowserLocale uses English when no locale matches', () => {
   assert.equal(selectBrowserLocale(availableLocales, ['fr-FR']), 'en')
 })
+
+test('selectBrowserLocale skips malformed Chinese candidates', () => {
+  assert.equal(selectBrowserLocale(availableLocales, ['zh-', 'zh-TW']), 'zh-Hant-TW')
+  assert.equal(selectBrowserLocale(availableLocales, ['zh-Hant-!', 'de-AT']), 'de-DE')
+  assert.equal(selectBrowserLocale(availableLocales, ['zh-']), 'en')
+})