datbkpro commited on
Commit
6d48dc9
·
verified ·
1 Parent(s): 22ff288

Update core/multilingual_manager.py

Browse files
Files changed (1) hide show
  1. core/multilingual_manager.py +317 -88
core/multilingual_manager.py CHANGED
@@ -1,50 +1,161 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import re
2
  from typing import Dict, Tuple, Optional
3
  from sentence_transformers import SentenceTransformer
 
4
  from config.settings import settings
5
 
6
  class MultilingualManager:
7
  def __init__(self):
8
  self.vietnamese_model = None
9
  self.multilingual_model = None
10
- self.current_language = 'vi'
11
-
12
- # Phát hiện thuộc ngôn ngữ dựa trên các mẫu ký tự và từ phổ biến
13
- self.language_patterns = {
14
- 'vi': {
15
- 'chars': set('àáâãèéêìíòóôõùúýăđĩũơưạảấầẩẫậắằẳẵặẹẻẽếềểễệỉịọỏốồổỗộớờởỡợụủứừửữựỳỵỷỹ'),
16
- 'common_words': ['của', 'và', 'là', 'có', 'được', 'trong', 'cho', 'với', 'như', 'tôi']
17
- },
18
- 'en': {
19
- 'chars': set('abcdefghijklmnopqrstuvwxyz'),
20
- 'common_words': ['the', 'and', 'is', 'are', 'for', 'with', 'this', 'that', 'you', 'they']
21
- },
22
- 'fr': {
23
- 'chars': set('àâæçèéêëîïôœùûüÿ'),
24
- 'common_words': ['le', 'la', 'et', 'est', 'dans', 'pour', 'avec', 'vous', 'nous', 'ils']
25
- },
26
- 'es': {
27
- 'chars': set('áéíóúñü'),
28
- 'common_words': ['el', 'la', 'y', 'es', 'en', 'por', 'con', 'los', 'las', 'del']
29
- },
30
- 'de': {
31
- 'chars': set('äöüß'),
32
- 'common_words': ['der', 'die', 'das', 'und', 'ist', 'in', 'für', 'mit', 'sich', 'nicht']
33
- },
34
- 'ja': {
35
- 'chars': set('ぁ-んァ-ン一-龯'),
36
- 'common_words': ['の', 'に', 'は', 'を', 'た', 'で', 'し', 'が', 'ます', 'です']
37
- },
38
- 'ko': {
39
- 'chars': set('가-힣'),
40
- 'common_words': ['이', '그', '에', '를', '의', '에', '에서', '으로', '하다', '이다']
41
- },
42
- 'zh': {
43
- 'chars': set('一-鿌'),
44
- 'common_words': ['的', '是', '在', '有', '和', '了', '人', '我', '他', '这']
45
- }
46
- }
47
  self._initialize_models()
 
48
  def _initialize_models(self):
49
  """Khởi tạo các mô hình đa ngôn ngữ"""
50
  try:
@@ -53,94 +164,212 @@ class MultilingualManager:
53
  print("✅ Đã tải mô hình embedding tiếng Việt")
54
  except Exception as e:
55
  print(f"❌ Lỗi tải mô hình embedding tiếng Việt: {e}")
 
56
  self.vietnamese_model = None
57
 
58
  try:
59
  print("🔄 Đang tải mô hình embedding đa ngôn ngữ...")
60
- self.multilingual_model = SentenceTransformer(settings.MULTILINGUAL_EMBEDDING_MODEL,trust_remote_code=True )
 
 
 
61
  print("✅ Đã tải mô hình embedding đa ngôn ngữ")
62
  except Exception as e:
63
  print(f"❌ Lỗi tải mô hình embedding đa ngôn ngữ: {e}")
64
- self.multilingual_model = None
65
-
66
- def detect_language(self, text: str) -> str:
67
- """Phát hiện ngôn ngữ với độ chính xác cao"""
 
 
 
 
 
 
 
 
68
  if not text or len(text.strip()) == 0:
69
  return 'vi' # Default to Vietnamese
70
 
71
- text_lower = text.lower()
72
- scores = {}
 
 
 
73
 
74
- for lang, patterns in self.language_patterns.items():
75
- score = 0
 
 
 
 
 
 
 
 
 
 
 
 
 
76
 
77
- # Score based on special characters
78
- char_score = sum(1 for char in text if char in patterns['chars'])
79
- score += char_score * 2
 
 
80
 
