在開發多語言介面的windows應用程式,經常會用到下面幾句**:
thread.currentthread.currentuiculture = thread.currentthread.currentculture;
resourcemanager rsmng = new resourcemanager("myform.messageresource", assembly.getexecutingassembly());
string text = rsmng.getstring("test");
在一般的情況下程式都能正確地取出作業系統區域設定所對應的資源文字, 但有些情況下就另當別論了.請看以下**:
public class form1: system.windows.forms.form
...private void mymethod()
private void button1_click(object sender, system.eventargs e)
...}
如果以上程式中正確包含英文和中文兩個語言資源(英文為預設), 然後讓程式在執行在英文作業系統中(區域設定為中國), 那麼你將發現取出的text1和text2值並不一樣,前者為中文,後者為英文.
產生這個問題的原因是因為使用了多執行緒.
thread的currentuiculture屬性是和介面相關的culture,處理資源讀取、標籤本文,提示資訊等內容,它的預設值與作業系統的介面語言相同。而currentculture是和格式相關的culture,處理日期格式,時間,貨幣,日曆等內容, 它的預設內容與作業系統的區域設定相同。所以當程式執行在區域設定為中國的英文作業系統中時,currentuiculture預設定為en, currentculture的預設值為zh-cn.
** thread.currentthread.currentuiculture = thread.currentthread.currentculture; 只是把程式的啟動執行緒(處理介面載入、更新顯示等工作)的currentuiculture設為中文, 新增執行緒的currentuiculture屬性仍將保持是英文的預設值。所以currentthread執行緒取出的文字會是中文(text1),而新執行緒thread處理中取出的文字卻是英文(text2).
有兩個辦法可以解決以上問題:
1. 修改新執行緒的currentuiculture屬性:
thread thread = new thread(new threadstart(this.mymethod));
thread.currentuiculture = thread.currentthread.currentculture;
thread.start();
2. 每次取資源文字時都指定文化區域:
private uiculture = thread.currentthread.currentculture; //定義全域性的區域變數
rsmng.getstring("test", uiculture);
經過以上的處理後,多語言介面程式就可以很準確地取出資源文字了。
建立多執行緒應用程式
定義命名空間在.net中,多執行緒功能是在system.threading命名空間中定義的。usingsystem.threading 啟動執行緒system.threading命名空間中的thread類代表乙個執行緒物件,用這個類物件可以建立新的執行緒,刪除 暫停和恢復執行緒。下面的 使用thre...
建立多執行緒應用程式
定義命名空間 在.中,多執行緒功能是在system.threading命名空間中定義的。usingsystem.threading 啟動執行緒 system.threading命名空間中的thread類代表乙個執行緒物件,用這個類物件可以建立新的執行緒,刪除 暫停和恢復執行緒。下面的 使用threa...
建立多執行緒應用程式
定義命名空間 在.net中,多執行緒功能是在system.threading命名空間中定義的。using system.threading 啟動執行緒 system.threading命名空間中的thread類代表乙個執行緒物件,用這個類物件可以建立新的執行緒,刪除 暫停和恢復執行緒。下面的 使用t...