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(IObservableMapsender, 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# UnleashedProgramming 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