2

最近、アプリケーションに4つの言語を追加することにしました。私はそれを行う方法について読み、成功しました。

しかし、私が聞きたい2つの問題/質問があります。

最初の質問:代わりに各コントロールのテキストを変更するより良い方法はありますか

private System.Resources.ResourceManager rm;

System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("fr");
rm = new System.Resources.ResourceManager(typeof(MainForm));

次に、各コントロールがこの行を書き込むために:

aboutToolStripMenuItem.Text = rm.GetString("aboutToolStripMenuItem.Text");
addTaskToolStripMenuItem.Text = rm.GetString("addTaskToolStripMenuItem.Text");
addTaskToolStripMenuItem1.Text = rm.GetString("addTaskToolStripMenuItem1.Text");
...

2番目の質問:label1のテキストが「test」で、他の言語では「testest」であるとすると、ラベルのサイズが変わります。これで問題ありません。しかし、彼の場所がlabel1の近くにあるlabel2を取得した場合、label1はlabel2の一番上にある可能性があります。label1をlabel2と比較して移動するにはどうすればよいですか。したがって、label1のテキストの長さに関係なく、label2の位置はlabel1を基準にしています。プログラムで計算を使用したくありません。コントロールの1つにプロパティのような他の方法があるかどうかを知りたいです。

編集:長い間考えた後、私は多言語にXMLを使用することにしました。このようにして、人々に翻訳してアップロードしてもらうことができます。さらに、代わりに実行時に使用したり、プログラムをリロードしたりできます。

使用するコントロールの相対的な位置について、FlowLayoutPanelまたはTableLayoutPanelどちらが優れているかをさらに確認します。

4

3 に答える 3

3

衛星アセンブリはあなたが探しているものです。

Q1:VSで、フォームのLocalizableプロパティをtrueに設定します。次に、それに応じて言語プロパティを選択し、デザイナーに翻訳を入力します。そうすれば、起動時にスレッドカルチャを設定するだけで、.NETが正しい言語をロードします。余分なコードを追加する必要はありません。

Q2:繰り返しになりますが、デザイナーで言語を選択したら、コントロールを移動するだけです。新しい場所/サイズは翻訳の一部であり、.NETによって自動的に処理されます。

于 2011-02-14T19:48:45.977 に答える
2

実行中にGUIを別のカルチャに変更することはあまり良い考えではありません。変更を確認するには、アプリケーションを再起動する必要があるなどと言ったほうがよいでしょう。

それを行う必要がある場合でも、場所やサイズなども変更される可能性があるため、テキストだけでなく、新しいカルチャからすべてのリソースをリロードする必要があります(InitializeComponenとほぼ同じです)。また、エラー、メッセージ、および新しいコントロールにも正しいカルチャを持たせるために、スレッドカルチャを変更する必要があります(正しい言語で表示するためにも)。

次のコマンドでアプリケーションカルチャを設定できます。

CultureInfo appCulture = CultureInfo.CreateSpecificCulture("fr");
Thread.CurrentThread.CurrentCulture = appCulture; 
Thread.CurrentThread.CurrentUICulture = appCulture;

フォーマットと解析で使用するには、特定のカルチャが必要です。

于 2011-02-14T19:43:11.633 に答える
1

あなたの最初の質問に答えて:

本当にそのスキームに従いたい場合は、Reflectionまたは自動コード生成を使用することが管理を容易にするための代替手段になる可能性があります。私は通常GetString、デフォルトの英語の文字列を引数として取る独自のメソッドを作成します(現在の言語のリソースを動的にロードできない場合に使用されます)。しかし、それが最善の解決策であるかどうかもわかりません...


2番目の質問への回答:

Winformsでは、TableLayoutPanelまたはFlowLayoutPanelまたは別のレイアウトコンポーネントを使用して、コントロールを比較的配置します。たとえば、ラベルがそのコンテンツ(AutoSize)に適合するかどうか、またはドッキングするかどうか、一致する場合はどの配置に合わせるかを指定できます。面倒な自己管理や計算を必要とするユースケースはほとんどありません。

リンク: http: //msdn.microsoft.com/en-us/library/z9w7ek2f (v = VS.100).aspx

于 2011-02-14T19:42:26.013 に答える