资讯专栏INFORMATION COLUMN

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

littleGrow / 1167人阅读

摘要:默认情况下,是英文环境,调取的是的资源其实无需翻译。但是,如前面提到的,语言包只是包含了部分常规字串的翻译,如果遇到没有包含的常规字串怎么办呢例如,本例中的语言包并没有对,进行翻译,所以即使切换了语言,它们仍旧是英文。

注:本文是个人调试分析所得,非官方文档,请酌情选用参考。文中分析的数据由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数据包层次结构中位于:reslocales. 每种语言包中有个allstrings.json,其中包括了#1的所有字串对应的翻译配对,#3中部分字串的翻译配对。Forge Viewer的JavaScript库封装了名为i18n的语言翻译类,用于调用对应语言包资源的和翻译字串的查询。

默认情况下,是英文环境,调取的是reslocalesen 的资源(其实无需翻译)。当切换语言时,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.为了提高性能,语言包的加载对每个应用只加载一次,假设加载后又去修改是用不了的。因此需要将此缓存的资源剔除掉,再加载。这个技术相信各位都有办法。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/82712.html

相关文章

  • Forge Viewer 载入外部扩展

    摘要:本文章的原作是的在版的里引入了一个重大的变革,开始支持载入外部扩展,细节可以参考这篇文章重大变更。这个函数自此刻起的函数回传值不在是布林值,取而代之的是一个实例,这表示开始支持使用非同步的方法在载入扩展。 本文章的原作是 Autodesk ADN 的 Philippe Leefsma 在 v2.15 版的 Forge Viewer API 里引入了一个重大的变革,Viewer开始支持载...

    LinkedME2016 评论0 收藏0
  • Learn Forge tutorial - 向导式Forge进阶教程

    摘要:团队陆续的推出了很多学习资料和样例工程,这些资源在学习简谈做了介绍。近期,团队制作了一个向导式进阶教程,旨在通过一步一步的教学,让初学者熟悉有关和的用法。目前上线的有,,即将上线的是。 Autodesk Forge团队陆续的推出了很多学习资料和样例工程,这些资源在Autodesk Forge 学习简谈做了介绍。而部分资源由于API本身的变动,或者代码的变动,可能无法正常使用了,我们会逐...

    韩冰 评论0 收藏0
  • Learn Forge tutorial - 向导式Forge进阶教程

    摘要:团队陆续的推出了很多学习资料和样例工程,这些资源在学习简谈做了介绍。近期,团队制作了一个向导式进阶教程,旨在通过一步一步的教学,让初学者熟悉有关和的用法。目前上线的有,,即将上线的是。 Autodesk Forge团队陆续的推出了很多学习资料和样例工程,这些资源在Autodesk Forge 学习简谈做了介绍。而部分资源由于API本身的变动,或者代码的变动,可能无法正常使用了,我们会逐...

    wenshi11019 评论0 收藏0
  • 「翻译」在Forge Viewer上实作简易的模型版本比较

    摘要:现在让我们修改这个示例让他可以展示两个同项目但不同版号的模型及。示例执行结果如下这边是这个比较模型的括展代码英文原文 showImg(https://segmentfault.com/img/bVOmjp?w=1542&h=925); 熟悉 BIM360 Team 的朋友可能知道他有一个很牛的模型文档版本比较的功能,但如果模型是放在 Google 云盘或是百度云盘上有可能做到吗? Au...

    JowayYoung 评论0 收藏0

发表评论

0条评论

littleGrow

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<