最近接到一个海外项目业务需求,项目最终会被来自不一样国家的客户所使用,指望能让客户有一个良好的用户体验,所以前端须要适配国际化。css
乍一听,这个海外项目需求并无什么特别的地方,彷佛就多了一个国际化适配。但细细一想,事情可没这么简单,前端开发面临了不少新的问题。下面梳理一下国际化开发中一般会面临的挑战: 页面文案所有可配置前端
英语(页面样式正常)react
以上列举出了不少挑战,但实际上“页面文案处理”才是最主要的矛盾,由于它直接致使前端开发工做量和维护成本的激增。下面咱们重点来讨论文案处理思路,其实从实现国际化的角度来看,jQuery、Vue、React 等都只是载体而已,实现思路都是相通的,所以国际化文案处理与具体的技术框架并不耦合。接下来将会抛出几种国际化文案处理思路,每种思路对生产力和生产关系的要求有高有低,姑且将其分别对应为石器时期、青铜时期、黄金时期。json
传统的国际化开发流程:前端开发到必定阶段,将文案提取到资源文件(一般为 en-US.json),而后将资源文件发送给翻译团队,翻译团队翻译出各国语言版本的文案,每种语言对应一个资源文件,最后将这些资源文件发回给前端开发人员,前端开发人员更新到本身本地。以下图所示:bash
1.页面上要提取的文案很少架构
2.支持的国际化语言较少,好比:只须要支持中文和英文框架
3.项目需求较固定,后期只作简单维护,不会新增大的需求ide
4.分析 这是国际化开发的基本流程,“前端开发”和“翻译团队”是必不可少的两个节点,但它们相互之间依赖的过重。“提取文案”的过程本质上是在重复劳动,所以能够考虑由程序来完成。svg
5.代码示例工具
6.App.js
import React, { Component } from 'react';
import { IntlProvider, FormattedMessage } from 'react-intl';
import qs from 'querystring';
import logo from './logo.svg';
import './App.css';
import DEFAULT_MESSAGES from './i18n/en-US.json';
const DEFAULT_LOCALE = 'en-US';
class App extends Component {
state = {
messages: DEFAULT_MESSAGES,
};
componentWillMount() {
const search = window.location.search.slice(1);
const params = qs.parse(search);
const locale = params.locale || DEFAULT_LOCALE;
const messages = require(`./i18n/${locale}.json`);
debugger;
this.setState({
messages,
});
}
render() {
const { messages } = this.state;
return (
<IntlProvider locale="en" messages={messages}>
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
<FormattedMessage
id="welcome"
defaultMessage={`Hello world!`}
/>
</p>
<a
className="App-link"
href="/?locale=zh-CN"
rel="noopener noreferrer"
>
zh-CN
</a>
<a
className="App-link"
href="/?locale=en-US"
rel="noopener noreferrer"
>
en-US
</a>
</header>
</div>
</IntlProvider>
);
}
}
export default App;
复制代码
en-US.json
{
"welcome": "Hello world!"
}
复制代码
前面分析了“提取文案”的过程本质上是在重复劳动,那咱们看看有没有办法进行改进。咱们能够先对比一下“无国际化需求”和“有国际化需求”时的前端开发流程。如图所示:
这里咱们提出一个指望或愿景:但愿能像开发普通业务同样去开发有国际化需求的业务!
为了达成这一愿景,咱们须要有一个工具:它可以扫描指定的文件,并能识别出文件中的字符串,而后能根据字符串的含义生成变量名,并用变量表达式替换掉原来的字符串,最后可以将提取出来的变量自动追加到资源文件中。
如何实现这样的工具?咱们能够用 Babel 将js文件解析为一颗语法树,而后遍历并找出字符串节点,接下来调用 Google Cloud Translation API 将字符串翻译为英文,并以此做为变量名获得变量表达式,最后用变量表达式替换掉原来的文本便可。以下图所示:
有了石器时期的生产方式做为铺垫,咱们能够在此基础上继续作改进。既然“前端开发”和“翻译团队”之间依赖的过重,那咱们能够在中间加一个节点“文案配置平台”。前端将提取的文案直接上传到“文案配置平台”,翻译团队直接在“文案配置平台”上进行文案翻译,前端直接从“文案配置平台”获取翻译后的最新文案。
1.面向前端开发人员:文案录入、输出
2.面向翻译团队:文案翻译、发布
3.其余:文案版本控制
4.适用场景
这是从架构层面对国际化开发方式进行优化和提效,通常大的互联网公司由于其自身业务的复杂度,都早已沉淀出不少的通用能力平台。
以上每种思路都有各自适用的场景,实际生产中须要从开发成本、开发体验、后期维护、能力沉淀等多维度进行考虑。这篇文章旨在抛砖引玉打开思路,各位看官能够将本身的思路抛出来一块儿讨论。