1

すべて、私はローカライズされたWinFormsアプリケーションを持っています。ユーザーが実行時にアプリケーションの必要なカルチャ/言語を変更できる機能を作成しました。特別なことをしないように、カルチャを変更したい場合は、カルチャの変更を有効にするためにアプリケーションを再起動する必要があることを確認するメッセージが表示されます(これはほとんど発生しないため、合理的です)。次に、必要な新しい言語を文字列として設定XMLファイル( "de-DE"、 "en-US"、 "en-GB"など)の1つに保存します。次に、アプリケーションが再起動したときに、必要に応じて、必要なカルチャに切り替えます。

// Main constructor.
public SqlEditorForm(string[] args) 
{
    // Load settings.
    username = Environment.UserName;
    userSettings = UserSettings.Instance();
    advUserSettings = AdvanceUserSettings.Instance();
    CheckChangeCurrentCulture();

    isInitialising = true;
    InitializeComponent();

    ...
}

private void CheckChangeCurrentCulture()
{
    //if (!Debugger.IsAttached)
    //  Debugger.Launch();
    if (advUserSettings.DefaultCulture)
        return;
    else
    {
        CultureInfo culture = new CultureInfo(advUserSettings.CustomCultureString);
        Thread.CurrentThread.CurrentCulture = culture;
        Thread.CurrentThread.CurrentUICulture = culture;
    }
}

VS2012からデバッグ/リリースモードで実行している場合、このメカニズムは正常に機能します。ただし、(Windows 7(x86 / x64)を実行している)さまざまなマシンにアプリケーションをインストールすると、このメカニズムは機能しなくなります。つまり、カルチャがマシンのデフォルトからこれまでに切り替わることはありません。

インストールされたアプリケーションにデバッガーをアタッチしましたが、カルチャを変更するコードが呼び出され、ロジックは機能しているようで、例外はスローされませんが、カルチャ/言語は変更されません。私はSOについて多くの質問をしましたが、この特定の問題をカバーする適切な質問を見つけることができません。

このメカニズムがVS2012から機能しているのに、インストールされているアプリケーションでは機能しないのはなぜですか?希望する動作を実現するには、何をする必要がありますか?

御時間ありがとうございます。

CheckChangeCurrentCulture();:への呼び出しを次のように置き換えてみました。

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("de-DE");
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("de-DE");

これはVS2012(デバッグモードとリリースモード)でも機能しますが、インストールされているアプリケーションでは機能しません。また、マシンカルチャStart-> Control Panel->Region and Languageをドイツ語( "de-DE")に変更しました。これは、アプリケーションと.NET Frameworkが、そのカルチャが利用可能であり、それを使用していることを検出することを期待しています。これは、インストールされたアプリケーションでも失敗しました。

4

1 に答える 1

1

おそらく、プロダクションマシンでは、新しいカルチャのサテライトアセンブリを何らかの理由でロードできないため、アプリケーションはニュートラルカルチャにフォールバックします。

サテライトアセンブリファイルへのアクセスが失敗した場合は、Microsoft sysinternalsProcessMonitorツールに確認してください。

また、.NETfuslogツールhttp://msdn.microsoft.com/en-us/library/e74a18c4.aspxで確認します。

于 2013-03-27T16:02:51.013 に答える