mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-28 01:53:53 +08:00
Merge pull request #2216 from xinnan-tech/manager-web-i18n
Manager web i18n
This commit is contained in:
@@ -20,16 +20,17 @@
|
|||||||
{{ $t('home.voiceModel') }}:{{ device.ttsModelName }} ({{ device.ttsVoiceName }})
|
{{ $t('home.voiceModel') }}:{{ device.ttsModelName }} ({{ device.ttsVoiceName }})
|
||||||
</div>
|
</div>
|
||||||
<div style="display: flex;gap: 10px;align-items: center;">
|
<div style="display: flex;gap: 10px;align-items: center;">
|
||||||
<div :class="['settings-btn', {'settings-btn-en': isEnglish}]" @click="handleConfigure">
|
<div class="settings-btn" @click="handleConfigure">
|
||||||
{{ $t('home.configureRole') }}
|
{{ $t('home.configureRole') }}
|
||||||
</div>
|
</div>
|
||||||
<div :class="['settings-btn', {'settings-btn-en': isEnglish}]" @click="handleVoicePrint">
|
<div class="settings-btn" @click="handleVoicePrint">
|
||||||
{{ $t('home.voiceprintRecognition') }}
|
{{ $t('home.voiceprintRecognition') }}
|
||||||
</div>
|
</div>
|
||||||
<div :class="['settings-btn', {'settings-btn-en': isEnglish}]" @click="handleDeviceManage">
|
<div class="settings-btn" @click="handleDeviceManage">
|
||||||
{{ $t('home.deviceManagement') }}({{ device.deviceCount }})
|
{{ $t('home.deviceManagement') }}({{ device.deviceCount }})
|
||||||
</div>
|
</div>
|
||||||
<div :class="['settings-btn', {'settings-btn-en': isEnglish, 'disabled-btn': device.memModelId === 'Memory_nomem'}]" @click="handleChatHistory">
|
<div :class="['settings-btn', { 'disabled-btn': device.memModelId === 'Memory_nomem' }]"
|
||||||
|
@click="handleChatHistory">
|
||||||
<el-tooltip v-if="device.memModelId === 'Memory_nomem'" :content="$t('home.enableMemory')" placement="top">
|
<el-tooltip v-if="device.memModelId === 'Memory_nomem'" :content="$t('home.enableMemory')" placement="top">
|
||||||
<span>{{ $t('home.chatHistory') }}</span>
|
<span>{{ $t('home.chatHistory') }}</span>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
@@ -130,13 +131,6 @@ export default {
|
|||||||
border-radius: 14px;
|
border-radius: 14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.settings-btn.settings-btn-en {
|
|
||||||
font-size: 11px;
|
|
||||||
height: 39px;
|
|
||||||
min-width: 65px;
|
|
||||||
padding: 0 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.version-info {
|
.version-info {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
|
|||||||
@@ -9,36 +9,36 @@
|
|||||||
|
|
||||||
<!-- 中间导航菜单 -->
|
<!-- 中间导航菜单 -->
|
||||||
<div class="header-center">
|
<div class="header-center">
|
||||||
<div class="equipment-management"
|
<div class="equipment-management"
|
||||||
:class="{ 'active-tab': $route.path === '/home' || $route.path === '/role-config' || $route.path === '/device-management' }"
|
:class="{ 'active-tab': $route.path === '/home' || $route.path === '/role-config' || $route.path === '/device-management' }"
|
||||||
@click="goHome">
|
@click="goHome">
|
||||||
<img loading="lazy" alt="" src="@/assets/header/robot.png"
|
<img loading="lazy" alt="" src="@/assets/header/robot.png"
|
||||||
:style="{ filter: $route.path === '/home' || $route.path === '/role-config' || $route.path === '/device-management' ? 'brightness(0) invert(1)' : 'None' }" />
|
:style="{ filter: $route.path === '/home' || $route.path === '/role-config' || $route.path === '/device-management' ? 'brightness(0) invert(1)' : 'None' }" />
|
||||||
<span class="nav-text">{{ $t('header.smartManagement') }}</span>
|
<span class="nav-text">{{ $t('header.smartManagement') }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="isSuperAdmin" class="equipment-management" :class="{ 'active-tab': $route.path === '/model-config' }"
|
<div v-if="isSuperAdmin" class="equipment-management" :class="{ 'active-tab': $route.path === '/model-config' }"
|
||||||
@click="goModelConfig">
|
@click="goModelConfig">
|
||||||
<img loading="lazy" alt="" src="@/assets/header/model_config.png"
|
<img loading="lazy" alt="" src="@/assets/header/model_config.png"
|
||||||
:style="{ filter: $route.path === '/model-config' ? 'brightness(0) invert(1)' : 'None' }" />
|
:style="{ filter: $route.path === '/model-config' ? 'brightness(0) invert(1)' : 'None' }" />
|
||||||
<span class="nav-text">{{ $t('header.modelConfig') }}</span>
|
<span class="nav-text">{{ $t('header.modelConfig') }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="isSuperAdmin" class="equipment-management"
|
<div v-if="isSuperAdmin" class="equipment-management"
|
||||||
:class="{ 'active-tab': $route.path === '/user-management' }" @click="goUserManagement">
|
:class="{ 'active-tab': $route.path === '/user-management' }" @click="goUserManagement">
|
||||||
<img loading="lazy" alt="" src="@/assets/header/user_management.png"
|
<img loading="lazy" alt="" src="@/assets/header/user_management.png"
|
||||||
:style="{ filter: $route.path === '/user-management' ? 'brightness(0) invert(1)' : 'None' }" />
|
:style="{ filter: $route.path === '/user-management' ? 'brightness(0) invert(1)' : 'None' }" />
|
||||||
<span class="nav-text">{{ $t('header.userManagement') }}</span>
|
<span class="nav-text">{{ $t('header.userManagement') }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="isSuperAdmin" class="equipment-management"
|
<div v-if="isSuperAdmin" class="equipment-management"
|
||||||
:class="{ 'active-tab': $route.path === '/ota-management' }" @click="goOtaManagement">
|
:class="{ 'active-tab': $route.path === '/ota-management' }" @click="goOtaManagement">
|
||||||
<img loading="lazy" alt="" src="@/assets/header/firmware_update.png"
|
<img loading="lazy" alt="" src="@/assets/header/firmware_update.png"
|
||||||
:style="{ filter: $route.path === '/ota-management' ? 'brightness(0) invert(1)' : 'None' }" />
|
:style="{ filter: $route.path === '/ota-management' ? 'brightness(0) invert(1)' : 'None' }" />
|
||||||
<span class="nav-text">{{ $t('header.otaManagement') }}</span>
|
<span class="nav-text">{{ $t('header.otaManagement') }}</span>
|
||||||
</div>
|
</div>
|
||||||
<el-dropdown v-if="isSuperAdmin" trigger="click" class="equipment-management more-dropdown"
|
<el-dropdown v-if="isSuperAdmin" trigger="click" class="equipment-management more-dropdown"
|
||||||
:class="{ 'active-tab': $route.path === '/dict-management' || $route.path === '/params-management' || $route.path === '/provider-management' || $route.path === '/server-side-management' }"
|
:class="{ 'active-tab': $route.path === '/dict-management' || $route.path === '/params-management' || $route.path === '/provider-management' || $route.path === '/server-side-management' }"
|
||||||
@visible-change="handleParamDropdownVisibleChange">
|
@visible-change="handleParamDropdownVisibleChange">
|
||||||
<span class="el-dropdown-link">
|
<span class="el-dropdown-link">
|
||||||
<img loading="lazy" alt="" src="@/assets/header/param_management.png"
|
<img loading="lazy" alt="" src="@/assets/header/param_management.png"
|
||||||
:style="{ filter: $route.path === '/dict-management' || $route.path === '/params-management' || $route.path === '/provider-management' || $route.path === '/server-side-management' ? 'brightness(0) invert(1)' : 'None' }" />
|
:style="{ filter: $route.path === '/dict-management' || $route.path === '/params-management' || $route.path === '/provider-management' || $route.path === '/server-side-management' ? 'brightness(0) invert(1)' : 'None' }" />
|
||||||
<span class="nav-text">{{ $t('header.paramDictionary') }}</span>
|
<span class="nav-text">{{ $t('header.paramDictionary') }}</span>
|
||||||
<i class="el-icon-arrow-down el-icon--right" :class="{ 'rotate-down': paramDropdownVisible }"></i>
|
<i class="el-icon-arrow-down el-icon--right" :class="{ 'rotate-down': paramDropdownVisible }"></i>
|
||||||
@@ -63,16 +63,16 @@
|
|||||||
<!-- 右侧元素 -->
|
<!-- 右侧元素 -->
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<div class="search-container" v-if="$route.path === '/home' && !(isSuperAdmin && isSmallScreen)">
|
<div class="search-container" v-if="$route.path === '/home' && !(isSuperAdmin && isSmallScreen)">
|
||||||
<el-input v-model="search" :placeholder="$t('header.searchPlaceholder')" class="custom-search-input"
|
<el-input v-model="search" :placeholder="$t('header.searchPlaceholder')" class="custom-search-input"
|
||||||
@keyup.enter.native="handleSearch">
|
@keyup.enter.native="handleSearch">
|
||||||
<i slot="suffix" class="el-icon-search search-icon" @click="handleSearch"></i>
|
<i slot="suffix" class="el-icon-search search-icon" @click="handleSearch"></i>
|
||||||
</el-input>
|
</el-input>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 语言切换下拉菜单 -->
|
<!-- 语言切换下拉菜单 -->
|
||||||
<el-dropdown trigger="click" class="language-dropdown" @visible-change="handleLanguageDropdownVisibleChange">
|
<el-dropdown trigger="click" class="language-dropdown" @visible-change="handleLanguageDropdownVisibleChange">
|
||||||
<span class="el-dropdown-link">
|
<span class="el-dropdown-link">
|
||||||
<i class="el-icon-document"></i>
|
<span class="current-language-text">{{ currentLanguageText }}</span>
|
||||||
<i class="el-icon-arrow-down el-icon--right" :class="{ 'rotate-down': languageDropdownVisible }"></i>
|
<i class="el-icon-arrow-down el-icon--right" :class="{ 'rotate-down': languageDropdownVisible }"></i>
|
||||||
</span>
|
</span>
|
||||||
<el-dropdown-menu slot="dropdown">
|
<el-dropdown-menu slot="dropdown">
|
||||||
@@ -87,7 +87,7 @@
|
|||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
</el-dropdown-menu>
|
</el-dropdown-menu>
|
||||||
</el-dropdown>
|
</el-dropdown>
|
||||||
|
|
||||||
<img loading="lazy" alt="" src="@/assets/home/avatar.png" class="avatar-img" />
|
<img loading="lazy" alt="" src="@/assets/home/avatar.png" class="avatar-img" />
|
||||||
<el-dropdown trigger="click" class="user-dropdown" @visible-change="handleUserDropdownVisibleChange">
|
<el-dropdown trigger="click" class="user-dropdown" @visible-change="handleUserDropdownVisibleChange">
|
||||||
<span class="el-dropdown-link">
|
<span class="el-dropdown-link">
|
||||||
@@ -95,7 +95,8 @@
|
|||||||
<i class="el-icon-arrow-down el-icon--right" :class="{ 'rotate-down': userDropdownVisible }"></i>
|
<i class="el-icon-arrow-down el-icon--right" :class="{ 'rotate-down': userDropdownVisible }"></i>
|
||||||
</span>
|
</span>
|
||||||
<el-dropdown-menu slot="dropdown">
|
<el-dropdown-menu slot="dropdown">
|
||||||
<el-dropdown-item @click.native="showChangePasswordDialog">{{ $t('header.changePassword') }}</el-dropdown-item>
|
<el-dropdown-item @click.native="showChangePasswordDialog">{{ $t('header.changePassword')
|
||||||
|
}}</el-dropdown-item>
|
||||||
<el-dropdown-item @click.native="handleLogout">{{ $t('header.logout') }}</el-dropdown-item>
|
<el-dropdown-item @click.native="handleLogout">{{ $t('header.logout') }}</el-dropdown-item>
|
||||||
</el-dropdown-menu>
|
</el-dropdown-menu>
|
||||||
</el-dropdown>
|
</el-dropdown>
|
||||||
@@ -109,10 +110,9 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import userApi from '@/apis/module/user';
|
import userApi from '@/apis/module/user';
|
||||||
|
import i18n, { changeLanguage } from '@/i18n';
|
||||||
import { mapActions, mapGetters } from 'vuex';
|
import { mapActions, mapGetters } from 'vuex';
|
||||||
import ChangePasswordDialog from './ChangePasswordDialog.vue'; // 引入修改密码弹窗组件
|
import ChangePasswordDialog from './ChangePasswordDialog.vue'; // 引入修改密码弹窗组件
|
||||||
import { changeLanguage } from '@/i18n';
|
|
||||||
import i18n from '@/i18n';
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'HeaderBar',
|
name: 'HeaderBar',
|
||||||
@@ -142,6 +142,20 @@ export default {
|
|||||||
// 获取当前语言
|
// 获取当前语言
|
||||||
currentLanguage() {
|
currentLanguage() {
|
||||||
return i18n.locale || 'zh_CN';
|
return i18n.locale || 'zh_CN';
|
||||||
|
},
|
||||||
|
// 获取当前语言显示文本
|
||||||
|
currentLanguageText() {
|
||||||
|
const currentLang = this.currentLanguage;
|
||||||
|
switch (currentLang) {
|
||||||
|
case 'zh_CN':
|
||||||
|
return this.$t('language.zhCN');
|
||||||
|
case 'zh_TW':
|
||||||
|
return this.$t('language.zhTW');
|
||||||
|
case 'en':
|
||||||
|
return this.$t('language.en');
|
||||||
|
default:
|
||||||
|
return this.$t('language.zhCN');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
@@ -390,6 +404,13 @@ export default {
|
|||||||
margin-right: 5px;
|
margin-right: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.current-language-text {
|
||||||
|
margin-left: 4px;
|
||||||
|
margin-right: 4px;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #3d4566;
|
||||||
|
}
|
||||||
|
|
||||||
.more-dropdown {
|
.more-dropdown {
|
||||||
padding-right: 20px;
|
padding-right: 20px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
export default {
|
export default {
|
||||||
// HeaderBar组件文本
|
// HeaderBar组件文本
|
||||||
'header.smartManagement': 'Smart Agent Management',
|
'header.smartManagement': 'Agents',
|
||||||
'header.modelConfig': 'Model Configuration',
|
'header.modelConfig': 'Models',
|
||||||
'header.userManagement': 'User Management',
|
'header.userManagement': 'Users',
|
||||||
'header.otaManagement': 'OTA Management',
|
'header.otaManagement': 'OTA',
|
||||||
'header.paramDictionary': 'Parameter Dictionary',
|
'header.paramDictionary': 'More',
|
||||||
'header.paramManagement': 'Parameter Management',
|
'header.paramManagement': 'Params Management',
|
||||||
'header.dictManagement': 'Dictionary Management',
|
'header.dictManagement': 'Dict Management',
|
||||||
|
|
||||||
// Dictionary data dialog related
|
// Dictionary data dialog related
|
||||||
'dictDataDialog.addDictData': 'Add Dictionary Data',
|
'dictDataDialog.addDictData': 'Add Dictionary Data',
|
||||||
'dictDataDialog.dictLabel': 'Dictionary Label',
|
'dictDataDialog.dictLabel': 'Dictionary Label',
|
||||||
@@ -17,7 +17,7 @@ export default {
|
|||||||
'dictDataDialog.sort': 'Sort',
|
'dictDataDialog.sort': 'Sort',
|
||||||
'dictDataDialog.requiredDictLabel': 'Please enter dictionary label',
|
'dictDataDialog.requiredDictLabel': 'Please enter dictionary label',
|
||||||
'dictDataDialog.requiredDictValue': 'Please enter dictionary value',
|
'dictDataDialog.requiredDictValue': 'Please enter dictionary value',
|
||||||
|
|
||||||
// Dictionary type dialog related
|
// Dictionary type dialog related
|
||||||
'dictTypeDialog.addDictType': 'Add Dictionary Type',
|
'dictTypeDialog.addDictType': 'Add Dictionary Type',
|
||||||
'dictTypeDialog.dictName': 'Dictionary Type Name',
|
'dictTypeDialog.dictName': 'Dictionary Type Name',
|
||||||
@@ -86,7 +86,7 @@ export default {
|
|||||||
'voicePrint.cancelDelete': 'Deletion operation canceled',
|
'voicePrint.cancelDelete': 'Deletion operation canceled',
|
||||||
'voicePrint.closeOperation': 'Operation closed',
|
'voicePrint.closeOperation': 'Operation closed',
|
||||||
'voicePrint.loading': 'Loading...',
|
'voicePrint.loading': 'Loading...',
|
||||||
|
|
||||||
// Manual add device dialog related
|
// Manual add device dialog related
|
||||||
'manualAddDeviceDialog.title': 'Manual Add Device',
|
'manualAddDeviceDialog.title': 'Manual Add Device',
|
||||||
'manualAddDeviceDialog.deviceType': 'Device Type',
|
'manualAddDeviceDialog.deviceType': 'Device Type',
|
||||||
@@ -98,7 +98,7 @@ export default {
|
|||||||
'manualAddDeviceDialog.confirm': 'Confirm',
|
'manualAddDeviceDialog.confirm': 'Confirm',
|
||||||
'manualAddDeviceDialog.cancel': 'Cancel',
|
'manualAddDeviceDialog.cancel': 'Cancel',
|
||||||
'manualAddDeviceDialog.requiredMacAddress': 'Please enter Mac address',
|
'manualAddDeviceDialog.requiredMacAddress': 'Please enter Mac address',
|
||||||
|
|
||||||
// Parameter dialog related
|
// Parameter dialog related
|
||||||
'paramDialog.paramCode': 'Parameter Code',
|
'paramDialog.paramCode': 'Parameter Code',
|
||||||
'paramDialog.paramCodePlaceholder': 'Please enter parameter code',
|
'paramDialog.paramCodePlaceholder': 'Please enter parameter code',
|
||||||
@@ -142,13 +142,13 @@ export default {
|
|||||||
'firmwareDialog.uploadSuccess': 'Firmware file uploaded successfully',
|
'firmwareDialog.uploadSuccess': 'Firmware file uploaded successfully',
|
||||||
'firmwareDialog.uploadFailed': 'File upload failed',
|
'firmwareDialog.uploadFailed': 'File upload failed',
|
||||||
'header.providerManagement': 'Provider Management',
|
'header.providerManagement': 'Provider Management',
|
||||||
'header.serverSideManagement': 'Server-side Management',
|
'header.serverSideManagement': 'Server Management',
|
||||||
'header.changePassword': 'Change Password',
|
'header.changePassword': 'Change Password',
|
||||||
'header.logout': 'Logout',
|
'header.logout': 'Logout',
|
||||||
'header.searchPlaceholder': 'Search by name..',
|
'header.searchPlaceholder': 'Search by name..',
|
||||||
|
|
||||||
// Login page text
|
// Login page text
|
||||||
'login.title': 'XiaoZhi Service Login',
|
'login.title': 'Login',
|
||||||
'login.welcome': 'WELCOME TO LOGIN',
|
'login.welcome': 'WELCOME TO LOGIN',
|
||||||
'login.username': 'Username',
|
'login.username': 'Username',
|
||||||
'login.usernamePlaceholder': 'Please enter username',
|
'login.usernamePlaceholder': 'Please enter username',
|
||||||
@@ -163,12 +163,12 @@ export default {
|
|||||||
'login.forgetPassword': 'Forgot Password?',
|
'login.forgetPassword': 'Forgot Password?',
|
||||||
'login.mobileLogin': 'Mobile Login',
|
'login.mobileLogin': 'Mobile Login',
|
||||||
'login.usernameLogin': 'Username Login',
|
'login.usernameLogin': 'Username Login',
|
||||||
'login.agreeTo': 'Logging in means you agree to the',
|
'login.agreeTo': 'Login implies acceptance of',
|
||||||
'login.userAgreement': 'User Agreement',
|
'login.userAgreement': 'User Agreement',
|
||||||
'login.and': 'and',
|
'login.and': 'and',
|
||||||
'login.privacyPolicy': 'Privacy Policy',
|
'login.privacyPolicy': 'Privacy Policy',
|
||||||
'login.registerAccount': 'Register Account',
|
'login.registerAccount': 'Register Account',
|
||||||
|
|
||||||
// Register page text
|
// Register page text
|
||||||
'register.title': 'Register Account',
|
'register.title': 'Register Account',
|
||||||
'register.welcome': 'WELCOME TO REGISTER',
|
'register.welcome': 'WELCOME TO REGISTER',
|
||||||
@@ -213,7 +213,7 @@ export default {
|
|||||||
'register.registerSuccess': 'Registration successful!',
|
'register.registerSuccess': 'Registration successful!',
|
||||||
'register.registerFailed': 'Registration failed',
|
'register.registerFailed': 'Registration failed',
|
||||||
'register.passwordsNotMatch': 'The two passwords do not match',
|
'register.passwordsNotMatch': 'The two passwords do not match',
|
||||||
|
|
||||||
// Retrieve password page text
|
// Retrieve password page text
|
||||||
'retrievePassword.title': 'Reset Password',
|
'retrievePassword.title': 'Reset Password',
|
||||||
'retrievePassword.welcome': 'PASSWORD RETRIEVE',
|
'retrievePassword.welcome': 'PASSWORD RETRIEVE',
|
||||||
@@ -240,7 +240,7 @@ export default {
|
|||||||
'retrievePassword.newPasswordRequired': 'New password cannot be empty',
|
'retrievePassword.newPasswordRequired': 'New password cannot be empty',
|
||||||
'retrievePassword.confirmNewPasswordRequired': 'Confirm new password cannot be empty',
|
'retrievePassword.confirmNewPasswordRequired': 'Confirm new password cannot be empty',
|
||||||
'retrievePassword.passwordUpdateSuccess': 'Password updated successfully',
|
'retrievePassword.passwordUpdateSuccess': 'Password updated successfully',
|
||||||
|
|
||||||
// Change password page text
|
// Change password page text
|
||||||
'changePassword.title': 'Change Password',
|
'changePassword.title': 'Change Password',
|
||||||
'changePassword.oldPasswordLabel': 'Old Password:',
|
'changePassword.oldPasswordLabel': 'Old Password:',
|
||||||
@@ -256,7 +256,7 @@ export default {
|
|||||||
'changePassword.newPasswordSameAsOld': 'New password cannot be the same as old password',
|
'changePassword.newPasswordSameAsOld': 'New password cannot be the same as old password',
|
||||||
'changePassword.passwordChangedSuccessfully': 'Password changed successfully, please login again',
|
'changePassword.passwordChangedSuccessfully': 'Password changed successfully, please login again',
|
||||||
'changePassword.changeFailed': 'Password change failed',
|
'changePassword.changeFailed': 'Password change failed',
|
||||||
|
|
||||||
// Device management page text
|
// Device management page text
|
||||||
'device.management': 'Device Management',
|
'device.management': 'Device Management',
|
||||||
'device.add': 'Add Device',
|
'device.add': 'Add Device',
|
||||||
@@ -303,16 +303,16 @@ export default {
|
|||||||
'device.autoUpdateDisabled': 'Auto update disabled',
|
'device.autoUpdateDisabled': 'Auto update disabled',
|
||||||
'device.batchUnbindSuccess': 'Successfully unbound {count} devices',
|
'device.batchUnbindSuccess': 'Successfully unbound {count} devices',
|
||||||
'device.getFirmwareTypeFailed': 'Failed to fetch firmware type',
|
'device.getFirmwareTypeFailed': 'Failed to fetch firmware type',
|
||||||
|
|
||||||
// Message tips
|
// Message tips
|
||||||
'message.success': 'Operation Successful',
|
'message.success': 'Operation Successful',
|
||||||
'message.error': 'Operation Failed',
|
'message.error': 'Operation Failed',
|
||||||
'message.warning': 'Warning',
|
'message.warning': 'Warning',
|
||||||
'message.info': 'Information',
|
'message.info': 'Information',
|
||||||
|
|
||||||
// Cache related
|
// Cache related
|
||||||
'cache.viewer': 'Cache Viewer',
|
'cache.viewer': 'Cache Viewer',
|
||||||
|
|
||||||
// Chat history dialog related
|
// Chat history dialog related
|
||||||
'chatHistory.with': 'With',
|
'chatHistory.with': 'With',
|
||||||
'chatHistory.dialogTitle': "'s Chat History",
|
'chatHistory.dialogTitle': "'s Chat History",
|
||||||
@@ -357,21 +357,21 @@ export default {
|
|||||||
'cache.clearedSuccess': 'Cache cleared successfully',
|
'cache.clearedSuccess': 'Cache cleared successfully',
|
||||||
'cache.clearFailed': 'Failed to clear cache',
|
'cache.clearFailed': 'Failed to clear cache',
|
||||||
'cache.clearCanceled': 'Clear operation canceled',
|
'cache.clearCanceled': 'Clear operation canceled',
|
||||||
|
|
||||||
// Common buttons
|
// Common buttons
|
||||||
'button.ok': 'OK',
|
'button.ok': 'OK',
|
||||||
'button.cancel': 'Cancel',
|
'button.cancel': 'Cancel',
|
||||||
'button.save': 'Save',
|
'button.save': 'Save',
|
||||||
'button.close': 'Close',
|
'button.close': 'Close',
|
||||||
|
|
||||||
// System information
|
// System information
|
||||||
'system.name': 'XiaoZhi Service',
|
'system.name': 'XiaoZhi Service',
|
||||||
|
|
||||||
// Voiceprint related
|
// Voiceprint related
|
||||||
'voiceprint.management': 'Voiceprint Management',
|
'voiceprint.management': 'Voiceprint Management',
|
||||||
'voiceprint.add': 'Add Voiceprint',
|
'voiceprint.add': 'Add Voiceprint',
|
||||||
'voiceprint.delete': 'Delete Voiceprint',
|
'voiceprint.delete': 'Delete Voiceprint',
|
||||||
|
|
||||||
// Dictionary management page text
|
// Dictionary management page text
|
||||||
'dictManagement.pageTitle': 'Dictionary Management',
|
'dictManagement.pageTitle': 'Dictionary Management',
|
||||||
'dictManagement.searchPlaceholder': 'Please enter dict value label to search',
|
'dictManagement.searchPlaceholder': 'Please enter dict value label to search',
|
||||||
@@ -407,7 +407,7 @@ export default {
|
|||||||
'dictManagement.selectDictDataToDelete': 'Please select dict data to delete',
|
'dictManagement.selectDictDataToDelete': 'Please select dict data to delete',
|
||||||
'dictManagement.confirmBatchDeleteDictData': 'Are you sure you want to delete {count} selected dict data items?',
|
'dictManagement.confirmBatchDeleteDictData': 'Are you sure you want to delete {count} selected dict data items?',
|
||||||
'dictManagement.getDictDataFailed': 'Failed to get dict data',
|
'dictManagement.getDictDataFailed': 'Failed to get dict data',
|
||||||
|
|
||||||
// User information
|
// User information
|
||||||
'user.info': 'User Information',
|
'user.info': 'User Information',
|
||||||
'user.username': 'Username',
|
'user.username': 'Username',
|
||||||
@@ -481,23 +481,23 @@ export default {
|
|||||||
'user.invalidUserId': 'There are invalid user IDs',
|
'user.invalidUserId': 'There are invalid user IDs',
|
||||||
'user.searchPhone': 'Please enter mobile phone number to search',
|
'user.searchPhone': 'Please enter mobile phone number to search',
|
||||||
'user.search': 'Search',
|
'user.search': 'Search',
|
||||||
|
|
||||||
// Language switch
|
// Language switch
|
||||||
'language.zhCN': 'Simplified Chinese',
|
'language.zhCN': '中文简体',
|
||||||
'language.zhTW': 'Traditional Chinese',
|
'language.zhTW': '中文繁體',
|
||||||
'language.en': 'English',
|
'language.en': 'English',
|
||||||
|
|
||||||
// Home page text
|
// Home page text
|
||||||
'home.addAgent': 'Add Agent',
|
'home.addAgent': 'Add Agent',
|
||||||
'home.languageModel': 'Language Model',
|
'home.languageModel': 'LLM',
|
||||||
'home.voiceModel': 'Voice Model',
|
'home.voiceModel': 'TTS',
|
||||||
'home.configureRole': 'Configure Role',
|
'home.configureRole': 'Config Role',
|
||||||
'home.voiceprintRecognition': 'Voiceprint Recognition',
|
'home.voiceprintRecognition': 'Voiceprint',
|
||||||
'home.deviceManagement': 'Device Management',
|
'home.deviceManagement': 'Devices',
|
||||||
'home.chatHistory': 'Chat History',
|
'home.chatHistory': 'Chat History',
|
||||||
'home.lastConversation': 'Last Conversation',
|
'home.lastConversation': 'Last Conversation',
|
||||||
'home.noConversation': 'No conversation yet',
|
'home.noConversation': 'No conversation yet',
|
||||||
|
|
||||||
// Parameter management page text
|
// Parameter management page text
|
||||||
'paramManagement.pageTitle': 'Parameter Management',
|
'paramManagement.pageTitle': 'Parameter Management',
|
||||||
'paramManagement.searchPlaceholder': 'Please enter parameter code or remark to search',
|
'paramManagement.searchPlaceholder': 'Please enter parameter code or remark to search',
|
||||||
@@ -539,8 +539,8 @@ export default {
|
|||||||
'home.confirmDeleteAgent': 'Are you sure you want to delete this agent?',
|
'home.confirmDeleteAgent': 'Are you sure you want to delete this agent?',
|
||||||
'home.deleteSuccess': 'Delete successful',
|
'home.deleteSuccess': 'Delete successful',
|
||||||
'home.deleteFailed': 'Delete failed',
|
'home.deleteFailed': 'Delete failed',
|
||||||
'home.enableMemory': 'Please enable memory in the "Configure Role" page first',
|
'home.enableMemory': 'Please enable memory in the "Config Role" page first',
|
||||||
|
|
||||||
// Server side management page text
|
// Server side management page text
|
||||||
'serverSideManager.pageTitle': 'Server Management',
|
'serverSideManager.pageTitle': 'Server Management',
|
||||||
'serverSideManager.wsAddress': 'WS Address',
|
'serverSideManager.wsAddress': 'WS Address',
|
||||||
@@ -556,7 +556,7 @@ export default {
|
|||||||
'serverSideManager.operationFailed': 'Operation failed',
|
'serverSideManager.operationFailed': 'Operation failed',
|
||||||
'serverSideManager.restartSuccess': 'Restart successful',
|
'serverSideManager.restartSuccess': 'Restart successful',
|
||||||
'serverSideManager.updateConfigSuccess': 'Config update successful',
|
'serverSideManager.updateConfigSuccess': 'Config update successful',
|
||||||
|
|
||||||
// Add agent dialog text
|
// Add agent dialog text
|
||||||
'addAgentDialog.title': 'Add Agent',
|
'addAgentDialog.title': 'Add Agent',
|
||||||
'addAgentDialog.agentName': 'Agent Name',
|
'addAgentDialog.agentName': 'Agent Name',
|
||||||
@@ -565,24 +565,24 @@ export default {
|
|||||||
'addAgentDialog.cancel': 'Cancel',
|
'addAgentDialog.cancel': 'Cancel',
|
||||||
'addAgentDialog.nameRequired': 'Please enter agent name',
|
'addAgentDialog.nameRequired': 'Please enter agent name',
|
||||||
'addAgentDialog.addSuccess': 'Add successful',
|
'addAgentDialog.addSuccess': 'Add successful',
|
||||||
|
|
||||||
// Role configuration page text
|
// Role configuration page text
|
||||||
'roleConfig.title': 'Role Configuration',
|
'roleConfig.title': 'Role Configuration',
|
||||||
'roleConfig.restartNotice': 'After saving the configuration, you need to restart the device for the new configuration to take effect.',
|
'roleConfig.restartNotice': 'After saving the configuration, you need to restart the device for the new configuration to take effect.',
|
||||||
'roleConfig.saveConfig': 'Save Configuration',
|
'roleConfig.saveConfig': 'Save Configuration',
|
||||||
'roleConfig.reset': 'Reset',
|
'roleConfig.reset': 'Reset',
|
||||||
'roleConfig.agentName': 'Agent Nickname',
|
'roleConfig.agentName': 'Nickname',
|
||||||
'roleConfig.roleTemplate': 'Role Template',
|
'roleConfig.roleTemplate': 'Template',
|
||||||
'roleConfig.roleIntroduction': 'Role Introduction',
|
'roleConfig.roleIntroduction': 'Introduction',
|
||||||
'roleConfig.languageCode': 'Language Code',
|
'roleConfig.languageCode': 'Language Code',
|
||||||
'roleConfig.interactionLanguage': 'Interaction Language',
|
'roleConfig.interactionLanguage': 'Interaction Language',
|
||||||
'roleConfig.vad': 'VAD',
|
'roleConfig.vad': 'Voice Detect',
|
||||||
'roleConfig.asr': 'ASR',
|
'roleConfig.asr': 'Speech Recognition',
|
||||||
'roleConfig.llm': 'LLM',
|
'roleConfig.llm': 'Language Model',
|
||||||
'roleConfig.vllm': 'VLLM',
|
'roleConfig.vllm': 'Vision Model',
|
||||||
'roleConfig.tts': 'TTS',
|
'roleConfig.tts': 'Text-to-Speech',
|
||||||
'roleConfig.memory': 'Memory',
|
'roleConfig.memory': 'Memory',
|
||||||
'roleConfig.intent': 'Intent',
|
'roleConfig.intent': 'Intent Recognition',
|
||||||
'roleConfig.voiceType': 'Voice Type',
|
'roleConfig.voiceType': 'Voice Type',
|
||||||
'roleConfig.pleaseEnterContent': 'Please enter content',
|
'roleConfig.pleaseEnterContent': 'Please enter content',
|
||||||
'roleConfig.pleaseEnterLangCode': 'Please enter language code, e.g.: en_US',
|
'roleConfig.pleaseEnterLangCode': 'Please enter language code, e.g.: en_US',
|
||||||
@@ -601,7 +601,7 @@ export default {
|
|||||||
'roleConfig.fetchConfigFailed': 'Failed to fetch configuration',
|
'roleConfig.fetchConfigFailed': 'Failed to fetch configuration',
|
||||||
'roleConfig.fetchModelsFailed': 'Failed to fetch model list',
|
'roleConfig.fetchModelsFailed': 'Failed to fetch model list',
|
||||||
'roleConfig.fetchPluginsFailed': 'Failed to fetch plugin list',
|
'roleConfig.fetchPluginsFailed': 'Failed to fetch plugin list',
|
||||||
|
|
||||||
// Function management dialog text
|
// Function management dialog text
|
||||||
'functionDialog.title': 'Function Management',
|
'functionDialog.title': 'Function Management',
|
||||||
'functionDialog.unselectedFunctions': 'Unselected Functions',
|
'functionDialog.unselectedFunctions': 'Unselected Functions',
|
||||||
@@ -629,7 +629,7 @@ export default {
|
|||||||
'functionDialog.copyFailed': 'Copy failed, please copy manually',
|
'functionDialog.copyFailed': 'Copy failed, please copy manually',
|
||||||
'functionDialog.jsonFormatError': ' field format error: invalid JSON format',
|
'functionDialog.jsonFormatError': ' field format error: invalid JSON format',
|
||||||
'functionDialog.defaultValue': 'Default Value',
|
'functionDialog.defaultValue': 'Default Value',
|
||||||
|
|
||||||
// Model Configuration Page Text
|
// Model Configuration Page Text
|
||||||
'modelConfig.searchPlaceholder': 'Please enter model name to search',
|
'modelConfig.searchPlaceholder': 'Please enter model name to search',
|
||||||
'modelConfig.search': 'Search',
|
'modelConfig.search': 'Search',
|
||||||
@@ -679,7 +679,7 @@ export default {
|
|||||||
'modelConfig.nextPage': 'Next Page',
|
'modelConfig.nextPage': 'Next Page',
|
||||||
'modelConfig.totalRecords': 'Total {total} records',
|
'modelConfig.totalRecords': 'Total {total} records',
|
||||||
'modelConfig.loading': 'Loading...',
|
'modelConfig.loading': 'Loading...',
|
||||||
|
|
||||||
// Model Configuration Dialog Text
|
// Model Configuration Dialog Text
|
||||||
'modelConfigDialog.addModel': 'Add Model',
|
'modelConfigDialog.addModel': 'Add Model',
|
||||||
'modelConfigDialog.editModel': 'Edit Model',
|
'modelConfigDialog.editModel': 'Edit Model',
|
||||||
@@ -701,7 +701,7 @@ export default {
|
|||||||
'modelConfigDialog.callInfo': 'Call Information',
|
'modelConfigDialog.callInfo': 'Call Information',
|
||||||
'modelConfigDialog.enterJsonExample': 'Please enter JSON format variables (example:{"key":"value"})',
|
'modelConfigDialog.enterJsonExample': 'Please enter JSON format variables (example:{"key":"value"})',
|
||||||
'modelConfigDialog.save': 'Save',
|
'modelConfigDialog.save': 'Save',
|
||||||
|
|
||||||
// TTS Model Configuration Text
|
// TTS Model Configuration Text
|
||||||
'ttsModel.select': 'Select',
|
'ttsModel.select': 'Select',
|
||||||
'ttsModel.voiceCode': 'Voice Code',
|
'ttsModel.voiceCode': 'Voice Code',
|
||||||
@@ -725,7 +725,7 @@ export default {
|
|||||||
'ttsModel.fetchVoicesFailed': 'Failed to fetch voice list',
|
'ttsModel.fetchVoicesFailed': 'Failed to fetch voice list',
|
||||||
'ttsModel.loadVoicesFailed': 'Failed to load voice data',
|
'ttsModel.loadVoicesFailed': 'Failed to load voice data',
|
||||||
'ttsModel.unnamedVoice': 'Unnamed Voice',
|
'ttsModel.unnamedVoice': 'Unnamed Voice',
|
||||||
|
|
||||||
// OTA Management Page Text
|
// OTA Management Page Text
|
||||||
'otaManagement.firmwareManagement': 'Firmware Management',
|
'otaManagement.firmwareManagement': 'Firmware Management',
|
||||||
'otaManagement.searchPlaceholder': 'Please enter firmware name to search',
|
'otaManagement.searchPlaceholder': 'Please enter firmware name to search',
|
||||||
@@ -765,7 +765,7 @@ export default {
|
|||||||
'otaManagement.addSuccess': 'Addition successful',
|
'otaManagement.addSuccess': 'Addition successful',
|
||||||
'otaManagement.addFailed': 'Addition failed',
|
'otaManagement.addFailed': 'Addition failed',
|
||||||
'otaManagement.fetchFirmwareListFailed': 'Failed to fetch firmware list',
|
'otaManagement.fetchFirmwareListFailed': 'Failed to fetch firmware list',
|
||||||
|
|
||||||
// Provider Management page model type translations
|
// Provider Management page model type translations
|
||||||
'providerManagement.all': 'All',
|
'providerManagement.all': 'All',
|
||||||
'providerManagement.modelType.ASR': 'Speech Recognition',
|
'providerManagement.modelType.ASR': 'Speech Recognition',
|
||||||
@@ -776,7 +776,7 @@ export default {
|
|||||||
'providerManagement.modelType.Memory': 'Memory Module',
|
'providerManagement.modelType.Memory': 'Memory Module',
|
||||||
'providerManagement.modelType.VAD': 'Voice Activity Detection',
|
'providerManagement.modelType.VAD': 'Voice Activity Detection',
|
||||||
'providerManagement.modelType.Plugin': 'Plugin Tool',
|
'providerManagement.modelType.Plugin': 'Plugin Tool',
|
||||||
|
|
||||||
// Provider Dialog translations
|
// Provider Dialog translations
|
||||||
'providerDialog.category': 'Category',
|
'providerDialog.category': 'Category',
|
||||||
'providerDialog.selectCategory': 'Please select category',
|
'providerDialog.selectCategory': 'Please select category',
|
||||||
@@ -814,4 +814,4 @@ export default {
|
|||||||
'providerDialog.selectFieldsToDelete': 'Please select fields to delete first',
|
'providerDialog.selectFieldsToDelete': 'Please select fields to delete first',
|
||||||
'providerDialog.confirmBatchDeleteFields': 'Are you sure to delete {count} selected fields?',
|
'providerDialog.confirmBatchDeleteFields': 'Are you sure to delete {count} selected fields?',
|
||||||
'providerDialog.batchDeleteFieldsSuccess': 'Successfully deleted {count} fields',
|
'providerDialog.batchDeleteFieldsSuccess': 'Successfully deleted {count} fields',
|
||||||
};
|
};
|
||||||
@@ -7,7 +7,7 @@ export default {
|
|||||||
'header.paramDictionary': '参数字典',
|
'header.paramDictionary': '参数字典',
|
||||||
'header.paramManagement': '参数管理',
|
'header.paramManagement': '参数管理',
|
||||||
'header.dictManagement': '字典管理',
|
'header.dictManagement': '字典管理',
|
||||||
|
|
||||||
// 字典数据对话框相关
|
// 字典数据对话框相关
|
||||||
'dictDataDialog.addDictData': '新增字典数据',
|
'dictDataDialog.addDictData': '新增字典数据',
|
||||||
'dictDataDialog.dictLabel': '字典标签',
|
'dictDataDialog.dictLabel': '字典标签',
|
||||||
@@ -17,7 +17,7 @@ export default {
|
|||||||
'dictDataDialog.sort': '排序',
|
'dictDataDialog.sort': '排序',
|
||||||
'dictDataDialog.requiredDictLabel': '请输入字典标签',
|
'dictDataDialog.requiredDictLabel': '请输入字典标签',
|
||||||
'dictDataDialog.requiredDictValue': '请输入字典值',
|
'dictDataDialog.requiredDictValue': '请输入字典值',
|
||||||
|
|
||||||
// 字典类型对话框相关
|
// 字典类型对话框相关
|
||||||
'dictTypeDialog.addDictType': '新增字典类型',
|
'dictTypeDialog.addDictType': '新增字典类型',
|
||||||
'dictTypeDialog.dictName': '字典类型名称',
|
'dictTypeDialog.dictName': '字典类型名称',
|
||||||
@@ -86,7 +86,7 @@ export default {
|
|||||||
'voicePrint.cancelDelete': '已取消删除操作',
|
'voicePrint.cancelDelete': '已取消删除操作',
|
||||||
'voicePrint.closeOperation': '操作已关闭',
|
'voicePrint.closeOperation': '操作已关闭',
|
||||||
'voicePrint.loading': '拼命加载中',
|
'voicePrint.loading': '拼命加载中',
|
||||||
|
|
||||||
// 手動添加設備對話框相關
|
// 手動添加設備對話框相關
|
||||||
'manualAddDeviceDialog.title': '手动添加设备',
|
'manualAddDeviceDialog.title': '手动添加设备',
|
||||||
'manualAddDeviceDialog.deviceType': '设备型号',
|
'manualAddDeviceDialog.deviceType': '设备型号',
|
||||||
@@ -98,7 +98,7 @@ export default {
|
|||||||
'manualAddDeviceDialog.confirm': '确定',
|
'manualAddDeviceDialog.confirm': '确定',
|
||||||
'manualAddDeviceDialog.cancel': '取消',
|
'manualAddDeviceDialog.cancel': '取消',
|
||||||
'manualAddDeviceDialog.requiredMacAddress': '请输入Mac地址',
|
'manualAddDeviceDialog.requiredMacAddress': '请输入Mac地址',
|
||||||
|
|
||||||
// 参数对话框相关
|
// 参数对话框相关
|
||||||
'paramDialog.paramCode': '参数编码',
|
'paramDialog.paramCode': '参数编码',
|
||||||
'paramDialog.paramCodePlaceholder': '请输入参数编码',
|
'paramDialog.paramCodePlaceholder': '请输入参数编码',
|
||||||
@@ -146,10 +146,10 @@ export default {
|
|||||||
'header.changePassword': '修改密码',
|
'header.changePassword': '修改密码',
|
||||||
'header.logout': '退出登录',
|
'header.logout': '退出登录',
|
||||||
'header.searchPlaceholder': '输入名称搜索..',
|
'header.searchPlaceholder': '输入名称搜索..',
|
||||||
|
|
||||||
// 登录页面文本
|
// 登录页面文本
|
||||||
'login.title': '小智服务登录',
|
'login.title': '登录',
|
||||||
'login.welcome': '欢迎登录',
|
'login.welcome': 'WELCOME TO LOGIN',
|
||||||
'login.username': '用户名',
|
'login.username': '用户名',
|
||||||
'login.usernamePlaceholder': '请输入用户名',
|
'login.usernamePlaceholder': '请输入用户名',
|
||||||
'login.mobilePlaceholder': '请输入手机号码',
|
'login.mobilePlaceholder': '请输入手机号码',
|
||||||
@@ -168,7 +168,7 @@ export default {
|
|||||||
'login.and': '和',
|
'login.and': '和',
|
||||||
'login.privacyPolicy': '《隐私政策》',
|
'login.privacyPolicy': '《隐私政策》',
|
||||||
'login.registerAccount': '注册账号',
|
'login.registerAccount': '注册账号',
|
||||||
|
|
||||||
// 注册页面文本
|
// 注册页面文本
|
||||||
'register.title': '注册账号',
|
'register.title': '注册账号',
|
||||||
'register.welcome': '欢迎注册',
|
'register.welcome': '欢迎注册',
|
||||||
@@ -213,7 +213,7 @@ export default {
|
|||||||
'register.registerSuccess': '注册成功!',
|
'register.registerSuccess': '注册成功!',
|
||||||
'register.registerFailed': '注册失败',
|
'register.registerFailed': '注册失败',
|
||||||
'register.passwordsNotMatch': '两次输入的密码不一致',
|
'register.passwordsNotMatch': '两次输入的密码不一致',
|
||||||
|
|
||||||
// 忘记密码页面文本
|
// 忘记密码页面文本
|
||||||
'retrievePassword.title': '重置密码',
|
'retrievePassword.title': '重置密码',
|
||||||
'retrievePassword.welcome': '密码找回',
|
'retrievePassword.welcome': '密码找回',
|
||||||
@@ -240,7 +240,7 @@ export default {
|
|||||||
'retrievePassword.newPasswordRequired': '新密码不能为空',
|
'retrievePassword.newPasswordRequired': '新密码不能为空',
|
||||||
'retrievePassword.confirmNewPasswordRequired': '确认新密码不能为空',
|
'retrievePassword.confirmNewPasswordRequired': '确认新密码不能为空',
|
||||||
'retrievePassword.passwordUpdateSuccess': '密码修改成功',
|
'retrievePassword.passwordUpdateSuccess': '密码修改成功',
|
||||||
|
|
||||||
// 修改密码页面文本
|
// 修改密码页面文本
|
||||||
'changePassword.title': '修改密码',
|
'changePassword.title': '修改密码',
|
||||||
'changePassword.oldPasswordLabel': '旧密码:',
|
'changePassword.oldPasswordLabel': '旧密码:',
|
||||||
@@ -256,7 +256,7 @@ export default {
|
|||||||
'changePassword.newPasswordSameAsOld': '新密码不能与旧密码相同',
|
'changePassword.newPasswordSameAsOld': '新密码不能与旧密码相同',
|
||||||
'changePassword.passwordChangedSuccessfully': '密码修改成功,请重新登录',
|
'changePassword.passwordChangedSuccessfully': '密码修改成功,请重新登录',
|
||||||
'changePassword.changeFailed': '密码修改失败',
|
'changePassword.changeFailed': '密码修改失败',
|
||||||
|
|
||||||
// 设备管理页面文本
|
// 设备管理页面文本
|
||||||
'device.management': '设备管理',
|
'device.management': '设备管理',
|
||||||
'device.add': '添加设备',
|
'device.add': '添加设备',
|
||||||
@@ -303,16 +303,16 @@ export default {
|
|||||||
'device.autoUpdateDisabled': '已关闭自动升级',
|
'device.autoUpdateDisabled': '已关闭自动升级',
|
||||||
'device.batchUnbindSuccess': '成功解绑 {count} 台设备',
|
'device.batchUnbindSuccess': '成功解绑 {count} 台设备',
|
||||||
'device.getFirmwareTypeFailed': '获取固件类型失败',
|
'device.getFirmwareTypeFailed': '获取固件类型失败',
|
||||||
|
|
||||||
// 消息提示
|
// 消息提示
|
||||||
'message.success': '操作成功',
|
'message.success': '操作成功',
|
||||||
'message.error': '操作失败',
|
'message.error': '操作失败',
|
||||||
'message.warning': '警告',
|
'message.warning': '警告',
|
||||||
'message.info': '提示',
|
'message.info': '提示',
|
||||||
|
|
||||||
// 缓存相关
|
// 缓存相关
|
||||||
'cache.viewer': '缓存查看器',
|
'cache.viewer': '缓存查看器',
|
||||||
|
|
||||||
// 聊天历史对话框相关
|
// 聊天历史对话框相关
|
||||||
'chatHistory.with': '与',
|
'chatHistory.with': '与',
|
||||||
'chatHistory.dialogTitle': '的聊天记录',
|
'chatHistory.dialogTitle': '的聊天记录',
|
||||||
@@ -357,16 +357,16 @@ export default {
|
|||||||
'cache.clearedSuccess': '缓存已清除',
|
'cache.clearedSuccess': '缓存已清除',
|
||||||
'cache.clearFailed': '清除缓存失败',
|
'cache.clearFailed': '清除缓存失败',
|
||||||
'cache.clearCanceled': '已取消清除',
|
'cache.clearCanceled': '已取消清除',
|
||||||
|
|
||||||
// 通用按钮
|
// 通用按钮
|
||||||
'button.ok': '确定',
|
'button.ok': '确定',
|
||||||
'button.cancel': '取消',
|
'button.cancel': '取消',
|
||||||
'button.save': '保存',
|
'button.save': '保存',
|
||||||
'button.close': '关闭',
|
'button.close': '关闭',
|
||||||
|
|
||||||
// 系统信息
|
// 系统信息
|
||||||
'system.name': '小智服务',
|
'system.name': '小智服务',
|
||||||
|
|
||||||
// 声纹相关
|
// 声纹相关
|
||||||
'voiceprint.management': '声纹管理',
|
'voiceprint.management': '声纹管理',
|
||||||
'voiceprint.add': '添加声纹',
|
'voiceprint.add': '添加声纹',
|
||||||
@@ -407,7 +407,7 @@ export default {
|
|||||||
'dictManagement.selectDictDataToDelete': '请选择要删除的字典数据',
|
'dictManagement.selectDictDataToDelete': '请选择要删除的字典数据',
|
||||||
'dictManagement.confirmBatchDeleteDictData': '确定要删除选中的{count}个字典数据吗?',
|
'dictManagement.confirmBatchDeleteDictData': '确定要删除选中的{count}个字典数据吗?',
|
||||||
'dictManagement.getDictDataFailed': '获取字典数据失败',
|
'dictManagement.getDictDataFailed': '获取字典数据失败',
|
||||||
|
|
||||||
// 用户信息
|
// 用户信息
|
||||||
'user.info': '用户信息',
|
'user.info': '用户信息',
|
||||||
'user.username': '用户名',
|
'user.username': '用户名',
|
||||||
@@ -481,12 +481,12 @@ export default {
|
|||||||
'user.invalidUserId': '存在无效的用户ID',
|
'user.invalidUserId': '存在无效的用户ID',
|
||||||
'user.searchPhone': '请输入手机号码查询',
|
'user.searchPhone': '请输入手机号码查询',
|
||||||
'user.search': '搜索',
|
'user.search': '搜索',
|
||||||
|
|
||||||
// 语言切换
|
// 语言切换
|
||||||
'language.zhCN': '中文简体',
|
'language.zhCN': '中文简体',
|
||||||
'language.zhTW': '中文繁体',
|
'language.zhTW': '中文繁體',
|
||||||
'language.en': 'English',
|
'language.en': 'English',
|
||||||
|
|
||||||
// 首页文本
|
// 首页文本
|
||||||
'home.addAgent': '添加智能体',
|
'home.addAgent': '添加智能体',
|
||||||
'home.languageModel': '语言模型',
|
'home.languageModel': '语言模型',
|
||||||
@@ -497,7 +497,7 @@ export default {
|
|||||||
'home.chatHistory': '聊天记录',
|
'home.chatHistory': '聊天记录',
|
||||||
'home.lastConversation': '最近对话',
|
'home.lastConversation': '最近对话',
|
||||||
'home.noConversation': '暂未对话',
|
'home.noConversation': '暂未对话',
|
||||||
|
|
||||||
// 参数管理页面文本
|
// 参数管理页面文本
|
||||||
'paramManagement.pageTitle': '参数管理',
|
'paramManagement.pageTitle': '参数管理',
|
||||||
'paramManagement.searchPlaceholder': '请输入参数编码或备注查询',
|
'paramManagement.searchPlaceholder': '请输入参数编码或备注查询',
|
||||||
@@ -539,7 +539,7 @@ export default {
|
|||||||
'home.deleteSuccess': '删除成功',
|
'home.deleteSuccess': '删除成功',
|
||||||
'home.deleteFailed': '删除失败',
|
'home.deleteFailed': '删除失败',
|
||||||
'home.enableMemory': '请先在“配置角色”界面开启记忆',
|
'home.enableMemory': '请先在“配置角色”界面开启记忆',
|
||||||
|
|
||||||
// 服务端管理页面文本
|
// 服务端管理页面文本
|
||||||
'serverSideManager.pageTitle': '服务端管理',
|
'serverSideManager.pageTitle': '服务端管理',
|
||||||
'serverSideManager.wsAddress': 'ws地址',
|
'serverSideManager.wsAddress': 'ws地址',
|
||||||
@@ -555,7 +555,7 @@ export default {
|
|||||||
'serverSideManager.operationFailed': '操作失败',
|
'serverSideManager.operationFailed': '操作失败',
|
||||||
'serverSideManager.restartSuccess': '重启成功',
|
'serverSideManager.restartSuccess': '重启成功',
|
||||||
'serverSideManager.updateConfigSuccess': '更新配置成功',
|
'serverSideManager.updateConfigSuccess': '更新配置成功',
|
||||||
|
|
||||||
// 添加智能体对话框文本
|
// 添加智能体对话框文本
|
||||||
'addAgentDialog.title': '添加智能体',
|
'addAgentDialog.title': '添加智能体',
|
||||||
'addAgentDialog.agentName': '智能体名称',
|
'addAgentDialog.agentName': '智能体名称',
|
||||||
@@ -564,7 +564,7 @@ export default {
|
|||||||
'addAgentDialog.cancel': '取消',
|
'addAgentDialog.cancel': '取消',
|
||||||
'addAgentDialog.nameRequired': '请输入智能体名称',
|
'addAgentDialog.nameRequired': '请输入智能体名称',
|
||||||
'addAgentDialog.addSuccess': '添加成功',
|
'addAgentDialog.addSuccess': '添加成功',
|
||||||
|
|
||||||
// 角色配置页面文本
|
// 角色配置页面文本
|
||||||
'roleConfig.title': '角色配置',
|
'roleConfig.title': '角色配置',
|
||||||
'roleConfig.restartNotice': '保存配置后,需要重启设备,新的配置才会生效。',
|
'roleConfig.restartNotice': '保存配置后,需要重启设备,新的配置才会生效。',
|
||||||
@@ -579,8 +579,8 @@ export default {
|
|||||||
'roleConfig.asr': '语音识别(ASR)',
|
'roleConfig.asr': '语音识别(ASR)',
|
||||||
'roleConfig.llm': '大语言模型(LLM)',
|
'roleConfig.llm': '大语言模型(LLM)',
|
||||||
'roleConfig.vllm': '视觉大模型(VLLM)',
|
'roleConfig.vllm': '视觉大模型(VLLM)',
|
||||||
'roleConfig.intent': '意图识别(Intent)',
|
'roleConfig.intent': '意图识别(Intent)',
|
||||||
'roleConfig.memory': '记忆(Memory)',
|
'roleConfig.memory': '记忆(Memory)',
|
||||||
'roleConfig.tts': '语音合成(TTS)',
|
'roleConfig.tts': '语音合成(TTS)',
|
||||||
'roleConfig.voiceType': '角色音色(Voice Type)',
|
'roleConfig.voiceType': '角色音色(Voice Type)',
|
||||||
'roleConfig.pleaseEnterContent': '请输入内容',
|
'roleConfig.pleaseEnterContent': '请输入内容',
|
||||||
@@ -600,7 +600,7 @@ export default {
|
|||||||
'roleConfig.fetchConfigFailed': '获取配置失败',
|
'roleConfig.fetchConfigFailed': '获取配置失败',
|
||||||
'roleConfig.fetchModelsFailed': '获取模型列表失败',
|
'roleConfig.fetchModelsFailed': '获取模型列表失败',
|
||||||
'roleConfig.fetchPluginsFailed': '获取插件列表失败',
|
'roleConfig.fetchPluginsFailed': '获取插件列表失败',
|
||||||
|
|
||||||
// 功能管理对话框文本
|
// 功能管理对话框文本
|
||||||
'functionDialog.title': '功能管理',
|
'functionDialog.title': '功能管理',
|
||||||
'functionDialog.unselectedFunctions': '未选功能',
|
'functionDialog.unselectedFunctions': '未选功能',
|
||||||
@@ -628,7 +628,7 @@ export default {
|
|||||||
'functionDialog.copyFailed': '复制失败,请手动复制',
|
'functionDialog.copyFailed': '复制失败,请手动复制',
|
||||||
'functionDialog.jsonFormatError': '的字段格式错误:JSON格式有误',
|
'functionDialog.jsonFormatError': '的字段格式错误:JSON格式有误',
|
||||||
'functionDialog.defaultValue': '默认值',
|
'functionDialog.defaultValue': '默认值',
|
||||||
|
|
||||||
// 模型配置页面文本
|
// 模型配置页面文本
|
||||||
'modelConfig.searchPlaceholder': '请输入模型名称查询',
|
'modelConfig.searchPlaceholder': '请输入模型名称查询',
|
||||||
'modelConfig.search': '搜索',
|
'modelConfig.search': '搜索',
|
||||||
@@ -678,7 +678,7 @@ export default {
|
|||||||
'modelConfig.nextPage': '下一页',
|
'modelConfig.nextPage': '下一页',
|
||||||
'modelConfig.totalRecords': '共{total}条记录',
|
'modelConfig.totalRecords': '共{total}条记录',
|
||||||
'modelConfig.loading': '拼命加载中',
|
'modelConfig.loading': '拼命加载中',
|
||||||
|
|
||||||
// 模型配置对话框文本
|
// 模型配置对话框文本
|
||||||
'modelConfigDialog.addModel': '添加模型',
|
'modelConfigDialog.addModel': '添加模型',
|
||||||
'modelConfigDialog.editModel': '修改模型',
|
'modelConfigDialog.editModel': '修改模型',
|
||||||
@@ -700,7 +700,7 @@ export default {
|
|||||||
'modelConfigDialog.callInfo': '调用信息',
|
'modelConfigDialog.callInfo': '调用信息',
|
||||||
'modelConfigDialog.enterJsonExample': '请输入JSON格式变量(示例:{"key":"value"})',
|
'modelConfigDialog.enterJsonExample': '请输入JSON格式变量(示例:{"key":"value"})',
|
||||||
'modelConfigDialog.save': '保存',
|
'modelConfigDialog.save': '保存',
|
||||||
|
|
||||||
// TTS模型配置文本
|
// TTS模型配置文本
|
||||||
'ttsModel.select': '选择',
|
'ttsModel.select': '选择',
|
||||||
'ttsModel.voiceCode': '音色编码',
|
'ttsModel.voiceCode': '音色编码',
|
||||||
@@ -724,7 +724,7 @@ export default {
|
|||||||
'ttsModel.fetchVoicesFailed': '获取音色列表失败',
|
'ttsModel.fetchVoicesFailed': '获取音色列表失败',
|
||||||
'ttsModel.loadVoicesFailed': '加载音色数据失败',
|
'ttsModel.loadVoicesFailed': '加载音色数据失败',
|
||||||
'ttsModel.unnamedVoice': '未命名音色',
|
'ttsModel.unnamedVoice': '未命名音色',
|
||||||
|
|
||||||
// OTA管理页面文本
|
// OTA管理页面文本
|
||||||
'otaManagement.firmwareManagement': '固件管理',
|
'otaManagement.firmwareManagement': '固件管理',
|
||||||
'otaManagement.searchPlaceholder': '请输入固件名称查询',
|
'otaManagement.searchPlaceholder': '请输入固件名称查询',
|
||||||
@@ -764,7 +764,7 @@ export default {
|
|||||||
'otaManagement.addSuccess': '新增成功',
|
'otaManagement.addSuccess': '新增成功',
|
||||||
'otaManagement.addFailed': '新增失败',
|
'otaManagement.addFailed': '新增失败',
|
||||||
'otaManagement.fetchFirmwareListFailed': '获取固件列表失败',
|
'otaManagement.fetchFirmwareListFailed': '获取固件列表失败',
|
||||||
|
|
||||||
// 字段管理页面模型类型翻译
|
// 字段管理页面模型类型翻译
|
||||||
'providerManagement.all': '全部',
|
'providerManagement.all': '全部',
|
||||||
'providerManagement.modelType.ASR': '语音识别',
|
'providerManagement.modelType.ASR': '语音识别',
|
||||||
@@ -775,7 +775,7 @@ export default {
|
|||||||
'providerManagement.modelType.Memory': '记忆模块',
|
'providerManagement.modelType.Memory': '记忆模块',
|
||||||
'providerManagement.modelType.VAD': '语音活动检测',
|
'providerManagement.modelType.VAD': '语音活动检测',
|
||||||
'providerManagement.modelType.Plugin': '插件工具',
|
'providerManagement.modelType.Plugin': '插件工具',
|
||||||
|
|
||||||
// Provider Dialog 翻译
|
// Provider Dialog 翻译
|
||||||
'providerDialog.category': '类别',
|
'providerDialog.category': '类别',
|
||||||
'providerDialog.selectCategory': '请选择类别',
|
'providerDialog.selectCategory': '请选择类别',
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ export default {
|
|||||||
'header.paramDictionary': '參數字典',
|
'header.paramDictionary': '參數字典',
|
||||||
'header.paramManagement': '參數管理',
|
'header.paramManagement': '參數管理',
|
||||||
'header.dictManagement': '字典管理',
|
'header.dictManagement': '字典管理',
|
||||||
|
|
||||||
// 字典數據對話框相關
|
// 字典數據對話框相關
|
||||||
'dictDataDialog.addDictData': '新增字典數據',
|
'dictDataDialog.addDictData': '新增字典數據',
|
||||||
'dictDataDialog.dictLabel': '字典標籤',
|
'dictDataDialog.dictLabel': '字典標籤',
|
||||||
@@ -17,7 +17,7 @@ export default {
|
|||||||
'dictDataDialog.sort': '排序',
|
'dictDataDialog.sort': '排序',
|
||||||
'dictDataDialog.requiredDictLabel': '請輸入字典標籤',
|
'dictDataDialog.requiredDictLabel': '請輸入字典標籤',
|
||||||
'dictDataDialog.requiredDictValue': '請輸入字典值',
|
'dictDataDialog.requiredDictValue': '請輸入字典值',
|
||||||
|
|
||||||
// 字典類型對話框相關
|
// 字典類型對話框相關
|
||||||
'dictTypeDialog.addDictType': '新增字典類型',
|
'dictTypeDialog.addDictType': '新增字典類型',
|
||||||
'dictTypeDialog.dictName': '字典類型名稱',
|
'dictTypeDialog.dictName': '字典類型名稱',
|
||||||
@@ -86,7 +86,7 @@ export default {
|
|||||||
'voicePrint.cancelDelete': '已取消刪除操作',
|
'voicePrint.cancelDelete': '已取消刪除操作',
|
||||||
'voicePrint.closeOperation': '操作已關閉',
|
'voicePrint.closeOperation': '操作已關閉',
|
||||||
'voicePrint.loading': '拼命加載中',
|
'voicePrint.loading': '拼命加載中',
|
||||||
|
|
||||||
// 手動添加設備對話框相關
|
// 手動添加設備對話框相關
|
||||||
'manualAddDeviceDialog.title': '手動添加設備',
|
'manualAddDeviceDialog.title': '手動添加設備',
|
||||||
'manualAddDeviceDialog.deviceType': '設備型號',
|
'manualAddDeviceDialog.deviceType': '設備型號',
|
||||||
@@ -98,7 +98,7 @@ export default {
|
|||||||
'manualAddDeviceDialog.confirm': '確定',
|
'manualAddDeviceDialog.confirm': '確定',
|
||||||
'manualAddDeviceDialog.cancel': '取消',
|
'manualAddDeviceDialog.cancel': '取消',
|
||||||
'manualAddDeviceDialog.requiredMacAddress': '請輸入Mac地址',
|
'manualAddDeviceDialog.requiredMacAddress': '請輸入Mac地址',
|
||||||
|
|
||||||
// 參數對話框相關
|
// 參數對話框相關
|
||||||
'paramDialog.paramCode': '參數編碼',
|
'paramDialog.paramCode': '參數編碼',
|
||||||
'paramDialog.paramCodePlaceholder': '請輸入參數編碼',
|
'paramDialog.paramCodePlaceholder': '請輸入參數編碼',
|
||||||
@@ -146,10 +146,10 @@ export default {
|
|||||||
'header.changePassword': '修改密碼',
|
'header.changePassword': '修改密碼',
|
||||||
'header.logout': '退出登錄',
|
'header.logout': '退出登錄',
|
||||||
'header.searchPlaceholder': '輸入名稱搜索..',
|
'header.searchPlaceholder': '輸入名稱搜索..',
|
||||||
|
|
||||||
// 登录页面文本
|
// 登录页面文本
|
||||||
'login.title': '小智服務登錄',
|
'login.title': '登錄',
|
||||||
'login.welcome': '歡迎登錄',
|
'login.welcome': 'WELCOME TO LOGIN',
|
||||||
'login.username': '用戶名',
|
'login.username': '用戶名',
|
||||||
'login.usernamePlaceholder': '請輸入用戶名',
|
'login.usernamePlaceholder': '請輸入用戶名',
|
||||||
'login.mobilePlaceholder': '請輸入手機號碼',
|
'login.mobilePlaceholder': '請輸入手機號碼',
|
||||||
@@ -168,7 +168,7 @@ export default {
|
|||||||
'login.and': '和',
|
'login.and': '和',
|
||||||
'login.privacyPolicy': '《隱私政策》',
|
'login.privacyPolicy': '《隱私政策》',
|
||||||
'login.registerAccount': '註冊賬號',
|
'login.registerAccount': '註冊賬號',
|
||||||
|
|
||||||
// 注册页面文本
|
// 注册页面文本
|
||||||
'register.title': '註冊賬號',
|
'register.title': '註冊賬號',
|
||||||
'register.welcome': '歡迎註冊',
|
'register.welcome': '歡迎註冊',
|
||||||
@@ -213,7 +213,7 @@ export default {
|
|||||||
'register.registerSuccess': '註冊成功!',
|
'register.registerSuccess': '註冊成功!',
|
||||||
'register.registerFailed': '註冊失敗',
|
'register.registerFailed': '註冊失敗',
|
||||||
'register.passwordsNotMatch': '兩次輸入的密碼不一致',
|
'register.passwordsNotMatch': '兩次輸入的密碼不一致',
|
||||||
|
|
||||||
// 忘记密码页面文本
|
// 忘记密码页面文本
|
||||||
'retrievePassword.title': '重置密碼',
|
'retrievePassword.title': '重置密碼',
|
||||||
'retrievePassword.welcome': '密碼找回',
|
'retrievePassword.welcome': '密碼找回',
|
||||||
@@ -240,7 +240,7 @@ export default {
|
|||||||
'retrievePassword.newPasswordRequired': '新密碼不能為空',
|
'retrievePassword.newPasswordRequired': '新密碼不能為空',
|
||||||
'retrievePassword.confirmNewPasswordRequired': '確認新密碼不能為空',
|
'retrievePassword.confirmNewPasswordRequired': '確認新密碼不能為空',
|
||||||
'retrievePassword.passwordUpdateSuccess': '密碼修改成功',
|
'retrievePassword.passwordUpdateSuccess': '密碼修改成功',
|
||||||
|
|
||||||
// 修改密码页面文本
|
// 修改密码页面文本
|
||||||
'changePassword.title': '修改密碼',
|
'changePassword.title': '修改密碼',
|
||||||
'changePassword.oldPasswordLabel': '舊密碼:',
|
'changePassword.oldPasswordLabel': '舊密碼:',
|
||||||
@@ -256,7 +256,7 @@ export default {
|
|||||||
'changePassword.newPasswordSameAsOld': '新密碼不能與舊密碼相同',
|
'changePassword.newPasswordSameAsOld': '新密碼不能與舊密碼相同',
|
||||||
'changePassword.passwordChangedSuccessfully': '密碼修改成功,請重新登錄',
|
'changePassword.passwordChangedSuccessfully': '密碼修改成功,請重新登錄',
|
||||||
'changePassword.changeFailed': '密碼修改失敗',
|
'changePassword.changeFailed': '密碼修改失敗',
|
||||||
|
|
||||||
// 设备管理页面文本
|
// 设备管理页面文本
|
||||||
'device.management': '設備管理',
|
'device.management': '設備管理',
|
||||||
'device.add': '添加設備',
|
'device.add': '添加設備',
|
||||||
@@ -303,16 +303,16 @@ export default {
|
|||||||
'device.autoUpdateDisabled': '已關閉自動升級',
|
'device.autoUpdateDisabled': '已關閉自動升級',
|
||||||
'device.batchUnbindSuccess': '成功解綁 {count} 台設備',
|
'device.batchUnbindSuccess': '成功解綁 {count} 台設備',
|
||||||
'device.getFirmwareTypeFailed': '獲取固件類型失敗',
|
'device.getFirmwareTypeFailed': '獲取固件類型失敗',
|
||||||
|
|
||||||
// 消息提示
|
// 消息提示
|
||||||
'message.success': '操作成功',
|
'message.success': '操作成功',
|
||||||
'message.error': '操作失敗',
|
'message.error': '操作失敗',
|
||||||
'message.warning': '警告',
|
'message.warning': '警告',
|
||||||
'message.info': '提示',
|
'message.info': '提示',
|
||||||
|
|
||||||
// 缓存相关
|
// 缓存相关
|
||||||
'cache.viewer': '緩存查看器',
|
'cache.viewer': '緩存查看器',
|
||||||
|
|
||||||
// 聊天历史对话框相关
|
// 聊天历史对话框相关
|
||||||
'chatHistory.with': '與',
|
'chatHistory.with': '與',
|
||||||
'chatHistory.dialogTitle': '的聊天記錄',
|
'chatHistory.dialogTitle': '的聊天記錄',
|
||||||
@@ -357,21 +357,21 @@ export default {
|
|||||||
'cache.clearedSuccess': '緩存已清除',
|
'cache.clearedSuccess': '緩存已清除',
|
||||||
'cache.clearFailed': '清除緩存失敗',
|
'cache.clearFailed': '清除緩存失敗',
|
||||||
'cache.clearCanceled': '已取消清除',
|
'cache.clearCanceled': '已取消清除',
|
||||||
|
|
||||||
// 通用按钮
|
// 通用按钮
|
||||||
'button.ok': '確定',
|
'button.ok': '確定',
|
||||||
'button.cancel': '取消',
|
'button.cancel': '取消',
|
||||||
'button.save': '保存',
|
'button.save': '保存',
|
||||||
'button.close': '關閉',
|
'button.close': '關閉',
|
||||||
|
|
||||||
// 系统信息
|
// 系统信息
|
||||||
'system.name': '小智服務',
|
'system.name': '小智服務',
|
||||||
|
|
||||||
// 声纹相关
|
// 声纹相关
|
||||||
'voiceprint.management': '聲紋管理',
|
'voiceprint.management': '聲紋管理',
|
||||||
'voiceprint.add': '添加聲紋',
|
'voiceprint.add': '添加聲紋',
|
||||||
'voiceprint.delete': '刪除聲紋',
|
'voiceprint.delete': '刪除聲紋',
|
||||||
|
|
||||||
// 用户信息
|
// 用户信息
|
||||||
'user.info': '用戶信息',
|
'user.info': '用戶信息',
|
||||||
'user.username': '用戶名',
|
'user.username': '用戶名',
|
||||||
@@ -409,12 +409,12 @@ export default {
|
|||||||
'user.invalidUserId': '存在無效的用戶ID',
|
'user.invalidUserId': '存在無效的用戶ID',
|
||||||
'user.searchPhone': '請輸入手機號碼查詢',
|
'user.searchPhone': '請輸入手機號碼查詢',
|
||||||
'user.search': '搜索',
|
'user.search': '搜索',
|
||||||
|
|
||||||
// 語言切換
|
// 語言切換
|
||||||
'language.zhCN': '中文簡體',
|
'language.zhCN': '中文简体',
|
||||||
'language.zhTW': '中文繁體',
|
'language.zhTW': '中文繁體',
|
||||||
'language.en': 'English',
|
'language.en': 'English',
|
||||||
|
|
||||||
// 首頁文本
|
// 首頁文本
|
||||||
'home.addAgent': '添加智能體',
|
'home.addAgent': '添加智能體',
|
||||||
'home.languageModel': '語言模型',
|
'home.languageModel': '語言模型',
|
||||||
@@ -425,7 +425,7 @@ export default {
|
|||||||
'home.chatHistory': '聊天記錄',
|
'home.chatHistory': '聊天記錄',
|
||||||
'home.lastConversation': '最近對話',
|
'home.lastConversation': '最近對話',
|
||||||
'home.noConversation': '暫未對話',
|
'home.noConversation': '暫未對話',
|
||||||
|
|
||||||
// 參數管理頁面文本
|
// 參數管理頁面文本
|
||||||
'paramManagement.pageTitle': '參數管理',
|
'paramManagement.pageTitle': '參數管理',
|
||||||
'paramManagement.searchPlaceholder': '請輸入參數編碼或備註查詢',
|
'paramManagement.searchPlaceholder': '請輸入參數編碼或備註查詢',
|
||||||
@@ -445,7 +445,7 @@ export default {
|
|||||||
'paramManagement.firstPage': '首頁',
|
'paramManagement.firstPage': '首頁',
|
||||||
'paramManagement.prevPage': '上一頁',
|
'paramManagement.prevPage': '上一頁',
|
||||||
'paramManagement.nextPage': '下一頁',
|
'paramManagement.nextPage': '下一頁',
|
||||||
|
|
||||||
// 字段管理頁面文本
|
// 字段管理頁面文本
|
||||||
'providerManagement.categoryFilter': '類別篩選',
|
'providerManagement.categoryFilter': '類別篩選',
|
||||||
'providerManagement.searchPlaceholder': '請輸入供應器名稱查詢',
|
'providerManagement.searchPlaceholder': '請輸入供應器名稱查詢',
|
||||||
@@ -504,7 +504,7 @@ export default {
|
|||||||
'home.deleteSuccess': '刪除成功',
|
'home.deleteSuccess': '刪除成功',
|
||||||
'home.deleteFailed': '刪除失敗',
|
'home.deleteFailed': '刪除失敗',
|
||||||
'home.enableMemory': '請先在「配置角色」介面開啟記憶',
|
'home.enableMemory': '請先在「配置角色」介面開啟記憶',
|
||||||
|
|
||||||
// 字典管理頁面文本
|
// 字典管理頁面文本
|
||||||
'dictManagement.pageTitle': '字典管理',
|
'dictManagement.pageTitle': '字典管理',
|
||||||
'dictManagement.searchPlaceholder': '請輸入字典名稱搜索',
|
'dictManagement.searchPlaceholder': '請輸入字典名稱搜索',
|
||||||
@@ -540,7 +540,7 @@ export default {
|
|||||||
'dictManagement.saveFailed': '保存失敗',
|
'dictManagement.saveFailed': '保存失敗',
|
||||||
'dictManagement.loading': '拼命加載中',
|
'dictManagement.loading': '拼命加載中',
|
||||||
'dictManagement.select': '選擇',
|
'dictManagement.select': '選擇',
|
||||||
|
|
||||||
// 服務端管理頁面文本
|
// 服務端管理頁面文本
|
||||||
'serverSideManager.pageTitle': '服務端管理',
|
'serverSideManager.pageTitle': '服務端管理',
|
||||||
'serverSideManager.wsAddress': 'ws地址',
|
'serverSideManager.wsAddress': 'ws地址',
|
||||||
@@ -556,7 +556,7 @@ export default {
|
|||||||
'serverSideManager.operationFailed': '操作失敗',
|
'serverSideManager.operationFailed': '操作失敗',
|
||||||
'serverSideManager.restartSuccess': '重啟成功',
|
'serverSideManager.restartSuccess': '重啟成功',
|
||||||
'serverSideManager.updateConfigSuccess': '更新配置成功',
|
'serverSideManager.updateConfigSuccess': '更新配置成功',
|
||||||
|
|
||||||
// 添加智能體對話框文本
|
// 添加智能體對話框文本
|
||||||
'addAgentDialog.title': '添加智能體',
|
'addAgentDialog.title': '添加智能體',
|
||||||
'addAgentDialog.agentName': '智能體名稱',
|
'addAgentDialog.agentName': '智能體名稱',
|
||||||
@@ -565,7 +565,7 @@ export default {
|
|||||||
'addAgentDialog.cancel': '取消',
|
'addAgentDialog.cancel': '取消',
|
||||||
'addAgentDialog.nameRequired': '請輸入智能體名稱',
|
'addAgentDialog.nameRequired': '請輸入智能體名稱',
|
||||||
'addAgentDialog.addSuccess': '添加成功',
|
'addAgentDialog.addSuccess': '添加成功',
|
||||||
|
|
||||||
// 角色配置頁面文本
|
// 角色配置頁面文本
|
||||||
'roleConfig.title': '角色配置',
|
'roleConfig.title': '角色配置',
|
||||||
'roleConfig.restartNotice': '保存配置後,需要重啟設備,新的配置才會生效。',
|
'roleConfig.restartNotice': '保存配置後,需要重啟設備,新的配置才會生效。',
|
||||||
@@ -601,7 +601,7 @@ export default {
|
|||||||
'roleConfig.fetchConfigFailed': '獲取配置失敗',
|
'roleConfig.fetchConfigFailed': '獲取配置失敗',
|
||||||
'roleConfig.fetchModelsFailed': '獲取模型列表失敗',
|
'roleConfig.fetchModelsFailed': '獲取模型列表失敗',
|
||||||
'roleConfig.fetchPluginsFailed': '獲取插件列表失敗',
|
'roleConfig.fetchPluginsFailed': '獲取插件列表失敗',
|
||||||
|
|
||||||
// 功能管理對話框文本
|
// 功能管理對話框文本
|
||||||
'functionDialog.title': '功能管理',
|
'functionDialog.title': '功能管理',
|
||||||
'functionDialog.unselectedFunctions': '未選功能',
|
'functionDialog.unselectedFunctions': '未選功能',
|
||||||
@@ -629,7 +629,7 @@ export default {
|
|||||||
'functionDialog.copyFailed': '複製失敗,請手動複製',
|
'functionDialog.copyFailed': '複製失敗,請手動複製',
|
||||||
'functionDialog.jsonFormatError': '的字段格式錯誤:JSON格式有誤',
|
'functionDialog.jsonFormatError': '的字段格式錯誤:JSON格式有誤',
|
||||||
'functionDialog.defaultValue': '默認值',
|
'functionDialog.defaultValue': '默認值',
|
||||||
|
|
||||||
// 模型配置頁面文本
|
// 模型配置頁面文本
|
||||||
'modelConfig.searchPlaceholder': '請輸入模型名稱查詢',
|
'modelConfig.searchPlaceholder': '請輸入模型名稱查詢',
|
||||||
'modelConfig.search': '搜索',
|
'modelConfig.search': '搜索',
|
||||||
@@ -679,7 +679,7 @@ export default {
|
|||||||
'modelConfig.nextPage': '下一頁',
|
'modelConfig.nextPage': '下一頁',
|
||||||
'modelConfig.totalRecords': '共{total}條記錄',
|
'modelConfig.totalRecords': '共{total}條記錄',
|
||||||
'modelConfig.loading': '拼命加載中',
|
'modelConfig.loading': '拼命加載中',
|
||||||
|
|
||||||
// 模型配置對話框文本
|
// 模型配置對話框文本
|
||||||
'modelConfigDialog.addModel': '添加模型',
|
'modelConfigDialog.addModel': '添加模型',
|
||||||
'modelConfigDialog.editModel': '修改模型',
|
'modelConfigDialog.editModel': '修改模型',
|
||||||
@@ -701,7 +701,7 @@ export default {
|
|||||||
'modelConfigDialog.callInfo': '調用信息',
|
'modelConfigDialog.callInfo': '調用信息',
|
||||||
'modelConfigDialog.enterJsonExample': '請輸入JSON格式變量(示例:{"key":"value"})',
|
'modelConfigDialog.enterJsonExample': '請輸入JSON格式變量(示例:{"key":"value"})',
|
||||||
'modelConfigDialog.save': '保存',
|
'modelConfigDialog.save': '保存',
|
||||||
|
|
||||||
// TTS模型配置文本
|
// TTS模型配置文本
|
||||||
'ttsModel.select': '選擇',
|
'ttsModel.select': '選擇',
|
||||||
'ttsModel.voiceCode': '音色編碼',
|
'ttsModel.voiceCode': '音色編碼',
|
||||||
@@ -725,7 +725,7 @@ export default {
|
|||||||
'ttsModel.fetchVoicesFailed': '獲取音色列表失敗',
|
'ttsModel.fetchVoicesFailed': '獲取音色列表失敗',
|
||||||
'ttsModel.loadVoicesFailed': '加載音色數據失敗',
|
'ttsModel.loadVoicesFailed': '加載音色數據失敗',
|
||||||
'ttsModel.unnamedVoice': '未命名音色',
|
'ttsModel.unnamedVoice': '未命名音色',
|
||||||
|
|
||||||
// OTA管理頁面文本
|
// OTA管理頁面文本
|
||||||
'otaManagement.firmwareManagement': '固件管理',
|
'otaManagement.firmwareManagement': '固件管理',
|
||||||
'otaManagement.searchPlaceholder': '請輸入固件名稱查詢',
|
'otaManagement.searchPlaceholder': '請輸入固件名稱查詢',
|
||||||
@@ -765,7 +765,7 @@ export default {
|
|||||||
'otaManagement.addSuccess': '新增成功',
|
'otaManagement.addSuccess': '新增成功',
|
||||||
'otaManagement.addFailed': '新增失敗',
|
'otaManagement.addFailed': '新增失敗',
|
||||||
'otaManagement.fetchFirmwareListFailed': '獲取固件列表失敗',
|
'otaManagement.fetchFirmwareListFailed': '獲取固件列表失敗',
|
||||||
|
|
||||||
// 字段管理頁面模型類型翻譯
|
// 字段管理頁面模型類型翻譯
|
||||||
'providerManagement.all': '全部',
|
'providerManagement.all': '全部',
|
||||||
'providerManagement.modelType.ASR': '語音識別',
|
'providerManagement.modelType.ASR': '語音識別',
|
||||||
@@ -776,7 +776,7 @@ export default {
|
|||||||
'providerManagement.modelType.Memory': '記憶模組',
|
'providerManagement.modelType.Memory': '記憶模組',
|
||||||
'providerManagement.modelType.VAD': '語音活動檢測',
|
'providerManagement.modelType.VAD': '語音活動檢測',
|
||||||
'providerManagement.modelType.Plugin': '插件工具',
|
'providerManagement.modelType.Plugin': '插件工具',
|
||||||
|
|
||||||
// Provider Dialog 翻譯
|
// Provider Dialog 翻譯
|
||||||
'providerDialog.category': '類別',
|
'providerDialog.category': '類別',
|
||||||
'providerDialog.selectCategory': '請選擇類別',
|
'providerDialog.selectCategory': '請選擇類別',
|
||||||
|
|||||||
@@ -47,12 +47,13 @@
|
|||||||
<!-- 右侧内容 -->
|
<!-- 右侧内容 -->
|
||||||
<div class="content-area">
|
<div class="content-area">
|
||||||
<el-card class="model-card" shadow="never">
|
<el-card class="model-card" shadow="never">
|
||||||
<el-table ref="modelTable" style="width: 100%" v-loading="loading" :element-loading-text="$t('modelConfig.loading')"
|
<el-table ref="modelTable" style="width: 100%" v-loading="loading"
|
||||||
element-loading-spinner="el-icon-loading" element-loading-background="rgba(255, 255, 255, 0.7)"
|
:element-loading-text="$t('modelConfig.loading')" element-loading-spinner="el-icon-loading"
|
||||||
:header-cell-style="{ background: 'transparent' }" :data="modelList" class="data-table"
|
element-loading-background="rgba(255, 255, 255, 0.7)" :header-cell-style="{ background: 'transparent' }"
|
||||||
header-row-class-name="table-header" :header-cell-class-name="headerCellClassName"
|
:data="modelList" class="data-table" header-row-class-name="table-header"
|
||||||
@selection-change="handleSelectionChange">
|
:header-cell-class-name="headerCellClassName" @selection-change="handleSelectionChange">
|
||||||
<el-table-column type="selection" width="55" align="center" :cell-class-name="selectionCellClassName"></el-table-column>
|
<el-table-column type="selection" width="55" align="center"
|
||||||
|
:cell-class-name="selectionCellClassName"></el-table-column>
|
||||||
<el-table-column :label="$t('modelConfig.modelId')" prop="id" align="center"></el-table-column>
|
<el-table-column :label="$t('modelConfig.modelId')" prop="id" align="center"></el-table-column>
|
||||||
<el-table-column :label="$t('modelConfig.modelName')" prop="modelName" align="center"></el-table-column>
|
<el-table-column :label="$t('modelConfig.modelName')" prop="modelName" align="center"></el-table-column>
|
||||||
<el-table-column :label="$t('modelConfig.provider')" align="center">
|
<el-table-column :label="$t('modelConfig.provider')" align="center">
|
||||||
@@ -79,7 +80,7 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column :label="$t('modelConfig.action')" align="center" width="180px">
|
<el-table-column :label="$t('modelConfig.action')" align="center" width="210px">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-button type="text" size="mini" @click="editModel(scope.row)" class="edit-btn">
|
<el-button type="text" size="mini" @click="editModel(scope.row)" class="edit-btn">
|
||||||
{{ $t('modelConfig.edit') }}
|
{{ $t('modelConfig.edit') }}
|
||||||
@@ -109,19 +110,26 @@
|
|||||||
<div class="custom-pagination">
|
<div class="custom-pagination">
|
||||||
|
|
||||||
<el-select v-model="pageSize" @change="handlePageSizeChange" class="page-size-select">
|
<el-select v-model="pageSize" @change="handlePageSizeChange" class="page-size-select">
|
||||||
<el-option v-for="item in pageSizeOptions" :key="item" :label="$t('modelConfig.itemsPerPage', { items: item })" :value="item">
|
<el-option v-for="item in pageSizeOptions" :key="item"
|
||||||
|
:label="$t('modelConfig.itemsPerPage', { items: item })" :value="item">
|
||||||
</el-option>
|
</el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
|
|
||||||
<button class="pagination-btn" :disabled="currentPage === 1" @click="goFirst">{{ $t('modelConfig.firstPage') }}</button>
|
<button class="pagination-btn" :disabled="currentPage === 1" @click="goFirst">{{
|
||||||
<button class="pagination-btn" :disabled="currentPage === 1" @click="goPrev">{{ $t('modelConfig.prevPage') }}</button>
|
$t('modelConfig.firstPage')
|
||||||
|
}}</button>
|
||||||
|
<button class="pagination-btn" :disabled="currentPage === 1" @click="goPrev">{{
|
||||||
|
$t('modelConfig.prevPage')
|
||||||
|
}}</button>
|
||||||
|
|
||||||
<button v-for="page in visiblePages" :key="page" class="pagination-btn"
|
<button v-for="page in visiblePages" :key="page" class="pagination-btn"
|
||||||
:class="{ active: page === currentPage }" @click="goToPage(page)">
|
:class="{ active: page === currentPage }" @click="goToPage(page)">
|
||||||
{{ page }}
|
{{ page }}
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<button class="pagination-btn" :disabled="currentPage === pageCount" @click="goNext">{{ $t('modelConfig.nextPage') }}</button>
|
<button class="pagination-btn" :disabled="currentPage === pageCount" @click="goNext">{{
|
||||||
|
$t('modelConfig.nextPage')
|
||||||
|
}}</button>
|
||||||
<span class="total-text">{{ $t('modelConfig.totalRecords', { total }) }}</span>
|
<span class="total-text">{{ $t('modelConfig.totalRecords', { total }) }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -173,14 +181,14 @@ export default {
|
|||||||
created() {
|
created() {
|
||||||
this.loadData();
|
this.loadData();
|
||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
// 在组件挂载后确保表头翻译文本正确显示
|
// 在组件挂载后确保表头翻译文本正确显示
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
this.updateSelectionHeaderText();
|
this.updateSelectionHeaderText();
|
||||||
}, 100);
|
}, 100);
|
||||||
},
|
},
|
||||||
|
|
||||||
updated() {
|
updated() {
|
||||||
// 在组件更新后重新设置表头翻译文本
|
// 在组件更新后重新设置表头翻译文本
|
||||||
this.updateSelectionHeaderText();
|
this.updateSelectionHeaderText();
|
||||||
@@ -345,17 +353,17 @@ export default {
|
|||||||
const id = formData.id;
|
const id = formData.id;
|
||||||
|
|
||||||
if (this.editModelData.duplicateMode) {
|
if (this.editModelData.duplicateMode) {
|
||||||
Api.model.addModel({modelType, provideCode, formData},
|
Api.model.addModel({ modelType, provideCode, formData },
|
||||||
({ data }) => {
|
({ data }) => {
|
||||||
if (data.code === 0) {
|
if (data.code === 0) {
|
||||||
this.$message.success(this.$t('modelConfig.duplicateSuccess'));
|
this.$message.success(this.$t('modelConfig.duplicateSuccess'));
|
||||||
this.loadData();
|
this.loadData();
|
||||||
this.editDialogVisible = false;
|
this.editDialogVisible = false;
|
||||||
} else {
|
} else {
|
||||||
this.$message.error(data.msg || this.$t('modelConfig.duplicateFailed'));
|
this.$message.error(data.msg || this.$t('modelConfig.duplicateFailed'));
|
||||||
}
|
}
|
||||||
done && done(); // 调用done回调关闭加载状态
|
done && done(); // 调用done回调关闭加载状态
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Api.model.updateModel(
|
Api.model.updateModel(
|
||||||
@@ -790,9 +798,11 @@ export default {
|
|||||||
content: attr(data-content);
|
content: attr(data-content);
|
||||||
display: block;
|
display: block;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
line-height: 32px; /* 设置合适的行高,确保文本完整显示 */
|
line-height: 32px;
|
||||||
|
/* 设置合适的行高,确保文本完整显示 */
|
||||||
color: black;
|
color: black;
|
||||||
margin-top: 0; /* 移除可能导致偏移的上边距 */
|
margin-top: 0;
|
||||||
|
/* 移除可能导致偏移的上边距 */
|
||||||
height: 32px;
|
height: 32px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 50%;
|
top: 50%;
|
||||||
@@ -804,6 +814,7 @@ export default {
|
|||||||
.custom-selection-header .cell {
|
.custom-selection-header .cell {
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 已移除可能影响文本显示的空伪元素 */
|
/* 已移除可能影响文本显示的空伪元素 */
|
||||||
|
|
||||||
::v-deep .el-table__body .el-checkbox__inner {
|
::v-deep .el-table__body .el-checkbox__inner {
|
||||||
|
|||||||
@@ -33,14 +33,16 @@
|
|||||||
<el-tag v-else type="danger">{{ $t('user.disabled') }}</el-tag>
|
<el-tag v-else type="danger">{{ $t('user.disabled') }}</el-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column :label="$t('modelConfig.action')" align="center">
|
<el-table-column :label="$t('modelConfig.action')" align="center" width="300px">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-button size="mini" type="text" @click="resetPassword(scope.row)">{{ $t('user.resetPassword') }}</el-button>
|
<el-button size="mini" type="text" @click="resetPassword(scope.row)">{{ $t('user.resetPassword')
|
||||||
|
}}</el-button>
|
||||||
<el-button size="mini" type="text" v-if="scope.row.status === 1"
|
<el-button size="mini" type="text" v-if="scope.row.status === 1"
|
||||||
@click="handleChangeStatus(scope.row, 0)">{{ $t('user.disableAccount') }}</el-button>
|
@click="handleChangeStatus(scope.row, 0)">{{ $t('user.disableAccount') }}</el-button>
|
||||||
<el-button size="mini" type="text" v-if="scope.row.status === 0"
|
<el-button size="mini" type="text" v-if="scope.row.status === 0"
|
||||||
@click="handleChangeStatus(scope.row, 1)">{{ $t('user.enableAccount') }}</el-button>
|
@click="handleChangeStatus(scope.row, 1)">{{ $t('user.enableAccount') }}</el-button>
|
||||||
<el-button size="mini" type="text" @click="deleteUser(scope.row)">{{ $t('user.deleteUser') }}</el-button>
|
<el-button size="mini" type="text" @click="deleteUser(scope.row)">{{ $t('user.deleteUser')
|
||||||
|
}}</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
@@ -50,14 +52,20 @@
|
|||||||
<el-button size="mini" type="primary" class="select-all-btn" @click="handleSelectAll">
|
<el-button size="mini" type="primary" class="select-all-btn" @click="handleSelectAll">
|
||||||
{{ isAllSelected ? $t('user.deselectAll') : $t('user.selectAll') }}
|
{{ isAllSelected ? $t('user.deselectAll') : $t('user.selectAll') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button size="mini" type="success" icon="el-icon-circle-check" @click="batchEnable">{{ $t('user.enable') }}</el-button>
|
<el-button size="mini" type="success" icon="el-icon-circle-check" @click="batchEnable">{{
|
||||||
|
$t('user.enable')
|
||||||
|
}}</el-button>
|
||||||
<el-button size="mini" type="warning" @click="batchDisable"><i
|
<el-button size="mini" type="warning" @click="batchDisable"><i
|
||||||
class="el-icon-remove-outline rotated-icon"></i>{{ $t('user.disable') }}</el-button>
|
class="el-icon-remove-outline rotated-icon"></i>{{
|
||||||
<el-button size="mini" type="danger" icon="el-icon-delete" @click="batchDelete">{{ $t('user.delete') }}</el-button>
|
$t('user.disable') }}</el-button>
|
||||||
|
<el-button size="mini" type="danger" icon="el-icon-delete" @click="batchDelete">{{ $t('user.delete')
|
||||||
|
}}</el-button>
|
||||||
</div>
|
</div>
|
||||||
<div class="custom-pagination">
|
<div class="custom-pagination">
|
||||||
<el-select v-model="pageSize" @change="handlePageSizeChange" :class="['page-size-select', { 'page-size-select-en': isEnglish }]">
|
<el-select v-model="pageSize" @change="handlePageSizeChange"
|
||||||
<el-option v-for="item in pageSizeOptions" :key="item" :label="$t('modelConfig.itemsPerPage', { count: item })" :value="item">
|
:class="['page-size-select', { 'page-size-select-en': isEnglish }]">
|
||||||
|
<el-option v-for="item in pageSizeOptions" :key="item"
|
||||||
|
:label="$t('modelConfig.itemsPerPage', { count: item })" :value="item">
|
||||||
</el-option>
|
</el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
|
|
||||||
@@ -713,10 +721,10 @@ export default {
|
|||||||
color: #606266;
|
color: #606266;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.page-size-select-en {
|
&.page-size-select-en {
|
||||||
width: 130px;
|
width: 130px;
|
||||||
|
|
||||||
:deep(.el-input__inner) {
|
:deep(.el-input__inner) {
|
||||||
height: 36px;
|
height: 36px;
|
||||||
line-height: 36px;
|
line-height: 36px;
|
||||||
|
|||||||
@@ -1,45 +1,59 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="welcome">
|
<div class="welcome">
|
||||||
<el-container style="height: 100%;">
|
<el-container style="height: 100%">
|
||||||
<el-header>
|
<el-header>
|
||||||
<div style="display: flex;align-items: center;margin-top: 15px;margin-left: 10px;gap: 10px;">
|
<div style="
|
||||||
<img loading="lazy" alt="" src="@/assets/xiaozhi-logo.png" style="width: 45px;height: 45px;" />
|
display: flex;
|
||||||
<img loading="lazy" alt="" src="@/assets/xiaozhi-ai.png" style="height: 18px;" />
|
align-items: center;
|
||||||
|
margin-top: 15px;
|
||||||
|
margin-left: 10px;
|
||||||
|
gap: 10px;
|
||||||
|
">
|
||||||
|
<img loading="lazy" alt="" src="@/assets/xiaozhi-logo.png" style="width: 45px; height: 45px" />
|
||||||
|
<img loading="lazy" alt="" src="@/assets/xiaozhi-ai.png" style="height: 18px" />
|
||||||
</div>
|
</div>
|
||||||
</el-header>
|
</el-header>
|
||||||
<div class="login-person">
|
<div class="login-person">
|
||||||
<img loading="lazy" alt="" src="@/assets/login/login-person.png" style="width: 100%;" />
|
<img loading="lazy" alt="" src="@/assets/login/login-person.png" style="width: 100%" />
|
||||||
</div>
|
</div>
|
||||||
<el-main style="position: relative;">
|
<el-main style="position: relative">
|
||||||
<div class="login-box" @keyup.enter="login">
|
<div class="login-box" @keyup.enter="login">
|
||||||
<div style="display: flex;align-items: center;gap: 20px;margin-bottom: 39px;padding: 0 30px;">
|
<div style="
|
||||||
<img loading="lazy" alt="" src="@/assets/login/hi.png" style="width: 34px;height: 34px;" />
|
display: flex;
|
||||||
<div class="login-text">{{ $t('login.title') }}</div>
|
align-items: center;
|
||||||
|
gap: 20px;
|
||||||
|
margin-bottom: 39px;
|
||||||
|
padding: 0 30px;
|
||||||
|
">
|
||||||
|
<img loading="lazy" alt="" src="@/assets/login/hi.png" style="width: 34px; height: 34px" />
|
||||||
|
<div class="login-text">{{ $t("login.title") }}</div>
|
||||||
|
|
||||||
<div class="login-welcome">
|
<div class="login-welcome">
|
||||||
{{ $t('login.welcome') }}
|
{{ $t("login.welcome") }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 语言切换下拉菜单 -->
|
<!-- 语言切换下拉菜单 -->
|
||||||
<el-dropdown trigger="click" class="title-language-dropdown" @visible-change="handleLanguageDropdownVisibleChange">
|
<el-dropdown trigger="click" class="title-language-dropdown"
|
||||||
|
@visible-change="handleLanguageDropdownVisibleChange">
|
||||||
<span class="el-dropdown-link">
|
<span class="el-dropdown-link">
|
||||||
<i class="el-icon-document"></i>
|
<i class="el-icon-document"></i>
|
||||||
|
<span class="current-language-text">{{ currentLanguageText }}</span>
|
||||||
<i class="el-icon-arrow-down el-icon--right" :class="{ 'rotate-down': languageDropdownVisible }"></i>
|
<i class="el-icon-arrow-down el-icon--right" :class="{ 'rotate-down': languageDropdownVisible }"></i>
|
||||||
</span>
|
</span>
|
||||||
<el-dropdown-menu slot="dropdown">
|
<el-dropdown-menu slot="dropdown">
|
||||||
<el-dropdown-item @click.native="changeLanguage('zh_CN')">
|
<el-dropdown-item @click.native="changeLanguage('zh_CN')">
|
||||||
{{ $t('language.zhCN') }}
|
{{ $t("language.zhCN") }}
|
||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
<el-dropdown-item @click.native="changeLanguage('zh_TW')">
|
<el-dropdown-item @click.native="changeLanguage('zh_TW')">
|
||||||
{{ $t('language.zhTW') }}
|
{{ $t("language.zhTW") }}
|
||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
<el-dropdown-item @click.native="changeLanguage('en')">
|
<el-dropdown-item @click.native="changeLanguage('en')">
|
||||||
{{ $t('language.en') }}
|
{{ $t("language.en") }}
|
||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
</el-dropdown-menu>
|
</el-dropdown-menu>
|
||||||
</el-dropdown>
|
</el-dropdown>
|
||||||
</div>
|
</div>
|
||||||
<div style="padding: 0 30px;">
|
<div style="padding: 0 30px">
|
||||||
<!-- 用户名登录 -->
|
<!-- 用户名登录 -->
|
||||||
<template v-if="!isMobileLogin">
|
<template v-if="!isMobileLogin">
|
||||||
<div class="input-box">
|
<div class="input-box">
|
||||||
@@ -51,9 +65,9 @@
|
|||||||
<!-- 手机号登录 -->
|
<!-- 手机号登录 -->
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<div class="input-box">
|
<div class="input-box">
|
||||||
<div style="display: flex; align-items: center; width: 100%;">
|
<div style="display: flex; align-items: center; width: 100%">
|
||||||
<el-select v-model="form.areaCode" style="width: 220px; margin-right: 10px;">
|
<el-select v-model="form.areaCode" style="width: 220px; margin-right: 10px">
|
||||||
<el-option v-for="item in mobileAreaList" :key="item.key" :label="`${item.name} (${item.key})`"
|
<el-option v-for="item in mobileAreaList" :key="item.key" :label="`${item.name} (${item.key})`"
|
||||||
:value="item.key" />
|
:value="item.key" />
|
||||||
</el-select>
|
</el-select>
|
||||||
<el-input v-model="form.mobile" :placeholder="$t('login.mobilePlaceholder')" />
|
<el-input v-model="form.mobile" :placeholder="$t('login.mobilePlaceholder')" />
|
||||||
@@ -63,42 +77,64 @@
|
|||||||
|
|
||||||
<div class="input-box">
|
<div class="input-box">
|
||||||
<img loading="lazy" alt="" class="input-icon" src="@/assets/login/password.png" />
|
<img loading="lazy" alt="" class="input-icon" src="@/assets/login/password.png" />
|
||||||
<el-input v-model="form.password" :placeholder="$t('login.passwordPlaceholder')" type="password" show-password />
|
<el-input v-model="form.password" :placeholder="$t('login.passwordPlaceholder')" type="password"
|
||||||
|
show-password />
|
||||||
</div>
|
</div>
|
||||||
<div style="display: flex; align-items: center; margin-top: 20px; width: 100%; gap: 10px;">
|
<div style="
|
||||||
<div class="input-box" style="width: calc(100% - 130px); margin-top: 0;">
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
margin-top: 20px;
|
||||||
|
width: 100%;
|
||||||
|
gap: 10px;
|
||||||
|
">
|
||||||
|
<div class="input-box" style="width: calc(100% - 130px); margin-top: 0">
|
||||||
<img loading="lazy" alt="" class="input-icon" src="@/assets/login/shield.png" />
|
<img loading="lazy" alt="" class="input-icon" src="@/assets/login/shield.png" />
|
||||||
<el-input v-model="form.captcha" :placeholder="$t('login.captchaPlaceholder')" style="flex: 1;" />
|
<el-input v-model="form.captcha" :placeholder="$t('login.captchaPlaceholder')" style="flex: 1" />
|
||||||
</div>
|
</div>
|
||||||
<img loading="lazy" v-if="captchaUrl" :src="captchaUrl" alt="验证码"
|
<img loading="lazy" v-if="captchaUrl" :src="captchaUrl" alt="验证码"
|
||||||
style="width: 150px; height: 40px; cursor: pointer;" @click="fetchCaptcha" />
|
style="width: 150px; height: 40px; cursor: pointer" @click="fetchCaptcha" />
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div style="
|
||||||
style="font-weight: 400;font-size: 14px;text-align: left;color: #5778ff;display: flex;justify-content: space-between;margin-top: 20px;">
|
font-weight: 400;
|
||||||
<div v-if="allowUserRegister" style="cursor: pointer;" @click="goToRegister">{{ $t('login.register') }}</div>
|
font-size: 14px;
|
||||||
<div style="cursor: pointer;" @click="goToForgetPassword" v-if="enableMobileRegister">{{ $t('login.forgetPassword') }}</div>
|
text-align: left;
|
||||||
|
color: #5778ff;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin-top: 20px;
|
||||||
|
">
|
||||||
|
<div v-if="allowUserRegister" style="cursor: pointer" @click="goToRegister">
|
||||||
|
{{ $t("login.register") }}
|
||||||
|
</div>
|
||||||
|
<div style="cursor: pointer" @click="goToForgetPassword" v-if="enableMobileRegister">
|
||||||
|
{{ $t("login.forgetPassword") }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="login-btn" @click="login">{{ $t('login.login') }}</div>
|
<div class="login-btn" @click="login">{{ $t("login.login") }}</div>
|
||||||
|
|
||||||
<!-- 登录方式切换按钮 -->
|
<!-- 登录方式切换按钮 -->
|
||||||
<div class="login-type-container" v-if="enableMobileRegister">
|
<div class="login-type-container" v-if="enableMobileRegister">
|
||||||
<div style="display: flex; gap: 10px;">
|
<div style="display: flex; gap: 10px">
|
||||||
<el-tooltip :content="$t('login.mobileLogin')" placement="bottom">
|
<el-tooltip :content="$t('login.mobileLogin')" placement="bottom">
|
||||||
<el-button :type="isMobileLogin ? 'primary' : 'default'" icon="el-icon-mobile" circle
|
<el-button :type="isMobileLogin ? 'primary' : 'default'" icon="el-icon-mobile" circle
|
||||||
@click="switchLoginType('mobile')"></el-button>
|
@click="switchLoginType('mobile')"></el-button>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
<el-tooltip :content="$t('login.usernameLogin')" placement="bottom">
|
<el-tooltip :content="$t('login.usernameLogin')" placement="bottom">
|
||||||
<el-button :type="!isMobileLogin ? 'primary' : 'default'" icon="el-icon-user" circle
|
<el-button :type="!isMobileLogin ? 'primary' : 'default'" icon="el-icon-user" circle
|
||||||
@click="switchLoginType('username')"></el-button>
|
@click="switchLoginType('username')"></el-button>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div style="font-size: 14px;color: #979db1;">
|
<div style="font-size: 14px; color: #979db1">
|
||||||
{{ $t('login.agreeTo') }}
|
{{ $t("login.agreeTo") }}
|
||||||
<div style="display: inline-block;color: #5778FF;cursor: pointer;">{{ $t('login.userAgreement') }}</div>
|
<div style="display: inline-block; color: #5778ff; cursor: pointer">
|
||||||
{{ $t('login.and') }}
|
{{ $t("login.userAgreement") }}
|
||||||
<div style="display: inline-block;color: #5778FF;cursor: pointer;">{{ $t('login.privacyPolicy') }}</div>
|
</div>
|
||||||
|
{{ $t("login.and") }}
|
||||||
|
<div style="display: inline-block; color: #5778ff; cursor: pointer">
|
||||||
|
{{ $t("login.privacyPolicy") }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-main>
|
</el-main>
|
||||||
@@ -110,44 +146,62 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import Api from '@/apis/api';
|
import Api from "@/apis/api";
|
||||||
import VersionFooter from '@/components/VersionFooter.vue';
|
import VersionFooter from "@/components/VersionFooter.vue";
|
||||||
import { getUUID, goToPage, showDanger, showSuccess, validateMobile } from '@/utils';
|
import i18n, { changeLanguage } from "@/i18n";
|
||||||
import { mapState } from 'vuex';
|
import { getUUID, goToPage, showDanger, showSuccess, validateMobile } from "@/utils";
|
||||||
import { changeLanguage } from '@/i18n';
|
import { mapState } from "vuex";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'login',
|
name: "login",
|
||||||
components: {
|
components: {
|
||||||
VersionFooter
|
VersionFooter,
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapState({
|
...mapState({
|
||||||
allowUserRegister: state => state.pubConfig.allowUserRegister,
|
allowUserRegister: (state) => state.pubConfig.allowUserRegister,
|
||||||
enableMobileRegister: state => state.pubConfig.enableMobileRegister,
|
enableMobileRegister: (state) => state.pubConfig.enableMobileRegister,
|
||||||
mobileAreaList: state => state.pubConfig.mobileAreaList
|
mobileAreaList: (state) => state.pubConfig.mobileAreaList,
|
||||||
})
|
}),
|
||||||
|
// 获取当前语言
|
||||||
|
currentLanguage() {
|
||||||
|
return i18n.locale || "zh_CN";
|
||||||
|
},
|
||||||
|
// 获取当前语言显示文本
|
||||||
|
currentLanguageText() {
|
||||||
|
const currentLang = this.currentLanguage;
|
||||||
|
switch (currentLang) {
|
||||||
|
case "zh_CN":
|
||||||
|
return this.$t("language.zhCN");
|
||||||
|
case "zh_TW":
|
||||||
|
return this.$t("language.zhTW");
|
||||||
|
case "en":
|
||||||
|
return this.$t("language.en");
|
||||||
|
default:
|
||||||
|
return this.$t("language.zhCN");
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
activeName: "username",
|
activeName: "username",
|
||||||
form: {
|
form: {
|
||||||
username: '',
|
username: "",
|
||||||
password: '',
|
password: "",
|
||||||
captcha: '',
|
captcha: "",
|
||||||
captchaId: '',
|
captchaId: "",
|
||||||
areaCode: '+86',
|
areaCode: "+86",
|
||||||
mobile: ''
|
mobile: "",
|
||||||
},
|
},
|
||||||
captchaUuid: '',
|
captchaUuid: "",
|
||||||
captchaUrl: '',
|
captchaUrl: "",
|
||||||
isMobileLogin: false,
|
isMobileLogin: false,
|
||||||
languageDropdownVisible: false
|
languageDropdownVisible: false,
|
||||||
}
|
};
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.fetchCaptcha();
|
this.fetchCaptcha();
|
||||||
this.$store.dispatch('fetchPubConfig').then(() => {
|
this.$store.dispatch("fetchPubConfig").then(() => {
|
||||||
// 根据配置决定默认登录方式
|
// 根据配置决定默认登录方式
|
||||||
this.isMobileLogin = this.enableMobileRegister;
|
this.isMobileLogin = this.enableMobileRegister;
|
||||||
});
|
});
|
||||||
@@ -155,8 +209,8 @@ export default {
|
|||||||
methods: {
|
methods: {
|
||||||
fetchCaptcha() {
|
fetchCaptcha() {
|
||||||
if (this.$store.getters.getToken) {
|
if (this.$store.getters.getToken) {
|
||||||
if (this.$route.path !== '/home') {
|
if (this.$route.path !== "/home") {
|
||||||
this.$router.push('/home')
|
this.$router.push("/home");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.captchaUuid = getUUID();
|
this.captchaUuid = getUUID();
|
||||||
@@ -166,7 +220,7 @@ export default {
|
|||||||
const blob = new Blob([res.data], { type: res.data.type });
|
const blob = new Blob([res.data], { type: res.data.type });
|
||||||
this.captchaUrl = URL.createObjectURL(blob);
|
this.captchaUrl = URL.createObjectURL(blob);
|
||||||
} else {
|
} else {
|
||||||
showDanger('验证码加载失败,点击刷新');
|
showDanger("验证码加载失败,点击刷新");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -176,25 +230,25 @@ export default {
|
|||||||
handleLanguageDropdownVisibleChange(visible) {
|
handleLanguageDropdownVisibleChange(visible) {
|
||||||
this.languageDropdownVisible = visible;
|
this.languageDropdownVisible = visible;
|
||||||
},
|
},
|
||||||
|
|
||||||
// 切换语言
|
// 切换语言
|
||||||
changeLanguage(lang) {
|
changeLanguage(lang) {
|
||||||
changeLanguage(lang);
|
changeLanguage(lang);
|
||||||
this.languageDropdownVisible = false;
|
this.languageDropdownVisible = false;
|
||||||
this.$message.success({
|
this.$message.success({
|
||||||
message: this.$t('message.success'),
|
message: this.$t("message.success"),
|
||||||
showClose: true
|
showClose: true,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
// 切换登录方式
|
// 切换登录方式
|
||||||
switchLoginType(type) {
|
switchLoginType(type) {
|
||||||
this.isMobileLogin = type === 'mobile';
|
this.isMobileLogin = type === "mobile";
|
||||||
// 清空表单
|
// 清空表单
|
||||||
this.form.username = '';
|
this.form.username = "";
|
||||||
this.form.mobile = '';
|
this.form.mobile = "";
|
||||||
this.form.password = '';
|
this.form.password = "";
|
||||||
this.form.captcha = '';
|
this.form.captcha = "";
|
||||||
this.fetchCaptcha();
|
this.fetchCaptcha();
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -211,38 +265,46 @@ export default {
|
|||||||
if (this.isMobileLogin) {
|
if (this.isMobileLogin) {
|
||||||
// 手机号登录验证
|
// 手机号登录验证
|
||||||
if (!validateMobile(this.form.mobile, this.form.areaCode)) {
|
if (!validateMobile(this.form.mobile, this.form.areaCode)) {
|
||||||
showDanger('请输入正确的手机号码');
|
showDanger("请输入正确的手机号码");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 拼接手机号作为用户名
|
// 拼接手机号作为用户名
|
||||||
this.form.username = this.form.areaCode + this.form.mobile;
|
this.form.username = this.form.areaCode + this.form.mobile;
|
||||||
} else {
|
} else {
|
||||||
// 用户名登录验证
|
// 用户名登录验证
|
||||||
if (!this.validateInput(this.form.username, '用户名不能为空')) {
|
if (!this.validateInput(this.form.username, "用户名不能为空")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 验证密码
|
// 验证密码
|
||||||
if (!this.validateInput(this.form.password, '密码不能为空')) {
|
if (!this.validateInput(this.form.password, "密码不能为空")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 验证验证码
|
// 验证验证码
|
||||||
if (!this.validateInput(this.form.captcha, '验证码不能为空')) {
|
if (!this.validateInput(this.form.captcha, "验证码不能为空")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.form.captchaId = this.captchaUuid
|
this.form.captchaId = this.captchaUuid;
|
||||||
Api.user.login(this.form, ({ data }) => {
|
Api.user.login(
|
||||||
showSuccess('登录成功!');
|
this.form,
|
||||||
this.$store.commit('setToken', JSON.stringify(data.data));
|
({ data }) => {
|
||||||
goToPage('/home');
|
showSuccess("登录成功!");
|
||||||
}, (err) => {
|
this.$store.commit("setToken", JSON.stringify(data.data));
|
||||||
showDanger(err.data.msg || '登录失败')
|
goToPage("/home");
|
||||||
if (err.data != null && err.data.msg != null && err.data.msg.indexOf('图形验证码') > -1) {
|
},
|
||||||
this.fetchCaptcha()
|
(err) => {
|
||||||
|
showDanger(err.data.msg || "登录失败");
|
||||||
|
if (
|
||||||
|
err.data != null &&
|
||||||
|
err.data.msg != null &&
|
||||||
|
err.data.msg.indexOf("图形验证码") > -1
|
||||||
|
) {
|
||||||
|
this.fetchCaptcha();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
);
|
||||||
|
|
||||||
// 重新获取验证码
|
// 重新获取验证码
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
@@ -251,16 +313,16 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
goToRegister() {
|
goToRegister() {
|
||||||
goToPage('/register')
|
goToPage("/register");
|
||||||
},
|
},
|
||||||
goToForgetPassword() {
|
goToForgetPassword() {
|
||||||
goToPage('/retrieve-password')
|
goToPage("/retrieve-password");
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
}
|
};
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
@import './auth.scss';
|
@import "./auth.scss";
|
||||||
|
|
||||||
.login-type-container {
|
.login-type-container {
|
||||||
margin: 10px 20px;
|
margin: 10px 20px;
|
||||||
@@ -273,6 +335,13 @@ export default {
|
|||||||
margin-left: 20px;
|
margin-left: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.current-language-text {
|
||||||
|
margin-left: 4px;
|
||||||
|
margin-right: 4px;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #3d4566;
|
||||||
|
}
|
||||||
|
|
||||||
.language-dropdown {
|
.language-dropdown {
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user