私は週末にペット プロジェクトに取り組んで C# についてさらに学びましたが、ローカリゼーションの作業中に奇妙な問題に遭遇しました。具体的には、私が抱えている問題は System.Threading.Thread.CurrentThread.CurrentUICulture にあります。
ユーザーがメニュー項目をクリックしてアプリの言語をすばやく変更できるように、アプリをセットアップしました。メニュー項目は、言語の 2 文字のコード (「en」、「fr」など) を「Language」というユーザー設定に保存し、アプリケーションを再起動します。
Properties.Settings.Default.Language = "en";
Properties.Settings.Default.Save();
Application.Restart();
アプリケーションが起動すると、フォームのコンストラクターのコードの最初の行 (InitializeComponent() の前であっても) が設定から言語文字列を取得し、CurrentUICulture を次のように設定します。
public Form1()
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(Properties.Settings.Default.Language);
InitializeComponent();
}
問題は、これは一貫して機能しないということです。すべてがうまく機能し、アプリケーションが設定ファイルに保存された文字列に基づいて正しい言語をロードする場合があります。そうでない場合もあり、アプリケーションの再起動後も言語は同じままです。
最初は、アプリケーションを再起動する前に言語を保存していないと思っていましたが、そうではありません。正しい言語の読み込みに失敗した場合、アプリケーションを閉じて再度実行すると、正しい言語が正しく表示されます。これは、Language 文字列が保存されていることを意味しますが、フォーム コンストラクターの CurrentUICulture 割り当てが効果を発揮しない場合があります。
何か助けはありますか?C# でスレッド化がどのように機能するかについて、私が見逃しているものはありますか? これはマシン固有の可能性があるため、違いがある場合は、Pentium デュアルコア CPU を使用しています。
アップデート
Vlad から、CurrentThread の CurrentUICulture が何であるかを確認するように依頼されました。そのため、コンストラクターに MessageBox を追加して、CurrentUICulture の 2 文字のコードと、Language ユーザー文字列の値を教えてくれました。
MessageBox.Show(string.Format("Current Language: {0}\nCurrent UI Culture: {1}", Properties.Settings.Default.Language, Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName));
間違った言語が読み込まれると、Language 文字列と CurrentUICulture の両方に間違った言語が含まれます。したがって、CurrentUICulture はクリアされていると思いますが、実際には言語設定に問題があります。
したがって、問題は、アプリケーションが最後に保存された言語文字列ではなく、以前に保存された言語文字列をロードすることがあることだと思います。アプリを再起動すると、実際に保存された言語文字列が読み込まれます。