微信小程序-切换语言(国际化i18n)的方法封装

这篇具有很好参考价值的文章主要介绍了微信小程序-切换语言(国际化i18n)的方法封装。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

小程序切换语言封装

最近做的一个小程序的项目, 涉及到了多语言的切换, 就想到了之前vue用的多语言插件i18n, 就尝试着在微信开放社区搜了一下, 没有具体的实现, 但是提供了大致的实现思路, 如下:
微信小程序多语言,微信小程序,小程序,javascript
又结合了很多大佬的分享经验, 试着去封装了一个微信的i18n方法


🧐如何实现?

首先, 我们需要明确一下需要实现的功能

  1. 加载翻译文件的方法 loadTranslations 为i18n加载翻译文件(翻译文件单独抽离出来)
  2. 设置默认语言的方法 setLocale 用来设置一个默认的语言
  3. 获取当前语言的方法 getLocale 用来获取当前设置的语言
  4. 切换当前语言的方法 toggleLanguage 用来切换当前的语言
  5. 获取当前语言对应的翻译文件 getLanguage 用来获取对应语言的翻译文件
  6. 将翻译注入页面/组件的方法 effect 用来使页面/组件拿到当前语言对应的翻译文件
  7. 动态添加语言的方法 mergeTranslations 可以动态的添加语言

具体实现代码如下:

// i18n.js
class t {
  locale;
  locales;
  context;
  constructor(t) {
    this.locale = "", this.locales = t || {}
  }
  setLocale(t) {
    this.locale = t
  }
  getLocale() {
    return this.locale
  }
  loadTranslations(t) {
    return this.locales = t, this.context && this.effect(this.context)
  }
  mergeTranslations(t) {
    for (const e in t) this.locales[e] ? this.locales[e] = { ...this.locales[e], ...t[e] } : this.locales[e] = t[e];
    return this.context && this.effect(this.context)
  }
  getLanguage() {
    return this.locales[this.locale]
  }
  effect(t) {
    if (this.context = t, t.setData) return new Promise((e => { t.setData({ $t: this.getLanguage() }, (() => { e(t.$t) })) }))
  }
  toggleLanguage(t) {
    return this.setLocale(t), this.effect(this.context)
  }
}
const e = new t;
export { t as I18n, e as default, e as i18nInstance };

🧐如何使用?

  1. 首先我们要创建对应的翻译文件
    根目录下创建 lang 文件夹, 用来放翻译的文件, 有几种语言就分别创建几种语言对应的js文件, 以及一个入口文件 index.js
    微信小程序多语言,微信小程序,小程序,javascript
    我需要四种语言, 所以要有四种语言对应的翻译文案, 以及一个入口文件, 文件具体内容如下:
    微信小程序多语言,微信小程序,小程序,javascript
    语言对应的翻译文件, 导出一个大的对象, 大对象里面是一个一个模块的小的对象, 接着就是用到的翻译文案, 因此这四个文件需要尽可能保持一致, 不然就会导致某些文案没有对应的语言翻译

  2. 我们要将这些文件, 放到入口文件里统一处理:

import cnLocale from './cn';
import twLocale from './tw';
import enLocale from './en';
import ptLocale from './pt';

const messages = {
  cn: {
    ...cnLocale,
  },
  tw: {
    ...twLocale,
  },
  en: {
    ...enLocale,
  },
  pt: {
    ...ptLocale,
  }
};

export default messages;
  1. 初始化插件
// app.js
import message from "./lang/index";
import { i18nInstance, I18n } from "./utils/i18n";

