2009-07-17 43 views
230

我似乎無法讓本地化工作。如何在C中使用本地化#

我有一個類庫。現在我想在那裏創建resx文件,並根據線程文化返回一些值。

我該怎麼做?

回答

491
  • 添加資源文件到您的項目通過執行以下操作(可以稱之爲「strings.resx」):在項目
    右鍵單擊屬性,選擇添加 - >新項...在上下文菜單中,然後在列表中的Visual C#項目選擇「資源文件」並將其命名爲strings.resx
  • 添加一個字符串種源在RESX文件,並給它一個好聽的名字(例如:其命名爲「你好」用,並給它的價值「你好」)
  • 保存資源文件(注:這將是在默認資源文件,因爲它不具備的兩個字母的語言代碼)
  • 添加引用您的程序:System.ThreadingSystem.Globalization

運行這段代碼:

Console.WriteLine(Properties.strings.Hello); 

它應該打印「你好」。

現在,添加一個名爲「strings.fr.resx」的新資源文件(注意「fr」部分;這將包含法語資源)。添加一個字符串資源,其名稱與strings.resx中的名稱相同,但其值爲法文(Name =「Hello」,Value =「Salut」)。現在,如果你運行下面的代碼,它應該打印薩呂:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR"); 
Console.WriteLine(Properties.strings.Hello); 

什麼情況是,該系統將查找的「FR-FR」的資源。它不會找到一個(因爲我們在你的文件中指定了「fr」),它將回退到檢查它找到(並使用)的「fr」。

以下代碼將打印「Hello 「:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US"); 
Console.WriteLine(Properties.strings.Hello); 

那是因爲它沒有找到任何‘EN-US’資源,也沒有‘EN’的資源,所以它會回落到默認,這是我們從添加的一個開始

如果需要,您可以創建具有更多特定資源的文件(例如分別爲法國和加拿大的法語的strings.fr-FR.resx和strings.fr-CA.resx)。在每個這樣的文件中,您將需要至爲那些與它將回退的資源不同的字符串添加資源。因此,如果法國和加拿大的文本相同,則可以將其放入strings.fr.resx中,而加拿大法語中不同的字符串可以放入strings.fr-CA.resx中。

+20

答案可以引用Visual Studio在這裏完成的「幕後」管道:resx.designer.cs文件,使智能感知工作;用類庫編譯的衛星程序集,需要與編譯後的程序集以及任何後來使用它的項目一起進行部署......答案很好,很簡單,但它無法解釋事情可能出錯的地方,例如,如果你不使用Visual Studio。 – Tao 2010-01-05 13:48:51

+13