81
- # Score based on common words
82
- word_score = sum(1 for word in patterns['common_words'] if word in text_lower)
83
- score += word_score
84
 
85
- scores[lang] = score
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86
 
87
- # Return language with highest score
88
- detected_lang = max(scores.items(), key=lambda x: x[1])[0]
 
 
89
 
90
- # If no strong detection, use character-based fallback
91
- if max(scores.values()) < 3:
92
- vietnamese_chars = set('àáâãèéêìíòóôõùúýăđĩũơưạảấầẩẫậắằẳẵặẹẻẽếềểễệỉịọỏốồổỗộớờởỡợụủứừửữựỳỵỷỹ')
93
- if any(char in vietnamese_chars for char in text):
94
- return 'vi'
95
- elif any(char in text for char in 'あいうえおぁ-んァ-ン'):
 
 
 
 
 
 
 
 
 
 
96
  return 'ja'
97
  elif any(char in text for char in '你好'):
98
  return 'zh'
99
  elif any(char in text for char in '안녕'):
100
  return 'ko'
 
 
 
 
 
 
101
  else:
102
- return 'en' # Default to English for other cases
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
 
104
- return detected_lang
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
105
  def get_embedding_model(self, language: str = None) -> Optional[SentenceTransformer]:
106
  """Lấy mô hình embedding dựa trên ngôn ngữ đã phát hiện"""
107
- lang = language if language in settings.SUPPORTED_LANGUAGES else self.current_language
 
 
 
108
 
109
- if lang == 'vi':
110
  return self.vietnamese_model
111
  else:
112
  return self.multilingual_model
113
-
114
  def get_llm_model(self, language: str = None) -> str:
115
  """Lấy tên mô hình LLM dựa trên ngôn ngữ đã phát hiện"""
116
- lang = language if language in settings.SUPPORTED_LANGUAGES else self.current_language
 
 
 
117
 
118
  if lang == 'vi':
119
  return settings.VIETNAMESE_LLM_MODEL
120
  else:
121
  return settings.MULTILINGUAL_LLM_MODEL
122
-
123
  def get_language_info(self, language: str = None) -> Dict:
124
  """Lấy thông tin ngôn ngữ bao gồm mã và tên đầy đủ"""
125
- lang = language if language in settings.SUPPORTED_LANGUAGES else self.current_language
126
-
127
- model_info = {
128
- 'vi': {
129
- 'name': 'Tiếng Việt',
130
- 'embedding_model': settings.VIETNAMESE_EMBEDDING_MODEL,
131
- 'llm_model': settings.VIETNAMESE_LLM_MODEL,
132
- 'status': 'active' if self.vietnamese_model else 'inactive'
133
- },
134
- 'other': {
135
- 'name': 'Multilingual',
136
- 'embedding_model': settings.MULTILINGUAL_EMBEDDING_MODEL,
137
- 'llm_model': settings.MULTILINGUAL_LLM_MODEL,
138
- 'status': 'active' if self.multilingual_model else 'inactive'
139
- }
140
  }
141
 
