Files
VidBee/src/shared/languages.ts

106 lines
2.1 KiB
TypeScript

export interface LanguageDefinition {
flag: string
name: string
hreflang: string
}
export const languages = {
en: {
flag: 'fi fi-us',
name: 'English',
hreflang: 'en'
},
es: {
flag: 'fi fi-es',
name: 'Español',
hreflang: 'es'
},
ar: {
flag: 'fi fi-sa',
name: 'العربية',
hreflang: 'ar'
},
id: {
flag: 'fi fi-id',
name: 'Bahasa Indonesia',
hreflang: 'id'
},
pt: {
flag: 'fi fi-br',
name: 'Português',
hreflang: 'pt-BR'
},
fr: {
flag: 'fi fi-fr',
name: 'Français',
hreflang: 'fr'
},
it: {
flag: 'fi fi-it',
name: 'Italiano',
hreflang: 'it'
},
zh: {
flag: 'fi fi-cn',
name: '中文',
hreflang: 'zh-CN'
},
'zh-TW': {
flag: 'fi fi-tw',
name: '繁體中文',
hreflang: 'zh-TW'
},
ko: {
flag: 'fi fi-kr',
name: '한국어',
hreflang: 'ko'
},
ja: {
flag: 'fi fi-jp',
name: '日本語',
hreflang: 'ja'
},
ru: {
flag: 'fi fi-ru',
name: 'Русский',
hreflang: 'ru'
},
de: {
flag: 'fi fi-de',
name: 'Deutsch',
hreflang: 'de'
}
} as const satisfies Record<string, LanguageDefinition>
export type LanguageCode = keyof typeof languages
export const defaultLanguageCode: LanguageCode = 'en'
export const languageList = Object.entries(languages).map(([code, definition]) => ({
value: code as LanguageCode,
...definition
}))
export const supportedLanguageCodes = languageList.map((language) => language.value)
export function normalizeLanguageCode(code: string | null | undefined): LanguageCode {
if (!code) {
return defaultLanguageCode
}
const normalizedInput = code.toLowerCase()
const directMatch = supportedLanguageCodes.find(
(languageCode) => languageCode.toLowerCase() === normalizedInput
)
if (directMatch) {
return directMatch
}
const base = normalizedInput.split('-')[0] ?? ''
const baseMatch = supportedLanguageCodes.find(
(languageCode) => languageCode.split('-')[0]?.toLowerCase() === base
)
return baseMatch ?? defaultLanguageCode
}