多语言切换功能——i18n

一、前言

在软件开发过程中,不管是电商,民宿,租车还是交友软件中,多语言适配是提升用户体验的重要环节。UniApp作为一种跨平台的开发框架,提供了便捷的方式来实现多语言切换功能---i18n。

这个功能是我在开发电商,民宿,租车等相关软件的时候经常用到的一个工具。


二、技术开发
2.1、安装 vue-i18n

css 复制代码
npm installvue-i18n --save

2.2、配置多语言资源文件
在根目录创建i18n文件,

添加图片注释,不超过 140 字(可选)

在项目的i18n/lang目录下,创建多个JS文件来存放不同语言的文本资源。例如:

en.js (英文)

arduino 复制代码
export const h = {
  appName: 'Have a date',
  lang: 'en',
  search: 'Search',
  switchLanguage:'Switch language',
  my:'My',
  loginToView:'You have to log in to see mine',
  clickLogin:'Click here to login',
  inReview:'in review',
  authenticated:'Authenticated',
}

zh.js(中文)

arduino 复制代码
export const h = {
 appName: '约会吧',
 lang: '中文',
 search: '搜索',
 switchLanguage:'切换语言',
 my:'我的',
 loginToView:'登录后才能查看我的哦',
 clickLogin:'点此登录',
 inReview:'审核中',
}

zh-fan.js(中文繁体)

arduino 复制代码
export const h = {
 appName: '約會吧',
 lang: '中衛',
 search: '搜索',
 switchLanguage:'切換語言',
 my:'我的',
 loginToView:'登錄後才能查看我的哦',
 clickLogin:'點此登錄',
 inReview:'審核中',
 authenticated:'已認證',
}

在i18n文件下创建一个index.js文件管理多语言逻辑:

javascript 复制代码
import Vue from "vue";
import VueI18n from "vue-i18n";
 
Vue.use(VueI18n); // 全局挂载
 
export const i18n = new VueI18n({
  locale: uni.getStorageSync("locale") || "fan",
  messages: {
    zh: require("./lang/zh.js"), // 中文简体语言包
    en: require("./lang/en.js"), // 英文语言包
	fan: require("./lang/zh-fan.js") //中文繁体语言包
  }
});
 
export default i18n;

2.3、 在 main.js 中配置和引用 i18n

javascript 复制代码
//main.js

import App from './App'

import { i18n } from './i18n/index' //国际化

import Vue from 'vue'
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({
	...App,
	i18n
})
app.$mount()

2.4、在package-lock.json里面配置i18n

json 复制代码
"dependencies": {
     "vue-i18n": "^8.2.1"
  }

2.5、在页面中使用多语言切换和设置手动切换语言功能

xml 复制代码
<template>
  <view style="text-align: center;">
    <u-radio-group
      v-model="languages1"
      placement="column"
      @change="groupChange"
      iconPlacement='right'
      style="padding: 22rpx 44rpx;"
    >
      <u-radio
        :customStyle="{marginBottom: '8px'}"
        v-for="(item, index) in languages"
        :key="index"
        :label="item.name"
        :name="item.code"  
        :disabled="item.disabled" 
		style="padding: 12rpx 24rpx;"
      >
      </u-radio>
    </u-radio-group>
    
    <!-- 确定按钮 -->
    <view class="btn" v-if="showConfirmButton" @click="confirmLanguageChange">
      {{ $t('h.confirm') }}
    </view>
	<!-- <Tabbar :curIndex='3' ></Tabbar> -->
  </view>
</template>


<script>
// import Tabbar from '@/components/tabbar/tabbar.vue';
export default {
	// components: {
	//   Tabbar
	// },
  data() {
    return {
      languages: [
        { code: "EN", name: 'English', disabled: false },
        { code: "ZH", name: '简体中文', disabled: false },
        { code: "TC", name: '繁体中文', disabled: false },
      ],
      languages1: uni.getStorageSync("lang") || "TC",    // Initialize with code
      selectedLanguage: uni.getStorageSync("lang") || "TC",
      showConfirmButton: false // 控制按钮显示
    };
  },
  onLoad() {
      uni.setNavigationBarTitle({
        title: this.$t('h.switchLanguage')
      });
    },
  mounted() {
    const savedLang = uni.getStorageSync("lang") || "TC";
    this.changeLangEvent(savedLang);
  },
  methods: {
    changeLangEvent(langCode) {
      let locale;
      switch (langCode) {
        case "EN":
          locale = "en";
          break;
        case "ZH":
          locale = "zh";
          break;
        case "TC":
          locale = "fan";
          break;
      }
      uni.setStorageSync("locale", locale);;
      this.$i18n.locale = locale;
      uni.setStorageSync("lang", langCode);
      this.selectedLanguage = langCode;
    },
    groupChange(value) {
      this.showConfirmButton = true; // 显示确定按钮
    },
    confirmLanguageChange() {
      this.changeLangEvent(this.languages1);
      this.showConfirmButton = false; // 隐藏确定按钮
    
      // 刷新页面
      uni.reLaunch({
        url: '/pages/tab/index', // 跳转到主页路径
      });
    }
  },
};
</script>

选择对应的语言后点击确定后选择对应的语言。

完结撒花。

相关推荐
打不着的大喇叭32 分钟前
uniapp的光标跟随和打字机效果
前端·javascript·uni-app
无我Code38 分钟前
2025----前端个人年中总结
前端·年终总结·创业
程序猿阿伟40 分钟前
《前端路由重构:解锁多语言交互的底层逻辑》
前端·重构
Sun_light1 小时前
6个你必须掌握的「React Hooks」实用技巧✨
前端·javascript·react.js
爱学习的茄子1 小时前
深度解析JavaScript中的call方法实现:从原理到手写实现的完整指南
前端·javascript·面试
莫空00001 小时前
Vue组件通信方式详解
前端·面试
呆呆的心1 小时前
揭秘 CSS 伪元素:不用加标签也能玩转出花的界面技巧 ✨
前端·css·html
susnm1 小时前
Dioxus 与数据库协作
前端·rust
优雅永不过时_v1 小时前
基于vite适用于 vue和 react 的Three.js低代码与Ai结合编辑器
前端·javascript
小皮侠1 小时前
nginx的使用
java·运维·服务器·前端·git·nginx·github