import 'package:get/get.dart'; import '../../core/utils/logger.dart'; /// 语言信息类,包含语言的各种表示形式 class LanguageInfo { /// 短代码,如 'zh', 'en' final String shortCode; /// 中文名称 final String chineseName; /// 英文名称 final String englishName; /// Azure ASR 语言代码,如 'zh-CN', 'en-US' final String asrCode; /// Azure TTS 语音名称 final String ttsVoiceName; /// 备注信息 final String? note; LanguageInfo({ required this.shortCode, required this.chineseName, required this.englishName, required this.asrCode, required this.ttsVoiceName, this.note, }); } /// 语言类型管理类,提供语言信息的查询和转换功能 class LanguageManager extends GetxService { // 单例实例 static LanguageManager? _instance; // 单例工厂方法 factory LanguageManager() { _instance ??= LanguageManager._internal(); return _instance!; } // 私有构造函数 LanguageManager._internal() { _initLanguageMap(); } // 语言信息映射表,以 ASR 代码为键 final Map _languageMap = {}; // 中文名称到 ASR 代码的映射 final Map _chineseNameToAsrCodeMap = {}; // 英文名称到 ASR 代码的映射 final Map _englishNameToAsrCodeMap = {}; // 短代码到 ASR 代码的映射 final Map _shortCodeToAsrCodeMap = {}; /// 初始化语言映射表 void _initLanguageMap() { // 中文相关 _addLanguage( shortCode: 'zh', chineseName: '中文(简体)', englishName: 'Chinese (simplified)', asrCode: 'zh-CN', ttsVoiceName: 'zh-CN-XiaoxiaoNeural', ); _addLanguage( shortCode: 'zh-Hant', chineseName: '中文(繁体)', englishName: 'Chinese (traditional)', asrCode: 'zh-TW', ttsVoiceName: 'zh-TW-HsiaoChenNeural', ); _addLanguage( shortCode: 'zh-Hant-hk', chineseName: '中文(香港繁体)', englishName: 'Chinese (Hongkong traditional)', asrCode: 'zh-HK', ttsVoiceName: 'zh-HK-HiuMaanNeural', ); // 英语相关 _addLanguage( shortCode: 'en', chineseName: '英语', englishName: 'English', asrCode: 'en-US', ttsVoiceName: 'en-US-AriaNeural', ); // 日语相关 _addLanguage( shortCode: 'ja', chineseName: '日语', englishName: 'Japanese', asrCode: 'ja-JP', ttsVoiceName: 'ja-JP-NanamiNeural', ); // 韩语相关 _addLanguage( shortCode: 'ko', chineseName: '韩语', englishName: 'Korean', asrCode: 'ko-KR', ttsVoiceName: 'ko-KR-SunHiNeural', ); // 欧洲语言 _addLanguage( shortCode: 'fr', chineseName: '法语', englishName: 'French', asrCode: 'fr-FR', ttsVoiceName: 'fr-FR-DeniseNeural', ); _addLanguage( shortCode: 'es', chineseName: '西班牙语', englishName: 'Spanish', asrCode: 'es-ES', ttsVoiceName: 'es-ES-ElviraNeural', ); _addLanguage( shortCode: 'pt', chineseName: '葡萄牙语', englishName: 'Portuguese', asrCode: 'pt-BR', ttsVoiceName: 'pt-BR-FranciscaNeural', ); _addLanguage( shortCode: 'it', chineseName: '意大利语', englishName: 'Italian', asrCode: 'it-IT', ttsVoiceName: 'it-IT-ElsaNeural', ); _addLanguage( shortCode: 'de', chineseName: '德语', englishName: 'German', asrCode: 'de-DE', ttsVoiceName: 'de-DE-KatjaNeural', ); _addLanguage( shortCode: 'ru', chineseName: '俄语', englishName: 'Russian', asrCode: 'ru-RU', ttsVoiceName: 'ru-RU-SvetlanaNeural', ); _addLanguage( shortCode: 'pl', chineseName: '波兰语', englishName: 'Polish', asrCode: 'pl-PL', ttsVoiceName: 'pl-PL-AgnieszkaNeural', ); _addLanguage( shortCode: 'nl', chineseName: '荷兰语', englishName: 'Dutch', asrCode: 'nl-NL', ttsVoiceName: 'nl-NL-ColetteNeural', ); _addLanguage( shortCode: 'sv', chineseName: '瑞典语', englishName: 'Swedish', asrCode: 'sv-SE', ttsVoiceName: 'sv-SE-SofieNeural', ); _addLanguage( shortCode: 'cs', chineseName: '捷克语', englishName: 'Czech', asrCode: 'cs-CZ', ttsVoiceName: 'cs-CZ-VlastaNeural', ); _addLanguage( shortCode: 'el', chineseName: '现代希腊语', englishName: 'Modern Greek', asrCode: 'el-GR', ttsVoiceName: 'el-GR-AthinaNeural', ); _addLanguage( shortCode: 'ro', chineseName: '罗马尼亚语', englishName: 'Romanian', asrCode: 'ro-RO', ttsVoiceName: 'ro-RO-AlinaNeural', ); _addLanguage( shortCode: 'hu', chineseName: '匈牙利语', englishName: 'Hungarian', asrCode: 'hu-HU', ttsVoiceName: 'hu-HU-NoemiNeural', ); _addLanguage( shortCode: 'uk', chineseName: '乌克兰语', englishName: 'Ukrainian', asrCode: 'uk-UA', ttsVoiceName: 'uk-UA-PolinaNeural', ); _addLanguage( shortCode: 'da', chineseName: '丹麦语', englishName: 'Danish', asrCode: 'da-DK', ttsVoiceName: 'da-DK-ChristelNeural', ); _addLanguage( shortCode: 'fi', chineseName: '芬兰语', englishName: 'Finnish', asrCode: 'fi-FI', ttsVoiceName: 'fi-FI-NooraNeural', ); _addLanguage( shortCode: 'no', chineseName: '挪威语', englishName: 'Norwegian', asrCode: 'nb-NO', ttsVoiceName: 'nb-NO-IselinNeural', ); _addLanguage( shortCode: 'hr', chineseName: '克罗地亚语', englishName: 'Croatian', asrCode: 'hr-HR', ttsVoiceName: 'hr-HR-GabrijelaNeural', ); _addLanguage( shortCode: 'ca', chineseName: '加泰隆语', englishName: 'Catalan', asrCode: 'ca-ES', ttsVoiceName: 'ca-ES-JoanaNeural', ); // 亚洲语言 _addLanguage( shortCode: 'ar', chineseName: '阿拉伯语', englishName: 'Arabic', asrCode: 'ar-EG', ttsVoiceName: 'ar-EG-SalmaNeural', ); _addLanguage( shortCode: 'th', chineseName: '泰语', englishName: 'Thai', asrCode: 'th-TH', ttsVoiceName: 'th-TH-PremwadeeNeural', ); _addLanguage( shortCode: 'vi', chineseName: '越南语', englishName: 'Vietnamese', asrCode: 'vi-VN', ttsVoiceName: 'vi-VN-HoaiMyNeural', ); _addLanguage( shortCode: 'id', chineseName: '印尼语', englishName: 'Indonesian', asrCode: 'id-ID', ttsVoiceName: 'id-ID-GadisNeural', ); _addLanguage( shortCode: 'hi', chineseName: '印地语', englishName: 'Hindi', asrCode: 'hi-IN', ttsVoiceName: 'hi-IN-SwaraNeural', ); _addLanguage( shortCode: 'tr', chineseName: '土耳其语', englishName: 'Turkish', asrCode: 'tr-TR', ttsVoiceName: 'tr-TR-EmelNeural', ); _addLanguage( shortCode: 'ms', chineseName: '马来语', englishName: 'Malay', asrCode: 'ms-MY', ttsVoiceName: 'ms-MY-YasminNeural', ); _addLanguage( shortCode: 'bn', chineseName: '孟加拉语', englishName: 'Bengali', asrCode: 'bn-IN', ttsVoiceName: 'bn-IN-TanishaaNeural', ); _addLanguage( shortCode: 'ta', chineseName: '泰米尔语', englishName: 'Tamil', asrCode: 'ta-IN', ttsVoiceName: 'ta-IN-PallaviNeural', ); _addLanguage( shortCode: 'te', chineseName: '泰卢固语', englishName: 'Telugu', asrCode: 'te-IN', ttsVoiceName: 'te-IN-ShrutiNeural', ); _addLanguage( shortCode: 'mr', chineseName: '马拉提语', englishName: 'Marathi', asrCode: 'mr-IN', ttsVoiceName: 'mr-IN-AarohiNeural', ); _addLanguage( shortCode: 'ur', chineseName: '乌尔都语', englishName: 'Urdu', asrCode: 'ur-IN', ttsVoiceName: 'ur-IN-GulNeural', ); _addLanguage( shortCode: 'fa', chineseName: '波斯语', englishName: 'Persian', asrCode: 'fa-IR', ttsVoiceName: 'fa-IR-DilaraNeural', ); // 非洲语言 _addLanguage( shortCode: 'sw', chineseName: '斯瓦希里语', englishName: 'Swahili', asrCode: 'sw-KE', ttsVoiceName: 'sw-KE-ZuriNeural', ); Logger.info('语言管理器初始化完成,共加载 ${_languageMap.length} 种语言'); } /// 添加语言信息到映射表 void _addLanguage({ required String shortCode, required String chineseName, required String englishName, required String asrCode, required String ttsVoiceName, String? note, }) { final languageInfo = LanguageInfo( shortCode: shortCode, chineseName: chineseName, englishName: englishName, asrCode: asrCode, ttsVoiceName: ttsVoiceName, note: note, ); _languageMap[asrCode] = languageInfo; _chineseNameToAsrCodeMap[chineseName] = asrCode; _englishNameToAsrCodeMap[englishName] = asrCode; _shortCodeToAsrCodeMap[shortCode] = asrCode; } /// 获取所有支持的语言信息 Map getAllLanguages() { return Map.from(_languageMap); } /// 获取所有支持的语言的中文名称 List getAllChineseNames() { return _chineseNameToAsrCodeMap.keys.toList(); } /// 获取所有支持的语言的英文名称 List getAllEnglishNames() { return _englishNameToAsrCodeMap.keys.toList(); } /// 根据 ASR 代码获取语言信息 LanguageInfo? getLanguageByAsrCode(String asrCode) { return _languageMap[asrCode]; } /// 根据中文名称获取语言信息 LanguageInfo? getLanguageByChineseName(String chineseName) { final asrCode = _chineseNameToAsrCodeMap[chineseName]; if (asrCode == null) return null; return _languageMap[asrCode]; } /// 根据英文名称获取语言信息 LanguageInfo? getLanguageByEnglishName(String englishName) { final asrCode = _englishNameToAsrCodeMap[englishName]; if (asrCode == null) return null; return _languageMap[asrCode]; } /// 根据短代码获取语言信息 LanguageInfo? getLanguageByShortCode(String shortCode) { final asrCode = _shortCodeToAsrCodeMap[shortCode]; if (asrCode == null) return null; return _languageMap[asrCode]; } /// 根据中文名称获取 ASR 代码 String? getAsrCodeByChineseName(String chineseName) { return _chineseNameToAsrCodeMap[chineseName]; } /// 根据英文名称获取 ASR 代码 String? getAsrCodeByEnglishName(String englishName) { return _englishNameToAsrCodeMap[englishName]; } /// 根据短代码获取 ASR 代码 String? getAsrCodeByShortCode(String shortCode) { return _shortCodeToAsrCodeMap[shortCode]; } /// 根据 ASR 代码获取中文名称 String? getChineseNameByAsrCode(String asrCode) { final languageInfo = _languageMap[asrCode]; return languageInfo?.chineseName; } /// 根据 ASR 代码获取英文名称 String? getEnglishNameByAsrCode(String asrCode) { final languageInfo = _languageMap[asrCode]; return languageInfo?.englishName; } /// 根据 ASR 代码获取短代码 String? getShortCodeByAsrCode(String asrCode) { final languageInfo = _languageMap[asrCode]; return languageInfo?.shortCode; } /// 根据 ASR 代码获取 TTS 语音名称 String? getTtsVoiceNameByAsrCode(String asrCode) { final languageInfo = _languageMap[asrCode]; return languageInfo?.ttsVoiceName; } /// 根据中文名称获取 TTS 语音名称 String? getTtsVoiceNameByChineseName(String chineseName) { final asrCode = _chineseNameToAsrCodeMap[chineseName]; if (asrCode == null) return null; return _languageMap[asrCode]?.ttsVoiceName; } /// 根据短代码获取中文名称 String? getChineseNameByShortCode(String shortCode) { final asrCode = _shortCodeToAsrCodeMap[shortCode]; if (asrCode == null) return null; return _languageMap[asrCode]?.chineseName; } /// 根据短代码获取英文名称 String? getEnglishNameByShortCode(String shortCode) { final asrCode = _shortCodeToAsrCodeMap[shortCode]; if (asrCode == null) return null; return _languageMap[asrCode]?.englishName; } /// 根据短代码获取 TTS 语音名称 String? getTtsVoiceNameByShortCode(String shortCode) { final asrCode = _shortCodeToAsrCodeMap[shortCode]; if (asrCode == null) return null; return _languageMap[asrCode]?.ttsVoiceName; } /// 获取中文名称到 ASR 代码的映射 Map getChineseNameToAsrCodeMap() { return Map.from(_chineseNameToAsrCodeMap); } /// 获取英文名称到 ASR 代码的映射 Map getEnglishNameToAsrCodeMap() { return Map.from(_englishNameToAsrCodeMap); } /// 获取短代码到 ASR 代码的映射 Map getShortCodeToAsrCodeMap() { return Map.from(_shortCodeToAsrCodeMap); } }