2012-09-24 23 views
21

Tengo algunos problemas en las aplicaciones Metro de Windows 8 (XAML & C#) con respecto a la configuración regional del usuario. Parece que las aplicaciones no respetarán la configuración regional del usuario, por lo que incluso si su Windows 8 está configurado para mostrar las fechas y horas en formato finlandés, las aplicaciones todavía las mostrarán utilizando el formato US. ¿Pero este es un problema tan grande que debe haber algo que me falta?WinRT aplicaciones y configuraciones regionales. ¿La forma correcta de formatear fechas y números en función de la configuración regional del usuario?

Para probar esto comencé creando una aplicación WPF. La aplicación se limita a imprimir la CurrentCulture y la DateTime.Now formato:

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

Aquí está mi configuración regional predeterminada: Regional settings

Cuando se ejecuta, la aplicación mostrará la fecha en formato de Finlandia:

Finnish formatting

Entonces cambió la configuración regional de los Estados Unidos: US Regional settings

Y cuando la aplicación se ejecuta de nuevo, la cultura y el formato cambió: US wpf formatting

Ésta es como esperaba todo para trabajar y esta es también la forma en que esperaba aplicaciones WinRT para trabajar.

Así que, como paso siguiente, creé una aplicación WinRT (XAML & C#) con el mismo código y revertí la configuración regional de nuevo al finlandés. El problema:

Winrt formatting

Incluso cuando he definido a través de la configuración regional que el formato debe ser "finlandés", la aplicación WinRT muestra la fecha y hora con Estados Unidos y el formato. luego modifiqué archivo de proyecto de la aplicación e hice fi-FI el idioma por defecto:

Default language

Este cambio también modificó la cultura de la aplicación:

Finnish winrt formatting

extraño. Cambié el idioma predeterminado a su valor predeterminado y el formato se restauró en EE. UU. Luego creé las carpetas "Strings - fi-FI" dentro del proyecto y agregué un vacío "Resources.resw" al proyecto. Este archivo vacío parece ser suficiente, ya que ahora estaba recibiendo el formato de Finlandia:

Resource file Finnish formatting

Tan pronto como se quita el archivo de recursos vacía, los formateos revierte de nuevo a los Estados Unidos:

Resource file removed US formatting winrt

Muy extraño.

Esto lleva a algunas preguntas, pero la principal es: ¿Es intencional que las aplicaciones WinRT no sigan las configuraciones regionales del usuario como lo hacen las aplicaciones WPF?

Respuesta

14

Ha pasado un tiempo, pero la pregunta no ha sido respondida por completo, así que permítanme compartir mi pequeña investigación. Depechie tiene la razón, pero él solo proporcionó un enlace y no estaba realmente seguro.

Sí, este cambio inesperado es intencionado. No deberíamos utilizar CultureInfo ya que contiene códigos heredados y Microsoft quiere que usemos las API de Windows.Globalization en su lugar.

Para obtener región actual podemos utilizar:

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

Pero como me di cuenta que sólo contiene información de la región, no hay código de idioma. Para obtener el lenguaje podemos utilizar:

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) 

Vuelven BCP47 etiquetas de idioma en formato de lenguaje-región como "en-US" si el lenguaje tiene dialectos o idiomas al igual que "pl" si el idioma no tiene dialectos principales .

Nosotros también puede establecer un idioma primario que anulará todos los demás:

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

(Esta es una configuración persistió y se supone que debe ser utilizado a petición del usuario)

También hay nueva API para la fecha, hora y número:

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 

No hay realmente mucho más en las API Windows.Globalization, pero creo que esto nos da la idea general. Para la lectura adicional:

También puede encontrar algunos temas sobre el problema en windo ws 8 dev center forum con algunas respuestas de los empleados de Microsoft, pero principalmente lo envían a la documentación.

+3

Así, acutally cómo el get/respeto de los Usuarios La configuración regional de formato? Comencé el emulador de Windows 8.1 para teléfono con la siguiente configuración para fines de prueba: UI Idioma: alemán, Región: EE. UU., Configuración de formato: irlandés No he encontrado forma de obtener la información, que el usuario ha establecido su configuración de formato Irlandés. Y mi único deseo es formatear un DateTime como el usuario quiere verlo. Y el formato regional no significa automáticamente su región en la que configuro el dispositivo ni el UI Langauge que elegí. En mis dispositivos configuro la interfaz de usuario en inglés, pero quiero ver todos los TimeStamps y fechas en el formato alemán ... – Kornelis

+0

gracias, lo siguiente fue genial, porque necesitaba ISO 3166-1 alpha2 https://en.wikipedia.org/ wiki/ISO_3166-1_alpha-2 GeographicRegion userRegion = new GeographicRegion(); string regionCode = userRegion.CodeTwoLetter; – Quincy

+0

Esto me ha funcionado, pero ahora necesito grandes cantidades y el 'CurrencyFormatter' no es compatible con el decimal así que necesito una solución ... –

4

Es intencional. Microsoft se está alejando de obligar a las aplicaciones a estar en el lenguaje del sistema operativo. En cambio, cada aplicación usa información declarada por la aplicación (lenguajes de manifiesto, observables en Windows.Globalization.ApplicationLanguages.ManifestLanguages) y declarada por el usuario (lenguajes de usuario, observables en Windows.System.UserProfile.GlobalizationPreferences.Languages) para determinar cómo mostrar recursos y fechas y horarios globalizados. Este conjunto de idiomas se denomina lenguajes de la aplicación (observable en Windows.Globalization.ApplicationLanguages.Languages). El comportamiento que está viendo se debe a que está jugando con los idiomas de usuario y los lenguajes de manifiesto, y obtendrá diferentes idiomas de aplicación.

+4

Un enfoque interesante, aunque como portugués viviendo en el Reino Unido (y actualmente trabajando para Microsoft) no pude '¡No estoy de acuerdo más! Esta es mi opinión: Mi teléfono Win10 tiene el idioma configurado en "Inglés de EE. UU.", País en "Reino Unido" y el formato regional "Portugués (Portugal)". Outlook muestra las fechas en formato PT-PT correcto, pero todas las otras aplicaciones insisten en usar en-US que en mi humilde opinión está mal y no es lo que esperaba !! –

0

Esta publicación sigue pareciendo relevante a pesar de haber sido solicitada hace dos años. Acabo de encontrarlo porque estaba buscando una respuesta sobre lo mismo. También quería mostrar las fechas en el formato regional en mi aplicación WP8.1 WinRT. La información publicada aquí ayuda, pero fue un poco difícil armarla.

Esto es lo que me ocurrió y parece que funciona para mí como la respuesta que necesitaba:

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