// See also languages-schema.ts // Nota bene: If you are adding a new language, // change accept-language handling in CDN config as well. /** * Client-safe language definitions without server-side dependencies. * For server-side usage with fs/path operations, import from './languages-server.ts' */ export type LanguageCode = 'en' | 'es' | 'ja' | 'pt' | 'zh' | 'ru' | 'fr' | 'ko' | 'de' export type LocaleCode = | 'en' | 'es-es' | 'ja-jp' | 'pt-br' | 'zh-cn' | 'ru-ru' | 'fr-fr' | 'ko-kr' | 'de-de' export interface Language { name: string nativeName?: string code: LanguageCode hreflang: string locale: LocaleCode redirectPatterns?: RegExp[] dir?: string } export interface Languages { [code: string]: Language } // Languages in order of accept-language header frequency // Note: 'dir' is omitted here as it requires server-side path resolution export const languages: Languages = { en: { name: 'English', code: 'en', hreflang: 'en', locale: 'en', }, es: { name: 'Spanish', nativeName: 'Español', code: 'es', hreflang: 'es', locale: 'es-es', }, ja: { name: 'Japanese', nativeName: '日本語', code: 'ja', hreflang: 'ja', redirectPatterns: [/^\/jp/], locale: 'ja-jp', }, pt: { name: 'Portuguese', nativeName: 'Português do Brasil', code: 'pt', hreflang: 'pt', redirectPatterns: [/^\/br/], locale: 'pt-br', }, zh: { name: 'Simplified Chinese', nativeName: '简体中文', code: 'zh', hreflang: 'zh-Hans', redirectPatterns: [/^\/cn/, /^\/zh-\w{2}/], locale: 'zh-cn', }, ru: { name: 'Russian', nativeName: 'Русский', code: 'ru', hreflang: 'ru', locale: 'ru-ru', }, fr: { name: 'French', nativeName: 'Français', code: 'fr', hreflang: 'fr', locale: 'fr-fr', }, ko: { name: 'Korean', nativeName: '한국어', code: 'ko', hreflang: 'ko', redirectPatterns: [/^\/kr/], locale: 'ko-kr', }, de: { name: 'German', nativeName: 'Deutsch', code: 'de', hreflang: 'de', locale: 'de-de', }, } Object.freeze(languages) export const languageKeys: string[] = Object.keys(languages)