App({
  renderI18nData: {},
  globalData: {
    currentLanguage: '',
  },
  onLaunch() {
    /**
     * i18nInstance.loadTranslations();  ->load translations for i18nInstance
     * i18nInstance.setLocale();  ->set default language
     * i18nInstance.getLocale();  ->get current language name
     * i18nInstance.toggleLanguage();  ->toggle language quickly
     * i18nInstance.effect(context: any);  ->必须指定page和components传递的context为this, 该方法会在this.data中设置一个$t属性
     * i18nInstance.mergeTranslations(); ->merge new locales into origin locales
     */
    const curL = this.getCurrentLanguage();
    
    i18nInstance.setLocale(curL);
    i18nInstance.loadTranslations(message);
    i18nInstance.effect(this);

    this.watch('currentLanguage',()=> {
      this.eachRenderI18nCallback();
    })
  },
  getCurrentLanguage() {
    return wx.getStorageSync('appLanguage') || i18nInstance.getLocale() || 'tw';;
  },
  switchLanguage(language) {
    wx.setStorageSync('appLanguage', language);
    i18nInstance.toggleLanguage(language);
    this.setGlobalData('currentLanguage',language);
  },
  setGlobalData(keyName,value) {
    this.globalData[keyName] = value;
  },
  watch(keyName,method = ()=> {},value) {
    let globalModel = this.globalData;
    Object.defineProperty(globalModel,keyName,{
      configurable: true,
      enumerable: true,
      set: function (_value) {
        value = _value;
        method(value);
      },
      get: function () {
        return value;
      }
    })
  },
  getCurrentI18n() {
    let lanModel = new I18n;
    const curL = i18nInstance.getLocale() || 'tw';
    
    lanModel.setLocale(curL);
    lanModel.loadTranslations(message);

    return lanModel;
  },
  renderI18nData(_this,callback,type) {
    const recordKey = _this.__wxExparserNodeId__ || _this.is || _this.route;

    _this.setData({$t: i18nInstance.getLanguage()});
    
    this.renderI18nData[recordKey] = {
      _this: _this,
      callback: callback
    };
  },
  eachRenderI18nCallback() {
    for (const key in this.renderI18nData) {
      if (Object.hasOwnProperty.call(this.renderI18nData, key)) {
        const element = this.renderI18nData[key];
        element._this.setData({$t: i18nInstance.getLanguage()});
        element.callback && element.callback();
      }
    }
  },
  handleLanguageChange() {
    // 获取当前页面实例,并重新渲染页面
    const pages = getCurrentPages();

    pages.forEach(page => {
      if (page.renderPage) {
        page.renderPage();
      }
    })
  }
})

之所以这么实现, 是因为page和component一起使用多语言时候会出问题, 传入了两个或者多个this, 导致i18n不知道该将翻译文件注入到哪里, 进而导致无法切换语言, 所以放到了 app.js 里面统一处理, 也更加符合逻辑;

  1. page/component 的具体使用
// page的使用
---------xxx.js
import i18nInstance from '../../utils/i18n';

onLoad(options) {
  i18nInstance.effect(this);
  ...
  // js 里通过 this.data.$t.route.test; (举个🌰) 来获取翻译文件
}
---------xxx.wxml
 <text>{{ $t.route.test}}</text>



// component的使用, 与page只有初始化不同, 使用翻译文件方法相同
---------xxx.js
const app = getApp();

Component({
  options: {
    addGlobalClass: true
  },
  properties: {},
  ready() {
    app.renderI18nData(this, ()=>{});
  }
})

因为没有vue的重定向组件用来重新加载页面, 我们需要在切换语言的页面手动刷新接口并把当前的语言传递给服务端
我用的方法是, 把当前的语言添加到请求头, 这样下发的数据就是对应语言的数据啦

import i18nInstance from '../utils/i18n';

axios.interceptors.request.use((request) => {
  const currentLe = i18nInstance.getLocale();
        
  const languageMap = {
    cn: 'zh_CN',
    tw: 'zh_TW',
    en: 'en_US',
    pt: 'pt_PT'
  }
  request.headers['lang'] = languageMap[currentLe];
 
  ...
}, (error) => {
  return Promise.reject(error);
})

🎉🎉
最后, 我们的小程序就能正常的切换多语言啦🥳
欢迎大家一起讨论学习😊~文章来源地址https://www.toymoban.com/news/detail-745561.html

