Nella mia applicazione per ogni lingua, le risorse di stringa vengono memorizzate separatamente e vengono visualizzate in base al tipo di ambiente della lingua. Voglio cambiare la lingua nelle impostazioni dell'applicazione. Come mi rendo conto che dopo la selezione della lingua la applichi immediatamente nell'interfaccia utente?C# cambia lingua app in modo programmatico UWP in tempo reale
risposta
Possiamo usare ApplicationLanguages.PrimaryLanguageOverride per cambiare la lingua durante il runtime senza riavviare l'app.
Ad esempio: Ho due lingue supportate "en" e "fr", il messaggio localizzato verrà visualizzato nel blocco di testo.
Aggiungere utilizzando Windows.Globalization;
modificare la lingua predefinita da "en" a "fr" per
ApplicationLanguages.PrimaryLanguageOverride = "fr";
nuovamente accedere alla pagina corrente per aggiornare l'interfaccia utente.
Frame.Navigate(this.GetType());
Si noti che, è necessario confrontare il PrimaryLanguageOverride con la cultura di sistema per impostare la lingua per il prossimo lancio app, perché l'impostazione PrimaryLanguageOverride viene mantenuto. E se hai abilitato la cache della pagina, quando applichi una lingua diversa al volo, devi cancellare la cache impostando prima Frame.CacheSize = 0;
e poi ripristinarla.
Questa soluzione funziona sempre per me, ma la prima modifica della lingua. Dopo il primo cambio di lingua devo cliccare manualmente su un elemento di navigazione per caricare una pagina con la nuova lingua. Per ogni cambio di lingua dopo quello la pagina si aggiorna automaticamente con la lingua corretta. Questo comportamento si verifica anche quando si modifica CachSize come consigliato. – ThisWillDoIt
@ThisWillDoIt Hai trovato qualche soluzione per questo problema? Altrimenti, segnalarlo come bug potrebbe essere l'idea migliore ...!? – Herdo
Ho un'altra app che funziona correttamente e li ho confrontati l'uno con l'altro. Non ho ancora idea del perché questo comportamento si verifichi nelle app (https://github.com/theWalli/EurekaRemake). Se decido di segnalarlo dopo un altro giro di controllo dalla mia parte, dove sarebbe il posto migliore/ufficiale per farlo? – ThisWillDoIt
C'è un page MSDN che descrive la nuova funzionalità di Language da Windows 8.1.
Dopo modificare il
ApplicationLanguages.PrimaryLanguageOverride = "en-US";
ho guardato la proprietà resourceContext.Languages[0]
al fine di lanciare l'evento PropertyChanged
della mia LanguageManager, che era un StaticResources
dichiarato in App.xaml
con 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);
}
}
Il while (true)
era solo per prova, in realtà è meglio per sfuggire da un "backup", perché
Tali requisiti possono variare a seconda del framework di interfaccia utente utilizzata dalla app, e può essere necessario riavviare l'app.
Sì ApplicationLanguages.PrimaryLanguageOverride = "en-US"; dovrebbe essere usato – peterincumbria
@ThisWillDoIt e @Herdo
ho aggiunto un ritardo in modo che il tempo di "First" che avrebbe funzionato nella mia situazione:
Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = languageCode;
await Task.Delay(100);
Frame.Navigate(this.GetType());
Speranza che aiuta il lavoro per voi.
Eccellente! Funziona! Ma perché ??? – Charlie
@Charlie Leggi la risposta di Péter Bozsó sopra la mia, che dovrebbe rispondere alla tua domanda –
Qualche aggiunta alla risposta di Alan Yao. C'è un pezzo mancante: Dopo aver impostato la Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride
e prima di ri-navigazione verso la pagina corrente, è necessario chiamare queste due funzioni:
Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().Reset();
Windows.ApplicationModel.Resources.Core.ResourceContext.GetForViewIndependentUse().Reset();
In questo modo non sarà necessario il Task.Delay()
soluzione indicata da Michael Woolsey.
Un ultimo passaggio importante: quando si crea un pacchetto Store, è necessario assicurarsi di impostare il valore dell'impostazione "Genera pacchetto app" su "Mai". Motivo da this article:
Perché altrimenti creerà un pacchetto. Significa che taglierà l' l'applicazione in parti diverse per ottimizzare il download. Solo verranno scaricate le parti rilevanti per i dispositivi. Per esempio , se ci sono le risorse in diversa risoluzione, sarà solo scaricare quelli che sono adatti per il dispositivo. Stessa cosa per le lingue , scaricherà solo il file delle risorse relativo alla lingua del dispositivo. Quindi, se provi a cambiare lingua, il numero cadrà ancora nella stessa lingua di base, perché altri non sono installati .
Risposta eccellente, evita i rimedi che interrompono la fluidità dell'interfaccia utente (ritardo sul thread dell'interfaccia utente). – MoDu
Purtroppo, nessuna delle risposte precedenti aiutato se NavigationCacheMode
insieme al "Required"
per la pagina. Ecco il codice che ha risolto il mio problema.
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;
- 1. Cambia EditText IME_ACTION in modo programmatico
- 2. App in tempo reale con Facebook
- 3. streaming video in tempo reale in C#
- 4. Visualizzazione 3D in tempo reale in C++
- 5. Linting in tempo reale del codice C
- 6. Chiamata sleep in tempo reale() in tempo reale?
- 7. Grafico in tempo reale per un'applicazione C
- 8. c in tempo reale vs timespec
- 9. MongoDb Streaming dei dati inseriti in tempo reale (o quasi in tempo reale)
- 10. tempo reale pianificazione in Linux
- 11. App per monitorare le query PostgreSQL in tempo reale?
- 12. Aggiornamento di App in tempo reale per notifiche push
- 13. Lucene indicizzazione in tempo reale?
- 14. Monitoraggio MySQL in tempo reale
- 15. Cambia span di riga/colonna in modo programmatico (tablelayoutpanel)
- 16. Cambia in modo programmatico RelativeLayout toRightOf to aLeftOf
- 17. Prezzo in tempo reale R
- 18. Streaming audio in tempo reale
- 19. come ottenere un orologio in tempo reale in C#?
- 20. Cambia il nome del processo reale in C su Linux
- 21. Google Maps cambia lingua in modo dinamico (caricamento asincrono)
- 22. Deploy UWP App progetto In VS2015
- 23. Elaborazione in tempo reale e callback con Python e C++
- 24. Il modo migliore per mantenere l'indice in tempo reale?
- 25. Interrupt in tempo reale in Python
- 26. Test in tempo reale su Android LVL
- 27. Grafico in tempo reale in Java
- 28. Servizio web valuta in tempo reale
- 29. L'impostazione "AppleLanguages" non cambia la lingua delle app
- 30. Collaborazione in tempo reale in Eclipse
Set [CurrentUICulture] (https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.currentuiculture (v = vs.110) aspx) Proprietà quando lancio app. – tao
Lo so. Ma ho bisogno di cambiare la lingua senza riavviare all'istante. Dobbiamo cambiarlo direttamente nell'applicazione in esecuzione. – AlexeySRG