142
- if lang == 'vi':
143
- return model_info['vi']
144
- else:
145
- return model_info['other']
146
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # import re
2
+ # from typing import Dict, Tuple, Optional
3
+ # from sentence_transformers import SentenceTransformer
4
+ # from config.settings import settings
5
+
6
+ # class MultilingualManager:
7
+ # def __init__(self):
8
+ # self.vietnamese_model = None
9
+ # self.multilingual_model = None
10
+ # self.current_language = 'vi'
11
+
12
+ # # Phát hiện thuộc ngôn ngữ dựa trên các mẫu ký tự và từ phổ biến
13
+ # self.language_patterns = {
14
+ # 'vi': {
15
+ # 'chars': set('àáâãèéêìíòóôõùúýăđĩũơưạảấầẩẫậắằẳẵặẹẻẽếềểễệỉịọỏốồổỗộớờởỡợụủứừửữựỳỵỷỹ'),
16
+ # 'common_words': ['của', 'và', 'là', 'có', 'được', 'trong', 'cho', 'với', 'như', 'tôi']
17
+ # },
18
+ # 'en': {
19
+ # 'chars': set('abcdefghijklmnopqrstuvwxyz'),
20
+ # 'common_words': ['the', 'and', 'is', 'are', 'for', 'with', 'this', 'that', 'you', 'they']
21
+ # },
22
+ # 'fr': {
23
+ # 'chars': set('àâæçèéêëîïôœùûüÿ'),
24
+ # 'common_words': ['le', 'la', 'et', 'est', 'dans', 'pour', 'avec', 'vous', 'nous', 'ils']
25
+ # },
26
+ # 'es': {
27
+ # 'chars': set('áéíóúñü'),
28
+ # 'common_words': ['el', 'la', 'y', 'es', 'en', 'por', 'con', 'los', 'las', 'del']
29
+ # },
30
+ # 'de': {
31
+ # 'chars': set('äöüß'),
32
+ # 'common_words': ['der', 'die', 'das', 'und', 'ist', 'in', 'für', 'mit', 'sich', 'nicht']
33
+ # },
34
+ # 'ja': {
35
+ # 'chars': set('ぁ-んァ-ン一-龯'),
36
+ # 'common_words': ['の', 'に', 'は', 'を', 'た', 'で', 'し', 'が', 'ます', 'です']
37
+ # },
38
+ # 'ko': {
39
+ # 'chars': set('가-힣'),
40
+ # 'common_words': ['이', '그', '에', '를', '의', '에', '에서', '으로', '하다', '이다']
41
+ # },
42
+ # 'zh': {
43
+ # 'chars': set('一-鿌'),
44
+ # 'common_words': ['的', '是', '在', '有', '和', '了', '人', '我', '他', '这']
45
+ # }
46
+ # }
47
+ # self._initialize_models()
48
+ # def _initialize_models(self):
49
+ # """Khởi tạo các mô hình đa ngôn ngữ"""
50
+ # try:
51
+ # print("🔄 Đang tải mô hình embedding tiếng Việt...")
52
+ # self.vietnamese_model = SentenceTransformer(settings.VIETNAMESE_EMBEDDING_MODEL)
53
+ # print("✅ Đã tải mô hình embedding tiếng Việt")
54
+ # except Exception as e:
55
+ # print(f"❌ Lỗi tải mô hình embedding tiếng Việt: {e}")
56
+ # self.vietnamese_model = None
57
+
58
+ # try:
59
+ # print("🔄 Đang tải mô hình embedding đa ngôn ngữ...")
60
+ # self.multilingual_model = SentenceTransformer(settings.MULTILINGUAL_EMBEDDING_MODEL,trust_remote_code=True )
61
+ # print("✅ Đã tải mô hình embedding đa ngôn ngữ")
62
+ # except Exception as e:
63
+ # print(f"❌ Lỗi tải mô hình embedding đa ngôn ngữ: {e}")
64
+ # self.multilingual_model = None
65
+
66
+ # def detect_language(self, text: str) -> str:
67
+ # """Phát hiện ngôn ngữ với độ chính xác cao"""
68
+ # if not text or len(text.strip()) == 0:
69
+ # return 'vi' # Default to Vietnamese
70
+
71
+ # text_lower = text.lower()
72
+ # scores = {}
73
+
74
+ # for lang, patterns in self.language_patterns.items():
75
+ # score = 0
76
+
77
+ # # Score based on special characters
78
+ # char_score = sum(1 for char in text if char in patterns['chars'])
79
+ # score += char_score * 2
80
+
81
+ # # Score based on common words
82
+ # word_score = sum(1 for word in patterns['common_words'] if word in text_lower)
83
+ # score += word_score
84
+
85
+ # scores[lang] = score
86
+
87
+ # # Return language with highest score
88
+ # detected_lang = max(scores.items(), key=lambda x: x[1])[0]
89
+
90
+ # # If no strong detection, use character-based fallback
91
+ # if max(scores.values()) < 3:
92
+ # vietnamese_chars = set('àáâãèéêìíòóôõùúýăđĩũơưạảấầẩẫậắằẳẵặẹẻẽếềểễệỉịọỏốồổỗộớờởỡợụủứừửữựỳỵỷỹ')
93
+ # if any(char in vietnamese_chars for char in text):
94
+ # return 'vi'
95
+ # elif any(char in text for char in 'あいうえおぁ-んァ-ン'):
96
+ # return 'ja'
97
+ # elif any(char in text for char in '你好'):
98
+ # return 'zh'
99
+ # elif any(char in text for char in '안녕'):
100
+ # return 'ko'
101
+ # else:
102
+ # return 'en' # Default to English for other cases
103
+
104
+ # return detected_lang
105
+ # def get_embedding_model(self, language: str = None) -> Optional[SentenceTransformer]:
106
+ # """Lấy mô hình embedding dựa trên ngôn ngữ đã phát hiện"""
107
+ # lang = language if language in settings.SUPPORTED_LANGUAGES else self.current_language
108
+
109
+ # if lang == 'vi':
110
+ # return self.vietnamese_model
111
+ # else:
112
+ # return self.multilingual_model
113
+
114
+ # def get_llm_model(self, language: str = None) -> str:
115
+ # """Lấy tên mô hình LLM dựa trên ngôn ngữ đã phát hiện"""
116
+ # lang = language if language in settings.SUPPORTED_LANGUAGES else self.current_language
117
+
118
+ # if lang == 'vi':
119
+ # return settings.VIETNAMESE_LLM_MODEL
120
+ # else:
121
+ # return settings.MULTILINGUAL_LLM_MODEL
122
+
123
+ # def get_language_info(self, language: str = None) -> Dict:
124
+ # """Lấy thông tin ngôn ngữ bao gồm mã và tên đầy đủ"""
125
+ # lang = language if language in settings.SUPPORTED_LANGUAGES else self.current_language
126
+
127
+ # model_info = {
128
+ # 'vi': {
129
+ # 'name': 'Tiếng Việt',
130
+ # 'embedding_model': settings.VIETNAMESE_EMBEDDING_MODEL,
131
+ # 'llm_model': settings.VIETNAMESE_LLM_MODEL,
132
+ # 'status': 'active' if self.vietnamese_model else 'inactive'
133
+ # },
134
+ # 'other': {
135
+ # 'name': 'Multilingual',
136
+ # 'embedding_model': settings.MULTILINGUAL_EMBEDDING_MODEL,
137
+ # 'llm_model': settings.MULTILINGUAL_LLM_MODEL,
138
+ # 'status': 'active' if self.multilingual_model else 'inactive'
139
+ # }
140
+ # }
141
+
142
+ # if lang == 'vi':
143
+ # return model_info['vi']
144
+ # else:
145
+ # return model_info['other']
146
  import re
