本地化 Localization 實現

2021-09-16 23:46:01 字數 2100 閱讀 8390

本文將討論在wpf中一種較為方便的本地化方法。

通過編譯專案以設定 x:uid 並使用 locbaml 工具實現;

通過 dynamicresource 實現;

通過 resx 檔案實現

其中第一種是官方介紹的方法,考慮到實現步驟略為複雜,所以直接忽略;

第二種方式的實現,主要是在程式中新增 resource dictionary 型別的檔案,並在其中放入本地化資源字串;在 xaml **中,直接使用 來實現;這種方法比較方便,不過它也有兩個缺點:

在 xaml 中,引用 dynamicresource 的屬性必須為依賴屬性,否則會出錯;

在 c# **中引用稍微有點麻煩,需要從 resource dictionary 中獲取並轉化為字串

其中第一點可以說是致命缺點,我曾在專案中新增了乙個第三方控制項,其 header 屬性並不是依賴屬性,所以不能使用這種方式;不是依賴屬性,當然,也就更不能使用繫結(binding)來設定了。

所以,之後嘗試了第三種方式——使用 resx 檔案,事實上,這是一種比較傳統的方式,在 winform 中就可以這麼做,當然,在 uwp 中的實現方式也與此有點類似。並且,事件證明,這種方式的確是非常合適的,並且也很好用,在 xaml **和 c# **中均可以非常方便的使用。

使用 resx 檔案實現

它的操作步驟大概如下:

1. 建立乙個 wpf 專案;

2. 在主視窗中新增幾個需要本地化其內容的控制項,如 textblock、button等;

3. 展示此專案的 properties 資料夾,這裡已經有乙個預設的 resources.resx,在其中新增本地化字串;

4. 將其複製,並貼上到當前位置,將新檔案改名為 resources.en-us.resx,並修改其中的本地化字串為對應的語言值;

說明:這裡我們新增了對英語語言的本地化,至於支援哪些語言的本地化,可以參考這篇文章 supported languages,關於語言匹配可參考這篇文章 manage language and region,儘管這兩篇文章是針對 uwp 的,不過原則上,對於 wpf 也是適用的;

5. 將上述兩個 resx 檔案的 access modifier 修改為 public,預設值是 internal;如下圖:

接下來就是如何使用了:

6. 在 xaml 中新增命名空間引用:

xmlns:loc="clr-namespace:wpflocalizationtest.properties"

7. 使用 標記引用資源,如下:

8. 如果需要在**中引用,也非常簡單:

var homepage = properties.resources.main_menu_home;

經測試,這種方式也支援 intellisense(智慧型提示),如下圖:

如果你沒看到智慧型提示,可以先編譯專案。

protected override void onstartup(startupeventargs e)

base.onstartup(e);

thread.currentthread.currentuiculture = new system.globalization.cultureinfo("en-us");

執行後就可以看到測試結果了。

在大型專案中使用

上面是在 demo 中展示如何本地化應用,那麼在大型專案中是如何來應用這種方式呢?以下簡單介紹一下,可以供參考:

1. 在解決方案中建立乙個類庫專案(或在已有專案中進行後續操作),此專案的用途主要是作資源用;

2. 在其中建立 localization 資料夾,在這個資料夾下可以再建立針對各個模組的子資料夾,然後在此建立 resx 檔案、新增本地化字串並複製。檔案結構如下:

更方便的方式

如果軟體中有大量的文字需要本地化,那麼在 resx 檔案中的資源項將會非常多,這時,要在兩個資源檔案中新增、刪除、對比、檢查專案時,將會非常困難,有沒有更方便的方法呢?這裡推薦乙個 vs extension: resx manager

它可以非常方便地管理當前解決方案中的 resx 檔案以及其中的資源項,安裝後,在 vs 中工具選單中可以開啟,介面如下:

需要注意的是,如果要新增時,必須在左則僅選擇目標資源檔案。通過它,可以非常方便地建立、刪除、管理本地化文字。

本地化 日誌本地化

目錄 概要執行時日誌 國際化與本地化 定義你的本地化日誌資訊mymsg enum package org.skzr.logging basename charset utf 8 value org.skzr.logging.msglocallog public enum mymsg 定義國際化檔案o...

Swift 匯出本地化和匯入本地化

一。匯出本地化 1.如下設定,來新增本地化語言 2.匯出檔案 儲存完成後 生成以下兩個檔案 然後用xlifftool 分別開啟以上兩個檔案 在以下顯示 no translation 的地方,新增英文所要替代的語言,如下所示 然後儲存就可以了 二.匯入本地化 1.按如下步驟 2.新增 3新增後出現以下...

本地化測試

com localization testing kiki翻譯於2005 8 12 在本文中,我們講述了在編碼階段期間所能夠做的事情和為了使發現問題最有效,你應該將你的本地化測試力量集中在何處等問題。翻譯應用程式的資源和測試 與開發平行進行通常是一種較好的方法。這有助於在過程的早期揭露 功能設計中的...