2011-10-12 107 views
3

我正在處理涉及本地化大量Windows窗體的項目。本地化Windows窗體

我們正在處理佈局使用TableLayoutPanel控件,它很好地工作。

我們遇到的一個問題是當我們將Form.Localizable屬性設置爲True時,我們最終不得不爲每種語言的每個表單管理一個.resx文件。如果.resx文件只包含本地化文本,那麼也可以,但是它也包含大量的表單佈局數據。

有沒有辦法將可本地化的文本元素從控件佈局信息中分離出來,並繼續在Visual Studio IDE中工作?

我注意到,我可以修改我的窗體的設計文件來看看另一個資源文件,但是當我使用窗體設計器,這些變化都將被刪除:

 
' 
'Label1 
' 
Me.Label1.AutoSize = True 
Me.Label1.Dock = System.Windows.Forms.DockStyle.Top 
Me.Label1.Location = New System.Drawing.Point(3, 0) 
Me.Label1.Name = "Label1" 
Me.Label1.Size = New System.Drawing.Size(61, 13) 
Me.Label1.TabIndex = 1 
Me.Label1.Text = My.Resources.ResourceManager.GetString("Form1_Label1_Text") 
+0

好吧,我從來沒有真的找到這個問題的完全滿意的答案。但是我想出了一個解決方案,至少讓我感到失望,下面我會詳細介紹。 –

回答

2

我從來沒有找到答案,我完全滿意。但是,這是我結束了實施解決方案:

  1. 我結束了設置Form.Localizable = false因爲我不想保持所有這些相同的.resx文件

  2. 所有的UI元素得到了事實上的值(例如「O_K_」),它明顯不是本地化的。

  3. 我處理的形式/控制完全一樣的我所有的其他本地化的內容(錯誤信息,日誌信息等),只是給了他們像「cmdOkTextOK」唯一鍵,以便他們可以跨多個表單共享

  4. 我創建的每個表單上LocalizeComponent()功能,並把它稱爲從InitializeComponent()功能後立即構造,如下所示:

 
Public Class Form1 
    Public Sub New() 
     ' This call is required by the Windows Form Designer. 
     InitializeComponent() 
     ' Add any initialization after the InitializeComponent() call. 
     LocalizeComponent() 
    End Sub 

    Private Sub LocalizeComponent() 
     ' Localizes all the ui elements from a common Resource 
     Me.SuspendLayout() 
     Me.cmdOK.Text = My.Resources.ResourceManager.GetString("cmdOKTextOK") 
     Me.cmdCancel.Text = My.Resources.ResourceManager.GetString("cmdCancelTextCancel") 
     Me.cmdApply.Text = My.Resources.ResourceManager.GetString("cmdApplyTextApply") 
     Me.ResumeLayout(False) 
    End Sub 
End Class 

這將移動定位的可見控制元素從設計器文件中刪除(每當我進行表單編輯時它就被銷燬)並將其放回到我的控制之下。

我仍然不是100%高興,因爲控件是在運行時使用非本地化字符串創建的,後者正在更新。但它會讓我從一個我真正不想要的維修噩夢中解脫出來!

感謝所有花時間回答的人。我很感激!我不確定你在回答自己的問題時想要做什麼來標記它'已回答',因此如果有人能指出我的意思,而不會讓我感到厭倦,那將是值得讚賞的。

0

你可以有文件作爲資源,所以這是你應該能夠完成的事情,因爲它在運行期間沒有改變,只能從你所說的內容中訪問。例如,可能是帶有語言條目和翻譯文本的xml文件。 <entry key = "btnOK">Ok</entry>。在運行時,你可以在

<Languages> 
    <Language name="Spanish"> 
     <Entry key="Yes">Si</Entry> 

要加載哪些語言節點中的最後的地方,我工作的決定,我們使用的XML文件,一個爲每種語言,我們捆綁安裝。當解決方案被加載時,我們將所需的文件加載到全局HashTable中,並以這種方式設置每一位文本。可能會有一個更優化的解決方案,但沿着這些線路可能會有所幫助。例如,hashTable("successfulSaveMsg")會返回「您已成功保存您的小部件」。