[英]Change language at runtime in C# winform
我想更改語言,但是在編譯時會彈出異常。 它說
“找不到適合於指定區域性或中性區域性的任何資源。請確保在編譯時已將“ System.Type.resources”正確嵌入或鏈接到程序集“ mscorlib”中,或者確保所需的所有附屬程序集都可加載且完全簽。”
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBox1.SelectedItem.ToString() == "English")
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo("En");
ChangeLanguage("En");
}
else if (comboBox1.SelectedItem.ToString() == "German")
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo("De");
ChangeLanguage("De");
}
}
private void ChangeLanguage(string lang)
{
foreach (Control c in this.Controls)
{
ComponentResourceManager resources = new ComponentResourceManager(typeof(Type));
resources.ApplyResources(c, c.Name, new CultureInfo(lang));
}
}
有什么建議么?
ComponentResourceManager resources = new ComponentResourceManager(typeof(Type));
構造函數的參數是錯誤的,您要告訴它查找System.Type的資源。 這就是為什么它抱怨找不到“ System.Type.resources”。 它永遠找不到。
您需要傳遞實際要本地化的表單的類型。 請改用this.GetType()
。 盡管這可能只是將“選項”表單而不是應用程序中其余窗口本地化。 您可以代替Application.OpenForms()。 還必須將本地化應用於所有控件。 不僅是表單上的內容,還有位於面板之類的容器中的內容。 從而:
private static void ChangeLanguage(string lang) {
Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
foreach (Form frm in Application.OpenForms) {
localizeForm(frm);
}
}
private static void localizeForm(Form frm) {
var manager = new ComponentResourceManager(frm.GetType());
manager.ApplyResources(frm, "$this");
applyResources(manager, frm.Controls);
}
private static void applyResources(ComponentResourceManager manager, Control.ControlCollection ctls) {
foreach (Control ctl in ctls) {
manager.ApplyResources(ctl, ctl.Name);
applyResources(manager, ctl.Controls);
}
}
請謹慎使用類似wiz-bang的功能。 在使用您的程序時,實際上沒有人更改其母語。
private void ChangeLanguage(CultureInfo culture)
{
Application.CurrentCulture = culture;
CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture.Name);
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(culture.Name);
}
不過,您需要為所有語言提供適當的資源。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.