import languageMap from './languages.zh.json' export type LanguageOption = { code: string name: string search: string } type LanguageMap = Record const raw = languageMap as LanguageMap const hasCjk = (text: string) => /[\u4e00-\u9fff]/.test(text) const normalized = Object.entries(raw) .map(([code, name]) => ({ code: code.replace(/_/g, '-'), name })) .filter(({ code }) => code.length <= 10) .sort((a, b) => { const aGroup = hasCjk(a.name) ? 0 : 1 const bGroup = hasCjk(b.name) ? 0 : 1 if (aGroup !== bGroup) return aGroup - bGroup return a.name.localeCompare(b.name, 'zh-CN') }) const nameByCode: Record = Object.fromEntries( normalized.map(({ code, name }) => [code, name]) ) export const AUTO_LANGUAGE: LanguageOption = { code: 'auto', name: '自动检测', search: 'auto 自动检测', } export const LANGUAGE_OPTIONS: LanguageOption[] = normalized.map(({ code, name }) => ({ code, name, search: `${name} ${code}`.toLowerCase(), })) export const COMMON_LANGUAGE_CODES = [ 'zh', 'zh-Hant', 'en', 'ja', 'ko', 'fr', 'de', 'es', 'ru', 'pt', 'it', 'ar', 'hi', 'th', 'vi', 'id', 'tr', 'uk', 'pl', 'nl', 'sv', ] export const COMMON_LANGUAGE_OPTIONS: LanguageOption[] = COMMON_LANGUAGE_CODES .map((code) => { const name = nameByCode[code] if (!name) return null return { code, name, search: `${name} ${code}`.toLowerCase() } }) .filter((v): v is LanguageOption => Boolean(v)) export function getLanguageName(code: string): string { if (code === AUTO_LANGUAGE.code) return AUTO_LANGUAGE.name return nameByCode[code] ?? code }