2009-08-09 66 views
31

我有一個WinForms應用程序,我想將其翻譯成多種語言。但是,我沒有任何本地化WinForms應用程序的經驗,並且我發現關於此主題的信息非常矛盾。WinForms應用程序的正確本地化

基本上,我想要的是:

  • 在源代碼中,我想每個語言
  • 此文件被上編譯編譯到主應用程序只有一個文件 - 沒有衛星組件或外部數據文件構建應用程序
  • 用戶可以選擇語言後,我並不需要/想自動檢測基於該操作系統
  • 這應該主要包含字符串和整數,但也有CultureInfo的

我見過的大多數解決方案的每個表單和/或外部附屬程序集都有一個.resx文件。

我必須推出自己的?或者框架中是否有某些東西?

.net Framework 3.5 SP1如果有問題。

編輯:大多數情況下,Visual Studio已經提供了我想要的支持,但有兩個問題。當我將Form.Localizable設置爲true時,我有這個不錯的設計器支持,但是這會爲每個表單生成一個resx。在InitializeComponent中手動覆蓋它的想法失敗了,因爲它是由設計師編寫的代碼,它們會被定期覆蓋。理論上,我只想a)重寫ComponentResourceManager的創建,將其指向我的全局resx; b)將調用ApplyResources更改爲以CultureInfo作爲第三個參數的重載。

看起來好像我不得不向我的構造函數添加一個函數調用,它在InitializeComponent()之後調用並覆蓋它的行爲。這似乎非常低效,但Visual Studio正確地警告觸摸InitializeComponent。目前,我的確在推出我自己的WinForms本地化框架...

+1

不是很確定,如果你要求的 '適當的'爲一種「非常習慣」的本地化方式。 – 2009-08-09 11:59:19

+1

「每個表格一個.resx,每個語言和組件的一個衛星組件」有什麼問題?這就是.NET的工作原理 - 如果你不喜歡這樣,恐怕你必須自己推出很多代碼。 – 2009-08-09 12:00:06

+2

錯誤的意思是,「一個.resx per form」(對於所有不是表格的組成部分,至少有一個)成倍增長,而不是線性增長,如果新的/更正的本地化是每個語言一個彙編只是更多的混亂只允許應用程序的新版本。另請參閱http://redsolo.blogspot.com/2006/11/localisation-gone-wrong-in-c.html – 2009-08-09 12:06:58

回答

4

我在問一個關於ASP.NET的類似問題,並得到了第一個答案 - 這個工具和它的工作流可能也適合你 - 有一個看:Lingobit Localizer

它似乎能夠加載您的Winforms應用程序,並允許您開始翻譯您的標籤等,並看到形式,而你這樣做。許多其他功能,如增量翻譯和翻譯記憶(如果您反覆使用相同的術語)。儘管如此,看起來很有前途(對於Winforms) - 我自己並沒有使用它。

下面是extensive list of potential .NET localization tools - 不確定,他們的工作情況以及他們的工作情況 - 看一看,也許你會找到你要找的東西。

Marc

+0

那麼這個軟件創建一個衛星,OP說他不想要任何衛星文件。 – 2009-08-09 12:05:32

+1

是的,我知道 - 我試圖證明可能有適當的工具支持,但衛星組裝方法畢竟不是那麼糟糕。 – 2009-08-09 13:26:08

3

這是一個很大的課題,有很多方法可以完成你想要的。該框架確實提供了基礎,但完整的解決方案要求您自己實施某些元素。

例如,默認的框架實現是爲每個資源創建一個.resx文件。在ASP.Net這意味着每個用戶/服務器控制或頁面。這不適合簡單維護,如果您想將資源移動到數據庫,則需要實施自己的提供程序。

我對Winforms的熟悉程度有限,但如果您使用的是Silverlight或WPF,那麼請閱讀Guy Smith-Ferrier關於此主題的文章:http://www.guysmithferrier.com/category/Internationalization.aspx。他還有一些工具箱,可以使您的生活更輕鬆:http://www.dotneti18n.com/Downloads.aspx

我以前和他一起工作過,從來沒有遇到任何其他人對這個問題有更深入的瞭解。

2

我沒有第一個和第二個需求的解決方案,但請記住本地化表單並不像翻譯每個單詞那麼簡單。您需要檢查每個翻譯文本是否適合各自的控制。此外,也許你有一個圖標或一個圖像需要在另一種文化中改變。

對於您的觀點三,你可以通過下面的代碼手動更改語言:

CultureInfo ci = new CultureInfo("fr"); 
Thread.CurrentThread.CurrentUICulture = ci; 
15

我剛剛完成了一個C#.NET 3.5的項目有類似的問題。我們正在爲使用8種語言(包括英語)的現有多語言應用程序編寫WinForms插件。

這是我們如何做到了:

  1. 創建我們的默認語言,英語一切形式的UI。

  2. 放在一個資源文件中的所有我們的內部字符串(的東西不直接依賴於像自定義錯誤消息和對話框標題等形式),一旦我們完成了大部分工作,並測試我們的

本地化它。

  1. 每個表格都有一個.resx文件,但是這是空的。我們將屬性'Localizable'設置爲true,.resx文件充滿了按鈕大小&字符串。

  2. 對於其他各種語言,我們更改了表單上的'Language'屬性。我們選擇了每種語言的基本版本,例如:'西班牙'而不是'西班牙語(智利)'等,以便它適用於每種'西班牙語'方言。

  3. 然後我們通過每個控件,翻譯其文本並調整大小,如果需要的話。這爲每種語言和表單組合創建了一個.resx。

然後,我們留下了8種語言,每種形式8種.resx,普通字符串8種.resx。編譯時,輸出文件夾有我們正在創建的.dll,然後是每個語言的子文件夾,其中包含.resources.dll。

我們能夠通過更改語言屬性來檢查設計器中UI的版本,以檢查我們是否具有正確的字符串&佈局。總而言之,一旦我們頭腦清醒,這很容易,也很輕鬆。

我們並不需要編寫任何自定義調整的形式加載

+4

對不起,但我不能推薦這種技術。當需要在表單上添加,刪除或移動字段時,它成爲維護噩夢。 – RenniePet 2014-05-20 13:42:53

+5

不幸的是,大多數情況下,這**是** MSDN推薦用於WinForms本地化的內容。 :(https://msdn.microsoft.com/en-us/library/y99d1cd3(VS.80).aspx – 2015-05-13 13:10:45

+1

這是微軟推薦的方式,它是可怕的。 – 2016-04-17 23:42:20

1

你所要求的:

  1. 沒有衛星資源文件
  2. 只有一種尺寸和每個表單控件位置。
  3. 許多語言嵌入在可執行文件中。

在vanilla Visual Studio的IDE中不可行。

它所需要一些定製工作,基本完成所有這些步驟:

  • 採集,處理TMX資源文件自定義資源管理器。
  • 將所有可本地化的字符串放入TMX文件中。
    • 將此TMX在您的項目文件的嵌入式資源。
  • 在您的Form構造函數中,創建您的TMX ResourceManager,從嵌入式資源中加載TMX文件。
  • 在您的代碼中,使用您的tmx ResourceManager而不是默認的ResourceManager來獲取本地化的字符串。
    • 讓表單使用默認ResourceManager獲取除字符串以外的所有設計器事物。
  • 讓你的TMX文件充滿新的語言翻譯。
    • 只有在編譯之前將其添加到此TMX文件中,才能在項目的下一版本中添加更多內容。

資源:(不是一個詳盡的列表,以任何方式)