热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

5分钟前端国际化

作者简介Kid蚂蚁金服数据体验技术团队背景需要国际化的react项目已经迭代了1年多,文件众多,包含了jsx和普通的js对象文件。粗略估计有几千个中文词

作者简介 Kid 蚂蚁金服·数据体验技术团队

背景

需要国际化的react项目已经迭代了1年多,文件众多,包含了jsx和普通的js对象文件。粗略估计有几千个中文词条。本文先介绍了采用的国际化方案,然后给出了国际化的过程和一个自己开发的脚本i18n-pick,按照教程,可以帮助前端jsx项目5分钟快速国际化。

方案选择

先大体上介绍下我选择的国际化方案。国际化方案很多,我这里列举主要的几种:

  • 编译期间转化:例如wepack的i18n-webpack-plugin,打包的时候对_('key')进行转义
  • 运行期间转化:react-intl等,把中文词条写成intl.get()的方式,在运行时获取中文文案
  • wordpress的getText方案:gettext是一个filter 钩子, 用来替换和本地化翻译文本, 替换 __()、_e()、_x()、_ex() 和 _n() 函数包含的文本

由于项目中我选择了antd作为视觉组件库。所以想和antd提供的官方的国际化方式保持统一。antd推荐的是react-intl,不过另一款类似的react-intl-universal也有不少人推荐,两者都比较成熟。所以我对两种进行了比较:

react-intlreact-intl-universal
切换不刷新页面
js文件支持(重要)
名词单双数,默认值,html
无破坏性劣(装饰器的代码实现会改变ref)

名词单双数,默认值,html这种功能两者都有。我这里就不多说了,具体的功能感兴趣的可以去看下API。比较关注的其实是js文件支持那块。react-intl只支持在jsx文件的内容中使用,但是由于项目配置化编程的缘故,很多中文是写在js对象中的。react-intl不支持在普通js对象中使用,很不方便。而且他的装饰器实现会改变组件的ref。他唯一的好处是他的切换不需要刷新页面,不过这种低频的操作刷新页面倒也无妨。

针对以上的原因,最终选择了react-intl-universal作为国际化方案。不过后来真实使用的时候,发现他提供的支持js对象的方式不是很好,于是还是直接采取了react-intl-universal的思想。简单的包装了下他们的依赖intl-messageformat~这里不详细描述了,他的api官网文档可以查到。

国际化方案选择完了之后,开始执行阶段。以上无论是选择哪种方案,编码时基本都要求一种特殊的形式。要么intl.get(),要么是文案前加上_#这种。对于已经迭代了很久的项目,这就涉及到了一项力气活。对中文文案进行提取以及替换。在这里就直接分享脚本i18n-pick,描述下整个的国际化过程了。

使用教程

主要分为3步,安装,扫描和提取,然后使用翻译工具来进行词条的翻译,具体步骤如下:

安装

cnpm i i18n-pick cnpm用的淘宝镜像,会快一些。

扫描

./node_modules/i18n-pick/bin/i18n-pick.js scan [path] 命令最后的path选择你的代码目录,运行完成后会在项目根目录生成i18n-messages文件夹,包含jsx.text,text.text和zh-CH.json三个文件。具体实现是调用了babel的transformFileSync方法,在编译成语法树的时候,解析下面几种babel-type:

  • JSXAttribute
  • JSXText
  • AssignmentExpression
  • ObjectProperty
  • ArrayExpression

这里的基本含括了所有的情况,如果有遗漏的,欢迎联系我。将解析的这几种的value与/[\u4e00-\u9fa5]/进行比对。将包含中文文案的文件名,行数,文案内容记录下来。JSX内的中文文案存到jsx.text,一般JS内的中文文案存到text.text。

分开存的原因是因为替换的时候,JSX内的文案需要加上大括号才行。

同时我会把提取出来的文案内容存到了zh-CH.json中。这里为了配合翻译工具atool-i10n的使用,json中的存储格式也是按照他的要求提供的。这里有个小tip,参见附录。