到了这里,关于微信小程序-切换语言(国际化i18n)的方法封装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 国际化(微信小程序+TS)

    目录 一、环境配置 1、安装根目录依赖 2、安装minprogram依赖 3、新建gulpfile文件 二、i18文本定义 1、中文 zh-CN.json 2、英文 en-US.json 三、使用 1、WXML中的使用 2、Javascript中的使用 3、中英文切换 四、打包编译 1、配置TS 2、配置project.config.js 3、打包 参考文档         目录结构

    2024年02月09日
    浏览(42)
  • uniapp配置了pages.json 的 tabbar 国际化,小程序切换语言没有实时切换

    如上图,按照uniapp官方文档配置了tabbar的国际化 但是微信小程序实时切换语言没有实时刷新 解决方案: 在App.vue中加入以下代码:   在onLaunch中执行方法即可

    2024年04月28日
    浏览(23)
  • 【uniapp】微信小程序国际化详细版

    目录 一、步骤 1、main.js 引入并初始化 VueI18n  2、创建文件夹locale 二、应用 1、页面(固定数据) 2、动态数据 3、系统 官网详解:https://uniapp.dcloud.net.cn/tutorial/i18n.html 我创建项目的时候选择的模板是uni-ui项目,所以不需要npm  vue-i18n locale文件夹是与pages同级 locale/en.json(英文

    2024年02月11日
    浏览(32)
  • 微信小程序教学系列(8)- 小程序国际化开发

    欢迎来到第八章!这一次我们要谈论的是小程序国际化开发。你可能会问,什么是国际化?简单来说,国际化就是让小程序能够适应不同的语言和地区,让用户们感受到更亲切、更贴心的使用体验。下面就让我们一起探索一下吧! 1. 小程序国际化概述 在这个日益全球化的时

    2024年02月09日
    浏览(34)
  • i18n(国际化)代码简单实现

    各个国家都有各个国家的语言,如果网站需要让全世界的人使用,那就需要进行国际化功能开发 国际化我知道的一共有两种,其中一种是不同国家不同网站,也就是说页面风格都不一样。另外一种是网站都是一样的,只是里面的文字不同罢了。第一种没啥好说了,毕竟都是两

    2024年02月07日
    浏览(47)
  • Spring之国际化:i18n

    学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需写作干货注入能量… 热爱写作,愿意让自己成为更好

    2024年02月03日
    浏览(41)
  • Vue - i18n 国际化的使用

    参考网址: 使用: https://huaweicloud.csdn.net/638f133edacf622b8df8eb26.html?spm=1001.2101.3001.6650.1utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Eactivity-1-125181861-blog-123845480.235%5Ev38%5Epc_relevant_anti_t3_basedepth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Ea

    2024年02月11日
    浏览(44)
  • vue-i18n 实现国际化,支持切换不同语言

    需求:后台管理系统,可以实现语言切换 实现过程:用的i18n来实现的语言切换,网上能看到好多模板,根据自己的需求,修改一下即可使用,大概都是差不多的,因为涉及到后端,所以要跟后端协商一致决定去写,我的设计思路是跟着后端设计更改的,如下: 1.语言是后端接

    2024年02月12日
    浏览(30)
  • SpringBoot - SpringBoot整合i18n实现消息国际化

    在我们开发WEB项目的时候,项目可能涉及到在国外部署或者应用,也有可能会有国外的用户对项目进行访问,那么在这种项目中, 为客户展现的页面或者操作的信息就需要根据客户系统的环境来使用不同的语言,这就是我们所说的项目国际化。 1. MessageSource源码 Spring中定义了

    2024年02月03日
    浏览(39)
  • 【angular】实现简单的angular国际化(i18n)

    实现简单的angular国际化。本博客实现中文版和法语版。 将 Hello i18n! 变为 中文版:你好 i18n! 或 法语版:Bonjour l’i18n ! 。 创建一个项目: 在集成终端中打开。 添加本地化包: 在html中添加格式化标识: 现在运行一下,页面是: 生成翻译模板语言包: 生成了一个文件夹: l

    2024年02月08日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包