2013-02-11 67 views
1

我目前正在開發一個必須支持6種不同語言的項目。我已經有一個工作實現使用字符串資源文件和窗體本地化的控制。實施的最後一部分涉及在程序運行時實時更改語言。我已經看到了如何做到這一點的建議,並且我最終使用了ApplyResources方法的修改版本。在一般情況下,我說的是這樣的事情:C# - 運行時Windows窗體本地化(語言)更改 - ListView列標題不會更改語言

ComponentResourceManager resources = new ComponentResourceManager(typeof(Form1)); 
CultureInfo culture = new CultureInfo("fr-FR"); 

resources.ApplyResources(_mybutton, _mybutton.Name, culture); 

因此,按鈕「_mybutton」文本隨後將得到改變法國的本地化版本。這適用於我所有的窗體和控件,除了特定的ListView控件。此ListView有5列對象類型ColumnHeader。我正在嘗試使用ApplyResources將列標題的文本更改爲新語言。我已經在列標題的.fr.resx資源文件中添加了相應的法語文本,並且當我將表單本地化切換到法語時,Designer View向我展示了法語翻譯版本,就像預期的那樣。更進一步,我嘗試在構造函數中將表單的InitializeComponent()方法更改爲全局線程currentUICulture屬性爲法語。我確認這會爲列表視圖中的列標題加載正確的法語資源。

但是,我嘗試手動將文化應用於ColumnHeader/ListView資源時出現問題。比如我會說的代碼看起來大約是這樣的:

ComponentResourceManager resources = new ComponentResourceManager(typeof(myUserControl)); 
CultureInfo culture = new CultureInfo("fr-FR"); 
resources.ApplyResources(_myListView, _myListView.Name, culture); 
resources.ApplyResources(_myColumnHeader1, _myColumnHeader1.Name, culture); 
this.Refresh(); 

無論我怎麼努力,我不能讓法國的資源應用於列標題文本。我也試過:

resources.ApplyResources(_myListView.Columns[0], _myListView.Columns[0].Name, culture); 

我試着計算器上尋找解決方案後,類似的東西:

var lv = (ListView)_myListView; 
foreach (ColumnHeader col in lv.Columns) 
{ 
    resources.ApplyResources(col, col.Name, culture); 
} 

效果相同 - 沒有語言的變化。我查看了Designer.cs代碼,看看是否有任何關鍵的區別或缺失的行,看起來我正確地做了。所有其他控件都能正確更改語言,但列表視圖中的列標題拒絕動態更改文本。有沒有人見過這個?我在這裏做錯了什麼?

在最壞的情況下,我可以將列標題的文本移動到外部資源文件,然後手動設置每個列標題的文本,但是我發現這是一個很大的麻煩,特別是如果我有處理稍後有很多列的列表視圖,或者如果文本需要爲每種語言設置多個值。非常感謝幫助!

回答

1

我對自己的問題做了更多的研究,看來實際上.NET Framework中存在一個錯誤,因爲ColumnHeader對象的.Name方法實際上並未正確返回對象名稱。這就是爲什麼我嘗試將資源應用到對象失敗。

我能夠通過硬編碼ColumnHeaders的更改來解決問題。例如:

resources.ApplyResources(_myHeader, "_myHeader", culture); 

您基本上只是將名稱的文字字符串替換爲.Name的調用。我已經測試過它,它的工作原理。不幸的是,這意味着它不適合作爲我用來更改所有控件的代碼的一部分。我必須爲每個需要更改的ColumnHeader對象添加一行。幸運的是,我沒有使用列數可變的列,因爲這可能會變得棘手。

另一種選擇是創建本地化的資源文件。您可能已經擁有了諸如消息框文本和其他字符串等內容。然後,您可以在資源文件中添加一個條目,如「columnHeader_myHeader」,併爲每種語言設置適當的語言文本。最後,您可以使用以下方式手動將文本更改爲列標題:

_myHeader.Text = myResourceFileName.columnHeader_myHeader; 

這將根據當前線索文化選擇適當的語言。