TOC

This article has been localized into Spanish by the community.

Una aplicación WPF:

Culture y UICulture de la aplicación

Si has trabajado con números o fechas en tu aplicación WPF, p. ej. debido a uno de los artículos en este tutorial, tal vez has notado algo interesante: Los números y las fechas son mostrados automáticamente en el formato usado en tu ordenador. Si vives en un país anglohablante, esto probablemente no pareciera la gran cosa, pero si vives en uno de TANTOS países donde las fechas y/o números se muestran diferente, entonces esto es realmente interesante.

Y si estás pensando "seguramente no haya mucha diferencia a la hora de formatear cosas sencillas como números y fechas" te sugiero que eches un vistazo a esta sencilla aplicación, donde he dado diferentes formatos (Estados Unidos, Alemania y Suecia) al mismo número y a la misma fecha:

Así que como puedes ver, hay varias diferencias sustanciales en cómo los números y fechas son mostrados. La buena noticia es que el framework .NET te puede ayudar un montón - de hecho ya lo hace: por defecto las fechas y números se muestran con el formato del sistema en el que tu aplicación se está ejecutando. La mala noticia es que su apariencia puede no ser la que tu deseas. Pero no te preocupes - puedes cambiarlo facilmente. Todo esto esta relacionado con el uso de la clase CultureInfo, de la cual puedes leer más en el enlace C# Tutorial article on CultureInfo. Por ahora veamos cómo aplicar estas técnicas a tu aplicación WPF.

Formateo Ad-hoc

Si sólo necesitas aplicar formato a una pieza específica de información, por ej. los contenidos de un control Label, puedes lograrlo fácilmente, al vuelo, usando una combinación del método ToString() y la clase CultureInfo. Por ejemplo, más arriba hemos aplicado un formato diferente, basado en la localizacion, de esta manera:

double largeNumber = 123456789.42;

CultureInfo usCulture = new CultureInfo("en-US");
CultureInfo deCulture = new CultureInfo("de-DE");
CultureInfo seCulture = new CultureInfo("sv-SE");

lblNumberUs.Content = largeNumber.ToString("N2", usCulture);
lblNumberDe.Content = largeNumber.ToString("N2", deCulture);
lblNumberSe.Content = largeNumber.ToString("N2", seCulture);

Esto puede ser suficiente en algunos casos, donde solo necesites el formato especial en un par de lugares, pero en general, tu decides si tu aplicación debería usar los ajustes del sistema (por defecto) o si deberías sobrescribir estos con una configuración especial para toda la aplicación.

CurrentCulture & CurrentUICulture

Aplicar cualquier otra cultura a tu aplicación WPF es muy fácil. Potencialmente, encontraras los atributos CurrentCulture y CurrentUICulture,en la propiedad CurrentThread de la clase Thread. Pero, ¿cuál es la diferencia?

La propiedad CurrentCulture es la que controla cómo se formatean los números, las fechas, etc. El valor predeterminado proviene del sistema operativo de la computadora que ejecuta la aplicación y se puede cambiar independientemente del idioma utilizado por su sistema operativo. Es, por ejemplo, muy común que una persona que vive en Alemania instale Windows con el inglés como idioma de interfaz, mientras sigue prefiriendo la notación alemana para números y fechas. Para una situación como esta, la propiedad CurrentCulture sería por defecto en alemán.

La propiedad CurrentUICulture específica el lenguaje que la interfaz deberá usar. Esto es relevante solamente sí la aplicación soporta múltiples lenguajes, por ejemplo, a través del uso de un archivo de recursos de lenguaje. Una vez más, esto te permite usar una cultura para el lenguaje (por ejemplo: inglés), mientras usas otro (por ejemplo: alemán) cuando tratas con entradas/salidas de números, fechas, etc.

Cambiando la Cultura de la aplicación

Con eso en mente, ahora tienes que decidir sí cambiar la propiedad CurrentCulture y/o la propiedad CurrentUICulture. Esto puede lograrse cuando lo desees, pero tiene más sentido hacerlo cuando inicia tu aplicación - de otra forma, algunas salidas pueden ser generadas con la cultura por defecto, antes del cambio. Aquí hay un ejemplo donde cambiamos la Culture, también como la UICulture, en el evento Application_Startup() el cual puede ser usado en el archivo App.xaml.cs de tu aplicación WPF.

