2012-09-24 19 views
21

Sto riscontrando alcuni problemi nelle app di Windows 8 Metro (XAML & C#) relative alle impostazioni internazionali dell'utente. Sembra che le app non rispettino le impostazioni internazionali dell'utente, quindi anche se Windows 8 è impostato per visualizzare le date e le ore in formato finlandese, le app continueranno a visualizzarle utilizzando la formattazione statunitense. Ma questo è un problema così grande che deve esserci qualcosa che mi manca?App WinRT e impostazioni internazionali. Il modo corretto di formattare date e numeri in base alle impostazioni regionali dell'utente?

Per verificarlo, ho iniziato creando un'applicazione WPF. L'applicazione appena stampa il CurrentCulture e la DateTime.Now formattato:

private void Culture_Loaded_1(object sender, RoutedEventArgs e) 
    { 
     this.Culture.Text = System.Globalization.CultureInfo.CurrentCulture.DisplayName; 
    } 

    private void Date_Loaded_1(object sender, RoutedEventArgs e) 
    { 
     this.Date.Text = DateTime.Now.ToString(); 
    } 

Ecco le mie impostazioni internazionali predefinite: Regional settings

Quando viene eseguito, l'applicazione visualizzata la data in formato finlandese:

Finnish formatting

poi ho cambiato le impostazioni internazionali negli Stati Uniti: US Regional settings

E quando l'applicazione è stato eseguito ancora una volta, la cultura e la formattazione cambiato: US wpf formatting

Questo è come mi aspettavo tutto per lavorare e questo è anche il modo che mi aspettavo applicazioni WinRT al lavoro.

Quindi, come passaggio successivo, ho creato un'app WinRT (XAML & C#) con lo stesso codice e ripristinato le impostazioni internazionali in finlandese. Il problema:

Winrt formatting

Anche quando ho definito tramite le impostazioni regionali che la formattazione dovrebbe essere "finlandese", l'applicazione visualizza la WinRT datetime con US-formattazione. Ho poi modificato file di progetto della app e fatto fi-FI la lingua predefinita:

Default language

Questo cambiamento anche modificato la cultura del app:

Finnish winrt formatting

Strano. Ho cambiato la lingua predefinita al suo valore predefinito e la formattazione è stata ripristinata negli Stati Uniti. Ho quindi creato le cartelle "Strings - fi-FI" all'interno del progetto e aggiunto un vuoto "Resources.resw" al progetto. Questo file vuoto sembra essere sufficiente, come mi è stato ora ottenendo la formattazione finlandese:

Resource file Finnish formatting

Appena posso rimuovere il file di risorse vuoto, le formattazioni ritorna negli Stati Uniti:

Resource file removed US formatting winrt

Molto strano.

Questo porta a poche domande, ma la principale è: è intenzionale che le app WinRT non seguano le impostazioni regionali dell'utente come fanno le app WPF?

risposta

14

È passato un po 'di tempo, ma alla domanda non è stata data una risposta completa, quindi permettimi di condividere la mia piccola ricerca. Depechie ha quasi sempre ragione, ma ha fornito solo un link e non era proprio sicuro.

Sì, questo cambiamento imprevisto è intenzionale. Non dovremmo più utilizzare CultureInfo in quanto contiene codici legacy e Microsoft vorrebbe utilizzare le API di Windows.Globalization.

Per ottenere regione attuale possiamo usare:

GeographicRegion userRegion = new GeographicRegion(); 
string regionCode = userRegion.CodeTwoLetter; 

Ma, come ho notato che contiene solo informazioni di regione, non c'è codice di lingua. Per ottenere la lingua possiamo usare:

string langRegionCode = Windows.Globalization.Language.CurrentInputMethodLanguageTag; // depends on keyboard settings 
List<string> langs = Windows.System.UserProfile.GlobalizationPreferences.Languages; // all user languages, like in languages control panel 
List<string> applicationlangs = Windows.Globalization.ApplicationLanguages.Languages; // application languages (user languages resolved against languages declared as supported by application) 

tornano BCP47 lingua tag in formato lingua-area come "en-US" se il linguaggio ha dialetti o semplicemente la lingua come "pl" Se la lingua non ha grandi dialetti .

Possiamo anche impostare una lingua primaria che ignorare tutto il resto:

Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = "en-US"; 

(Questa è un'impostazione persistente e si suppone per essere utilizzato su richiesta dell'utente)

C'è anche nuove API per data, ora e numeri:

Windows.Globalization.DateTimeFormatting.DateTimeFormatter dtf = new DateTimeFormatter("longdate", new[] { "en-US" }, "US", CalendarIdentifiers.Gregorian, ClockIdentifiers.TwentyFourHour); 
string longDate = dtf.Format(DateTime.Now); 

Windows.Globalization.NumberFormatting.DecimalFormatter deciamlFormatter = new DecimalFormatter(new string[] { "PL" }, "PL"); 
double d1 = (double)deciamlFormatter.ParseDouble("2,5"); // ParseDouble returns double?, not double 

Non c'è davvero molto di più in API Windows.Globalization, ma penso che questo ci dà l'idea generale. Per ulteriori approfondimenti:

Puoi anche trovare alcuni argomenti sul problema su windo ws 8 forum del centro di sviluppo con alcune risposte dei dipendenti Microsoft, ma principalmente vi inviano alla documentazione.

+3

Così, acutally come il get/rispettare le impostazioni di formato internazionale utenti? Ho avviato l'emulatore Windows phone 8.1 con la seguente configurazione a scopo di test: UI Lingua: tedesco, Regione: Stati Uniti, Formato Impostazioni: irlandese Non ho trovato alcun modo per ottenere le informazioni, che l'utente ha impostato le sue impostazioni di formato all'irlandese. E il mio unico desiderio è quello di formattare un DateTime come se l'utente volesse vederlo. E il formato regionale non significa automaticamente la regione in cui ho impostato il dispositivo o l'interfaccia utente Langauge che ho scelto. Sui miei dispositivi ho impostato l'interfaccia utente in inglese ma voglio vedere tutte le date e le date nel formato tedesco ... – Kornelis

+0

grazie, il seguente è stato fantastico, perché avevo bisogno di ISO 3166-1 alpha2 https://en.wikipedia.org/ wiki/ISO_3166-1_alpha-2 GeographicRegion userRegion = new GeographicRegion(); string regionCode = userRegion.CodeTwoLetter; – Quincy

+0

Questo ha funzionato per me ma ora ho bisogno di grandi numeri e il 'CurrencyFormatter' non supporta i decimali quindi ho bisogno di una soluzione ... –

4

È intenzionale. Microsoft si sta allontanando dal forzare le applicazioni a essere nella lingua del sistema operativo. Invece, ogni applicazione utilizza le informazioni dichiarate dall'applicazione (lingue manifest, osservabili in Windows.Globalization.ApplicationLanguages.ManifestLanguages) e dichiarate dall'utente (lingue utente, osservabili in Windows.System.UserProfile.GlobalizationPreferences.Languages) per determinare come visualizzare risorse e date e orari globalizzati. Questo set di lingue è chiamato i linguaggi dell'applicazione (osservabile in Windows.Globalization.ApplicationLanguages.Languages). Il comportamento che stai vedendo è dovuto al fatto che stai giocando con le lingue dell'utente e le lingue manifest e otterrai diversi linguaggi applicativi.

+4

Un approccio interessante, anche se come portoghese che vive nel Regno Unito (e attualmente lavorando per Microsoft) non potrei non ne condivido più! Ecco il mio punto di vista: il mio telefono Win10 ha la lingua impostata su "Inglese USA", paese per "Regno Unito" e formato regionale "Portoghese (Portogallo)". Outlook mostra le date nel formato pt-PT corretto, ma tutte le altre app insistono nell'uso di en-US che IMHO ha torto e non è quello che mi aspettavo !! –

0

Questo post sembra ancora rilevante anche se è stato chiesto due anni fa. L'ho appena visto mentre cercavo una risposta alla stessa cosa. Volevo anche visualizzare le date nel formato regionale nella mia app WP8.1 WinRT. Le informazioni pubblicate qui aiutano, ma è stato un po 'difficile metterle insieme.

Questo è quello che mi è venuta e sembra funzionare per me come la risposta che mi serviva:

using Windows.Globalization; 
using Windows.Globalization.DateTimeFormatting; 

private string FormatDate(int year, int month, int day) 
{ 
    GeographicRegion userRegion = new GeographicRegion(); 
    string regionCode = userRegion.CodeTwoLetter; 
    var formatter = new DateTimeFormatter("year month day", new[] { regionCode }); 
    DateTime dateToFormat = new DateTime(year, month, day); 
    var formattedDate = formatter.Format(dateToFormat); 
    return formattedDate; 
} 
Problemi correlati