注:本文是个人调试分析所得,非官方文档,请酌情选用参考。文中分析的数据由https://extract.autodesk.io转换下载而来。
谈到信息本地化,个人觉得包含三个方面的内容:
1) Forge Viewer的操作菜单名,提示字串,错误提示字串等
2) 原始模型结构节点名或构件额外属性的名和值,例如在Navisworks中额外的附加属性
3) 常规属性的名和值, 即任何模型可能会出现的缺省属性名和值,例如截图中的,Item,Color, Material等
Forge在转换原始模型的时候,对于#2中的内容存储到objects_attrs.json.gz之中,所以#2中提到的本地化内容是直接可以显示的。应该无需额外的工作。
而谈到#1 和 #3,首先Forge转换服务会配置不同语言包,在Forge Viewer数据包层次结构中位于:res\locales. 每种语言包中有个allstrings.json,其中包括了#1的所有字串对应的翻译配对,#3中部分字串的翻译配对。Forge Viewer的JavaScript库封装了名为i18n的语言翻译类,用于调用对应语言包资源的和翻译字串的查询。
默认情况下,是英文环境,调取的是res\locales\en 的资源(其实无需翻译)。当切换语言时,i18n会根据设置的语言,刷新i18n,调取对应的语言包到浏览器内存。而Forge Viewer怎么又去把界面上显示出来的英文字串替换成英文呢?经过调试分析,发现在大多数的界面字串的DOM元素创建过程中,Viewer的JavaSript库都赋予了一个名为 data-i18n 的属性,而i18n有个方法叫做localize,用于遍历所有含有 data-i18n 的属性DOM元素,根据语言包得到本地化字串,再替换div显示的字串。
所以,如果想切换到某个语言版本,调用i18n的setLng和localize方法即可。zh-HANS是简体中文版。
Autodesk.Viewing.i18n.setLng('zh-HANS')
Autodesk.Viewing.i18n.localize()
但是,如前面提到的,语言包只是包含了部分常规字串的翻译,如果遇到没有包含的常规字串怎么办呢? 例如,本例中的语言包并没有对Item,Color, Material进行翻译,所以即使切换了语言,它们仍旧是英文。
首先能想到的折中办法是:先在对应语言包提供好翻译,例如allstrings.json添加Item,Color, Material的本地化语言字串,不过实际测试发现,不管用 :( 经过调试发现,在Viewer的JavaScript库新建每一条属性或属性类别时,并没有设置赋予了名为 data-i18n 的属性,虽然代码里是有这个分支,但无法通过简单的方式干预,设置该选项。也不建议去直接改造Viewer的JavaScript代码 (官方对改造后的JavaScript产生的问题不保证给予支持)
最后,想出一个办法:在切换语言的时候,搜索出所有属性或属性类别的DOM元素,如果没有data-i18n 的属性,则加上,最后再调用一次i18n.localize。此方法只需额外写一个函数调用即可,不用改动Viewer的JavaScript代码。只是需要在适当的时机触发一下。
function swtichLanguage(lng)
{
//加载语言资源
Autodesk.Viewing.i18n.setLng('zh-HANS',{localizeCategory:true},function(cb){
//寻找所有属性和属性类别的DOM元素
Array.prototype.forEach.call (document.querySelectorAll ('div.propertyName,div.categoryName'), function (eachDOM){
//赋予'data-i18n'属性
var if_i18n = eachDOM.getAttribute('data-i18n');
if(if_i18n === null){
var text = eachDOM.innerHTML;
eachDOM.setAttribute('data-i18n', text);
}
});
//翻译替换
Autodesk.Viewing.i18n.localize();
});
};
注意:
1.由于allstrings.json只在离线模式下能够修改,所以本法不适用于在线访问模式。已就此向开发部提交了需求
2.也和开发部提交了另外一个需求,希望在JavaScript库中能把属性和属性类别也加上data-i18n属性,而不用额外的操作
3.为了提高性能,语言包的加载对每个应用只加载一次,假设加载后又去修改是用不了的。因此需要将此缓存的资源剔除掉,再加载。这个技术相信各位都有办法。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。