private void Application_Startup(object sender, StartupEventArgs e)
{
    Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
}

Ya que usamos la clase Thread tanto como la clase CultureInfo, no olvidemos agregar los espacios de nombres requeridos para tu archivo, sí es que no están ya presentes:

using System.Threading;
using System.Globalization;

Con esto en su lugar, números y fechas ahora serán formateados de acuerdo a como ellos lo prefieren en alemán (de-DE). Como se mencionó, puedes comentar o ignorar la línea que define la cultura para la UICulture (la última línea) sí tu aplicación no soporta múltiples lenguajes

Cambiar la cultura durante el evento Application_Startup, o al final del constructor de tu ventana principal, hace mas sentido, porque los valores que ya han sido generados no son actualizados automáticamente cuando cambias la propiedad CurrentCulture. Sin embargo, esto no significa que no puedes hacerlo, como esta ilustrado por el siguiente ejemplo, el cual también sirve como demostración de como la salida es afectada por la propiedad CurrentCulture.

<Window x:Class="WpfTutorialSamples.WPF_Application.ApplicationCultureSwitchSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfTutorialSamples.WPF_Application"
mc:Ignorable="d"
Title="ApplicationCultureSwitchSample" Height="200" Width="320">
    <StackPanel Margin="20">
<Grid>
    <Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Label>Number:</Label>
    <Label Name="lblNumber" Grid.Column="1" />
    <Label Grid.Row="1">Date:</Label>
    <Label Name="lblDate" Grid.Row="1" Grid.Column="1" />
</Grid>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,20">
    <Button Tag="en-US" Click="CultureInfoSwitchButton_Click" HorizontalContentAlignment="Stretch">English (US)</Button>
    <Button Tag="de-DE" Click="CultureInfoSwitchButton_Click" HorizontalContentAlignment="Stretch" Margin="10,0">German (DE)</Button>
    <Button Tag="sv-SE" Click="CultureInfoSwitchButton_Click" HorizontalContentAlignment="Stretch">Swedish (SE)</Button>
</StackPanel>
    </StackPanel>
</Window>
using System;  
using System.Globalization;  
using System.Threading;  
using System.Windows;  
using System.Windows.Controls;  

namespace WpfTutorialSamples.WPF_Application  
{  
    public partial class ApplicationCultureSwitchSample : Window  
    {  
public ApplicationCultureSwitchSample()  
{  
    InitializeComponent();      
}  

private void CultureInfoSwitchButton_Click(object sender, RoutedEventArgs e)  
{  
    Thread.CurrentThread.CurrentCulture = new CultureInfo((sender as Button).Tag.ToString());      
    lblNumber.Content = (123456789.42d).ToString("N2");  
    lblDate.Content = DateTime.Now.ToString();  
}  
    }  
}

La parte interesante se encuentra en el evento CultureInfoSwitchButton_Click, donde establecemos la CurrentCulture basados en sobre cual de los botones se hizo clic, y después se actualiza las dos etiquetas que contienen un número y una fecha.

Culture & Threads: La propiedad DefaultThreadCurrentCulture

Sí tu aplicación usa más de un hilo, debes considerar usar la propiedad DefaultThreadCurrentCulture. Ésta puede encontrarse en la clase CultureInfo (introducida en la versión 4.5 de framework de .NET) y asegurar que no solamente el hilo actual, si no también futuros hilos que usen la misma cultura. Puedes usarlo así, por ejemplo en el evento Application_Startup :

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("de-DE");

Entonces, ¿tienes que establecer las propiedades CurrentCulture y DefaultThreadCurrentCulture? De hecho, no - si tu aún no has cambiado la propiedad CurrentCulture, establecer la propiedad DefaultThreadCurrentCulture también será aplicada a la propiedad CurrentCulture. En otras palabras, tiene sentido usar el DefaultThreadCurrentCulture en vez de CurrentCulture si tu planeas usar múltiples hilos en tu aplicación - esto se encargará de todos los escenarios.

Resumen

Tratar con la cultura de tu aplicación WPF es muy importante, pero afortunadamente WPF hará mucho por ti completamente "fuera de la caja". Sí tu necesitas cambiar el comportamiento por defecto, es muy simple también, usar las propiedades CurrentCulture y CurrentUICulture, como se ilustra en los numerosos ejemplos de este artículo.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!