147
  from typing import Dict, Tuple, Optional
148
  from sentence_transformers import SentenceTransformer
149
+ from langdetect import detect, detect_langs, LangDetectError
150
  from config.settings import settings
151
 
152
  class MultilingualManager:
153
  def __init__(self):
154
  self.vietnamese_model = None
155
  self.multilingual_model = None
156
+ self.current_language = 'vi'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
157
  self._initialize_models()
158
+
159
  def _initialize_models(self):
160
  """Khởi tạo các mô hình đa ngôn ngữ"""
161
  try:
 
164
  print("✅ Đã tải mô hình embedding tiếng Việt")
165
  except Exception as e:
166
  print(f"❌ Lỗi tải mô hình embedding tiếng Việt: {e}")
167
+ # Fallback to multilingual model
168
  self.vietnamese_model = None
169
 
170
  try:
171
  print("🔄 Đang tải mô hình embedding đa ngôn ngữ...")
172
+ self.multilingual_model = SentenceTransformer(
173
+ settings.MULTILINGUAL_EMBEDDING_MODEL,
174
+ trust_remote_code=True
175
+ )
176
  print("✅ Đã tải mô hình embedding đa ngôn ngữ")
177
  except Exception as e:
178
  print(f"❌ Lỗi tải mô hình embedding đa ngôn ngữ: {e}")
179
+ # Fallback to default model
180
+ try:
181
+ self.multilingual_model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
182
+ print(" Đã tải hình fallback đa ngôn ngữ")
183
+ except Exception as fallback_error:
184
+ print(f"❌ Lỗi tải mô hình fallback: {fallback_error}")
185
+ self.multilingual_model = None
186
+
187
+ def detect_language(self, text: str, fallback_method: bool = True) -> str:
188
+ """
189
+ Phát hiện ngôn ngữ với độ chính xác cao sử dụng langdetect
190
+ """
191
  if not text or len(text.strip()) == 0:
192
  return 'vi' # Default to Vietnamese
193
 
194
+ # Clean text
195
+ text = self._clean_text_for_detection(text)
196
+
197
+ if len(text.strip()) < 3:
198
+ return 'vi'
199
 
