2017-09-05 86 views
0

我們已經創建了一個帶有一些WinForms的類庫項目。 我們通過在VS設計器中構建(設置Localizable = true)來翻譯窗體。本地化將從3方應用程序中使用的WinForms

VS將爲包含衛星資源文件的每種語言創建程序集和不同的文件夾。

該程序集將由3方應用程序加載。

現在我們遇到了這個問題,即如果我們通過三方應用程序啓動表單,我們的表單將不會被本地化。 看來,我們的程序集無法從語言子目錄加載資源文件。

是否有可能通過代碼加載此資源文件,所以WinForms的默認本地化機制將工作?

編輯

如果我複製語言文件夾(DE,EN,...)到主3方應用程序的文件夾,一切都將工作就像一個魅力。

回答

0

如您所知,本地化工作取決於線程文化。您確定,第三方應用程序在啓動時設置了正確的文化嗎?

// set culture on program startup 
CultureInfo ci = CultureInfo.GetCultureInfo("de-DE"); 
Thread.CurrentThread.CurrentCulture  = ci; 
Thread.CurrentThread.CurrentUICulture  = ci; 

// .NET 4.5 and above 
CultureInfo.DefaultThreadCurrentUICulture = ci; 
CultureInfo.DefaultThreadCurrentCulture = ci; 

從MSDN:

「在.NET Framework 4和以前的版本中,默認情況下,所有線程的UI區域性設置爲Windows系統文化對於那些當前UI文化不同的應用程序。從默認的系統文化中,這種行爲通常是不可取的。在.NET Framework 4.5中,DefaultThreadCurrentUICulture屬性允許您定義應用程序域中所有線程的默認UI區域性。「

因此,如果您使用的是.NET 3.5,則線程池和工作線程的文化可能也與您想要的應用程序文化不同,如果這與OS文化不同。如果需要,您應該檢查/設置每個線程調用的文化。

+0

我已經試過了,但它似乎不是問題所在。 我測試了創建一個資源文件並使用自動生成的ResourceManager與'ResourceManager.GetString()'並提供不同的CultureInfos,但沒有成功。 所以我認爲,我的程序集無法自動找到衛星資源文件並加載它。 – Markus

+0

@Markus:我使用WinForms本地化功能,從.NET 1.0開始,沒有這樣的問題。你的應用程序目標目錄中有衛星程序集嗎?例如。 MyForms.dll並行於「de」子目錄中的MyApp.exe和German MyForms.resources.dll? – KBO

+0

是的。 我認爲問題是,3方應用程序加載我的程序集,而我現在執行的程序集找不到衛星資源。 如果我將包含資源文件的語言文件夾(de,en,...)複製到三方應用程序的主文件夾中,它將像魅力一樣工作。 所以我需要通過代碼手動加載資源,但我不知道如何。 – Markus