想法来源于工作需求,最后倒腾出一个国际化工作流,期望是这样的:

1. 自动化处理国际化文案(表现为转义翻译人员给到的文件处理成技术人员所识别的文件)

2. 转化后的国际化文件能够按需加载,实现懒加载的功能

综上,实现以上需求所涉及知识点:nodejs, webpack

本文只记录文件实现懒加载功能,至于国家化文案转换如果需要的告知。那么,就开始啦。
先上实际效果图:

以上便是最终效果,有兴趣的可以继续往下看

Q: 首先有这样一个HTML文本,思考如何讲要替换的文字进行国际化?

<section><div class="icon-bg"></div><div id="create" class="lx-button lx-button-black">Create wallet</div><div id="import" class="lx-button">Import wallet</div><button id="cn">zh-cn</button><button id="hant">zh-hant</button><br>
</section>

...: 通过观察了vue 和angular的国际化方案,最后决定在元素上增加一个标识,用来识别该元素需要做国际化,思路就是通过document.querySelectorAll()选择所有具有i18n类的元素

A: 效果如下

有了标识符后,怎么才能替换文字?思路是这样的:

如何替换文字? -> 替换什么语言的文字 ? -> 替换的内容具体是什么?

一路逆推过去: 
1. 替换的内容具体是什么?

替换的内容考虑到懒加载,所以一般对于相同的字段的文案都会按照不同国家分开来(此处,参考平时用的angular 和vue框架)
所以,中文文案和繁体文案分成了两个文件夹存放,存放如下:


(PS: 个人习惯会把文案相关文件放入叫做i18n的文件夹中)

此时,便解决了替换的内容具体是什么 。

2. 替换什么语言的文字?

语言肯定是在页面加载的时候获取的,而且是不固定的,所以在初始化国际化的时候肯定是需要明确指定的,并且,为了方便检索,通常国际化文件夹里面会根据不同语言的标识码进行划分,但是有些国家比较特别公用一种文字,比如新加坡的和香港的和台湾的就都是繁体,所以我们肯定不会sasa的去建立三个繁体的国际化文案的,所以,这里需要统一入口做这种需求处理;
3. 如何替换文字?
反推到最后一步,很显然,获取了需要国际化的元素之后,根据指定的替换的语言去获取相应的资源文件,然后并把资源文件中的字段替换掉页面上的文案
具体代码如下:

export class TinaI18n {constructor (obj){this.currentLang = obj['currentLang'];this.useFileName = obj['useFileName'];}// 设置当前国际化语言
  setLang(){if(/^zh/i.test(this.currentLang)){if(/^zh[-—](cn|SG)/gi.test(this.currentLang)){this.currentLang = 'zh-cn';}else {this.currentLang = 'zh-hant';}}else {this.currentLang = this.currentLang.slice(0,2).toLowerCase();}}// 获取当前国际化语言翻译文案
  static getI18nFile(fileUrl){return import(/* webpackIgnore: true */ fileUrl).then(({default: ctx}) => {return ctx;})}// 变换国际化
  setInnerHtml(lang){lang && (this.currentLang = lang);let ele = document.querySelectorAll('.i18n');if (!(ele.length > 0)) {return new Error('请检查class是否有添加i18n');}this.setLang();TinaI18n.getI18nFile(`${window.location.href}i18n/${this.currentLang}/${this.useFileName}.js`).then(ctx => {for (let i = 0; i < ele.length; i++) {if (this.currentLang && ctx) {if (!ele[i].getAttribute('placeholder')) {ele[i].innerText = ctx[ele[i].getAttribute('data-i18n')];}} else {if (!(ctx)) {console.error('获取文案失败: 路径指定错误? 文件不存在?');return}}}}).catch(err => {console.log('err', err);});}}

如何使用?

import {TinaI18n} from "./i18n/TinaI18n";window.onload = function () {// 实例化国际化const tinaI18n = initI18N('zh-hant', 'add');// 简体中文document.querySelector('#cn').addEventListener('click', ()=>{tinaI18n.setInnerHtml('zh-cn');});// 繁体中文document.querySelector('#hant').addEventListener('click', ()=>{tinaI18n.setInnerHtml('zh-hant');})
};// 初始化国际化
function initI18N(currentlang, currentFile) {const tinaI18n =  new TinaI18n({currentLang: currentlang,useFileName: currentFile});tinaI18n.setInnerHtml();return tinaI18n;
}

这里创建了一个专门做国际化的类,通过实例化这个类,传入语言代码(一种语言标识)和文件名称,调用setInnerHtml(),对页面上的元素进行替换,注意,这个功能只能替换标签里的文案,像placehoder要新写一个方法,像变量也是要写一个方法

下一篇更新敢于动态加载webpack的配置

转载于:https://www.cnblogs.com/timetimetime/p/10784851.html

