对国际化 i18n 项目的一点思考

简介: 对国际化 i18n 项目的一点思考

image.png


国际化是什么?

国际化 对应的英文单词为 Internationalization,又称 i18n

  • i 为单词的 【第一个】 字母
  • 18 为 【in 之间】 单词的个数
  • n 代表这个单词的 【最后一个】 字母

如果你的项目是 Vue,那么相信你在实现国际化功能时,也必不可少的会使用到 vue-i18n 这个库,接下来本文也是通过这个库搭配 Vue 实现最基本的国际化功能,但关注点并不是如何使用这个库,而是在实现的过程中思考 可优化的点

实现基本国际化功能

这里就不再多余演示 demo 项目的创建过程了,并且文中只演示最基本的 中英文 切换,好了现在直奔核心吧!

集成 vue-i18n

安装依赖

熟悉的命令:npm install vue-i18n -S

配置 vue-i18n

image.png

  • src 目录下创建 language 目录用于保持和语言切换相关的内容
  • language 目录下创建 lang 目录用于保存不同语言的映射关系,如中文对应 zh.js、英文对应 en.js
  • language 目录下创建 index.js 作为默认导出,并在其中创建 i18n 对象
import { createI18n } from "vue-i18n";
  import zh from './lang/zh';
  import en from './lang/en';
  const i18n = createI18n({
    legacy: false,
    locale: "zh", // 初始化配置语言
    messages: {
      zh,
      en,
    },
  });
  export default i18n;
复制代码

main.js 注册 i18n

内容非常简单,直接上代码:

import { createApp } from "vue";
import i18n from "./language";
import store from "./store";
import App from "./App.vue";
createApp(App)
    .use(store)
    .use(i18n)
    .mount("#app");
复制代码

实际上在通过 use(i18n) 时,会调用 i18n.install() 方法,大概内容如下:

  • 通过 app.provide(app.__VUE_I18N_SYMBOL__, i18n)i18n 对象提供给应用中的所有后代组件可通过 inject 注入
  • 通过 app.config.globalProperties.xxx = xxx 的方式为应用添加 全局属性/方法,实际上是对 Vue2Vue.prototype 使用方式的一种替代
  • 常见全局属性,如 $i18n 通过 app.config.globalProperties.$i18n = i18n 添加到全局
  • 常见全局方法,如:$t, $rt, $d, $n, $tm 通过 Object.defineProperty(app.config.globalProperties, `$${method}`, desc) 添加到全局
  • 通过 aplly(...) 方法注册常用的 全局指令 v-t全局组件 i18n
  • 在根组件卸载时移除/释放 i18n 相关内容
const unmountApp = app.unmount;
app.unmount = () => {
    i18n.dispose();
    unmountApp();
};
复制代码
  • 注册 vue-devtools 的相关插件

根据数据信息填充国际化内容

页面渲染

假设需要渲染如下数据对应的列表,并且要实现国际化:

const data = [
  {
    url: vueImg,
    title: 'Vue',
    describe: '渐进式 JavaScript 框架'
  },
  {
    url: reactImg,
    title: 'React',
    describe: '用于构建用户界面的 JavaScript 库'
  },
  {
    url: angularImg,
    title: 'Angular',
    describe: '现代 Web 开发平台'
  },
  {
    url: nodeImg,
    title: 'Node',
    describe: 'Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时'
  },
  {
    url: webpackImg,
    title: 'Webpack',
    describe: 'webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具'
  },
];
复制代码

对应 App.vue 组件模板内容如下:

<template>
  <button class="btn" @click="changeLang">{{ $t("中/英") }}</button>
  <List :data="data" />
</template>
复制代码

对应的页面效果如下:

image.png

填充 lang 目录下映射关系

lang/zh.js 文件中:

export default {
  "渐进式 JavaScript 框架": "渐进式 JavaScript 框架",
  "用于构建用户界面的 JavaScript 库": "用于构建用户界面的 JavaScript 库",
  "现代 Web 开发平台": "现代 Web 开发平台",
  "Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时":
    "Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时",
  "webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具":
    "webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具",
  "中/英": "中/英",
};
复制代码

