This commit is contained in:
LiuHao 2023-04-18 23:36:26 +08:00
parent 55e29ce697
commit d2bce3fcbe
8 changed files with 76 additions and 35 deletions

View File

@ -0,0 +1,39 @@
<template>
<el-dropdown trigger="click" @command="handleLanguageChange">
<div class="lang-select--style">
<svg-icon icon-class="language" />
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item :disabled="appStore.language === 'zh-cn'" command="zh-cn"> 中文 </el-dropdown-item>
<el-dropdown-item :disabled="appStore.language === 'en'" command="en"> English </el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</template>
<script setup lang="ts">
import { useI18n } from 'vue-i18n';
import SvgIcon from '@/components/SvgIcon/index.vue';
import { useAppStore } from '@/store/modules/app';
const appStore = useAppStore();
const { locale } = useI18n();
function handleLanguageChange(lang: string) {
locale.value = lang;
appStore.changeLanguage(lang);
if (lang == 'en') {
ElMessage.success('Switch Language Successful!');
} else {
ElMessage.success('切换语言成功!');
}
}
</script>
<style lang="scss" scoped>
.lang-select--style {
font-size: 18px;
line-height: 50px;
}
</style>

View File

@ -7,14 +7,3 @@
<script setup lang="ts"> <script setup lang="ts">
const { isFullscreen, toggle } = useFullscreen(); const { isFullscreen, toggle } = useFullscreen();
</script> </script>
<style lang="scss" scoped>
.screenfull-svg {
display: inline-block;
cursor: pointer;
fill: #5a5e66;
width: 20px;
height: 20px;
vertical-align: 10px;
}
</style>

View File

@ -6,20 +6,22 @@ export default {
}, },
// 登录页面国际化 // 登录页面国际化
login: { login: {
title: 'vue3-element-admin',
username: 'Username', username: 'Username',
password: 'Password', password: 'Password',
login: 'Login', login: 'Login',
code: 'Verification Code', code: 'Verification Code',
copyright: '', copyright: ''
icp: '',
thirdPartyLogin: 'third-party login'
}, },
// 导航栏国际化 // 导航栏国际化
navbar: { navbar: {
full: 'Full Screen',
language: 'Language',
dashboard: 'Dashboard', dashboard: 'Dashboard',
logout: 'Logout',
document: 'Document', document: 'Document',
gitee: 'Gitee' layoutSize: 'Layout Size',
selectTenant: 'Select Tenant',
layoutSetting: 'Layout Setting',
personalCenter: 'Personal Center',
logout: 'Logout'
} }
}; };

View File

