Cómo cambiar el lenguaje de una aplicación Windows 8.1 en tiempo de ejecución

domingo, 16 de marzo de 2014

Una aplicación para la Windows Store puede estar localizada en varios lenguajes utilizando ficheros de recursos, imágenes localizadas ubicadas en su carpeta de lenguaje correspondiente. Vamos a ver como podemos conseguir sobrescribir el lenguaje actual de una aplicación en tiempo de ejecución.
Nos creamos una proyecto de tipo Windows Store en blanco y añadimos a la página por defecto un ComboBox con los idiomas que vamos a poder seleccionar.
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <StackPanel Orientation="Vertical">
        <ComboBox  Height="35" Width="300" Margin="0 50">
            <ComboBoxItem>es-ES</ComboBoxItem>
            <ComboBoxItem>en-US</ComboBoxItem>
            <ComboBoxItem>fr-FR</ComboBoxItem>
        </ComboBox>
        <TextBlock x:Uid="LocalizedText" VerticalAlignment="Top" HorizontalAlignment="Stretch" Margin="4000" FontSize="45"/>
    </StackPanel>
</Grid>

Asignando la propiedad x:Uid estamos identificando el control para poder localizarlo.

Ahora nos creamos un fichero de recursos por cada idioma. Tenemos que tener una carpeta Strings, una subcarpeta por cada idioma y un fichero de recursos con el nombre Resources.resw.


En cada uno de los ficheros añadimos una linea con el nombre LocalizedText.Text, de esta forma sera la propiedad Text del control identificado como LocalizedText la que se va a sustituir por el texto de cada idioma.


Para poder cambiar el idioma cuando el valor del ComboBox cambie nos suscribimos al evento SelectionChanged.
<ComboBox  Height="35" Width="300" Margin="0 50" SelectionChanged="ComboBox_SelectionChanged">

Y en el método manejador del evento sobreescribimos el lenguaje primario de la aplicación.

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    string language =(string) ((sender as ComboBox).SelectedItem as ComboBoxItem).Content;

    if (!string.IsNullOrEmpty(language) && language != System.Globalization.CultureInfo.CurrentCulture.Name)
        Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = language;
}


De esta forma ya hemos cambiado el lenguaje de nuestra aplicación y además este cambio es almacenado y persiste con cada inició de la aplicación.
En el siguiente inicio de la aplicación el cambio hará efecto, pero también podemos suscribirnos, al cambio del lenguaje y recargar la página que estamos visualizando. Para este ejemplo sencillo voy a realizar esto desde el código de la propia página pero en una aplicación real debería estar ubicado en un lugar centralizado

public MainPage()
{
    this.InitializeComponent();

    ResourceManager.Current.DefaultContext.QualifierValues.MapChanged += QualifierValues_MapChanged;
}

async void QualifierValues_MapChanged(IObservableMap sender, IMapChangedEventArgs @event)
{
    if (@event.Key.ToLower() == "language")
    {
        await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync (CoreDispatcherPriority.Normal, () =>
        this.Frame.Navigate(typeof(MainPage)));
    }

}

Como vemos en el código suscribiendonos a cambios en el mapa de calificadores nos enteramos de cuando un calificador a cambiado, en el método manejador comprobamos si el calificador que ha cambiado es el lenguaje y entonces navegamos de nuevo a la página actual.
De esta forma ya tenemos una aplicación donde podemos modificar el lenguaje en tiempo de ejecución.


Libros Relacionados

Windows 8.1 Apps with XAML and C# Unleashed

Programming Windows: Writing Windows 8 Apps With C# and XAML

Desarrollo en Windows 8 y Windows Phone 8 con XAML y C#

No hay comentarios:

Publicar un comentario