2017-10-10 5 views
0

タイトルの質問は、通常の問題のように思えるかもしれませんが、問題はありません。C#あるプログラムから開かれた他のすべてのフォームのローカライゼーション

私は構築しているUIの要素、警告メッセージなどを異なる言語に翻訳したい小さなプログラムを作成しました。 (ドイツ語と英語で始まる)。そのために、私はドロップダウンコンボボックスを使って "設定"フォームに言語を設定したいと思っています。

ここでフォームの一般的なローカライゼーションを行う方法についての実例がすでに見つかりました.VisualStudioにはそれほど難しくありません。ここからどのように進むのですか?私が開いたフォームに変数を渡す必要があるのでしょうか?または、グローバル変数として言語を設定し、他の新しいフォームを開くときに読み込むことができますか?合計6つまたは7つのフォームが使用中に開閉されます。二つの形式の

例コード:

namespace Test 
{ 
    public partial class MES : Form 
    { 
     public MES() 
     { 
      InitializeComponent(); 
     } 
     private void Messen_Load(object sender, EventArgs e) 
     { 
      comboBox1.Items.Add("English"); 
      comboBox1.Items.Add("Deutsch"); 
      comboBox1.SelectedIndex = 0; 
     } 
     private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      if (comboBox1.SelectedItem.ToString() == "English") 
      { 
       ChangeLanguage("en"); 
      } 
      else 
      { 
       ChangeLanguage("de-DE"); 
      } 
     } 
     private void ChangeLanguage(string lang) 
     { 
      foreach (Control c in this.Controls) 
      { 
       ComponentResourceManager resources = new ComponentResourceManager(typeof(Messen)); 
       resources.ApplyResources(c, c.Name, new CultureInfo(lang)); 
      } 
     } 
     private void button2_Click(object sender, EventArgs e) 
     { 
      NewForm NF = new NewForm(); 
      NF.Show(); 
      this.Close(); 
     } 
} 

MESフォームにラベルとボタンの名前を変更するには、作業を行いますが、何もローカライズがそこにもtrueに設定されている(NFの形で変化していない、との言語が設定しますそれに応じて)。

事前にヒントやヒントをお寄せいただきありがとうございます。

+0

「最も簡単な方法は、この設定を有効にするには、アプリケーションを再起動してください」とか、それに沿って何かを促すことです。実行時に文化の変化を強制することはPIAです。 – Fildor

+1

[実行時にC#winformで言語を変更する]の可能な複製(https://stackoverflow.com/questions/21067507/change-language-at-runtime-in-c-sharp-winform) –

+0

@Fildor PIAの意味それは悪いことですか?そのような変更のためにアプリケーションを閉じることは、私がそれを想像している方法のための少しの質問から外れています。 – Chris

答えて

0

以下の方法を使用してください。 Source StackOverflow これをlocalizeFormのリファレンスとして渡すことができます。

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); 
    } 
} 
+0

ありがとう=)私は前に他の投稿に出会いましたが、私はすべてのフォームのアプリケーションを上書きしたようです。私が望むように働いた。 – Chris

関連する問題