web-dev-qa-db-ja.com

C#アプリの言語をプログラムでUWPリアルタイムに変更する

私のアプリケーションでは、各言語の文字列リソースは個別に保存され、言語環境のタイプに応じて表示されます。アプリケーション設定で言語を変更したい。言語を選択した後、それをユーザーインターフェイスに即座に適用することをどのようにして認識しますか?

17
AlexeySRG

ApplicationLanguages.PrimaryLanguageOverride を使用して、ランタイム中にアプリを再起動せずに言語を変更できます。

たとえば、「en」と「fr」の2つの言語がサポートされている場合、ローカライズされたメッセージがテキストブロックに表示されます。

  1. Windows.Globalizationを使用して追加します。

  2. デフォルトの言語を「en」から「fr」に変更します

    ApplicationLanguages.PrimaryLanguageOverride = "fr";
    
  3. 現在のページに再度移動して、UIを更新します。

    Frame.Navigate(this.GetType());
    

PrimaryLanguageOverrideの設定は保持されるため、PrimaryLanguageOverrideをシステムカルチャと比較して、次のアプリの起動用の言語を設定する必要があることに注意してください。また、ページキャッシュを有効にしている場合、その場で別の言語を適用するときは、最初にFrame.CacheSize = 0;を設定してキャッシュをクリアしてから、キャッシュを元に戻す必要があります。

32
Alan Yao - MSFT

アラン・ヤオの答えにいくつかの追加。欠けている部分が1つあります。_Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride_を設定した後、現在のページに再度移動する前に、次の2つの関数を呼び出す必要があります。

_Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().Reset();
Windows.ApplicationModel.Resources.Core.ResourceContext.GetForViewIndependentUse().Reset();
_

この方法では、Michael Woolseyが述べたTask.Delay()の回避策は必要ありません。

最後のもう1つの重要なステップ:ストアパッケージを作成するときは、[アプリバンドルの生成]の設定値を[なし]に設定してください。理由 この記事

それ以外の場合は、バンドルが作成されます。つまり、ダウンロードを最適化するために、アプリケーションをさまざまな部分に分割します。デバイスに関連するパーツのみがダウンロードされます。たとえば、異なる解像度のアセットがある場合、デバイスに適したアセットのみがダウンロードされます。言語についても同じですが、デバイスの言語に関連するリソースファイルのみをダウンロードします。そのため、言語を変更しようとしても、他の言語がインストールされていないため、同じ基本言語にフォールバックします。

10
Péter Bozsó

@ThisWillDoItおよび@Herdo

私の状況で「最初」に機能するように、遅延を追加しました。

Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = languageCode;

await Task.Delay(100);

Frame.Navigate(this.GetType());

それがあなたの仕事に役立つことを願っています。

4
Michael Woolsey

Windows 8.1の言語に関する新しい羽を説明する MSDNページ があります。

変更後

ApplicationLanguages.PrimaryLanguageOverride = "en-US";

私は、LanguageManagerのPropertyChangedイベント(resourceContext.Languages[0]App.xamlで宣言されたStaticResources)を起動するために、x:Key = Locプロパティを監視しました。

    private void ButtonEn_OnClick(object sender, RoutedEventArgs e)
    {
        ApplicationLanguages.PrimaryLanguageOverride = "en-US";
        UpdateLang("en-US");
    }

    private async void UpdateLang(string newLang)
    {
        var resourceContext = Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView();

        while (true)
        {
            if (resourceContext.Languages[0] == newLang)
            {
                var loc = Application.Current.Resources["Loc"] as LanguagesManager;
                loc.ChangeLang();
                break;
            }
            await Task.Delay(100);
        }
    }

while (true)はテスト用でしたが、実際には「バックアップ」でエスケープした方がよいため、

これらの要件は、アプリで使用されるUIフレームワークによって異なり、アプリの再起動が必要になる場合があります。

2
Yang C

残念ながら、ページのNavigationCacheMode"Required"に設定されている場合、上記の回答のどれも役に立ちませんでした。これが私の問題を解決したコードです。

ApplicationLanguages.PrimaryLanguageOverride = language;
await Task.Delay(300);
Frame rootFrame = Window.Current.Content as Frame;
rootFrame.Content = null;
rootFrame = null;            
rootFrame = new Frame();
rootFrame.Navigate(typeof(MainPage), null);
Window.Current.Content = rootFrame;
0