77 lines
1.6 KiB
TypeScript
77 lines
1.6 KiB
TypeScript
import languageMap from './languages.zh.json'
|
|
|
|
export type LanguageOption = {
|
|
code: string
|
|
name: string
|
|
search: string
|
|
}
|
|
|
|
type LanguageMap = Record<string, string>
|
|
|
|
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<string, string> = 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
|
|
}
|