webentwicklung-frage-antwort-db.com.de

C # App-Sprache programmatisch UWP-Echtzeit ändern

In meiner Anwendung werden für jede Sprache Zeichenkettenressourcen separat gespeichert und je nach Art der Sprachumgebung angezeigt. Ich möchte die Sprache in den Anwendungseinstellungen ändern. Wie stelle ich fest, dass die Sprache nach der Sprachauswahl sofort in der Benutzeroberfläche angewendet wird?

14
AlexeySRG

Wir können ApplicationLanguages.PrimaryLanguageOverride verwenden, um die Sprache zur Laufzeit zu ändern, ohne die App neu zu starten.

Zum Beispiel: Ich habe zwei Sprachen "en" und "fr", die lokalisierten Nachrichten werden im Textblock angezeigt.

  1. Hinzufügen mit Windows.Globalization;

  2. Ändern Sie die Standardsprache von "en" in "fr" um

    ApplicationLanguages.PrimaryLanguageOverride = "fr";
    
  3. Navigieren Sie erneut zur aktuellen Seite, um die Benutzeroberfläche zu aktualisieren. 

    Frame.Navigate(this.GetType());
    

Beachten Sie, dass Sie PrimaryLanguageOverride mit der Systemkultur vergleichen müssen, um die Sprache für den nächsten App-Start festzulegen, da die Einstellung PrimaryLanguageOverride beibehalten wird. Wenn der Seiten-Cache aktiviert ist und Sie eine andere Sprache im laufenden Betrieb anwenden, müssen Sie den Cache leeren, indem Sie zuerst Frame.CacheSize = 0; setzen und ihn dann zurücksetzen.

27
Alan Yao - MSFT

Einige Ergänzung zu Alan Yao Antwort. Es fehlt ein Stück: Nachdem Sie den Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride eingestellt haben und zur aktuellen Seite zurückkehren, müssen Sie diese beiden Funktionen aufrufen:

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

Auf diese Weise brauchen Sie nicht die von Michael Woolsey erwähnte Task.Delay()-Problemumgehung.

Ein wichtiger noch wichtiger letzter Schritt: Beim Erstellen eines Store-Pakets sollten Sie sicherstellen, dass der Einstellungswert "App-Paket erstellen" auf "Nie" festgelegt wird. Grund aus diesem Artikel :

Andernfalls wird ein Bundle erstellt. Das bedeutet, dass er Ihre Anwendung in verschiedene Teile schneidet, um den Download zu optimieren. Es werden nur Die für die Geräte relevanten Teile heruntergeladen. Wenn beispielsweise Die Assets in einer anderen Auflösung vorhanden sind, werden nur Diejenigen heruntergeladen, die für das Gerät geeignet sind. Dasselbe gilt für die Sprachen . Es wird nur die Ressourcendatei heruntergeladen, die für die - Sprache des Geräts relevant ist. Wenn Sie also versuchen, die Sprache zu ändern, wird Immer noch auf dieselbe Basissprache zurückgegriffen, da andere nicht Installiert sind.

5
Péter Bozsó

@ThisWillDoIt und @Herdo

Ich fügte eine Verzögerung hinzu, damit das erste Mal in meiner Situation funktionieren würde:

Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = languageCode;

await Task.Delay(100);

Frame.Navigate(this.GetType());

Ich hoffe es hilft bei der Arbeit für Sie.

4
Michael Woolsey

Es gibt eine Seite MSDN , die die neue Sprache über Sprache aus Windows 8.1 beschreibt.

Nach dem Ändern der

ApplicationLanguages.PrimaryLanguageOverride = "en-US";

Ich habe mir die Eigenschaft resourceContext.Languages[0] angesehen, um das PropertyChanged-Ereignis meines LanguageManagers zu starten, das eine StaticResources war, die in App.xaml mit x:Key = Loc deklariert wurde.

    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);
        }
    }

Die while (true) war nur zum Testen, eigentlich ist es besser, durch ein "Backup" zu fliehen, weil 

Diese Anforderungen können je nach dem von der App verwendeten UI-Framework variieren. Möglicherweise müssen Sie die App erneut starten.

2
Yang C

Leider hat keine der obigen Antworten geholfen, wenn NavigationCacheMode für die Seite auf "Required" gesetzt wurde. Hier ist der Code, der mein Problem gelöst hat.

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