200
+ try:
201
+ # Sử dụng langdetect với xác suất
202
+ languages = detect_langs(text)
203
+
204
+ # Lấy ngôn ngữ có xác suất cao nhất
205
+ best_lang = str(languages[0]).split(':')[0]
206
+
207
+ # Map langdetect codes to our codes
208
+ lang_map = {
209
+ 'vi': 'vi', 'en': 'en', 'fr': 'fr', 'es': 'es',
210
+ 'de': 'de', 'ja': 'ja', 'ko': 'ko', 'zh-cn': 'zh', 'zh-tw': 'zh',
211
+ 'it': 'en', 'pt': 'en', 'ru': 'en', 'ar': 'en' # Fallback to English for others
212
+ }
213
+
214
+ detected_lang = lang_map.get(best_lang, 'en')
215
 
216
+ # Kiểm tra độ tin cậy
217
+ confidence = float(str(languages[0]).split(':')[1])
218
+ if confidence < 0.6 and fallback_method:
219
+ # Nếu độ tin cậy thấp, sử dụng fallback method
220
+ return self._fallback_language_detection(text)
221
 
222
+ print(f"🔍 Phát hiện ngôn ngữ: {detected_lang} (độ tin cậy: {confidence:.2f})")
223
+ return detected_lang
 
224
 
225
+ except LangDetectError as e:
226
+ print(f"⚠️ LangDetect lỗi, sử dụng fallback: {e}")
227
+ return self._fallback_language_detection(text) if fallback_method else 'vi'
228
+ except Exception as e:
229
+ print(f"⚠️ Lỗi phát hiện ngôn ngữ: {e}")
230
+ return self._fallback_language_detection(text) if fallback_method else 'vi'
231
+
232
+ def _fallback_language_detection(self, text: str) -> str:
233
+ """
234
+ Fallback method sử dụng các quy tắc heuristic
235
+ """
236
+ text_lower = text.lower()
237
+
238
+ # Vietnamese detection với các từ đặc trưng
239
+ vietnamese_indicators = [
240
+ 'của', 'và', 'là', 'có', 'được', 'trong', 'cho', 'với', 'như', 'tôi',
241
+ 'bạn', 'ông', 'bà', 'anh', 'chị', 'em', 'này', 'kia', 'đó', 'đây'
242
+ ]
243
 
244
+ english_indicators = [
245
+ 'the', 'and', 'is', 'are', 'for', 'with', 'this', 'that', 'you', 'they',
246
+ 'what', 'where', 'when', 'why', 'how', 'which', 'who', 'their', 'have', 'has'
247
+ ]
248
 
249
+ # Đếm số từ chỉ định
250
+ vi_count = sum(1 for word in vietnamese_indicators if word in text_lower)
251
+ en_count = sum(1 for word in english_indicators if word in text_lower)
252
+
253
+ # Kiểm tra ký tự đặc biệt
254
+ vietnamese_chars = set('àáâãèéêìíòóôõùúýăđĩũơưạảấầẩẫậắằẳẵặẹẻẽếềểễệỉịọỏốồổỗộớờởỡợụủứừửữựỳỵỷỹ')
255
+ vi_char_count = sum(1 for char in text if char in vietnamese_chars)
256
+
257
+ # Quyết định dựa trên các chỉ số
258
+ if vi_count > en_count or vi_char_count > 2:
259
+ return 'vi'
260
+ elif en_count > vi_count:
261
+ return 'en'
262
+ else:
263
+ # Kiểm tra các ngôn ngữ khác bằng ký tự
264
+ if any(char in text for char in 'あいうえおぁ-んァ-ン'):
265
  return 'ja'
266
  elif any(char in text for char in '你好'):
267
  return 'zh'
268
  elif any(char in text for char in '안녕'):
269
  return 'ko'
270
+ elif any(char in text for char in 'àâæçèéêëîïôœùûüÿ'):
271
+ return 'fr'
272
+ elif any(char in text for char in 'áéíóúñü'):
273
+ return 'es'
274
+ elif any(char in text for char in 'äöüß'):
275
+ return 'de'
276
  else:
