C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

多言語化

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■92933 / inTopicNo.1)  多言語化
  
□投稿者/ じょこびっち (22回)-(2019/11/11(Mon) 10:30:09)

分類:[C#] 

以前、多言語化で質問させていだだきました。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=92918
起動時に言語の選択をしてメインフォームを立ち上げるのが安全とのアドバイスをいただきチャレンジしようよ試みたのですが、やり方が全然わかりませんでした。
なので動的に変更するようにしてみました。

private void 英語ToolStripMenuItem_Click_1(object sender, EventArgs e)
{
英語ToolStripMenuItem.Checked = true;
日本語ToolStripMenuItem.Checked = false;

Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
ComponentResourceManager resources = new ComponentResourceManager(typeof(Form1));
resources.ApplyResources(this, "$this");
applyResources(resources, this.Controls);
}
private void applyResources(ComponentResourceManager resources, Control.ControlCollection ctls)
{
foreach (Control ctl in ctls)
{
resources.ApplyResources(ctl, ctl.Name);
applyResources(resources, ctl.Controls);
}
}

しかし、このコードだとボタンなどは変更できるのですがToolStripMenuItemだけ変更できません。どうすればいいですか?
もしくは他の安全な方法があればコードを教えて貰えると助かります。
よろしくお願いします。
引用返信 編集キー/
■92935 / inTopicNo.2)  Re[1]: 多言語化
□投稿者/ 魔界の仮面弁士 (2468回)-(2019/11/11(Mon) 10:46:27)
No92933 (じょこびっち さん) に返信
> 起動時に言語の選択をしてメインフォームを立ち上げるのが安全とのアドバイスをいただき
> チャレンジしようよ試みたのですが、やり方が全然わかりませんでした。

再起動は Application.Restart(); で行えます。

カルチャを指定するコードは、Program.cs の Main にて、
Application.Run の前に配置してみてください。
https://social.msdn.microsoft.com/Forums/en-US/29280bd7-c15e-444a-908f-804f896bd189/
引用返信 編集キー/
■92938 / inTopicNo.3)  Re[2]: 多言語化
□投稿者/ じょこびっち (23回)-(2019/11/11(Mon) 13:10:20)
No92935 (魔界の仮面弁士 さん) に返信
> ■No92933 (じょこびっち さん) に返信
> カルチャを指定するコードは、Program.cs の Main にて、
> Application.Run の前に配置してみてください。
> https://social.msdn.microsoft.com/Forums/en-US/29280bd7-c15e-444a-908f-804f896bd189/

教えていただいたサイトを参考にToolStripMenuItemのコードの最後に
this.Controls.Clear();とInitializeComponent();を追加したら出来ました。

しかし、Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
この一文をProgram.csに記載するとToolStripMenuItemenで言語を選択しても英語版のみで起動してしまいます。
出来れば英語・中国語・日本語の3言語のリソースを切り替えられたらと考えていますがカルチャを指定するコードはProgram.csに書かないと動作に不具合が出るのでしょうか?また、実現するにはどうすればいいですか?
よろしくお願いします。
引用返信 編集キー/
■92939 / inTopicNo.4)  Re[3]: 多言語化
□投稿者/ 774RR (748回)-(2019/11/11(Mon) 13:28:08)
オイラなら Program.cs 中 Main() に切り替えコードを置いて実行中には切り替えない(要再起動)
要するに CurrentUICulture = new Culture(ほげ); は new Application の前に置いて、
それ以後は CurrentUICulture / CurrentCulture はいじらないことにしている。

具体的にどうコード化するかは、どこにその設定を置くか次第なところがあるわけだけど、

myprog.exe を起動する際に起動用ショートカットを使うなら
myprog.exe ja-JP とか myprog.exe zh-CN とか指定できるよう Main(string[] args) から
new CultureInfo(args[0]); のように引っ張ってくればよいし
(デバッグ・マニュアル部隊のハードコピー作成にはもっぱらこれ)
(ショートカットへのファイルのドラッグ・ドロップを受け付けるときは要小細工)

設定 Properties.Settings.Default は Main() 中でも読めるので
new CultureInfo(MyProg.Properties.Settings.Default.UICulture); でもよさそうだし
(未テスト)


引用返信 編集キー/
■92940 / inTopicNo.5)  Re[3]: 多言語化
□投稿者/ 魔界の仮面弁士 (2469回)-(2019/11/11(Mon) 13:56:20)
No92938 (じょこびっち さん) に返信
> カルチャを指定するコードはProgram.csに書かないと動作に不具合が出るのでしょうか?

たとえばカルチャー依存の情報が static readonly メンバーで管理されていた場合、
それを実行後に書き換えることは難しいでしょう。また、static readonly で無いにしても、
インスタンス生成時やウィンドウ生成時に確定される情報であった場合、
カルチャーの事後変更を受け付けるには、インスタンスの再作成が必要になってしまいます。

それゆえ『設定するのであれば Application.Run 前に実施しておく』のが望ましいと思います。


たとえば DateTimePiceker クラスの Value プロパティは MinDate プロパティに依存しており、
その MinDate プロパティは、static な MinimumDateTime プロパティに依存しています。

そしてこの static プロパティの実装は、CurrentCulture の影響を受ける可能性があります。
そのため後からカルチャーを変更した場合、日付範囲のチェックに問題を生じるかもしれません。

https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/DateTimePicker.cs,9a181a0974bf9ccb,references



> しかし、Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
> 記載するとToolStripMenuItemenで言語を選択しても英語版のみで起動してしまいます。

ToolStripMenuItem 系の実験はしていないのですが、
検索してみたところ、次のようなやりとりが見つかりました。

https://stackoverflow.com/questions/7648421/switching-language-cultureinfo-globalization-does-not-affect-toolstripmenuitem
https://stackoverflow.com/questions/6980888/localization-at-runtime

試していませんが、上記 RuntimeLocalizer の実装が参考になるかも。
引用返信 編集キー/
■92970 / inTopicNo.6)  Re[4]: 多言語化
□投稿者/ じょこびっち (24回)-(2019/11/12(Tue) 12:02:22)
2019/11/13(Wed) 15:38:11 編集(投稿者)

No92940 (魔界の仮面弁士 さん) に返信

> 試していませんが、上記 RuntimeLocalizer の実装が参考になるかも。

とりあえずRuntimeLocalizerのクラスをそのまま利用してみようと思ったのですが
ChangeCulture(Form1,"en")の第一引数にフォームの名前を書いたのですが
「Form1は種類です。これは特定のコンテンツでは無効になります。」とのエラーがでます。何が問題なのでしょうか?よろしくお願いします。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