Coverage for src / moai_adk / core / language_config.py: 54.17%

24 statements  

« prev     ^ index     » next       coverage.py v7.12.0, created at 2025-11-20 20:52 +0900

1""" 

2Enhanced language configuration for MoAI-ADK. 

3 

4Supports extended language list with native names and automatic translation capabilities. 

5""" 

6 

7from typing import Dict, Optional 

8 

9# Enhanced language configuration with native names 

10LANGUAGE_CONFIG: Dict[str, Dict[str, str]] = { 

11 "en": { 

12 "name": "English", 

13 "native_name": "English", 

14 "code": "en", 

15 "family": "indo-european", 

16 }, 

17 "ko": { 

18 "name": "Korean", 

19 "native_name": "한국어", 

20 "code": "ko", 

21 "family": "koreanic", 

22 }, 

23 "ja": { 

24 "name": "Japanese", 

25 "native_name": "日本語", 

26 "code": "ja", 

27 "family": "japonic", 

28 }, 

29 "es": { 

30 "name": "Spanish", 

31 "native_name": "Español", # Spanish native representation 

32 "code": "es", 

33 "family": "indo-european", 

34 }, 

35 "fr": { 

36 "name": "French", 

37 "native_name": "Français", 

38 "code": "fr", 

39 "family": "indo-european", 

40 }, 

41 "de": { 

42 "name": "German", 

43 "native_name": "Deutsch", 

44 "code": "de", 

45 "family": "indo-european", 

46 }, 

47 "zh": { 

48 "name": "Chinese", 

49 "native_name": "中文", 

50 "code": "zh", 

51 "family": "sino-tibetan", 

52 }, 

53 "pt": { 

54 "name": "Portuguese", 

55 "native_name": "Português", 

56 "code": "pt", 

57 "family": "indo-european", 

58 }, 

59 "ru": { 

60 "name": "Russian", 

61 "native_name": "Русский", 

62 "code": "ru", 

63 "family": "indo-european", 

64 }, 

65 "it": { 

66 "name": "Italian", 

67 "native_name": "Italiano", 

68 "code": "it", 

69 "family": "indo-european", 

70 }, 

71 "ar": { 

72 "name": "Arabic", 

73 "native_name": "العربية", 

74 "code": "ar", 

75 "family": "afro-asiatic", 

76 }, 

77 "hi": { 

78 "name": "Hindi", 

79 "native_name": "हिन्दी", 

80 "code": "hi", 

81 "family": "indo-european", 

82 }, 

83} 

84 

85 

86def get_language_info(language_code: str) -> Optional[Dict[str, str]]: 

87 """Get language information by code. 

88 

89 Args: 

90 language_code: ISO language code (e.g., 'ko', 'en') 

91 

92 Returns: 

93 Language information dictionary or None if not found 

94 """ 

95 return LANGUAGE_CONFIG.get(language_code.lower()) 

96 

97 

98def get_native_name(language_code: str) -> str: 

99 """Get native language name. 

100 

101 Args: 

102 language_code: ISO language code 

103 

104 Returns: 

105 Native language name or English fallback 

106 """ 

107 lang_info = get_language_info(language_code) 

108 return lang_info["native_name"] if lang_info else "English" 

109 

110 

111def get_english_name(language_code: str) -> str: 

112 """Get English language name. 

113 

114 Args: 

115 language_code: ISO language code 

116 

117 Returns: 

118 English language name or fallback 

119 """ 

120 lang_info = get_language_info(language_code) 

121 return lang_info["name"] if lang_info else "English" 

122 

123 

124def get_all_supported_codes() -> list[str]: 

125 """Get list of all supported language codes.""" 

126 return list(LANGUAGE_CONFIG.keys()) 

127 

128 

129def get_language_family(language_code: str) -> Optional[str]: 

130 """Get language family for linguistic analysis. 

131 

132 Args: 

133 language_code: ISO language code 

134 

135 Returns: 

136 Language family string or None 

137 """ 

138 lang_info = get_language_info(language_code) 

139 return lang_info.get("family") if lang_info else None 

140 

141 

142# Language to Claude model mapping for optimal performance 

143LANGUAGE_MODEL_PREFERENCE: Dict[str, str] = { 

144 "en": "claude-sonnet-4-5-20250929", # Best for English 

145 "ko": "claude-sonnet-4-5-20250929", # Strong Korean support 

146 "ja": "claude-sonnet-4-5-20250929", # Strong Japanese support 

147 "es": "claude-sonnet-4-5-20250929", # Strong Spanish support 

148 "fr": "claude-sonnet-4-5-20250929", # Strong French support 

149 "de": "claude-sonnet-4-5-20250929", # Strong German support 

150 "zh": "claude-sonnet-4-5-20250929", # Strong Chinese support 

151 "pt": "claude-sonnet-4-5-20250929", # Portuguese support 

152 "ru": "claude-sonnet-4-5-20250929", # Russian support 

153 "it": "claude-sonnet-4-5-20250929", # Italian support 

154 "ar": "claude-sonnet-4-5-20250929", # Arabic support 

155 "hi": "claude-sonnet-4-5-20250929", # Hindi support 

156} 

157 

158 

159def get_optimal_model(language_code: str) -> str: 

160 """Get optimal Claude model for specific language. 

161 

162 Args: 

163 language_code: ISO language code 

164 

165 Returns: 

166 Recommended Claude model identifier 

167 """ 

168 return LANGUAGE_MODEL_PREFERENCE.get(language_code, "claude-sonnet-4-5-20250929") 

169 

170 

171# RTL (Right-to-Left) language detection 

172RTL_LANGUAGES = {"ar", "he", "fa", "ur"} 

173 

174 

175def is_rtl_language(language_code: str) -> bool: 

176 """Check if language uses right-to-left script. 

177 

178 Args: 

179 language_code: ISO language code 

180 

181 Returns: 

182 True if RTL language, False otherwise 

183 """ 

184 return language_code.lower() in RTL_LANGUAGES 

185 

186 

187# Translation priorities for descriptions 

188TRANSLATION_PRIORITY = [ 

189 "en", # English base 

190 "ko", # Korean 

191 "ja", # Japanese 

192 "es", # Spanish 

193 "fr", # French 

194 "de", # German 

195 "zh", # Chinese 

196 "pt", # Portuguese 

197] 

198 

199 

200def get_translation_priority() -> list[str]: 

201 """Get language translation priority order.""" 

202 return TRANSLATION_PRIORITY.copy()