Compare commits

...

2 Commits

Author SHA1 Message Date
wxs
32d8f2e5fb Merge branch 'main' of http://182.92.203.107:3000/libingkun/skyeyesystem 2026-03-02 14:10:26 +08:00
wxs
859be27901 feat:增加国际化处理 2026-03-02 14:09:49 +08:00
10 changed files with 574 additions and 452 deletions

View File

@ -32,6 +32,7 @@
"sockjs-client": "^1.5.1", "sockjs-client": "^1.5.1",
"stompjs": "^2.3.3", "stompjs": "^2.3.3",
"vue": "^2.6.11", "vue": "^2.6.11",
"vue-i18n": "^8.28.2",
"vue-router": "^3.1.5", "vue-router": "^3.1.5",
"vuex": "^3.1.2", "vuex": "^3.1.2",
"vuex-persistedstate": "^4.1.0" "vuex-persistedstate": "^4.1.0"

View File

@ -0,0 +1,29 @@
// English translations
export default {
app: {
title: 'Skyeye Twin System',
},
header: {
login: 'Login',
logout: 'Logout',
},
login: {
username: 'Please enter username',
password: 'Please enter password',
title: 'Login',
submit: 'Log In',
validation: {
required: 'Cannot be empty',
passwordMin: 'Password must be at least 6 characters',
},
},
common: {
capsLockOn: 'Caps lock is On',
},
menu: {
device: 'Device Management',
task: 'Task Management',
picture: 'Picture Management',
user: 'User Management'
}
}

View File

@ -0,0 +1,21 @@
import Vue from 'vue'
import VueI18n from 'vue-i18n'
import zh from './zh';
import en from './en';
Vue.use(VueI18n)
// load locale messages
const messages = {
zh,
en,
}
const locale = localStorage.getItem('locale') || 'zh'
const i18n = new VueI18n({
locale,
fallbackLocale: 'zh',
messages,
})
export default i18n

View File

@ -0,0 +1,29 @@
// Chinese translations
export default {
app: {
title: '空域快视系统',
},
header: {
login: '登录',
logout: '退出登录',
},
login: {
username: '请输入用户名',
password: '请输入用户密码',
title: '登录',
submit: '登 录',
validation: {
required: '不能为空',
passwordMin: '密码不少于6位字符',
},
},
common: {
capsLockOn: '大写锁定已打开',
},
menu: {
device: '设备管理',
task: '任务管理',
picture: '图片管理',
user: '用户管理'
}
}

View File

