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
« prev ^ index » next coverage.py v7.12.0, created at 2025-11-20 20:52 +0900
1"""
2Enhanced language configuration for MoAI-ADK.
4Supports extended language list with native names and automatic translation capabilities.
5"""
7from typing import Dict, Optional
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}
86def get_language_info(language_code: str) -> Optional[Dict[str, str]]:
87 """Get language information by code.
89 Args:
90 language_code: ISO language code (e.g., 'ko', 'en')
92 Returns:
93 Language information dictionary or None if not found
94 """
95 return LANGUAGE_CONFIG.get(language_code.lower())
98def get_native_name(language_code: str) -> str:
99 """Get native language name.
101 Args:
102 language_code: ISO language code
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"
111def get_english_name(language_code: str) -> str:
112 """Get English language name.
114 Args:
115 language_code: ISO language code
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"
124def get_all_supported_codes() -> list[str]:
125 """Get list of all supported language codes."""
126 return list(LANGUAGE_CONFIG.keys())
129def get_language_family(language_code: str) -> Optional[str]:
130 """Get language family for linguistic analysis.
132 Args:
133 language_code: ISO language code
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
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}
159def get_optimal_model(language_code: str) -> str:
160 """Get optimal Claude model for specific language.
162 Args:
163 language_code: ISO language code
165 Returns:
166 Recommended Claude model identifier
167 """
168 return LANGUAGE_MODEL_PREFERENCE.get(language_code, "claude-sonnet-4-5-20250929")
171# RTL (Right-to-Left) language detection
172RTL_LANGUAGES = {"ar", "he", "fa", "ur"}
175def is_rtl_language(language_code: str) -> bool:
176 """Check if language uses right-to-left script.
178 Args:
179 language_code: ISO language code
181 Returns:
182 True if RTL language, False otherwise
183 """
184 return language_code.lower() in RTL_LANGUAGES
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]
200def get_translation_priority() -> list[str]:
201 """Get language translation priority order."""
202 return TRANSLATION_PRIORITY.copy()