Autodesk Forge Viewer 信息本地化技术分析

注:本文是个人调试分析所得,非官方文档,请酌情选用参考。文中分析的数据由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.为了提高性能,语言包的加载对每个应用只加载一次,假设加载后又去修改是用不了的。因此需要将此缓存的资源剔除掉,再加载。这个技术相信各位都有办法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值