提取

./node_modules/i18n-pick/bin/i18n-pick.js pick 然后执行pick操作,就是将jsx.text,text.text文件的内容按行分析,对文件进行内容替换。这里最开始我将key值定为了自增长的数字。为了保证源码一定的阅读性,我同时将原文案以/**/注释的形式标在文末。后来,吸取了评论区lany9527同学的建议。将中文作为了key值~~然后我会在文件头部import一下依赖。效果如下:

base/reactIntlUnicersal这个文件需要自己放到自己的项目中,代码可以参考链接。

翻译

然后建议安装atool-l18n这种翻译工具,直接翻译成英文文案。就可以编译运行了~当然后续还得有一些css的调整工作。 cnpm i atool-l10n

node_modules/.bin/atool-l10n

总结

本文主要是分享了一个文案提取的脚本,来让前端jsx项目快速国际化。如有使用上的问题,欢迎在评论区询问~

tip

多谢评论区lany9527同学的建议,脚本已经更新。不再以自增长的数字作为key值了。换成以中文名作为key进行提取,已经更新脚本~

附录:

1.目前脚本不支持中文中有换行的情况,所以得修正下scan之后的三个文件的内容。并且这部分内容得手动去替换。不过这种情况很少,我的项目扫出2000个词条只有两条有这个问题。

2.第二种是pick操作执行之后可能会编译出错,那是因为你的项目中可能手写了\n这样的文案,得手动处理下这种情况。

3.第三种是不支持中文中含有\"的情况,这部分也得自己处理,原因是我以中文作为key,为了提取后的值过eslint,得用单引号引起来。就得对双引号单引号进行转义。无法处理已经转义过的内容。在完成了文案的转化之后可以再用scan命令扫描一遍,看下哪些没有处理好的,再手动处理下~

感兴趣的同学可以关注专栏或者发送简历至 'yifei.pyf####alibaba-inc.com'.replace('####', '@'),欢迎有志之士加入~

原文地址:github.com/ProtoTeam/b…



推荐阅读
  • 这篇文章给大家讲解如何利用dhtmlxGantt在服务器端集成数据。脚本数据保存如果您已初始化dataProcessor,则用户或以编程方式所做的任何更改都将自动 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • React项目中运用React技巧解决实际问题的总结
    本文总结了在React项目中如何运用React技巧解决一些实际问题,包括取消请求和页面卸载的关联,利用useEffect和AbortController等技术实现请求的取消。文章中的代码是简化后的例子,但思想是相通的。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 详解react组件通讯方式(多种)
    这篇文章主要介绍了详解react组件通讯方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着 ... [详细]
  • React 小白初入门
    推荐学习:React官方文档:https:react.docschina.orgReact菜鸟教程:https:www.runoob.c ... [详细]
  • 认识Vue关于Vue的描述有不少,不外乎都会拿来与Angular和React对比,同样头顶MVVM双向数据驱动设计模式光环的Angular自然被对比的最多,但到目前为止,Angul ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 原文链接:Python:获取“3年前的今天”的日期时间Python:getdatetimefor3yearsagotoday在Python中,如何获取3年前的今天的datetime ... [详细]
  • 转自:http:www.phpweblog.netfuyongjiearchive200903116374.html一直对字符的各种编码方式懵懵懂懂,什 ... [详细]
  • 加密、解密、揭秘
    谈PHP中信息加密技术同样是一道面试答错的问题,面试官问我非对称加密算法中有哪些经典的算法?当时我愣了一下,因为我把非对称加密与单项散列加 ... [详细]
  • 仅以博客形式记录linux所学,不足之处继续优化linux系统的常用命令格式基本上是以cmd(command)选项参数的形式书写例如screen、date、ifconfig等命令1 ... [详细]
author-avatar
妈妈说称号长的人很牛也
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有