针对nvue框架,关于使用i18n完成国际化开发,基于vue2+uniapp

1.使用i18n完成文字显示

首先下载适配vue2的i18n版本

npm install vue-i18n@8.28.2 --save

随后在common文件夹中创建i18n文件夹(也可以存放到任何合适的地方)

在i18n文件夹中创建locale文件夹用于存放语言包文件

在对应的文件夹中存放语言(一定要每个包都存放语言,可以是测试语言不然后续检测不到语句可能报错)

{
"hello":"你好!"
}
{
"hello":"hello"
}

之后配置main.js

import Vue from 'vue'
import App from './App'
import VueI18n from 'vue-i18n'
import en from '@/common/i18n/locale/en.json'
import zhCN from '@/common/i18n/locale/zh-CN.json'

Vue.use(VueI18n)
//注意这里需要export,不然nvue的特性无法切换语言
export const i18n = new VueI18n({
  locale: 'zh-CN', // 默认语言
  fallbackLocale: 'en', // 回退语言
  messages: {
    en,
    'zh-CN': zhCN,
  }
});

const app = new Vue({
  i18n,
  ...App
})
app.$mount()

在 nvue 文件中无法直接使用 {{ $t('welcome') }} 的原因通常与 nvue 的特殊性以及国际化(i18n)插件的支持方式有关。nvue 是 Weex 原生渲染的页面格式,与普通的 vue 文件在语法和运行环境上存在差异。

Weex 的 JavaScript 运行环境与浏览器不同,部分依赖浏览器 API 的库可能无法在 nvue 中直接使用。

方法 :使用计算属性或方法
在 nvue 中,可以通过计算属性或方法间接调用 $t 函数。

<template>
  <text>{{ welcomeText }}</text>
</template>

<script>
export default {
  data() {
    return {
      welcomeText: ''
    }
  },
  mounted() {
    this.updateWelcomeText()
  },
  methods: {
    updateWelcomeText() {
      const i18n = getApp().$i18n
      this.welcomeText = i18n.t('index.welcomeText')
      console.log("welcomeText:", this.welcomeText)
    }
  }
}
</script>


2.完成中英文更改

我这里设置的是点击图片实现中英文的更改,其他可以选择下拉框等实现多语言文字修改

首先是界面部分

<view class="language-switcher">
		  <image 
		    src="@/static/language.png" 
		    class="lang-img" 
		    alt="点击切换语言"
		    @click="toggleLanguage" 
		  >
		  </image>
</view>

然后在data中添加语言信息

export default {
		data() {
			return {
                languages: [
				  {code:'zh-CN',name:'简体中文'},
				  {code:'en',name:'English'},
				], // 可选择的语言
				currentLang: 'zh-CN', // 默认语言
				}
		},


	computed: {
    // 获取当前语言的显示名称
		currentLangName() {
			const matchedLang = this.languages.find(lang => lang.code === this.currentLang);
			return matchedLang ? matchedLang.name : '未知语言';
			}
		},
		onLoad() {
			console.log("=======onload..........")
			that = this
			
			this.currentLang = i18n.locale;
			console.log('初始化语言:', this.currentLangName);
			this.updateLanguageText();
		},

	methods: {
    // 点击图片切换语言的核心方法
       toggleLanguage() {
         // 2. 直接使用引入的 i18n 实例(不再用 this.$i18n)
         if (!i18n) {
           console.error('无法切换语言:i18n实例不存在');
           return;
         }
   
         // 3. 核心切换逻辑
         const newLang = this.currentLang === 'zh-CN' ? 'en' : 'zh-CN';
         
         // 更新页面状态
         this.currentLang = newLang;
         // 直接操作引入的 i18n 实例切换语言
         i18n.locale = newLang;
   
		// 关键:语言切换后重新更新文本
		this.updateLanguageText();
         // 验证切换结果
         console.log(`语言已切换:${this.currentLangName}(实际生效locale:${i18n.locale})`);
   
         try {
           uni.setStorageSync('selectedLang', newLang);
         } catch (e) {
           console.warn('保存语言设置失败:', e);
         }
		 // 关键:语言切换后重新更新文本
       },
	   updateLanguageText() {
	         this.welcomeText = i18n.t('index.welcomeText')
	       },
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值