Soporte multilenguaje en WinUI 3

Introducción

El soporte multilenguaje en aplicaciones permite ampliar el alcance a usuarios y clientes de diferentes regiones e idiomas, mejorando la accesibilidad y la experiencia del usuario. En este post, exploraremos cómo implementarlo en aplicaciones de escritorio desarrolladas con WinUI 3.

Configuración del proyecto

Para implementar soporte multilenguaje en una aplicación WinUI 3, el primer paso es configurar la estructura de carpetas y archivos de recursos. Esto permitirá que el sistema cargue los textos adecuados según el idioma del usuario.

Crear la carpeta Strings

Dentro del proyecto, en la raiz crea una carpeta llamada Strings. Esta será el contenedor principal para los recursos.

Strings
├── en-US
│   └── Resources.resw
├── es-ES
│   └── Resources.resw

¿Qué es el archivo Resources.resw y para qué se utiliza?

El archivo Resources.resw es un contenedor de recursos en formato XML que se utiliza en aplicaciones para definir textos y cadenas.

Pero en el contexto de este post, su propósito principal es permitir que la interfaz de usuario muestre contenido en el idioma correspondiente según la configuración regional del sistema o la preferencia del usuario.

Cada entrada se define como un par clave–valor, donde:

  • La clave es un identificador único que se usa en el código.
  • El valor es el texto traducido que se mostrará al usuario.

Ejemplo de entrada en Resources.resw:

 name="Message" xml:space="preserve">
  Bienvenido


 name="Message" xml:space="preserve">
  Welcome

Implementación

Para establecer el idioma en la aplicación lo debes hacer antes que cargue la ventana principal de la aplicación, esto lo puedes especificar en la clase App.xaml.cs en el metodo OnLaunched.

ApplicationLanguages.PrimaryLanguageOverride = "es-ES";
/// 
/// Invoked when the application is launched.
/// 
/// Details about the launch request and process.
protected override void OnLaunched(LaunchActivatedEventArgs args)
{
    if (ApplicationData.Current.LocalSettings.Values.TryGetValue("language", out object? language))
        ApplicationLanguages.PrimaryLanguageOverride = language?.ToString();
    else
        ApplicationLanguages.PrimaryLanguageOverride = "es-ES";
    _window = new MainWindow();
    _window.Activate();
}

Con esto logramos que cuando se ejecute la aplicación el sistema cargue los resources.resw según el idioma seleccionado.

Para que el usuario pueda seleccionar el idioma de su preferencia podemos usar diferentes controles en este caso utilizaremos el control ComboBox

 x:Name="LanguageSelector"
          SelectionChanged="LanguageSelector_SelectionChanged"
          PlaceholderText="Select a language"
          Width="200">
     Tag="en-US">English
     Tag="es-ES">Español

Una vez definimos el control podemos disparar el evento SelectionChanged el cual se ejecuta cada vez que el usuario cambie la opción del control ComboBox.

using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.Windows.AppLifecycle;
using Windows.ApplicationModel.Resources;
using Windows.Storage;

private void LanguageSelector_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (LanguageSelector.SelectedItem is ComboBoxItem comboBoxItem)
    {
        if (ApplicationData.Current.LocalSettings.Values["language"].ToString() != comboBoxItem.Tag.ToString())
        {
            ApplicationData.Current.LocalSettings.Values["language"] = comboBoxItem.Tag.ToString();
            AppInstance.Restart("");
        }
    }
}

La opción que el usuario seleccione la debemos guardar, puede ser en una base de datos también archivos de recursos por ejemplo un archivo .json o almacenamiento interno del sistema usando LocalSettings del using Windows.Storage.

Para acceder a los valores de los archivos resources.resw podemos realizarlo de la siguiente manera en el code-behind.

using Windows.ApplicationModel.Resources;

public string Message { get; set; } = new ResourceLoader().GetString("Message");

Y desde nuestro frontend podemos acceder usando esa propiedad Message mediante el uso del Bindingde la siguiente manera.

 Text="{x:Bind Message}">

Conclusión

Comparto el resultado final de la implementación del soporte multilenguaje para una aplicación WinUI 3.

Notas y mejoras

  • Se puede implementar usando MVVM.
  • La clase ResourceLoader se puede abstraer creando una clase helper o provider implementando IoC.
  • La aplicación actualmente se debe reiniciar para cargar los archivos de recursos desde el inicio de la ventana pero podrías implementar con archivos .json y propiedades usando la interfaz INotifyPropertyChanged o usando el paquete nuget CommunityToolkit.Mvvm para evitar el reinicio de la aplicación.
Total
0
Shares
Leave a Reply

Your email address will not be published. Required fields are marked *

Previous Post

“Unlocking the Musical Secrets of Ancient Civilizations: The

Related Posts
irremote-程式庫搭配-adafruit-neopoxel-程式庫的問題

IRRemote 程式庫搭配 Adafruit_NeoPoxel 程式庫的問題

IRremote 是大家使用紅外線遙控實驗最常用的程式庫,由於接收紅外線遙控器訊號與時間極度相關,如果你的程式中有耗時較久的動作,就可能會影響到紅外線訊號接收的正確性。舉例來說,像是大家愛用的 WS2812B 燈串,串接越多顆燈,傳輸所有燈顏色的資料所耗的時間就越久,以底下這個採用 Adafruit_NeoPixel 程式庫顯示呼吸燈效果的程式為例: #include #include #include #define DECODE_NEC Adafruit_NeoPixel leds=Adafruit_NeoPixel(16, 7); void setup() { Serial.begin(115200);…
Read More