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

注:本文是我的調試分析所得,非官方文檔,請酌情選用參考。文中分析的數據由https://extract.autodesk.io轉換下載而來。json

談到信息本地化,我的以爲包含三個方面的內容:瀏覽器

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的語言翻譯類,用於調用對應語言包資源的和翻譯字串的查詢。spa

圖片描述

默認狀況下,是英文環境,調取的是res\locales\en 的資源(其實無需翻譯)。當切換語言時,i18n會根據設置的語言,刷新i18n,調取對應的語言包到瀏覽器內存。而Forge Viewer怎麼又去把界面上顯示出來的英文字串替換成英文呢?通過調試分析,發如今大多數的界面字串的DOM元素建立過程當中,Viewer的JavaSript庫都賦予了一個名爲 data-i18n 的屬性,而i18n有個方法叫作localize,用於遍歷全部含有 data-i18n 的屬性DOM元素,根據語言包獲得本地化字串,再替換div顯示的字串。prototype

圖片描述

因此,若是想切換到某個語言版本,調用i18n的setLng和localize方法便可。zh-HANS是簡體中文版。翻譯

Autodesk.Viewing.i18n.setLng('zh-HANS')
Autodesk.Viewing.i18n.localize()

可是,如前面提到的,語言包只是包含了部分常規字串的翻譯,若是遇到沒有包含的常規字串怎麼辦呢? 例如,本例中的語言包並無對Item,Color, Material進行翻譯,因此即便切換了語言,它們仍舊是英文。3d

首先能想到的折中辦法是:先在對應語言包提供好翻譯,例如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.爲了提升性能,語言包的加載對每一個應用只加載一次,假設加載後又去修改是用不了的。所以須要將此緩存的資源剔除掉,再加載。這個技術相信各位都有辦法。

相關文章
相關標籤/搜索