vue3 国际化

一、安装

        安装 vue-i18n 依赖(我的版本是9.2.2)

npm i vue-i18n

二、配置

        在src文件夹下建立lang文件夹,里面分别建立文件index.ts、en.ts(英文)、zh.ts(中文)

1、index.ts

import { createI18n } from "vue-i18n";
import zh from "./zh";
import en from "./en";

const messages = {
  en,
  zh,
};

const language = (navigator.language || "en").toLocaleLowerCase();
const i18n = createI18n({
  legacy: false,   // 9.2以上版本不输入该属性会报错
  locale: sessionStorage.getItem('LANG') || language.indexOf('zh') > -1 ? 'zh':"en",
  fallbackLocale: "en",
  messages,
});

export default i18n;

2、zh.ts

export default {
    cc: '超'
}

3、en.ts

export default {
    cc: 'C'
}

三、引入

        main.ts文件引入lang中的index.ts文件

import { createApp } from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';
import i18n from './lang'

createApp(App)
.use(store)
.use(router)
.use(i18n)
.mount('#app')

四、使用

1、直接当做普通文本使用

<template>
  <div>
    <div>{{$t('cc')}}</div>
  </div>
</template>

2、通过setup使用

       ref常用于设置单个,reactive常用于设置多个(但切换语言时不会响应,见后面标题4

<template>
  <div>
    <div v-text="text1"></div>
    <div v-text="text2.a"></div>
  </div>
</template>

<script lang="ts" setup>
import { ref, reactive } from 'vue';
import { useI18n } from 'vue-i18n';
const { t } = useI18n();

const text1 = ref(t('cc'));
const text2 = reactive({
    a:t('cc')
})
</script>

3、切换语言

<template>
  <div>
    <button @click="changeLang('zh')">中文</button>
    <button @click="changeLang('en')">英文</button>
  </div>
</template>

<script lang="ts" setup>
import { useI18n } from 'vue-i18n';
const { locale } = useI18n();
const changeLang = (lang:string):void => {
  locale.value = lang;
  // 防止页面刷新后语言类型重置
  sessionStorage.setItem('LANG', lang==='zh' ? 'zh' : 'en');
}
</script>

4、切换语言时 ref/reactive 不响应问题

解决方案1:computed

<template>
  <div>
    <div v-text="text1"></div>
    <button @click="changeLang('zh')">中文</button>
    <button @click="changeLang('en')">英文</button>
  </div>
</template>

<script lang="ts" setup>
import { ref, computed } from 'vue';
import { useI18n } from 'vue-i18n';
const { t, locale } = useI18n();
const text = ref(t('cc'));
const text1 = computed(() => text.value = t('cc'));
const changeLang = (lang:string):void => {
  locale.value = lang;
  // 防止页面刷新后语言类型重置
  sessionStorage.setItem('LANG', lang==='zh' ? 'zh' : 'en');
}
</script>

解决方案2:watch(适用于文本有变化的情况)

<template>
  <div>
    <div v-text="text"></div>
    <div v-text="text1"></div>
    <button @click="changeLang('zh')">中文</button>
    <button @click="changeLang('en')">英文</button>
  </div>
</template>

<script lang="ts" setup>
import { ref, computed, watch} from 'vue';
import { useI18n } from 'vue-i18n';
const { t, locale } = useI18n();
const text = ref(t('cc'));
const text1 = computed(() => text.value = t('cc'));
const changeLang = (lang:string):void => {
  locale.value = lang;
  // 防止页面刷新后语言类型重置
  sessionStorage.setItem('LANG', lang==='zh' ? 'zh' : 'en');
}
watch(text,() => {
  text.value = t('cc')
})
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

[chao]

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值