2012-09-24 21 views
21

Ich habe einige Probleme in Windows 8 Metro-Anwendungen (XAML & C#) in Bezug auf die regionalen Einstellungen des Benutzers. Es scheint, dass die Apps die regionalen Einstellungen des Benutzers nicht respektieren, also, selbst wenn Ihr Windows 8 eingestellt ist, um Daten und Zeiten im finnischen Format anzuzeigen, zeigen die Apps sie weiterhin US-Formatierung an. Aber das ist so ein großes Problem, dass es etwas geben muss, was mir fehlt?WinRT-Apps und regionale Einstellungen. Die richtige Methode zum Formatieren von Daten und Zahlen basierend auf den regionalen Einstellungen des Benutzers?

Um dies zu testen, begann ich mit der Erstellung einer WPF-Anwendung. Die Anwendung druckt nur die Current und die formatierte DateTime.Now:

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

Hier ist meine Standard-Ländereinstellungen: Regional settings

Sobald er ausgeführt wird, die App das Datum im finnischen Format angezeigt:

Finnish formatting

Dann änderte ich die regionalen Einstellungen zu US: US Regional settings

Und wenn die App wieder laufen gelassen wurde, die Kultur und die Formatierung geändert: US wpf formatting

Dies ist wie ich alles erwartet zu funktionieren, und dies ist auch, wie ich erwartet hatte WinRT-Anwendungen zu arbeiten.

Als nächsten Schritt erstellte ich eine WinRT (XAML & C#) App mit demselben Code und setzte die regionalen Einstellungen wieder auf Finnisch zurück. Das Problem:

Winrt formatting

Auch wenn ich durch regionale Einstellungen festgelegt haben, dass die Formatierung sollte „Finnish“, die WinRT App mit US-Formatierung zeigt das Datetime sein. Ich änderte dann die Projektdatei der App und machte fi-FI die Standardsprache:

Default language

Diese Änderung auch die App-Kultur geändert:

Finnish winrt formatting

Seltsam. Ich habe die Standardsprache auf den Standardwert zurückgesetzt und die Formatierung wurde auf US zurückgesetzt. Ich habe dann innerhalb des Projekts Ordner "Strings - fi-FI" erstellt und dem Projekt ein leeres "Resources.resw" hinzugefügt. Diese leere Datei scheint genug zu sein, wie ich jetzt die finnische Formatierung erhalten wurde:

Resource file Finnish formatting

Sobald ich die leere Ressource-Datei entfernen, kehren die Formatierungen zu US zurück:

Resource file removed US formatting winrt

Sehr seltsam.

Dies führt zu wenigen Fragen, aber die wichtigste Frage ist: Ist es beabsichtigt, dass die WinRT-Apps nicht den regionalen Einstellungen des Benutzers folgen, wie es die WPF-Apps tun?

Antwort

14

Es ist eine Weile her, aber die Frage ist nicht vollständig beantwortet, also lassen Sie mich meine kleine Forschung teilen. Depechie hat meistens Recht, aber er stellte nur einen Link zur Verfügung und war sich nicht wirklich sicher.

Ja, diese unerwartete Änderung ist beabsichtigt. Wir sollten CultureInfo nicht mehr verwenden, da es Legacy-Codes enthält, und Microsoft möchte stattdessen Windows.Globalization-APIs verwenden.

Um aktuelle Region zu erhalten wir verwenden können:

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

Aber wie ich es enthält nur Regionsinformationen bemerkt haben, gibt es keine Sprachcode. Zu erhalten Sprache können wir verwenden:

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) 

Sie kehren BCP47 Sprach-Tags in Format Sprache-Region wie „en-US“, wenn die Sprache Dialekte oder einfach nur die Sprache hat wie „pl“, wenn die Sprache nicht Hauptdialekte hat .

Wir setzen auch eine primäre Sprache, die alle den Rest außer Kraft gesetzt werden:

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

(Dies ist eine persistente Einstellung und soll auf Benutzeranforderung verwendet werden)

Es gibt auch neue API für Datum, Uhrzeit und Zahlen:

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 

Es gibt wirklich viel mehr in Windows.Globalization APIs, aber ich denke, dass uns die allgemeine Idee gibt. Weiterführende Literatur:

hinzufügen Sie können auch einige Themen über das Problem auf windo finden WS 8 dev Center Forum mit einigen Microsoft-Mitarbeiter Antworten, aber sie senden Sie hauptsächlich zu der Dokumentation.

+3

So acutally, wie die get/respektieren die Benutzer Regional Format-Einstellungen? Ich startete den Windows Phone 8.1 Emulator mit der folgenden Konfiguration für Testzwecke: UI Sprache: Deutsch, Region: USA, Formateinstellungen: Irisch Ich habe keine Möglichkeit gefunden, die Information zu erhalten, dass der Benutzer seine Formateinstellungen festgelegt hat zu irisch. Und mein einziger Wunsch ist, eine DateTime so zu formatieren, wie der Benutzer sie sehen möchte. Und regionales Format bedeutet nicht automatisch die Region, in die ich das Gerät eingestellt habe, oder die von mir ausgewählte Benutzeroberfläche. Auf meinen Devices setze ich die UI auf Englisch, möchte aber alle TimeStamps und Daten im deutschen Format sehen ... – Kornelis

+0

danke, das folgende war super, weil ich ISO 3166-1 alpha2 https://en.wikipedia.org/ benötigt habe wiki/ISO_3166-1_alpha-2 GeographicRegion userRegion = new GeographicRegion(); Zeichenfolge regionCode = userRegion.CodeTwoLetter; – Quincy

+0

Dies hat für mich funktioniert, aber jetzt brauche ich große Zahlen und die 'CurrencyFormatter' unterstützt keine Dezimalstelle, also brauche ich eine Umgehungslösung ... –

4

Es ist beabsichtigt. Microsoft entfernt sich davon, Anwendungen in die Sprache des Betriebssystems zu zwingen. Stattdessen verwendet jede Anwendung Informationen, die von der Anwendung deklariert wurden (Manifest-Sprachen, beobachtbar unter Windows.Globalization.ApplicationLanguages.ManifestLanguages) und vom Benutzer deklariert wurden (Benutzersprachen, beobachtbar unter Windows.System.UserProfile.GlobalizationPreferences.Languages), um zu bestimmen, wie angezeigt werden soll Ressourcen und globalisierte Daten und Zeiten. Diese Gruppe von Sprachen wird als Anwendungssprache bezeichnet (beobachtbar unter Windows.Globalization.ApplicationLanguages.Languages). Das Verhalten, das Sie sehen, liegt daran, dass Sie mit den Benutzersprachen und den Manifest-Sprachen herumhantieren und verschiedene Anwendungssprachen erhalten.

+4

Interessanter Ansatz, obwohl als Portugiese in Großbritannien leben (und derzeit für Microsoft arbeitet) konnte ich nicht widerspreche mehr davon! Hier ist meine Ansicht: Mein Win10-Telefon hat die Sprache "Englisch US", Land "Großbritannien" und Regionalformat "Portugiesisch (Portugal)" eingestellt. Outlook zeigt Daten im korrekten PT-PT-Format, aber alle anderen Anwendungen bestehen darauf, en-US zu verwenden, was IMHO falsch ist und nicht das, was ich erwartet habe !! –

0

Dieser Beitrag scheint immer noch relevant zu sein, obwohl es vor zwei Jahren gefragt wurde. Ich bin gerade auf es gestoßen, als ich nach einer Antwort auf ungefähr die gleiche Sache suchte. Ich wollte auch Daten in dem regionalen Format in meiner WP8.1 WinRT App anzeigen. Die hier veröffentlichten Informationen helfen, aber es war ein bisschen schwierig, es zusammen zu setzen.

Das ist, was ich kam mit, und es scheint mir als Antwort zu arbeiten, die ich brauchte:

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