lang/zh.js 文件中:

export default {
  "渐进式 JavaScript 框架": "Progressive JavaScript framework",
  "用于构建用户界面的 JavaScript 库":
    "JavaScript library for building user interface",
  "现代 Web 开发平台": "Modern web development platform",
  "Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时":
    "Node.js is a JavaScript runtime based on the chrome V8 engine",
  "webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具":
    "Webpack is a static module packaging tool for modern JavaScript applications",
  "中/英": "Chinese / English",
};
复制代码

<List /> 组件中进行翻译处理

翻译处理可通过如下方式处理:

  • 使用 $t(...) 方法
  • 使用 v-t 指令
  • 使用 <i18n-t></i18n-t> 组件

这里选择第一种,因为它更灵活,能使用的范围也更广,指令和组件形式限定在了 template 中:

image.png

效果演示

image.png


目录
相关文章
|
程序员 Android开发 开发者
Aab(Android App Bundle)测试与安装
Aab(Android App Bundle)测试与安装
1420 0
|
应用服务中间件 Linux 网络安全
linux下查找nginx.conf文件路径的方法
nginx.conf文件在哪?云吞铺子介绍Linux系统下查找nginx.conf配置文件的方法。 查找nginx.conf 1、SSH连接Linux服务器,命令:ssh root@你的服务器IP 2、执行命令:nginx -t回车,即可看到nginx.conf文件所在目录 3、cd进入目录,vi nginx.conf编辑nginx.conf文件即可。
8793 0
|
1月前
|
人工智能
一个帮运营写产品详情页的AI指令
分享一套实用的电商详情页AI生成指令模板,涵盖标题、卖点、场景、参数、保障等核心模块,帮助运营、产品经理等快速产出80分初稿,大幅提升效率。适配主流AI工具,结合人工优化,轻松应对多平台需求。
768 7
|
8月前
|
人工智能 自然语言处理 数据挖掘
2025国内有哪些呼叫中心系统值得推荐?
在数字化浪潮推动下,呼叫中心系统已成为企业客户服务的核心枢纽。通过全面智能化、多渠道融合、大数据与AI驱动的决策支持及云化与安全性等技术优势,呼叫中心系统实现了降本增效和客户体验提升。2025年,随着人工智能和云计算的深度渗透,呼叫中心将迎来新一轮升级。推荐几款高效系统:合力亿捷、中国移动、华为云、阿里云和百度语音解决方案,涵盖电商、金融、政府等多个领域,助力企业优化服务流程,提升竞争力。
650 13
|
Web App开发 JavaScript 前端开发
【专栏】如何使用 Chrome DevTools 的断点功能提升前端调试效率, 花式打断点
【4月更文挑战第29天】本文介绍了如何使用 Chrome DevTools 的断点功能提升前端调试效率。从基本的行断点和函数断点,到更高级的条件断点、DOM 断点、XHR 断点和事件断点,以及代码注入断点,详细阐述了各种断点的设置和应用场景。通过断点调试实战案例,如异步操作、复杂逻辑和性能优化,展示断点在解决实际问题中的重要作用。掌握这些技巧能有效提高开发质量和效率。
850 1
|
安全 算法 物联网
Wi-Fi安全协议的演变过程:从WEP到WPA3的全面解析
随着无线网络普及,Wi-Fi安全性问题日益重要。本文详细探讨了Wi-Fi安全协议的演进,包括最早的WEP协议及其缺陷,随后推出的WPA协议引入了TKIP等改进措施,WPA2则采用AES加密提供更高安全性,最新的WPA3进一步强化了密码保护和隐私安全,标志着Wi-Fi安全的重大升级。未来,Wi-Fi安全协议将继续进化,确保无线通信安全。
1227 7
|
Web App开发 JavaScript 前端开发
前端项目打包与发布
前端项目打包与发布
795 7
|
存储 Linux
|
Python
python小游戏——怀念经典坦克大战代码
python小游戏——怀念经典坦克大战代码
720 0
python小游戏——怀念经典坦克大战代码