Skip to content

Commit 1a9ed13

Browse files
committed
feat(i18n): add Thai (th-TH) language support
Frontend: - Add frontend/src/i18n/th-TH.json (913 keys, full parity with zh-CN) - Register th-TH in i18n entry with native element-plus-secondary Thai locale - Add Thai option to language selectors, legacy th_TH alias mapping, and browser locale detection (th* -> th-TH) - Add common.thai label to all existing locale files Backend: - Add backend/locales/th-TH.json (177 keys) - Accept th-TH in language whitelist, schema regex, and MCP question - Map th* to Thai language name in LLM prompt language selection - Apply question language to guess-question prompt template
1 parent 518403e commit 1a9ed13

17 files changed

Lines changed: 1238 additions & 11 deletions

File tree

‎backend/apps/chat/models/chat_model.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,7 @@ def guess_sys_question(self, articles_number: int = 4):
354354
sqlbot_name=self.sqlbot_name)
355355

356356
def guess_user_question(self, old_questions: str = "[]"):
357-
return get_guess_question_template()['user'].format(question=self.question, schema=self.db_schema,
357+
return get_guess_question_template()['user'].format(lang=self.lang, question=self.question, schema=self.db_schema,
358358
old_questions=old_questions)
359359

360360
def filter_sys_question(self):
@@ -411,7 +411,7 @@ class ChatQuestionBase(BaseModel):
411411
class McpQuestion(ChatQuestionBase):
412412
token: str = Body(description='token')
413413
stream: Optional[bool] = Body(description='是否流式输出,默认为true开启, 关闭false则返回JSON对象', default=True)
414-
lang: Optional[str] = Body(description='语言:zh-CN|zh-TW|en|ko-KR', default='zh-CN')
414+
lang: Optional[str] = Body(description='语言:zh-CN|zh-TW|en|ko-KR|th-TH', default='zh-CN')
415415
datasource_id: Optional[int | str] = Body(description='数据源ID,仅当当前对话没有确定数据源时有效', default=None)
416416
return_img: Optional[bool] = Body(description='是否返回图表,默认为true开启, 关闭false则仅返回数据', default=True)
417417
custom_model: Optional[str | int] = Body(description='模型ID', default=None)

‎backend/apps/chat/task/llm.py‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2086,6 +2086,8 @@ def get_lang_name(lang: str):
20862086
return '英文'
20872087
if normalized.startswith('ko'):
20882088
return '韩语'
2089+
if normalized.startswith('th'):
2090+
return '泰语'
20892091
return '简体中文'
20902092

20912093

‎backend/apps/mcp/mcp.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ async def get_model_by_ws(session: SessionDep, mcp_oid: WsMcp):
166166
async def mcp_question(session: SessionDep, trans: Trans, chat: McpQuestion):
167167
session_user = get_user(session, chat.token)
168168
lang = chat.lang
169-
if lang in ["zh-CN", "zh-TW", "en", "ko-KR"]:
169+
if lang in ["zh-CN", "zh-TW", "en", "ko-KR", "th-TH"]:
170170
session_user.language = lang
171171
# if chat.oid:
172172
# w_list = await user_ws_options(session, session_user.id, trans)

‎backend/apps/system/api/user.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ async def batch_del(session: SessionDep, id_list: list[int]):
370370
@clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="current_user.id")
371371
async def langChange(session: SessionDep, current_user: CurrentUser, trans: Trans, language: UserLanguage):
372372
lang = language.language
373-
if lang not in ["zh-CN", "zh-TW", "en", "ko-KR"]:
373+
if lang not in ["zh-CN", "zh-TW", "en", "ko-KR", "th-TH"]:
374374
raise Exception(trans('i18n_user.language_not_support', key = lang))
375375
db_user: UserModel = get_db_user(session=session, user_id=current_user.id)
376376
db_user.language = lang

‎backend/apps/system/schemas/system_schema.py‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class BaseUser(BaseModel):
3232

3333

3434
class BaseUserDTO(BaseUser, BaseCreatorDTO):
35-
language: str = Field(pattern=r"^(zh-CN|zh-TW|en|ko-KR)$", default="zh-CN", description="用户语言")
35+
language: str = Field(pattern=r"^(zh-CN|zh-TW|en|ko-KR|th-TH)$", default="zh-CN", description="用户语言")
3636
password: str
3737
status: int = 1
3838
origin: int = 0
@@ -47,8 +47,8 @@ def to_dict(self):
4747

4848
@field_validator("language")
4949
def validate_language(cls, lang: str) -> str:
50-
if not re.fullmatch(r"^(zh-CN|zh-TW|en|ko-KR)$", lang):
51-
raise ValueError("Language must be 'zh-CN', 'zh-TW', 'en', or 'ko-KR'")
50+
if not re.fullmatch(r"^(zh-CN|zh-TW|en|ko-KR|th-TH)$", lang):
51+
raise ValueError("Language must be 'zh-CN', 'zh-TW', 'en', 'ko-KR', or 'th-TH'")
5252
return lang
5353

5454

‎backend/locales/th-TH.json‎

Lines changed: 209 additions & 0 deletions
Large diffs are not rendered by default.

‎backend/templates/template.yaml‎

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -564,8 +564,6 @@ template:
564564
565565
guess:
566566
system: |
567-
### 请使用语言:{lang} 回答,不需要输出深度思考过程
568-
569567
### 说明:
570568
您的任务是根据给定的表结构,用户问题以及以往用户提问,推测用户接下来可能提问的1-{articles_number}个问题。
571569
请遵循以下规则:
@@ -581,7 +579,6 @@ template:
581579
- 最多返回{articles_number}个你推测出的结果
582580
- 若无法推测,则返回空数据JSON:
583581
[]
584-
- 若你的给出的JSON不是{lang}的,则必须翻译为{lang}
585582
586583
### 响应, 请直接返回JSON结果(不要包含任何其他文本):
587584
@@ -595,7 +592,8 @@ template:
595592
### 以往提问:
596593
{old_questions}
597594
598-
/no_think
595+
## 请根据上述要求,使用语言:{lang} 进行输出,不需要输出深度思考过程
596+
## JSON列表内的值,语言请与 {lang} 保持一致
599597
analysis:
600598
system: |
601599
<Instruction>

‎frontend/src/components/Language-selector/index.vue‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ const languageOptions = computed(() => [
3636
{ value: 'zh-CN', label: t('common.simplified_chinese') },
3737
{ value: 'zh-TW', label: t('common.traditional_chinese') },
3838
{ value: 'ko-KR', label: t('common.korean') },
39+
{ value: 'th-TH', label: t('common.thai') },
3940
])
4041
4142
const selectedLanguage = computed(() => {

‎frontend/src/components/layout/Person.vue‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ const languageList = computed(() => [
6666
name: '한국인',
6767
value: 'ko-KR',
6868
},
69+
{
70+
name: 'ไทย',
71+
value: 'th-TH',
72+
},
6973
])
7074
const popoverRef = ref()
7175

‎frontend/src/i18n/en.json‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@
209209
"reset": "Reset",
210210
"simplified_chinese": "简体中文",
211211
"korean": "한국어",
212+
"thai": "ไทย",
212213
"traditional_chinese": "繁體中文",
213214
"help": "Help",
214215
"language": "Language",

0 commit comments

Comments
 (0)