managarten/packages/shared-i18n/src/languages.ts
Wuesteon d36b321d9d style: auto-format codebase with Prettier
Applied formatting to 1487+ files using pnpm format:write
  - TypeScript/JavaScript files
  - Svelte components
  - Astro pages
  - JSON configs
  - Markdown docs

  13 files still need manual review (Astro JSX comments)
2025-11-27 18:33:16 +01:00

225 lines
6.3 KiB
TypeScript

/**
* Language definitions and metadata
*/
/**
* Supported language codes
*/
export type LanguageCode =
| 'en'
| 'de'
| 'fr'
| 'es'
| 'it'
| 'pt'
| 'nl'
| 'pl'
| 'ru'
| 'ja'
| 'ko'
| 'zh'
| 'ar'
| 'hi'
| 'bn'
| 'ur'
| 'id'
| 'fa'
| 'vi'
| 'th'
| 'tr'
| 'uk'
| 'cs'
| 'da'
| 'fi'
| 'sv'
| 'nb'
| 'el'
| 'hu'
| 'ro'
| 'bg'
| 'hr'
| 'sk'
| 'sl'
| 'sr'
| 'lt'
| 'lv'
| 'et'
| 'mt'
| 'ga'
| 'tl'
| 'ms'
| 'he'
| 'af'
| 'pt-BR'
| 'es-MX';
/**
* Language metadata
*/
export interface LanguageInfo {
/** Native name of the language */
nativeName: string;
/** English name of the language */
englishName: string;
/** Flag emoji */
emoji: string;
/** RTL language */
rtl?: boolean;
}
/**
* Complete language definitions
*/
export const LANGUAGES: Record<LanguageCode, LanguageInfo> = {
// Major languages
en: { nativeName: 'English', englishName: 'English', emoji: '🇬🇧' },
de: { nativeName: 'Deutsch', englishName: 'German', emoji: '🇩🇪' },
fr: { nativeName: 'Français', englishName: 'French', emoji: '🇫🇷' },
es: { nativeName: 'Español', englishName: 'Spanish', emoji: '🇪🇸' },
it: { nativeName: 'Italiano', englishName: 'Italian', emoji: '🇮🇹' },
pt: { nativeName: 'Português', englishName: 'Portuguese', emoji: '🇵🇹' },
nl: { nativeName: 'Nederlands', englishName: 'Dutch', emoji: '🇳🇱' },
pl: { nativeName: 'Polski', englishName: 'Polish', emoji: '🇵🇱' },
ru: { nativeName: 'Русский', englishName: 'Russian', emoji: '🇷🇺' },
// Asian languages
ja: { nativeName: '日本語', englishName: 'Japanese', emoji: '🇯🇵' },
ko: { nativeName: '한국어', englishName: 'Korean', emoji: '🇰🇷' },
zh: { nativeName: '中文', englishName: 'Chinese', emoji: '🇨🇳' },
vi: { nativeName: 'Tiếng Việt', englishName: 'Vietnamese', emoji: '🇻🇳' },
th: { nativeName: 'ไทย', englishName: 'Thai', emoji: '🇹🇭' },
id: { nativeName: 'Bahasa Indonesia', englishName: 'Indonesian', emoji: '🇮🇩' },
ms: { nativeName: 'Bahasa Melayu', englishName: 'Malay', emoji: '🇲🇾' },
tl: { nativeName: 'Filipino', englishName: 'Filipino', emoji: '🇵🇭' },
// South Asian languages
hi: { nativeName: 'हिन्दी', englishName: 'Hindi', emoji: '🇮🇳' },
bn: { nativeName: 'বাংলা', englishName: 'Bengali', emoji: '🇧🇩' },
ur: { nativeName: 'اردو', englishName: 'Urdu', emoji: '🇵🇰', rtl: true },
// Middle Eastern languages
ar: { nativeName: 'العربية', englishName: 'Arabic', emoji: '🇦🇪', rtl: true },
fa: { nativeName: 'فارسی', englishName: 'Persian', emoji: '🇮🇷', rtl: true },
he: { nativeName: 'עברית', englishName: 'Hebrew', emoji: '🇮🇱', rtl: true },
tr: { nativeName: 'Türkçe', englishName: 'Turkish', emoji: '🇹🇷' },
// Nordic languages
sv: { nativeName: 'Svenska', englishName: 'Swedish', emoji: '🇸🇪' },
da: { nativeName: 'Dansk', englishName: 'Danish', emoji: '🇩🇰' },
fi: { nativeName: 'Suomi', englishName: 'Finnish', emoji: '🇫🇮' },
nb: { nativeName: 'Norsk', englishName: 'Norwegian', emoji: '🇳🇴' },
// Eastern European languages
uk: { nativeName: 'Українська', englishName: 'Ukrainian', emoji: '🇺🇦' },
cs: { nativeName: 'Čeština', englishName: 'Czech', emoji: '🇨🇿' },
hu: { nativeName: 'Magyar', englishName: 'Hungarian', emoji: '🇭🇺' },
ro: { nativeName: 'Română', englishName: 'Romanian', emoji: '🇷🇴' },
bg: { nativeName: 'Български', englishName: 'Bulgarian', emoji: '🇧🇬' },
hr: { nativeName: 'Hrvatski', englishName: 'Croatian', emoji: '🇭🇷' },
sk: { nativeName: 'Slovenčina', englishName: 'Slovak', emoji: '🇸🇰' },
sl: { nativeName: 'Slovenščina', englishName: 'Slovenian', emoji: '🇸🇮' },
sr: { nativeName: 'Српски', englishName: 'Serbian', emoji: '🇷🇸' },
// Baltic languages
lt: { nativeName: 'Lietuvių', englishName: 'Lithuanian', emoji: '🇱🇹' },
lv: { nativeName: 'Latviešu', englishName: 'Latvian', emoji: '🇱🇻' },
et: { nativeName: 'Eesti', englishName: 'Estonian', emoji: '🇪🇪' },
// Other European languages
el: { nativeName: 'Ελληνικά', englishName: 'Greek', emoji: '🇬🇷' },
mt: { nativeName: 'Malti', englishName: 'Maltese', emoji: '🇲🇹' },
ga: { nativeName: 'Gaeilge', englishName: 'Irish', emoji: '🇮🇪' },
// African languages
af: { nativeName: 'Afrikaans', englishName: 'Afrikaans', emoji: '🇿🇦' },
// Regional variants
'pt-BR': { nativeName: 'Português (Brasil)', englishName: 'Portuguese (Brazil)', emoji: '🇧🇷' },
'es-MX': { nativeName: 'Español (México)', englishName: 'Spanish (Mexico)', emoji: '🇲🇽' },
};
/**
* Get list of all language codes
*/
export function getLanguageCodes(): LanguageCode[] {
return Object.keys(LANGUAGES) as LanguageCode[];
}
/**
* Get language info by code
*/
export function getLanguageInfo(code: string): LanguageInfo | undefined {
return LANGUAGES[code as LanguageCode];
}
/**
* Check if a language code is supported
*/
export function isLanguageSupported(code: string): code is LanguageCode {
return code in LANGUAGES;
}
/**
* Check if a language is RTL
*/
export function isRTL(code: string): boolean {
const info = LANGUAGES[code as LanguageCode];
return info?.rtl === true;
}
/**
* Get display name for a language (native name with emoji)
*/
export function getLanguageDisplayName(code: string): string {
const info = LANGUAGES[code as LanguageCode];
if (!info) return code;
return `${info.emoji} ${info.nativeName}`;
}
/**
* Common locale groups for filtering
*/
export const LOCALE_GROUPS = {
/** European Union official languages */
eu: [
'en',
'de',
'fr',
'es',
'it',
'pt',
'nl',
'pl',
'cs',
'da',
'fi',
'sv',
'el',
'hu',
'ro',
'bg',
'hr',
'sk',
'sl',
'lt',
'lv',
'et',
'mt',
'ga',
] as LanguageCode[],
/** Major world languages */
major: ['en', 'de', 'fr', 'es', 'it', 'pt', 'ru', 'ja', 'ko', 'zh', 'ar'] as LanguageCode[],
/** DACH region (German-speaking) */
dach: ['de'] as LanguageCode[],
/** Nordic countries */
nordic: ['sv', 'da', 'fi', 'nb'] as LanguageCode[],
/** RTL languages */
rtl: ['ar', 'fa', 'he', 'ur'] as LanguageCode[],
};
/**
* Get languages by group
*/
export function getLanguagesByGroup(group: keyof typeof LOCALE_GROUPS): LanguageCode[] {
return LOCALE_GROUPS[group];
}