@ -4,6 +4,7 @@ import { createI18n } from 'vue-i18n';
// 本地语言包 // 本地语言包
import enLocale from './en'; import enLocale from './en';
import zhCnLocale from './zh-cn'; import zhCnLocale from './zh-cn';
import Cookies from 'js-cookie';
const messages = { const messages = {
'zh-cn': { 'zh-cn': {
@ -16,12 +17,11 @@ const messages = {
/** /**
* 使 * 使
*
* @returns zh-cn|en ... * @returns zh-cn|en ...
*/ */
export const getLanguage = () => { export const getLanguage = () => {
// 本地缓存获取 // 本地缓存获取
let language = localStorage.getItem('language'); let language = Cookies.get('language');
if (language) { if (language) {
return language; return language;
} }
@ -39,7 +39,7 @@ export const getLanguage = () => {
const i18n = createI18n({ const i18n = createI18n({
legacy: false, legacy: false,
locale: getLanguage(), locale: getLanguage(),
messages: messages messages
}); });
export default i18n; export default i18n;

View File

@ -6,19 +6,21 @@ export default {
}, },
// 登录页面国际化 // 登录页面国际化
login: { login: {
title: 'vue3-element-admin',
username: '用户名', username: '用户名',
password: '密码', password: '密码',
login: '登 录', login: '登 录',
code: '请输入验证码', code: '请输入验证码',
copyright: '', copyright: ''
icp: '',
thirdPartyLogin: '第三方登录'
}, },
navbar: { navbar: {
full: '全屏',
language: '语言',
dashboard: '首页', dashboard: '首页',
logout: '注销',
document: '项目文档', document: '项目文档',
gitee: '码云' layoutSize: '布局大小',
selectTenant: '选择租户',
layoutSetting: '布局设置',
personalCenter: '个人中心',
logout: '退出登录'
} }
}; };

View File

@ -11,7 +11,7 @@
clearable clearable
filterable filterable
reserve-keyword reserve-keyword
placeholder="请选择租户" :placeholder="$t('navbar.selectTenant')"
v-if="userId === 1 && tenantEnabled" v-if="userId === 1 && tenantEnabled"
@change="dynamicTenantEvent" @change="dynamicTenantEvent"
@clear="dynamicClearEvent" @clear="dynamicClearEvent"
@ -22,19 +22,23 @@
<header-search id="header-search" class="right-menu-item" /> <header-search id="header-search" class="right-menu-item" />
<el-tooltip content="源码地址" effect="dark" placement="bottom"> <el-tooltip content="Github" effect="dark" placement="bottom">
<ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" /> <ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" />
</el-tooltip> </el-tooltip>
<el-tooltip content="文档地址" effect="dark" placement="bottom"> <el-tooltip :content="$t('navbar.document')" effect="dark" placement="bottom">
<ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" /> <ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />
</el-tooltip> </el-tooltip>
<el-tooltip content="全屏" effect="dark" placement="bottom"> <el-tooltip :content="$t('navbar.full')" effect="dark" placement="bottom">
<screenfull id="screenfull" class="right-menu-item hover-effect" /> <screenfull id="screenfull" class="right-menu-item hover-effect" />
</el-tooltip> </el-tooltip>
<el-tooltip content="布局大小" effect="dark" placement="bottom"> <el-tooltip :content="$t('navbar.language')" effect="dark" placement="bottom">
<lang-select id="lang-select" class="right-menu-item hover-effect" />
</el-tooltip>
<el-tooltip :content="$t('navbar.layoutSize')" effect="dark" placement="bottom">
<size-select id="size-select" class="right-menu-item hover-effect" /> <size-select id="size-select" class="right-menu-item hover-effect" />
</el-tooltip> </el-tooltip>
</template> </template>
@ -47,13 +51,13 @@
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu>
<router-link to="/user/profile" v-if="!dynamic"> <router-link to="/user/profile" v-if="!dynamic">
<el-dropdown-item>个人中心</el-dropdown-item> <el-dropdown-item>{{ $t('navbar.personalCenter') }}</el-dropdown-item>
</router-link> </router-link>
<el-dropdown-item command="setLayout"> <el-dropdown-item command="setLayout">
<span>布局设置</span> <span>{{ $t('navbar.layoutSetting') }}</span>
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item divided command="logout"> <el-dropdown-item divided command="logout">
<span>退出登录</span> <span>{{ $t('navbar.logout') }}</span>
</el-dropdown-item> </el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
</template> </template>

View File

@ -30,6 +30,9 @@ import { useDict } from '@/utils/dict';
import { getConfigKey, updateConfigByKey } from '@/api/system/config'; import { getConfigKey, updateConfigByKey } from '@/api/system/config';
import { parseTime, addDateRange, handleTree, selectDictLabel, selectDictLabels } from '@/utils/ruoyi'; import { parseTime, addDateRange, handleTree, selectDictLabel, selectDictLabels } from '@/utils/ruoyi';
// 国际化
import i18n from '@/lang/index';
const app = createApp(App); const app = createApp(App);
// 全局方法挂载 // 全局方法挂载
app.config.globalProperties.useDict = useDict; app.config.globalProperties.useDict = useDict;
@ -46,6 +49,7 @@ app.config.globalProperties.animate = animate;
app.use(ElementIcons); app.use(ElementIcons);
app.use(router); app.use(router);
app.use(store); app.use(store);
app.use(i18n);
app.use(plugins); app.use(plugins);
// 自定义指令 // 自定义指令
directive(app); directive(app);

View File

@ -14,7 +14,7 @@ export const useAppStore = defineStore('app', () => {
// 语言 // 语言
const language = ref(Cookies.get('language')); const language = ref(Cookies.get('language'));
const locale = computed(() => { const locale = computed(() => {
if (language?.value == 'en') { if (language.value == 'en') {
return en; return en;
} else { } else {
return zhCn; return zhCn;
@ -53,6 +53,7 @@ export const useAppStore = defineStore('app', () => {
const changeLanguage = (val: string): void => { const changeLanguage = (val: string): void => {
language.value = val; language.value = val;
Cookies.set('language', val);
}; };
return { return {