集成 vue-i18n 支持国际化

This commit is contained in:
就眠儀式 2022-02-09 17:40:33 +08:00
parent 4325ca3bff
commit 70d4f66b96
7 changed files with 62 additions and 7 deletions

View File

@ -1,5 +1,8 @@
<template> <template>
<lay-config-provider :themeVariable="themeVariable"> <lay-config-provider
:locale="locale"
:theme="theme"
:themeVariable="themeVariable">
<lay-layout class="layui-layout-document"> <lay-layout class="layui-layout-document">
<lay-header <lay-header
><lay-logo style="box-shadow: 0 0px 2px 0 rgba(0, 0, 0, 0.15)"> ><lay-logo style="box-shadow: 0 0px 2px 0 rgba(0, 0, 0, 0.15)">
@ -86,14 +89,19 @@ export default {
router.push(menu.path); router.push(menu.path);
}; };
const locale = "en_US";
const theme = "light"; const theme = "light";
const themeVariable = { const themeVariable = {
"--global-primary-color":"red",
"--global-checked-color":"red"
} }
return { return {
menus, menus,
theme, theme,
locale,
themeVariable, themeVariable,
currentPath, currentPath,
handleClick, handleClick,

View File

@ -39,6 +39,7 @@
"countup.js": "^2.0.8", "countup.js": "^2.0.8",
"evtd": "^0.2.3", "evtd": "^0.2.3",
"vue": "^3.2.30", "vue": "^3.2.30",
"vue-i18n": "^9.2.0-beta.30",
"vue-router": "^4.0.12" "vue-router": "^4.0.12"
}, },
"devDependencies": { "devDependencies": {

View File

@ -6,6 +6,9 @@ export default {
<script setup lang="ts"> <script setup lang="ts">
import "./index.less" import "./index.less"
import { useI18n } from 'vue-i18n'
const { t } = useI18n();
export interface LayInputProps { export interface LayInputProps {
name?: string; name?: string;
@ -15,7 +18,8 @@ export interface LayInputProps {
placeholder?: string; placeholder?: string;
} }
const props = defineProps<LayInputProps>(); const props = withDefaults(defineProps<LayInputProps>(), {
});
const emit = defineEmits(["update:modelValue", "input", "focus", "blur"]); const emit = defineEmits(["update:modelValue", "input", "focus", "blur"]);

View File

@ -6,6 +6,7 @@ export default {
<script setup lang="ts"> <script setup lang="ts">
import { Ref, ref, watch, useSlots, computed } from "vue"; import { Ref, ref, watch, useSlots, computed } from "vue";
import { useI18n } from 'vue-i18n';
export interface LayPageProps { export interface LayPageProps {
total: number; total: number;
@ -23,6 +24,8 @@ export interface LayPageProps {
const slots = useSlots(); const slots = useSlots();
const { t } = useI18n();
const props = withDefaults(defineProps<LayPageProps>(), { const props = withDefaults(defineProps<LayPageProps>(), {
limit: 10, limit: 10,
theme: "green", theme: "green",
@ -113,7 +116,7 @@ watch(currentPage, function () {
@click="prev()" @click="prev()"
> >
<slot v-if="slots.prev" name="prev"></slot> <slot v-if="slots.prev" name="prev"></slot>
<template v-else>上一页</template> <template v-else>{{ t('page.prev') }}</template>
</a> </a>
<template v-if="showPage"> <template v-if="showPage">
<template v-for="index of totalPage" :key="index"> <template v-for="index of totalPage" :key="index">
@ -135,7 +138,7 @@ watch(currentPage, function () {
@click="next()" @click="next()"
> >
<slot v-if="slots.next" name="next"></slot> <slot v-if="slots.next" name="next"></slot>
<template v-else>下一页</template> <template v-else>{{ t('page.next') }}</template>
</a> </a>
<span v-if="showLimit" class="layui-laypage-limits"> <span v-if="showLimit" class="layui-laypage-limits">
<select v-model="inlimit"> <select v-model="inlimit">

View File

@ -4,6 +4,7 @@ import "./theme/index.less";
import "@layui/layer-vue/lib/index.css"; import "@layui/layer-vue/lib/index.css";
import "@layui/icons-vue/lib/index.css"; import "@layui/icons-vue/lib/index.css";
import { layer, useLayer } from "@layui/layer-vue"; import { layer, useLayer } from "@layui/layer-vue";
import i18n from "./locales";
import LayLayer from "./component/layer/index"; import LayLayer from "./component/layer/index";
import LayBacktop from "./component/backTop/index"; import LayBacktop from "./component/backTop/index";
@ -156,6 +157,7 @@ const install = (app: App): void => {
const item = components[key]; const item = components[key];
app.component(item.name || key, item); app.component(item.name || key, item);
} }
app.use(i18n);
}; };
export { export {

27
src/locales/index.ts Normal file
View File

@ -0,0 +1,27 @@
import { createI18n } from 'vue-i18n'
const i18n = createI18n({
locale: 'en_US', // set locale
messages: {
zh_CN: {
input: {
hello: '你好世界',
},
page: {
prev: '上一页',
next: '下一页'
}
},
en_US: {
input: {
hello: 'hello world',
},
page: {
prev: 'prev',
next: 'next'
}
},
},
})
export default i18n

View File

@ -1,25 +1,31 @@
<script lang="ts"> <script lang="ts">
import { watch } from '@vue/runtime-core'; import { watch } from '@vue/runtime-core';
import { useI18n } from 'vue-i18n';
export default { export default {
name: "lay-config-provider", name: "lay-config-provider",
}; };
</script> </script>
<script setup lang="ts"> <script setup lang="ts">
const { locale } = useI18n();
export interface LayConfigProviderProps { export interface LayConfigProviderProps {
local?: string; locale?: string;
theme?: string; theme?: string;
themeVariable?: object; themeVariable?: object;
} }
const props = withDefaults(defineProps<LayConfigProviderProps>(), const props = withDefaults(defineProps<LayConfigProviderProps>(),
{ {
local: 'zh_cn', locale: 'en_US',
theme: 'light', theme: 'light',
} }
); );
const changeLocale = (lang: string) => {
locale.value = lang
}
const changeTheme = (theme: string) => { const changeTheme = (theme: string) => {
document.body.removeAttribute("lay-theme"); document.body.removeAttribute("lay-theme");
document.body.setAttribute("lay-theme", theme); document.body.setAttribute("lay-theme", theme);
@ -36,6 +42,10 @@ const changeThemeVariable = (vars: any) => {
} }
}; };
watch(() => props.locale, (lang) => {
changeLocale(lang)
},{immediate: true})
watch(() => props.theme, (theme) => { watch(() => props.theme, (theme) => {
changeTheme(theme); changeTheme(theme);
},{immediate: true}); },{immediate: true});