Files
2026-07-13 13:12:33 +08:00

58 lines
2.9 KiB
JavaScript

import assert from 'node:assert/strict'
import { resolveLocaleFromTags } from '../dist/desktop-locale.js'
// --- preference order: first bundled match wins ---
// Regression: en-* is bundled and must match in place. Before the fix a Hong
// Kong system list [en-HK, zh-Hans-HK, zh-Hant-HK, fr-HK] resolved to 'fr' —
// the top two preferences both fell through and the fourth won.
assert.equal(resolveLocaleFromTags(['en-HK', 'zh-Hans-HK', 'zh-Hant-HK', 'fr-HK']), 'en')
assert.equal(resolveLocaleFromTags(['en', 'ja']), 'en')
assert.equal(resolveLocaleFromTags(['en_US']), 'en')
assert.equal(resolveLocaleFromTags(['ja-JP', 'en-US']), 'ja')
// --- Chinese: explicit script subtag wins over region ---
// Regression: zh-Hans with a Traditional-default region is still Simplified.
assert.equal(resolveLocaleFromTags(['zh-Hans-HK']), 'zh-Hans')
assert.equal(resolveLocaleFromTags(['zh-Hans-TW']), 'zh-Hans')
assert.equal(resolveLocaleFromTags(['zh-Hans-MO']), 'zh-Hans')
assert.equal(resolveLocaleFromTags(['zh-CN']), 'zh-Hans')
assert.equal(resolveLocaleFromTags(['zh']), 'zh-Hans')
assert.equal(resolveLocaleFromTags(['zh-Hans-CN']), 'zh-Hans')
assert.equal(resolveLocaleFromTags(['zh_Hans_HK']), 'zh-Hans')
// Traditional variants (explicit Hant, or bare Traditional-default regions)
// skip to the next preference rather than forcing Simplified text.
assert.equal(resolveLocaleFromTags(['zh-Hant']), 'en')
assert.equal(resolveLocaleFromTags(['zh-Hant-HK', 'ja-JP']), 'ja')
assert.equal(resolveLocaleFromTags(['zh-TW']), 'en')
assert.equal(resolveLocaleFromTags(['zh-HK', 'fr-FR']), 'fr')
assert.equal(resolveLocaleFromTags(['zh-MO', 'de']), 'de')
assert.equal(resolveLocaleFromTags(['zh_HK', 'fr-FR']), 'fr')
// Script detection is structural, never a substring match against extensions
// or private-use subtags.
assert.equal(resolveLocaleFromTags(['zh-Hant-x-hans', 'ja-JP']), 'ja')
assert.equal(resolveLocaleFromTags(['zh-CN-x-hant', 'fr-FR']), 'zh-Hans')
// --- other bundled languages and fallback ---
assert.equal(resolveLocaleFromTags(['fr-CA']), 'fr')
assert.equal(resolveLocaleFromTags(['fr_CA']), 'fr')
assert.equal(resolveLocaleFromTags(['de-AT']), 'de')
assert.equal(resolveLocaleFromTags(['es-419']), 'es')
// Unsupported languages skip to the next preference; nothing matches → 'en'.
assert.equal(resolveLocaleFromTags(['ko-KR', 'es-ES']), 'es')
assert.equal(resolveLocaleFromTags(['ko-KR', 'th-TH']), 'en')
assert.equal(resolveLocaleFromTags([]), 'en')
// Malformed entries (Electron APIs can surface non-strings) are skipped.
assert.equal(resolveLocaleFromTags([undefined, null, 42, 'ja']), 'ja')
assert.equal(resolveLocaleFromTags(['en--US', 'ja']), 'ja')
assert.equal(resolveLocaleFromTags(['zh-Hans-Hant', 'fr']), 'fr')
assert.equal(resolveLocaleFromTags(['zha', 'ja']), 'ja')
assert.equal(resolveLocaleFromTags(['zh!', 'de']), 'de')
console.log('desktop-locale resolution tests passed')