@ -18,7 +18,7 @@ export default {
} }
const validatePassword = (rule, value, callback) => { const validatePassword = (rule, value, callback) => {
if (value.length < 6) { if (value.length < 6) {
callback(new Error('密码不少于6位字符')) callback(new Error(this.$t('login.validation.passwordMin')))
} else { } else {
callback() callback()
} }
@ -51,7 +51,7 @@ export default {
loginRules: { loginRules: {
username: [ username: [
// { required: true, trigger: 'blur', validator: validateUsername } // { required: true, trigger: 'blur', validator: validateUsername }
{ required: true, message: '请输入用户名', trigger: 'blur' } { required: true, message: this.$t('login.username'), trigger: 'blur' }
], ],
password: [ password: [
{ required: true, trigger: 'blur', validator: validatePassword } { required: true, trigger: 'blur', validator: validatePassword }
@ -67,22 +67,22 @@ export default {
activeIndex: '1', activeIndex: '1',
menus: [ menus: [
{ {
label: "设备管理", key: 'device',
value: '2', value: '2',
show: true show: true
}, },
{ {
label: "任务管理", key: 'task',
value: '3', value: '3',
show: true show: true
}, },
{ {
label: "图片管理", key: 'picture',
value: '4', value: '4',
show: true show: true
}, },
{ {
label: "用户管理", key: 'user',
value: '5', value: '5',
show: true show: true
}, },
@ -175,6 +175,10 @@ export default {
handleSelect(key) { handleSelect(key) {
this.SET_MENUS_CHOSE(key) this.SET_MENUS_CHOSE(key)
}, },
changeLocale(lang) {
this.$i18n.locale = lang
localStorage.setItem('locale', lang)
},
goHome() { goHome() {
this.SET_MENUS_CHOSE('1') this.SET_MENUS_CHOSE('1')
}, },

View File

@ -25,7 +25,7 @@ $light_gray: #eee;
align-items: center; align-items: center;
.logo { .logo {
width: 250px; width: 350px;
height: 32px; height: 32px;
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
@ -129,7 +129,7 @@ $light_gray: #eee;
} }
.header-nav-r { .header-nav-r {
width: 250px; width: 350px;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: flex-end; justify-content: flex-end;

View File

@ -4,7 +4,7 @@
<div class="logo" @click="goHome"> <div class="logo" @click="goHome">
<img src="@/assets/img/common/logo3.png" alt /> <img src="@/assets/img/common/logo3.png" alt />
<!--span :class="tokenKey">灵动孪生智控系统</span--> <!--span :class="tokenKey">灵动孪生智控系统</span-->
<span :class="tokenKey">空域快视系统</span> <span :class="tokenKey">{{ $t('app.title') }}</span>
</div> </div>
</div> </div>
<div class="header-nav-c"> <div class="header-nav-c">
@ -19,14 +19,17 @@
v-if="item.show" v-if="item.show"
:index="item.value" :index="item.value"
:key="item.value" :key="item.value"
>{{ item.label }}</el-menu-item >{{ $t('menu.' + item.key) }}</el-menu-item
> >
</template> </template>
</el-menu> </el-menu>
</div> </div>
<ul class="header-nav-r"> <ul class="header-nav-r">
<!-- <li class="lang-select">
<a @click.prevent="changeLocale('zh')">中文</a> | <a @click.prevent="changeLocale('en')">EN</a>
</li> -->
<li v-if="roleIdsLocale.indexOf(2) !== -1"> <li v-if="roleIdsLocale.indexOf(2) !== -1">
<span class="user-login" @click="showLogin">登录</span> <span class="user-login" @click="showLogin">{{ $t('header.login') }}</span>
</li> </li>
<li v-if="roleIdsLocale.indexOf(2) === -1"> <li v-if="roleIdsLocale.indexOf(2) === -1">
<span class="user-photo"> <span class="user-photo">
@ -42,14 +45,14 @@
<!-- <el-dropdown-item command="modifyPassword" <!-- <el-dropdown-item command="modifyPassword"
>修改密码</el-dropdown-item >修改密码</el-dropdown-item
> --> > -->
<el-dropdown-item command="logout">退出登录</el-dropdown-item> <el-dropdown-item command="logout">{{ $t('header.logout') }}</el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
</el-dropdown> </el-dropdown>
</li> </li>
</ul> </ul>
<dt-dialog <dt-dialog
title="登录" :title="$t('header.login')"
:visible.sync="visible.login" :visible.sync="visible.login"
top="20vh" top="20vh"
width="22%" width="22%"
@ -70,7 +73,7 @@
class="username" class="username"
clearable clearable
v-model="loginForm.username" v-model="loginForm.username"
placeholder="请输入用户名" :placeholder="$t('login.username')"
name="username" name="username"
type="text" type="text"
size="mini" size="mini"
@ -82,7 +85,7 @@
<el-tooltip <el-tooltip
v-model="capsTooltip" v-model="capsTooltip"
content="Caps lock is On" :content="$t('common.capsLockOn')"
placement="right" placement="right"
manual manual
> >
@ -93,7 +96,7 @@
class="password" class="password"
v-model="loginForm.password" v-model="loginForm.password"
:type="passwordType" :type="passwordType"
placeholder="请输入用户密码" :placeholder="$t('login.password')"
name="password" name="password"
tabindex="2" tabindex="2"
size="mini" size="mini"
@ -122,8 +125,7 @@
size="mini" size="mini"
style="width: 100%" style="width: 100%"
@click.native.prevent="handleLogin" @click.native.prevent="handleLogin"
> </el-button >{{ $t('login.submit') }}</el-button>
>
</el-form-item> </el-form-item>
</el-form> </el-form>
</dt-dialog> </dt-dialog>

View File

@ -4,6 +4,7 @@
*/ */
import Vue from 'vue' import Vue from 'vue'
import appLoader from './App.Loader'; import appLoader from './App.Loader';
import i18n from '@/lang/index';
(async () => { (async () => {
await appLoader.install() await appLoader.install()
Promise.all([ Promise.all([
@ -17,6 +18,7 @@ import appLoader from './App.Loader';
el: '#app', el: '#app',
router, router,
store, store,
i18n,
render: h => h(App) render: h => h(App)
}) })
}) })

View File

@ -12,7 +12,7 @@
label-position="left" label-position="left"
> >
<div class="title-container"> <div class="title-container">
<h3 class="title">登录</h3> <h3 class="title">{{ $t('login.title') }}</h3>
</div> </div>
<el-form-item prop="username"> <el-form-item prop="username">
@ -25,7 +25,7 @@
ref="username" ref="username"
class="username" class="username"
v-model="loginForm.username" v-model="loginForm.username"
placeholder="请输入用户名" :placeholder="$t('login.username')"
name="username" name="username"
type="text" type="text"
tabindex="1" tabindex="1"
@ -36,7 +36,7 @@
<el-tooltip <el-tooltip
v-model="capsTooltip" v-model="capsTooltip"
content="Caps lock is On" :content="$t('common.capsLockOn')"
placement="right" placement="right"
manual manual
> >
@ -52,7 +52,7 @@
class="password" class="password"
v-model="loginForm.password" v-model="loginForm.password"
:type="passwordType" :type="passwordType"
placeholder="请输入用户密码" :placeholder="$t('login.password')"
name="password" name="password"
tabindex="2" tabindex="2"
autocomplete="on" autocomplete="on"
@ -77,7 +77,7 @@
type="primary" type="primary"
round round
@click.native.prevent="handleLogin" @click.native.prevent="handleLogin"
> </el-button >{{ $t('login.submit') }}</el-button
> >
</el-form> </el-form>
</div> </div>
@ -101,7 +101,7 @@ export default {
} }
const validatePassword = (rule, value, callback) => { const validatePassword = (rule, value, callback) => {
if (value.length < 6) { if (value.length < 6) {
callback(new Error('密码不少于6位字符')) callback(new Error(this.$t('login.validation.passwordMin')))
} else { } else {
callback() callback()
} }
@ -117,7 +117,7 @@ export default {
], ],
password: [ password: [
// { required: true, trigger: 'blur', validator: validatePassword } // { required: true, trigger: 'blur', validator: validatePassword }
{ required: true, trigger: 'blur', message: '请输入密码' }, { required: true, trigger: 'blur', message: this.$t('login.validation.required') },
], ],
}, },
passwordType: 'password', passwordType: 'password',

File diff suppressed because it is too large Load Diff