export interface LanguageOption { code: string name: string region?: string } export const GTTS_LANGUAGES: LanguageOption[] = [ { code: 'af', name: 'Afrikaans' }, { code: 'ar', name: 'Arabic' }, { code: 'bg', name: 'Bulgarian' }, { code: 'bn', name: 'Bengali' }, { code: 'bs', name: 'Bosnian' }, { code: 'ca', name: 'Catalan' }, { code: 'cs', name: 'Czech' }, { code: 'cy', name: 'Welsh' }, { code: 'da', name: 'Danish' }, { code: 'de', name: 'German' }, { code: 'el', name: 'Greek' }, { code: 'en', name: 'English', region: 'United States' }, { code: 'en-au', name: 'English', region: 'Australia' }, { code: 'en-ca', name: 'English', region: 'Canada' }, { code: 'en-gb', name: 'English', region: 'UK' }, { code: 'en-ie', name: 'English', region: 'Ireland' }, { code: 'en-in', name: 'English', region: 'India' }, { code: 'en-ng', name: 'English', region: 'Nigeria' }, { code: 'en-nz', name: 'English', region: 'New Zealand' }, { code: 'en-ph', name: 'English', region: 'Philippines' }, { code: 'en-za', name: 'English', region: 'South Africa' }, { code: 'en-tz', name: 'English', region: 'Tanzania' }, { code: 'en-uk', name: 'English', region: 'United Kingdom' }, { code: 'en-us', name: 'English', region: 'United States' }, { code: 'eo', name: 'Esperanto' }, { code: 'es', name: 'Spanish', region: 'Spain' }, { code: 'es-es', name: 'Spanish', region: 'Spain' }, { code: 'es-mx', name: 'Spanish', region: 'Mexico' }, { code: 'es-us', name: 'Spanish', region: 'United States' }, { code: 'et', name: 'Estonian' }, { code: 'eu', name: 'Basque' }, { code: 'fa', name: 'Persian' }, { code: 'fi', name: 'Finnish' }, { code: 'fr', name: 'French', region: 'France' }, { code: 'fr-ca', name: 'French', region: 'Canada' }, { code: 'fr-fr', name: 'French', region: 'France' }, { code: 'ga', name: 'Irish' }, { code: 'gu', name: 'Gujarati' }, { code: 'he', name: 'Hebrew' }, { code: 'hi', name: 'Hindi' }, { code: 'hr', name: 'Croatian' }, { code: 'hu', name: 'Hungarian' }, { code: 'hy', name: 'Armenian' }, { code: 'id', name: 'Indonesian' }, { code: 'is', name: 'Icelandic' }, { code: 'it', name: 'Italian' }, { code: 'ja', name: 'Japanese' }, { code: 'jw', name: 'Javanese' }, { code: 'ka', name: 'Georgian' }, { code: 'kk', name: 'Kazakh' }, { code: 'km', name: 'Khmer' }, { code: 'kn', name: 'Kannada' }, { code: 'ko', name: 'Korean' }, { code: 'la', name: 'Latin' }, { code: 'lv', name: 'Latvian' }, { code: 'mk', name: 'Macedonian' }, { code: 'ml', name: 'Malayalam' }, { code: 'mr', name: 'Marathi' }, { code: 'ms', name: 'Malay' }, { code: 'mt', name: 'Maltese' }, { code: 'my', name: 'Myanmar (Burmese)' }, { code: 'ne', name: 'Nepali' }, { code: 'nl', name: 'Dutch' }, { code: 'no', name: 'Norwegian' }, { code: 'pa', name: 'Punjabi' }, { code: 'pl', name: 'Polish' }, { code: 'pt', name: 'Portuguese', region: 'Brazil' }, { code: 'pt-br', name: 'Portuguese', region: 'Brazil' }, { code: 'pt-pt', name: 'Portuguese', region: 'Portugal' }, { code: 'ro', name: 'Romanian' }, { code: 'ru', name: 'Russian' }, { code: 'si', name: 'Sinhala' }, { code: 'sk', name: 'Slovak' }, { code: 'sl', name: 'Slovenian' }, { code: 'sq', name: 'Albanian' }, { code: 'sr', name: 'Serbian' }, { code: 'su', name: 'Sundanese' }, { code: 'sv', name: 'Swedish' }, { code: 'sw', name: 'Swahili' }, { code: 'ta', name: 'Tamil' }, { code: 'te', name: 'Telugu' }, { code: 'th', name: 'Thai' }, { code: 'tl', name: 'Filipino' }, { code: 'tr', name: 'Turkish' }, { code: 'uk', name: 'Ukrainian' }, { code: 'ur', name: 'Urdu' }, { code: 'vi', name: 'Vietnamese' }, { code: 'yo', name: 'Yoruba' }, { code: 'zh', name: 'Chinese (Mandarin)' }, { code: 'zh-cn', name: 'Chinese', region: 'China' }, { code: 'zh-tw', name: 'Chinese', region: 'Taiwan' }, { code: 'zu', name: 'Zulu' } ] export function getLanguageDisplayName(lang: LanguageOption): string { if (lang.region) { return `${lang.name} (${lang.region}) - ${lang.code}` } return `${lang.name} - ${lang.code}` } export function getSortedLanguages(): LanguageOption[] { return [...GTTS_LANGUAGES].sort((a, b) => { const aDisplay = getLanguageDisplayName(a) const bDisplay = getLanguageDisplayName(b) return aDisplay.localeCompare(bDisplay) }) }