我一直在週末的一個寵物項目上工作,以瞭解更多關於C#的知識,並且在使用本地化時遇到了一個奇怪的問題。更具體地說,我遇到的問題是System.Threading.Thread.CurrentThread.CurrentUICulture。Thread.CurrentThread.CurrentUICulture工作不一致
我已經設置了我的應用程序,以便用戶可以通過單擊菜單項快速更改應用程序的語言。該菜單項依次將用於該語言的雙字母代碼(例如「en」,「fr」等)保存在名爲「語言」的用戶設置中,然後重新啓動該應用程序。
Properties.Settings.Default.Language = "en";
Properties.Settings.Default.Save();
Application.Restart();
當應用程序啓動時,在窗體的構造函數的第一行代碼(的InitializeComponent()甚至之前)獲取的設置語言字符串,並設置的CurrentUICulture像這樣:
public Form1()
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(Properties.Settings.Default.Language);
InitializeComponent();
}
事情是,這不一致。有時候,一切正常,應用程序會根據保存在設置文件中的字符串加載正確的語言。其他時候,它沒有,並且應用程序重新啓動後語言保持不變。
起初我以爲我沒有在重新啓動應用程序之前保存語言,但事實絕非如此。當正確的語言加載失敗時,如果我要關閉應用程序並再次運行,正確的語言將正確顯示。所以這意味着語言字符串已經被保存了,但是我的表單構造函數中的CurrentUICulture賦值有時並不起作用。
任何幫助?有什麼我缺少線程在C#中的工作原理嗎?這可能是機器特定的,所以如果它有什麼區別,我使用奔騰雙核CPU。
UPDATE
弗拉德問我檢查CurrentThread的CurrentUICulture是什麼。因此,我在構造函數中添加了一個MessageBox,告訴我CurrentUICulture的兩個字母代碼以及我的Language用戶字符串的值。
MessageBox.Show(string.Format("Current Language: {0}\nCurrent UI Culture: {1}", Properties.Settings.Default.Language, Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName));
當錯誤的語言被加載,無論是語言字符串的CurrentUICulture有錯誤的語言。所以我想CurrentUICulture已經被清除了,我的問題實際上是在語言設置中。
所以我想問題是,我的應用有時加載以前保存的語言字符串,而不是上次保存的語言字符串。如果應用程序重新啓動,它將加載實際保存的語言字符串。
當您更改CurrentUICulture時是否真的有必要重新啓動應用程序? – 2010-04-28 08:12:09
@第七元素 顯然如此。當您僅更改CurrentUICulture時,顯示的語言不會更改。我一直在搜索如何在運行時更改表單的語言,但它有點麻煩(循環遍歷表單上的每個控件並應用該資源文件中找到的所有控件的屬性,但無法獲取該想法工作)。 重新啓動應用程序似乎是完成工作的更簡單的方法。 – xTRUMANx 2010-04-28 08:30:37