结合webpack 一步一步实现懒加载的国际化简易版方案相关推荐

  1. 使用Webpack的代码分离实现Vue懒加载(译文)

    当一个Vue的项目体积变得十分庞大的时候,使用Webpack的代码分离功能将Vue Components,routes或Vuex的代码进行分离并按需加载,会极大的提高App的首屏加载速度. 在Vue的 ...

  2. React ----- 路由懒加载的几种实现方案

    传统的两种方式 1.import() 符合ECMAScript提议的import()语法,该提案与普通 import 语句或 require 函数的类似,但返回一个 Promise 对象.这意味着模块 ...

  3. vue2首屏性能优化(splitChunks/externals/gzip/路由懒加载)

    首屏加载慢原因: Vue只有第一次会加载页面, 以后的每次页面切换,只需要进行组件替换.因为Vue 是SPA,所以首页第一次加载时会把所有的组件以及组件相关的资源全都加载了,造成网站首页打开速度变慢的 ...

  4. vue延迟渲染组件_性能优化之组件懒加载: Vue Lazy Component 介绍

    这篇文章分享了从遇到前端业务性能问题,到分析.解决并且梳理出通用的Vue 2.x 组件级懒加载解决方案(Vue Lazy Component )的过程. 初始加载资源过多 问题起源于我们的一个页面,下 ...

  5. Code Splitting代码分包(路由懒加载)

    code split代码分包(路由懒加载) 前言,​在应用打包结果过大时,按照设置的规则打包到不同的bundle中,提高应用响应速度.也就是当一个页面进行加载的时候如果太慢,那么你就可以考虑对工程进行 ...

  6. 前端性能优化的重要方案:图片懒加载

    大家好,我是前端岚枫,一枚二线城市的程序媛,今天主要跟大家分享我整理的前端性能优化的重要方案:图片懒加载,主要包括其原理,我们常用的一些插件,及编写源码实现图片懒加载功能等,图片懒加载是项目比较常见的 ...

  7. 什么是懒加载,如何实现图片或列表懒加载?

    文章目录 什么是懒加载 实现图片懒加载 列表懒加载 列表滚动加载 什么是懒加载 只在数据或内容即将进入视口或即将需要的时候才加载. 实现懒加载的好处有: 提高页面加载速度和响应速度.只加载当前用户需要 ...

  8. 11-分步查询懒加载

    分步查询--懒加载模式 目录 懒加载模式示例 不使用懒加载 使用懒加载 aggressiveLazyLoading lazyLoadTriggerMethods 所谓懒加载,也称延时加载,是指不一下子 ...

  9. 【MyBatis笔记】11-分步查询懒加载

    分步查询--懒加载模式 懒加载模式示例 不使用懒加载 使用懒加载 aggressiveLazyLoading lazyLoadTriggerMethods 所谓懒加载,也称延时加载,是指不一下子加载完 ...

最新文章

  1. pandas 保留小数位数
  2. 2017年第八届蓝桥杯省赛试题(JavaA组)
  3. 腾讯天衍实验室主任郑冶枫
  4. 千里眼摄像头支持对象存储吗_【手机技术】专业相机应用Halide全面支持苹果iPhone SE 2人像模式...
  5. SQL:数据表给定字段的多行记录的合并
  6. 如何解决 FrameBuffer console (vc)自动关闭显示
  7. 合并多个文件内容到同一个文件
  8. sql语句date函数
  9. 看图吧地图数据如何玩转企业地信圈
  10. Android中怎么重新启动APP或系统
  11. java左右摇摆_java – 按边缘排列摇摆组件
  12. 嵌入式软件研发所具备的技能
  13. 软件定义存储的头部厂商也来了,XSKY 星辰天合加入龙蜥社区
  14. 数学金融和计算机科学哪个数学难,高考志愿填报之热门专业:金融vs计算机如何选择...
  15. 计算机专业3a排名,3A大学排名
  16. 高校云计算专业有哪些?如何进行专业学习?
  17. Python Cookbook --第一章:数据结构和算法(1)
  18. FFmpeg进阶: 采用音频滤镜对音频进行转码
  19. 联想think system sr550信息
  20. 黑马程序员----JAVASE之交通灯管理系统

热门文章

  1. scrapy——抓取知乎
  2. eclipse安装html编辑器插件
  3. 2023年湖南建筑八大员(材料员)模拟真题及答案
  4. [基础]-beautifulsoup模块使用详解
  5. Qt 动画飞舞的蝴蝶源码
  6. 《矩阵论引论》田振际——状态方程的约当规范形
  7. lsdyna批处理求解工具使用
  8. ***无人驾驶***整理的apollo 入门课程
  9. 微信小程序 - 图像加载时渐隐淡入效果(image)
  10. 外置USB供电与内置锂电池供电自动切换电路