2016-08-01 99 views
-1

我的問題是當我需要更改我的語言時,如何在不重複此代碼的情況下更改語言。這裏有兩個保加利亞語和英語的按鈕。我需要添加一個語言法語如何添加它,而無需重複代碼...在Windows窗體中更改語言運行時

private void BtnBg_Click(object sender, EventArgs e) 
{ 
    CultureInfo ci = new CultureInfo("bg-BG"); 
    Assembly a = Assembly.Load("CoffeeShop"); 
    ResourceManager rm = new ResourceManager("CoffeeShop.Languages.Languages", a); 
    BtnCapuchino.Text = rm.GetString("Cappucino", ci); 
    BtnCinnamon.Text = rm.GetString("Cinnamon", ci); 
    BtnEspresso.Text = rm.GetString("Espresso", ci); 
    BtnDecaffeinedCoffee.Text = rm.GetString("DecaffeinedCoffee", ci); 
    BtnMilk.Text = rm.GetString("Milk", ci); 
    BtnSugar.Text = rm.GetString("Sugar", ci); 
    BtnBack.Text = rm.GetString("Clear", ci); 
    Bulgarian.Text = rm.GetString("LanguageBulgarian", ci); 
    textBox1.Text = rm.GetString("Bill", ci); 
    CoffeeShop.ActiveForm.Text = rm.GetString("CoffeeShop", ci); 
    BtnBuy.Text = rm.GetString("Buy", ci); 
    ShowInformation(this, null); 
} 

private void BtnEng_Click(object sender, EventArgs e) 
{ 
    CultureInfo ci = new CultureInfo("en-US"); 
    Assembly a = Assembly.Load("CoffeeShop"); 
    ResourceManager rm = new ResourceManager("CoffeeShop.Languages.Lang", a); 
    BtnCapuchino.Text = rm.GetString("Cappucino", ci); 
    BtnCinnamon.Text = rm.GetString("Cinnamon", ci); 
    BtnEspresso.Text = rm.GetString("Espresso", ci); 
    BtnDecaffeinedCoffee.Text = rm.GetString("DecaffeinedCoffee", ci); 
    BtnMilk.Text = rm.GetString("Milk", ci); 
    BtnSugar.Text = rm.GetString("Sugar", ci); 
    BtnBack.Text = rm.GetString("Clear", ci); 
    Bulgarian.Text = rm.GetString("LanguageBulgarian", ci); 
    textBox1.Text = rm.GetString("Bill", ci); 
    CoffeeShop.ActiveForm.Text = rm.GetString("CoffeeShop", ci); 
    Bulgarian.Text = rm.GetString("LanguageBulgarian", ci); 
    BtnBuy.Text = rm.GetString("Buy", ci); 
    ShowInformation(this, null); 
}  
+0

看看你的代碼。這些方法的唯一區別是在第一行中,在一個使用'bg-BG',另一個使用'en-US',所以你可以簡單地將代碼封裝在一個方法'void Localize(string culture){CultureInfo ci =新CultureInfo(文化); .........'並用Localize(「bg-BG」)調用它;或您需要的任何其他文化。 –

+0

也可以使用[本地化](https://msdn.microsoft.com/en-us/library/y99d1cd3(v = vs.100).aspx)窗體的功能。 –

+0

此外,作爲在運行時更改語言而不關閉並重新打開同時具有設計時支持的窗體的好方法,請查看[本文](http://stackoverflow.com/a/33948879/3110834)。在該文章中,您可以看到一個擴展控件,它允許您在設計時爲控件設置文本,然後在運行時允許您在不關閉重新打開窗體的情況下在不同文化之間切換。 –

回答

0

這不是本地化的應用程序很好的方法,但是在這種情況下,你可以嘗試。減去功能的新方法:

private void ApplyLanguage (CultureInfo ci) 
{ 
    Assembly a = Assembly.Load("CoffeeShop"); 
    ResourceManager rm = new ResourceManager("CoffeeShop.Languages.Lang", a); 
    BtnCapuchino.Text = rm.GetString("Cappucino", ci); 
    BtnCinnamon.Text = rm.GetString("Cinnamon", ci); 
    BtnEspresso.Text = rm.GetString("Espresso", ci); 
    BtnDecaffeinedCoffee.Text = rm.GetString("DecaffeinedCoffee", ci); 
    BtnMilk.Text = rm.GetString("Milk", ci); 
    BtnSugar.Text = rm.GetString("Sugar", ci); 
    BtnBack.Text = rm.GetString("Clear", ci); 
    Bulgarian.Text = rm.GetString("LanguageBulgarian", ci); 
    textBox1.Text = rm.GetString("Bill", ci); 
    CoffeeShop.ActiveForm.Text = rm.GetString("CoffeeShop", ci); 
    Bulgarian.Text = rm.GetString("LanguageBulgarian", ci); 
    BtnBuy.Text = rm.GetString("Buy", ci); 
    ShowInformation(this, null); 
} 

,並從你的按鈕調用它:

private void BtnBg_Click(object sender, EventArgs e) 
{ 
    ApplyLanguage(new CultureInfo("bg-BG")) 
} 
private void BtnEng_Click(object sender, EventArgs e) 
{ 
    ApplyLanguage(new CultureInfo("en-US")) 
} 
+0

它適用於furst語言,但對於英語我有我不同的資源管理器:ResourceManager rm = newResourceManager(「CoffeeShop.Lang.Languages」,a) –

+0

如何使它適用於此語言? –

+0

你也可以通過'ResourceManager'作爲參數。使用'ApplyLanguage(CultureInfo ci,ResourceManager rm)' – Marusyk

0

您確定要同時顯示所有語言嗎?或者你是否試圖讓它只顯示任何當前語言的標籤,按鈕?

大多數人都使用Visual Studio的內置功能來處理這些任務......只需單擊表單,選擇一種新語言並編輯文本即可。這將爲該表單的每種語言創建單獨的資源文件。

這樣,你不必在你的代碼改變什麼......,它會自動地選擇正確的語言,並顯示正確的標籤,按鈕等

https://msdn.microsoft.com/en-us/library/y99d1cd3(v=vs.100).aspx