+1發表!不要手動創建文件,請嘗試使用Zeta資源編輯器(http://www.zeta-resource-editor.com/index.html)。它是免費的,並且可以幫助你做這些翻譯比在VS中快得多。 – Killnine 2012-09-14 13:52:17

35

這其實很簡單。創建一個新的資源文件,例如Strings.resx。將Access Modifier設置爲Public。使用apprioriate文件模板,Visual Studio將自動生成一個訪問器類(在這種情況下,名稱將爲Strings)。這是您的默認語言。

現在,當您想要添加德語本地化時,請添加本地化的resx文件。在這種情況下,這通常是Strings.de.resx。如果您想爲奧地利添加其他本地化功能,您還需要創建一個Strings.de-AT.resx

現在去創建一個字符串 - 讓我們說一個名字爲HelloWorld的字符串。在您的Strings.resx中,添加值爲「Hello,world!」的此字符串。在Strings.de.resx中,添加「Hallo,Welt!」。並在Strings.de-AT.resx中添加「Servus,Welt!」。這是迄今爲止。

現在您已生成Strings類,並且它具有一個屬性,其中包含getter HelloWorld。獲得這個屬性將加載「Servus,Welt!」當你的語言環境是de-AT時,「當你的語言環境是其他語言環境(包括de-DE和de-CH)時,Hallo,Welt!和當你的語言環境是其他任何東西時,」Hello,World!在本地化版本中缺失,資源管理器會自動從最專業的資源向不變的資源鏈走,

您可以使用ResourceManager類來更多地控制您正在加載的東西的類型。生成的Strings

11

F.Mörk給出了很好的答案但是如果你想更新翻譯,或者在應用程序發佈後添加新的語言,那麼你就會陷入困境,因爲你總是需要重新編譯才能生成資源.dll。

以下是手動編譯資源DLL的解決方案。它使用resgen.exe和al.exe工具(與sdk一起安裝)。

假設你有一個Strings.fr.resx資源文件,您可以編輯資源DLL與以下批處理:

resgen.exe /compile Strings.fr.resx,WpfRibbonApplication1.Strings.fr.resources 
Al.exe /t:lib /embed:WpfRibbonApplication1.Strings.fr.resources /culture:"fr" /out:"WpfRibbonApplication1.resources.dll" 
del WpfRibbonApplication1.Strings.fr.resources 
pause 

一定要保持原有的命名空間中的文件名(這裏是「WpfRibbonApplication1」 )

13

此外@Fredrik莫克對字符串偉大的答案,以本地化添加到表單做到以下幾點:

  • 套裝在形式的財產"Localizable"true
  • 形式的Language屬性更改爲所需的語言(從與他們都在一個不錯的下拉)
  • 翻譯的控件在形式和移動他們關於是否需要(將那些真正長的法語句子壓扁!)

這個MSDN article on Localizing Windows Forms給出了一些更多的信息。

0

除了@Eric博樂Feysot答案:

由於衛星組件,定位可以基於.DLL/.EXE文件被創建。通過這種方式:

  • 源代碼(VS項目)可以從語言項目中分離出來,
  • 添加新的語言並不需要重新編譯項目,
  • 翻譯,可以由最終用戶甚至提出。

有一個叫LSACreator一個鮮爲人知的工具(免費的非商業用途或購買選項),它允許您根據的.dll/.exe文件創建本地化。實際上,在內部(在語言項目的目錄中),它創建/管理resx文件的本地化版本,並以與所描述的類似方式編譯程序集。

0

在我的情況

[assembly: System.Resources.NeutralResourcesLanguage("ru-RU")] 
在AssemblyInfo.cs中

防止事情照常上班。

5

修復和闡述@FredrikMörk答案。

  • 一個Strings.resx資源文件添加到您的項目(或一個不同的文件名)
  • 設置Access ModifierPublic(在打開Strings.resx文件選項卡)
  • 在RESX文件添加一個字符串種源(例如:命名Hello,價值Hello
  • 保存資源文件

的Visual Studio自動生成分別是Strings班,其實際上放在Strings.Designer.cs。類是,你會期望一個新創建的.cs文件被放置在同一個命名空間

該代碼始終打印Hello,因爲這是默認的資源並沒有具體語言資源可供選擇:

Console.WriteLine(Strings.Hello); 

現在添加一個新的特定語言的資源:

  • 添加Strings.fr.resx(法國)
  • 添加一個字符串名稱相同的預viously,但不同的價值:(名Hello,價值Salut

下面的代碼打印Salut

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR"); 
Console.WriteLine(Strings.Hello); 

使用何種資源依賴於Thread.CurrentThread.CurrentUICulture。它根據Windows UI語言設置進行設置,或者可以像本例中那樣手動設置。詳細瞭解here

您可以添加特定於國家/地區的資源,如Strings.fr-FR.resxStrings.fr-CA.resx

使用這個優先順序確定字串:

  • 從具體國家的資源像Strings.fr-CA.resx
  • 從具體語言的資源像Strings.fr.resx
  • 從默認Strings.resx

請注意,語言特定的資源會生成satellite assemblies

另外瞭解CurrentCultureCurrentUICulturehere的區別。