Skip to content

Commit c2531c3

Browse files
pms241948fit2cloud-chenyw
authored andcommitted
korean update
1 parent 0bf4c82 commit c2531c3

File tree

13 files changed

+260
-30
lines changed

13 files changed

+260
-30
lines changed

backend/apps/chat/task/llm.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ def select_datasource(self):
418418
full_thinking_text = ''
419419
full_text = ''
420420
if not ignore_auto_select:
421-
if settings.TABLE_EMBEDDING_ENABLED:
421+
if settings.EMBEDDING_ENABLED:
422422
ds = get_ds_embedding(self.session, self.current_user, _ds_list, self.out_ds_instance,
423423
self.chat_question.question, self.current_assistant)
424424
yield {'content': '{"id":' + str(ds.get('id')) + '}'}
@@ -508,7 +508,7 @@ def select_datasource(self):
508508
except Exception as e:
509509
_error = e
510510

511-
if not ignore_auto_select and not settings.TABLE_EMBEDDING_ENABLED:
511+
if not ignore_auto_select and not settings.EMBEDDING_ENABLED:
512512
self.record = save_select_datasource_answer(session=self.session, record_id=self.record.id,
513513
answer=orjson.dumps({'content': full_text}).decode(),
514514
datasource=_datasource,
@@ -1443,6 +1443,11 @@ def process_stream(res: Iterator[BaseMessageChunk],
14431443

14441444

14451445
def get_lang_name(lang: str):
1446-
if lang and lang == 'en':
1446+
if not lang:
1447+
return '简体中文'
1448+
normalized = lang.lower()
1449+
if normalized.startswith('en'):
14471450
return '英文'
1451+
if normalized.startswith('ko'):
1452+
return '韩语'
14481453
return '简体中文'

backend/apps/datasource/crud/datasource.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
from apps.db.constant import DB
1414
from apps.db.db import get_tables, get_fields, exec_sql, check_connection
1515
from apps.db.engine import get_engine_config, get_engine_conn
16-
from common.core.config import settings
1716
from common.core.deps import SessionDep, CurrentUser, Trans
1817
from common.utils.utils import deepcopy_ignore_extra
1918
from .table import get_tables_by_ds_id
@@ -403,7 +402,7 @@ def get_table_schema(session: SessionDep, current_user: CurrentUser, ds: CoreDat
403402
all_tables.append(t_obj)
404403

405404
# do table embedding
406-
if embedding and tables and settings.TABLE_EMBEDDING_ENABLED:
405+
if embedding and tables:
407406
tables = get_table_embedding(session, current_user, tables, question)
408407
# splice schema
409408
if tables:

backend/apps/system/api/user.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ async def batch_del(session: SessionDep, id_list: list[int]):
193193
@clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="current_user.id")
194194
async def langChange(session: SessionDep, current_user: CurrentUser, trans: Trans, language: UserLanguage):
195195
lang = language.language
196-
if lang not in ["zh-CN", "en"]:
196+
if lang not in ["zh-CN", "en", "ko-KR"]:
197197
raise Exception(trans('i18n_user.language_not_support', key = lang))
198198
db_user: UserModel = get_db_user(session=session, user_id=current_user.id)
199199
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
@@ -31,7 +31,7 @@ class BaseUser(BaseModel):
3131

3232

3333
class BaseUserDTO(BaseUser, BaseCreatorDTO):
34-
language: str = Field(pattern=r"^(zh-CN|en)$", default="zh-CN", description="用户语言")
34+
language: str = Field(pattern=r"^(zh-CN|en|ko-KR)$", default="zh-CN", description="用户语言")
3535
password: str
3636
status: int = 1
3737

@@ -44,8 +44,8 @@ def to_dict(self):
4444

4545
@field_validator("language")
4646
def validate_language(cls, lang: str) -> str:
47-
if not re.fullmatch(r"^(zh-CN|en)$", lang):
48-
raise ValueError("Language must be 'zh-CN' or 'en'")
47+
if not re.fullmatch(r"^(zh-CN|en|ko-KR)$", lang):
48+
raise ValueError("Language must be 'zh-CN', 'en', or 'ko-KR'")
4949
return lang
5050

5151

backend/common/core/config.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,6 @@ def SQLALCHEMY_DATABASE_URI(self) -> PostgresDsn | str:
105105
PG_POOL_RECYCLE: int = 3600
106106
PG_POOL_PRE_PING: bool = True
107107

108-
TABLE_EMBEDDING_ENABLED: bool = False
109108
TABLE_EMBEDDING_COUNT: int = 10
110109

111110

backend/locales/ko-KR.json

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
{
2+
"i18n_default_workspace": "기본 워크스페이스",
3+
"i18n_ds_name_exist": "이미 존재하는 이름입니다",
4+
"i18n_concat_admin": "관리자에게 문의해 주세요!",
5+
"i18n_exist": "{msg}이(가) 이미 존재합니다!",
6+
"i18n_name": "이름",
7+
"i18n_not_exist": "{msg}을(를) 찾을 수 없습니다",
8+
"i18n_error": "{key} 오류!",
9+
"i18n_miss_args": "{key} 매개변수가 없습니다!",
10+
"i18n_format_invalid": "{key} 형식이 올바르지 않습니다!",
11+
"i18n_login": {
12+
"account_pwd_error": "계정 또는 비밀번호가 올바르지 않습니다!",
13+
"no_associated_ws": "연결된 워크스페이스가 없습니다. {msg}",
14+
"user_disable": "계정이 비활성화되었습니다. {msg}"
15+
},
16+
"i18n_user": {
17+
"account": "계정",
18+
"email": "이메일",
19+
"password": "비밀번호",
20+
"language_not_support": "[{key}] 언어는 지원하지 않습니다!",
21+
"ws_miss": "현재 사용자는 워크스페이스 [{ws}]에 속해 있지 않습니다!"
22+
},
23+
"i18n_ws": {
24+
"title": "워크스페이스"
25+
},
26+
"i18n_permission": {
27+
"only_admin": "관리자만 호출할 수 있습니다!",
28+
"no_permission": "{url}{msg}에 접근 권한이 없습니다",
29+
"authenticate_invalid": "인증이 실패했습니다 [{msg}]",
30+
"token_expired": "토큰이 만료되었습니다"
31+
},
32+
"i18n_llm": {
33+
"validate_error": "검증에 실패했습니다 [{msg}]",
34+
"delete_default_error": "기본 모델 [{key}]은 삭제할 수 없습니다!",
35+
"miss_default": "기본 LLM이 아직 설정되지 않았습니다"
36+
},
37+
"i18n_ds_invalid": "데이터 소스가 유효하지 않습니다",
38+
"i18n_embedded": {
39+
"invalid_origin": "도메인 검증에 실패했습니다 [{origin}]"
40+
},
41+
"i18n_terminology": {
42+
"terminology_not_exists": "용어를 찾을 수 없습니다",
43+
"cannot_be_repeated": "용어 이름과 동의어는 중복될 수 없습니다",
44+
"exists_in_db": "용어 이름 또는 동의어가 이미 존재합니다"
45+
},
46+
"i18n_data_training": {
47+
"datasource_cannot_be_none": "데이터 소스를 선택해 주세요",
48+
"data_training_not_exists": "예제가 존재하지 않습니다",
49+
"exists_in_db": "질문이 이미 존재합니다"
50+
},
51+
"i18n_excel_export": {
52+
"data_is_empty": "양식 데이터가 없어 내보낼 수 없습니다"
53+
}
54+
}

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

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,20 @@
11
<template>
22
<el-dropdown trigger="hover" @command="changeLanguage">
33
<div class="lang-switch">
4-
<span>{{ selectedLanguage === 'zh-CN' ? '中文' : 'English' }}</span>
4+
<span>{{ displayLanguageName }}</span>
55
<el-icon class="el-icon--right">
66
<ArrowDown />
77
</el-icon>
88
</div>
99
<template #dropdown>
1010
<el-dropdown-menu>
11-
<el-dropdown-item command="en" :class="{ 'selected-lang': selectedLanguage === 'en' }">
12-
English
13-
</el-dropdown-item>
1411
<el-dropdown-item
15-
command="zh-CN"
16-
:class="{ 'selected-lang': selectedLanguage === 'zh-CN' }"
12+
v-for="option in languageOptions"
13+
:key="option.value"
14+
:command="option.value"
15+
:class="{ 'selected-lang': selectedLanguage === option.value }"
1716
>
18-
中文
17+
{{ option.label }}
1918
</el-dropdown-item>
2019
</el-dropdown-menu>
2120
</template>
@@ -29,13 +28,24 @@ import { useUserStore } from '@/stores/user'
2928
import { ArrowDown } from '@element-plus/icons-vue'
3029
import { userApi } from '@/api/auth'
3130
32-
const { locale } = useI18n()
31+
const { t, locale } = useI18n()
3332
const userStore = useUserStore()
3433
34+
const languageOptions = computed(() => [
35+
{ value: 'en', label: t('common.english') },
36+
{ value: 'zh-CN', label: t('common.simplified_chinese') },
37+
{ value: 'ko-KR', label: t('common.korean') },
38+
])
39+
3540
const selectedLanguage = computed(() => {
3641
return userStore.language
3742
})
3843
44+
const displayLanguageName = computed(() => {
45+
const current = languageOptions.value.find((item) => item.value === selectedLanguage.value)
46+
return current?.label ?? t('common.language')
47+
})
48+
3949
const changeLanguage = (lang: string) => {
4050
locale.value = lang
4151
userStore.setLanguage(lang)
@@ -63,4 +73,4 @@ const changeLanguage = (lang: string) => {
6373
.selected-lang {
6474
color: var(--el-color-primary);
6575
}
66-
</style>
76+
</style>

frontend/src/components/layout/Person.vue

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,21 +33,22 @@ const currentLanguage = computed(() => userStore.getLanguage)
3333
const isAdmin = computed(() => userStore.isAdmin)
3434
const dialogVisible = ref(false)
3535
const aboutRef = ref()
36-
const languageList = [
36+
const languageList = computed(() => [
3737
{
38-
name: 'English',
38+
name: t('common.english'),
3939
value: 'en',
4040
},
4141
{
4242
name: t('common.simplified_chinese'),
4343
value: 'zh-CN',
44-
} /* ,
44+
},
4545
{
46-
name: t('common.traditional_chinese'),
47-
value: 'zh-CN',
48-
}, */,
49-
]
46+
name: t('common.korean'),
47+
value: 'ko-KR',
48+
},
49+
])
5050
const popoverRef = ref()
51+
5152
const toSystem = () => {
5253
popoverRef.value.hide()
5354
router.push('/system')

frontend/src/i18n/en.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,11 @@
9898
"clear_filter": "Clear conditions",
9999
"reset": "Reset",
100100
"simplified_chinese": "Simplified Chinese",
101+
"korean": "Korean",
101102
"traditional_chinese": "Traditional Chinese",
102103
"help": "Help",
103104
"language": "Language",
105+
"english": "English",
104106
"re_upload": "Re-upload",
105107
"not_exceed_50mb": "Supports XLS, XLSX, CSV formats, file size does not exceed 50MB",
106108
"reset_password": "Reset password",
@@ -690,4 +692,4 @@
690692
"setting_successfully": "Setting Successfully",
691693
"customize_theme_color": "Customize theme color"
692694
}
693-
}
695+
}

frontend/src/i18n/index.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
import { createI18n } from 'vue-i18n'
22
import en from './en.json'
33
import zhCN from './zh-CN.json'
4+
import koKR from './ko-KR.json'
45
import elementEnLocale from 'element-plus-secondary/es/locale/lang/en'
56
import elementZhLocale from 'element-plus-secondary/es/locale/lang/zh-cn'
67
import { useCache } from '@/utils/useCache'
8+
9+
const elementKoLocale = elementEnLocale
710
const { wsCache } = useCache()
811

912
const getDefaultLocale = () => {
@@ -20,6 +23,10 @@ const messages = {
2023
...zhCN,
2124
el: elementZhLocale,
2225
},
26+
'ko-KR': {
27+
...koKR,
28+
el: elementKoLocale,
29+
},
2330
}
2431

2532
export const i18n = createI18n({
@@ -30,6 +37,13 @@ export const i18n = createI18n({
3037
messages,
3138
})
3239

40+
const elementLocales = {
41+
en: elementEnLocale,
42+
'zh-CN': elementZhLocale,
43+
'ko-KR': elementKoLocale,
44+
} as const
45+
3346
export const getElementLocale = () => {
34-
return i18n.global.locale.value === 'en' ? elementEnLocale : elementZhLocale
35-
}
47+
const locale = i18n.global.locale.value as keyof typeof elementLocales
48+
return elementLocales[locale] ?? elementEnLocale
49+
}

0 commit comments

Comments
 (0)