在地化發布檢查
i18n JSON 語系檔檢查指南:精確路徑與翻譯界線
鍵是否齊全是一項結構檢查,不能證明翻譯正確、完整或符合畫面情境。以一份來源與一份目標字典,在發布前找出需要補齊與人工檢查的項目。
內容更新: · 維護者:Hung Chi-Hsueh · 修正回報
翻譯前測試介面排版
將小型來源字串字典產生為僅供測試的偽語系,載入應用程式後檢查窄螢幕、按鈕及錯誤畫面。重音與填充可讓部分截斷問題顯現;沒有標記的文字可能是硬編碼,也可能是刻意排除。這不是真實翻譯,也不能證明已完成語系支援。
產生器只保護列出的簡單 placeholder 與行內標記;複雜 ICU 訊息及歧義輸入會被拒絕。這些分支請使用執行環境支援的訊息工具,並先在實際 formatter 中檢查所有產生的字串,再加入測試版本。
字面鍵不是框架別名
字面成員 "a.b" 的 JSON Pointer 是 /a.b;物件 a 內的 b 則是 /a/b,兩者可以同時存在。本工具不合併這些路徑、不改大小寫、不修剪鍵名,也不做 Unicode 正規化。空鍵、斜線與波浪號都保留;JSON Pointer 將 ~ 編碼成 ~0、/ 編碼成 ~1。
部分框架可設定鍵分隔符,或將點號與巢狀鍵視為別名;本工具只比較實際 JSON 結構。畫面路徑以 JSON 字串顯示,換行、不可見字元與雙向控制字元會跳脫,避免鍵名看似另一條路徑。
解讀分類,不用完成率誤導判斷
缺少與額外項目以字串末端路徑計算;字串與物件衝突只在該路徑報一次,不為所有後代重複報錯。巢狀空物件只提醒命名空間為空,不算已翻譯訊息;空根字典沒有字串可比較。
字串經 JavaScript trim() 後沒有字元即列為空白,但不修改原文;零寬連接字元不會被自動移除。OK 或品牌名稱等相同文字不直接判成未翻譯;來源端空白也需檢查。分類筆數是待檢查項目,不是翻譯完成率。
複數、fallback 與 placeholder 仍須執行測試
不同語言可能合法使用不同的複數類別;i18next 也支援可設定插值、巢狀資源、物件與陣列。本檢查器刻意只接受根物件,成員為命名空間物件或字串;陣列、null、數字與布林會指出側別及路徑後拒絕,不宣稱完整相容 i18next 或 ICU。
額外鍵可能有意保留,缺少的來源鍵也可能由執行時 fallback 提供;這些結果不構成自動刪除授權,更不能保證畫面正常。插值變數、ICU 訊息、HTML placeholder、文案是否過期、翻譯準確性與文字溢出,都需要另做框架測試及人工審查。
另外比對訊息 token
使用翻譯 token 檢查器比對一組來源與譯文。Token 模式比較常見 placeholder、printf、標記、數字、網址、Email 候選及換行出現次數;HTML 僅比較標記名稱與開閉,不檢查屬性或巢狀。差異只提示人工確認,不直接判定為錯誤。
ICU 模式解析 plural 與 select 訊息並比較參數名稱集合,不比較分支涵蓋或語意。仍須在目標框架與語系測試實際訊息。輸入留在本機;匯出報告可能包含 token 值。
嚴格輸入、完整報告與本機隱私
每份 UTF-8 輸入最多 1 MiB、100 層、50,000 節點及 20,000 字串;拒絕解碼後重複鍵與無效 Unicode。移除單一開頭 BOM 並提示;額外 BOM 與無效 UTF-8 位元組不會自動修復。路徑最多 4096 UTF-8 bytes;Worker 五秒逾時、取消或來源變更都會作廢過期工作,不提供部分報告。
表格每頁 100 項,完整、不含值的 JSON 報告包含所有分類,不受目前篩選影響,最多 8 MiB。複製缺少路徑上限 1 MiB,超過時須下載完整報告;列內值預覽最多 1000 字元,不修改原文,顯示值也不會將值加入報告。
輸入只存在瀏覽器記憶體,不上傳、不進網址或持久儲存,工具分析不含輸入內容。報告省略值與檔名,但鍵名仍可能透露未發布的產品結構,分享前須檢查。本機處理不能防護遭入侵裝置或瀏覽器擴充套件,清除頁面也不保證安全抹除記憶體。
來源:{"a.b":"Flat","a":{"b":"Nested"}}
目標:{"a.b":"字面"}
缺少路徑:/a/b
存在路徑:/a.b
兩個路徑不會被改名或合併。資料可信度