i18n如何在js文件中生效

在vue项目中引用vue-i18n实现语言切换功能,开发过程中发现,在vue文件中使用都可以,但是在js文件中直接使用$t('zhKey.首页')是不生效的。
下面是我研究出解决办法:

// js文件中
import Vue from 'vue'
import VueI18n from 'vue-i18n'
import messages from 'unisoc-ui/js/i18n/langs'

Vue.use(VueI18n) // 这里一行是必须加的。
// 在该js文件中,单独注册一个i18n实例并引入语言文件
const i18n = new VueI18n({
  locale: localStorage.lang || 'Zh_CN',
  messages: messages
})

let mainNavlist = [] 
mainNavlist = [
  {
    icon: 'iconuser',
    title: i18n.t('zhKey.首页'),
    url: '/'
  }
]
JavaScript 文件使用 i18n 的 `$t` 方法,通常需要确保 i18n 实例已经正确创建并挂载到 Vue 应用中。在非 Vue 组件的 JavaScript 文件中,可以通过导入 i18n 实例并调用其 `t` 方法来实现翻译功能。 ### 在 JavaScript 文件使用 `$t` 方法的步骤: 1. **创建 i18n 实例** 首先,在项目中创建一个 i18n 实例,通常使用 `createI18n` 方法从 `vue-i18n` 库中引入。该实例将包含语言环境、翻译内容等配置信息。 ```javascript // i18n.js import { createI18n } from 'vue-i18n'; const messages = { en: { greeting: 'Hello, {name}!', items: 'You have {count} item{plural}', }, zh: { greeting: '你好,{name}!', items: '你有 {count} 个条目{plural}', }, }; const i18n = createI18n({ legacy: false, // 使用 Composition API 模式 locale: 'en', // 设置默认语言 fallbackLocale: 'en', messages, // 设置翻译内容 }); export default i18n; ``` 2. **在 Vue 应用中挂载 i18n 实例** 在 Vue 应用的入口文件中,将 i18n 实例挂载到 Vue 应用中,确保组件可以访问到 `$t` 方法。 ```javascript // main.js import { createApp } from 'vue'; import i18n from './i18n'; import App from './App.vue'; const app = createApp(App); app.use(i18n); app.mount('#app'); ``` 3. **在 JavaScript 文件中调用 `$t` 方法** 在非 Vue 组件的 JavaScript 文件中,可以通过导入 i18n 实例,并使用其 `t` 方法来获取翻译内容。 ```javascript // utils.js import i18n from './i18n'; function getTranslatedGreeting(name) { return i18n.global.t('greeting', { name }); } function getTranslatedItems(count) { const plural = count !== 1 ? 's' : ''; return i18n.global.t('items', { count, plural }); } export { getTranslatedGreeting, getTranslatedItems }; ``` 4. **在 Vue 组件中使用翻译内容** 在 Vue 组件中,可以直接通过 `$t` 方法访问翻译内容,或者调用上述 JavaScript 文件中定义的函数。 ```vue <template> <div> <p>{{ greeting }}</p> <p>{{ items }}</p> </div> </template> <script> import { ref, onMounted } from 'vue'; import { getTranslatedGreeting, getTranslatedItems } from '@/utils'; export default { setup() { const greeting = ref(''); const items = ref(''); onMounted(() => { greeting.value = getTranslatedGreeting('John'); items.value = getTranslatedItems(2); }); return { greeting, items }; }, }; </script> ``` ### 注意事项 - **参数传递** `$t` 方法支持通过对象或数组传递参数。推荐使用命名参数(对象)以提高可读性和减少错误。例如,`$t('greeting', { name: 'John' })`。 - **复数处理** 如果需要处理复数场景,可以使用 `$tc` 方法。例如,`$tc('items', count, { count, plural: count !== 1 ? 's' : '' })`。 - **类型声明** 如果在 TypeScript 项目中使用 `$t` 方法,可能需要添加类型声明以避免类型报错。可以在 `shim-uni.d.ts` 文件中添加以下代码: ```typescript declare module 'vue' { interface ComponentCustomProperties { $t: (message: string, values?: Record<string, any>) => string; } } ``` - **配置检查** 如果遇到参数未生效的问题,请检查占位符格式是否与参数类型匹配,并确保 `vue-i18n` 的版本和配置正确。 ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值