介绍
为了解决gs应用的国际化文案问题,GS利用在SystemService提供了tr/setLocal/getLocal函数;
函数定义以及使用说明如下:
/**
* @function setLocale
* @description 给上下文设置locale值
* @param {String} locale locale值
* @returns {Void}
* @example
* sys.setLocale("en_US");
* sys.setLocale("zh_CN");
*/
setLocale(locale) {}
/**
* @function getLocale
* @description 获取上下文locale值
* @returns {String} locale值
* @example
* sys.getLocale();
*/
getLocale() {}
/**
* @function tr
* @description 动态匹配需要国际化的内容
* @param {String} format 原始文本,支持模版替换
* @param {Object} arg1 可选:模版动态变量替换值
* @param {...Object} argN 可选:模版动态变量替换值
* @returns {String} 根据locale值返回对应的国际化文本,如果未配置则返回原始值
* @example
* var locale = 'en_US';
* setLocale(locale); // 在当前context设置locale为zh_CN
* var desc1 = tr("这是一个需要在界面上展示的中文描述"); // locale为英文,desc1优先匹配应为描述,如果未配置则返回原始值
* var desc2 = tr("这是另一个需要界面上展示的中文描述");
* var desc4 = tr("这是一个{0}模版", name); // 这是一个占位符模版
* var desc5 = tr("{1}本书一共{0,number,currency}。"); // 这是另一个占位符使用模版
*
* // var desc5 = tr("这是一个" + name + "模版"); // 这种写法不支持
* // var desc = tr("这是一个") + name + tr("模版"); // 此写法会影响整体翻译,不建议使用
* //var desc4 = tr(`这是一个${a + b}模版`); // 此占位符方式Griffin Script暂不支持
*/
tr(format, arg1, ...argN) {}
如何使一个应用具有国际化文案的能力
1. 在profile引入SystemService扩展
<bean class="com.cainiao.loginx.edge.SystemService" name="sys"/>
2. 编写gs代码,动态指定语言并用tr包装默认文案
let locale = 'en_US'; // 这里可根据不同条件动态获取
sys.setLocale(locale); // 设置需要展示的语言
for (let i = 0; i < 10; i++) {
labor.scan("/pages/scan/index.lemo.json", {
"header_title": sys.tr("测试标题"), // 用sys.tr包装需要支持国际化的文案
"guide_text": sys.tr("这是测试标题"),
"bottom_tip": sys.tr("< 按左键可手动输入")
});
}
3. 上传应用并在对应项目编辑对应语言的文案
4. 重新上传应用,并配置部署规则
5. 验证语言是否切换
pageflow props支持国际化文案配置
<service name = "pageFlow" class= "com.cainiao.loginx.edge.pageflow.FlowService">
<function name = "scanContainer" action="router" page="/pages/scanContainer">
<props>
{
"foo": "#{some text to be translated}", // 用#{} 配置需要国际化的文案
"bar": "#{some other text to be translated} and more text"
}
</props>
</function>
</service>