277
+ return 'en' # Mặc định English
278
+
279
+ def _clean_text_for_detection(self, text: str) -> str:
280
+ """Làm sạch văn bản để phát hiện ngôn ngữ chính xác hơn"""
281
+ # Loại bỏ URL, số, ký tự đặc biệt không cần thiết
282
+ text = re.sub(r'http\S+', '', text)
283
+ text = re.sub(r'[0-9]+', '', text)
284
+ text = re.sub(r'[^\w\s]', ' ', text)
285
+ text = re.sub(r'\s+', ' ', text)
286
+ return text.strip()
287
+
288
+ def detect_language_with_confidence(self, text: str) -> Tuple[str, float]:
289
+ """
290
+ Phát hiện ngôn ngữ với điểm tin cậy
291
+ """
292
+ if not text or len(text.strip()) < 3:
293
+ return 'vi', 0.0
294
 
295
+ try:
296
+ languages = detect_langs(text)
297
+ best_lang = str(languages[0])
298
+ lang_code, confidence = best_lang.split(':')
299
+
300
+ lang_map = {
301
+ 'vi': 'vi', 'en': 'en', 'fr': 'fr', 'es': 'es',
302
+ 'de': 'de', 'ja': 'ja', 'ko': 'ko', 'zh-cn': 'zh', 'zh-tw': 'zh'
303
+ }
304
+
305
+ detected_lang = lang_map.get(lang_code, 'en')
306
+ confidence_score = float(confidence)
307
+
308
+ return detected_lang, confidence_score
309
+
310
+ except Exception as e:
311
+ print(f"⚠️ Lỗi phát hiện ngôn ngữ với confidence: {e}")
312
+ return 'vi', 0.5
313
+
314
  def get_embedding_model(self, language: str = None) -> Optional[SentenceTransformer]:
315
  """Lấy mô hình embedding dựa trên ngôn ngữ đã phát hiện"""
316
+ if language and language in settings.SUPPORTED_LANGUAGES:
317
+ lang = language
318
+ else:
319
+ lang = self.current_language
320
 
321
+ if lang == 'vi' and self.vietnamese_model is not None:
322
  return self.vietnamese_model
323
  else:
324
  return self.multilingual_model
325
+
326
  def get_llm_model(self, language: str = None) -> str:
327
  """Lấy tên mô hình LLM dựa trên ngôn ngữ đã phát hiện"""
328
+ if language and language in settings.SUPPORTED_LANGUAGES:
329
+ lang = language
330
+ else:
331
+ lang = self.current_language
332
 
333
  if lang == 'vi':
334
  return settings.VIETNAMESE_LLM_MODEL
335
  else:
336
  return settings.MULTILINGUAL_LLM_MODEL
337
+
338
  def get_language_info(self, language: str = None) -> Dict:
339
  """Lấy thông tin ngôn ngữ bao gồm mã và tên đầy đủ"""
340
+ if language and language in settings.SUPPORTED_LANGUAGES:
341
+ lang = language
342
+ else:
343
+ lang = self.current_language
344
+
345
+ language_names = {
346
+ 'vi': 'Tiếng Việt',
347
+ 'en': 'English',
348
+ 'fr': 'Français',
349
+ 'es': 'Español',
350
+ 'de': 'Deutsch',
351
+ 'ja': '日本語',
352
+ 'ko': '한국어',
353
+ 'zh': '中文'
 
354
  }
355
 
356
+ return {
357
+ 'code': lang,
358
+ 'name': language_names.get(lang, 'Unknown'),
359
+ 'embedding_model': settings.VIETNAMESE_EMBEDDING_MODEL if lang == 'vi' else settings.MULTILINGUAL_EMBEDDING_MODEL,
360
+ 'llm_model': settings.VIETNAMESE_LLM_MODEL if lang == 'vi' else settings.MULTILINGUAL_LLM_MODEL,
361
+ 'embedding_status': 'active' if (self.vietnamese_model if lang == 'vi' else self.multilingual_model) else 'inactive'
362
+ }
363
+
364
+ def get_supported_languages(self) -> Dict[str, str]:
365
+ """Lấy danh sách ngôn ngữ được hỗ trợ"""
366
+ return {
367
+ 'vi': 'Tiếng Việt',
368
+ 'en': 'English',
369
+ 'fr': 'Français',
370
+ 'es': 'Español',
371
+ 'de': 'Deutsch',
372
+ 'ja': '日本語',
373
+ 'ko': '한국어',
374
+ 'zh': '中文'
375
+ }