[UWP – How To] Cambiar idioma en tiempo de ejecución

[UWP – How To] Cambiar idioma en tiempo de ejecución


En esta pequeña entrada voy a demostrar cómo cambiar el idioma de nuestra aplicación en tiempo de ejecución, sin reiniciar la aplicación, utilizando únicamente archivos de recursos y asignándole código del idioma.

En la plataforma .NET, en cualquiera de sus “presentaciones” podemos aplicar el cambio de idioma en tiempo de ejecución, pero en UWP no he encontrado información de manera muy simple.

UWP permite la utilización de archivos de recursos, que lo podemos colocar en carpetas con el nombre de la localización que estamos necesitando para cumplir con el objetivo.

Primero, debemos agregar los archivos de recursos en la carpeta correspondiente a su localización, dentro de la carpeta Strings:
1

Al ingresar al archivo de recursos veremos todos los recursos que queremos modificar según el idioma:
2

Como código de ejemplo (enlaces para idiomas y el texto en sí) podemos utilizar un XAML similar al siguiente:


<Page x:Class="Language.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Language" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d">

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Margin="5 20 5 5">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>

<StackPanel HorizontalAlignment="Left" Orientation="Horizontal">
<TextBlock x:Uid="idioma" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="5" Text="Idioma" />
<StackPanel HorizontalAlignment="Left" Orientation="Vertical">
<HyperlinkButton x:Uid="spanish" Name="spanish" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="5" Click="HyperlinkButton_Click" />
<HyperlinkButton x:Uid="english" Name="english" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="5" Click="HyperlinkButton_Click" />
<HyperlinkButton x:Uid="portuguese" Name="portuguese" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="5" Click="HyperlinkButton_Click" />
</StackPanel>
</StackPanel>
<TextBlock x:Uid="mensaje" Grid.Row="1" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10" Text="Mba'e?" />
</Grid>
</Page>

El código que administra el código de cambio de idioma se encuentra dentro del evento HyperlinkButton_Click:

var hbIdioma = sender as HyperlinkButton;
string lang = "es-PY";

switch (hbIdioma.Name)
{
case "spanish":
lang = "es-PY";
break;
case "english":
lang = "en-US";
break;
case "portuguese":
lang = "pt-PT";
break;
}

ApplicationLanguages.PrimaryLanguageOverride = lang;

Frame.Navigate(this.GetType());

Poniendo en funcionamiento nuestra pequeña aplicación se vería así: 3

4

Conclusión

De manera muy sencilla logramos convertir nuestra aplicación en multi idioma utilizando archivos de recursos sin necesidad de reiniciar la aplicación que estamos utilizando.


Un comentario en «[UWP – How To] Cambiar idioma en tiempo de ejecución»

  1. Hola amigo, yo tengo algo parecido, haber si pudieras echarle un vistazo a mi código y ver si pudieras ayudarme.
    Tengo un antiguo código en form para seleccionar el idioma. pero ahora estoy usando window wpf y no consigo acoplar el codigo, si pudieras ayudarme a adaptarlo a wpf, te o agradeceria.

    //VARIABLES
    Window sp;
    ComboBox cb;

    void SeleccionPais()
    {
    MessageBox.Show(“Selecciona un país que se ajuste al idioma y dialecto predeterminados de tu computadora.”, “Selecciona un país.”);

    // VENTANA
    sp = new Window();
    sp.Title = “S e l e c c i o n a u n I d i o m a”;
    //sp.ShowIcon = false; ——————————————— Falta Solucionar
    sp.Width = 380;
    sp.Height = 180;
    //sp.BackColor = Color.Black; ——————————————— Falta Solucionar
    sp.ShowInTaskbar = false;
    sp.WindowStartupLocation = WindowStartupLocation.CenterScreen;
    //sp.Controls.Add(cb); ——————————————— Falta Solucionar
    //sp.Controls.Add(btnSetLang); ——————————————— Falta Solucionar
    //sp.AcceptButton = btnSetLang; ——————————————— Falta Solucionar
    sp.ShowDialog();

    // COMBOBOX
    cb = new ComboBox();
    cb.Width = 200;
    cb.Height = 60;
    //cb.Location = new System.Drawing.Point(82, 40); —————————— Falta Solucionar
    //cb.DropDownStyle = ComboBoxStyle.DropDownList; —————————— Falta Solucionar
    string[] arrayCountry = { “”English – US”, “Español – España” etc,etc….};
    //cb.DataSource = arrayCountry.ToList(); ————————————– Falta Solucionar

    // BOTON
    Button btnSetLang = new Button();
    btnSetLang.Width = 88;
    btnSetLang.Height = 23;
    btnSetLang.Content = “Aceptar”;
    //btnSetLang.Forecolor = Color.Gray; —————————————— Falta Solucionar
    //btnSetLang.Location = new System.Drawing.Point(136, 90); ———————– Falta Solucionar
    Marvel.SpeakAsync(“Selecciona un país que se ajuste al idioma y dialecto predeterminados de tu computadora.”);
    Marvel.SpeakAsyncCancelAll();
    btnSetLang.Click += new EventHandler(btnSetLang_Click); ———— Creado , pero me marca error.
    }

    private void btnSetLang_Click(object sender, EventArgs e) ——— Creado, pero arriba me da error.
    {
    LoadSpeechRecognizerLanguage();
    }

    void LoadSpeechRecognizerLanguage()
    {
    try
    {
    Marvel.SpeakAsyncCancelAll();
    string[] arrayCountry = { “Catalan – España”, “English – US”, “French – France”, “German – Germany”, “Italian – Italy”, “Portuguese – Brazil”, “Portuguese – Portugal”, “Español – España” };
    string[] arrayLang = { “ca-ES”, “en-US”, “fr-FR”, “de-DE”, “it-IT”, “pt-BR”, “pt-PT”, “es-ES” };
    Properties.Settings.Default.Idioma = arrayLang[sl.SelectedIndex];
    Properties.Settings.Default.Save();
    lblIdioma.Content = Properties.Settings.Default.Idioma;
    Thread.CurrentThread.CurrentCulture = new CultureInfo(Properties.Settings.Default.Idioma);
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(Properties.Settings.Default.Idioma);
    Marvel.SpeakAsync(“Has seleccionado ” + arrayCountry[sl.SelectedIndex] + ” como idioma predeterminado. Se recomienda que reinicies el programa cada vez que cambies el idioma de reconocimiento de voz.”);
    MessageBox.Show(“Has seleccionado ” + Properties.Settings.Default.Idioma + ” como idioma predeterminado. Se recomienda que reinicies el programa cada vez que cambies el idioma de reconocimiento de voz.”, “Gracias”);
    lblIdioma.Content = Properties.Settings.Default.Idioma;
    Marvel.SpeakAsyncCancelAll();
    sp.Dispose(); ———————————- Me sale en rojo
    }
    catch (Exception ex)
    {
    ErrorLog(ex.ToString());
    Marvel.SpeakAsyncCancelAll();
    Properties.Settings.Default.Idioma = string.Empty;
    Marvel.SpeakAsync(“Parece que el idioma que has seleccionado no coincide con el idioma de tu sistema.”);
    MessageBox.Show(“Parece que el idioma que has seleccionado no coincide con el idioma de tu sistema.”, “Selección invalida.”);
    sp.Dispose(); ———————————- Me sale en rojo
    sp.Visible = false; —————————- Me sale en rojo
    SeleccionPais();
    }
    }

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.