locked
Localización - Cambiar idioma de la app RRS feed

  • Pregunta

  • Hola,

    Estamos adaptando nuestra app a otros idiomas a través del uso de archivos de recursos. Por ahora, la app coge el idioma que tengas configurado como primera opción dentro de Windows 8. Me gustaría saber cómo podría hacer para que la aplicación coja el idioma que configure en el charm de configuración de la aplicación, así por ejemplo, el usuario podría tener su sistema en inglés y configurar la app en castellano.

    Imagino que habrá algún parámetro de la app que se pueda cambiar en tiempo de ejecución, recargando los controles o página que el usuario tenga abierta para que se pinte de nuevo con la traducción correspondiente de la interfaz.

    Gracias

    miércoles, 29 de agosto de 2012 8:33

Respuestas

  • Hola Javier,

    Efectivamente puede hacerse que la interfaz de la aplicación sea la que seleccione el usuario y también que el cambio se haga al vuelo (sin falta de volver a abrir la aplicación). Para ello necesitamos hacer un par de cosas.

    Primero necesitamos listar los idiomas disponibles en la configuración. Esto podemos hacerlo de forma automática, por ejemplo en un combo box con el siguiente código:

                comboIdioma.ItemsSource = from language in ApplicationLanguages.ManifestLanguages
                                          select new LanguageCapsule() { Language = new Language(language) };


    La clase LanguageCapsule está para simplificar las cosas a la hora de mostrar el idioma sobrecargando el método ToString. Su código es muy simple y yo la usaría como clase anidada:

            class LanguageCapsule
            {
                public Language Language { get; set; }
                public override string ToString() { return Language.NativeName; }
            }

    Ahora necesitamos que se produzca el cambio de idioma al realizar un cambio en la selección:

            private void comboIdioma_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
            {            
                ApplicationLanguages.PrimaryLanguageOverride = ((LanguageCapsule)comboIdioma.SelectedValue).Language.LanguageTag;
                this.Frame.Navigate(this.GetType());
            }

    Si queremos que el cambio sea persistente, tendríamos que guardar el LanguageTag del idioma (preferiblemente usando Roaming de Settings) y realizar la asignación de PrimaryLanguageOverride al lanzar la aplicación.

    Si además queremos que el cambio se haga "on-the-fly", sin necesidad de reabrir la aplicación, necesitamos decirle a la App que esté pendiente de esos cambios. Para ello lo mejor es usar esto dentro del método OnLaunched de nuestro App.xaml.cs:

    Windows.ApplicationModel.Resources.Core.ResourceManager.Current.DefaultContext.QualifierValues.MapChanged += (x, y) => { };

    A ver si con esto os sirve :)



    miércoles, 29 de agosto de 2012 20:38

Todas las respuestas

  • Buenas yo hago uso del siguiente código, aunque con los textos me va bien, pero las imagenes a veces permanece la del idioma anterior, alguien sabe porque puede ser.

    ApplicationData.Current.LocalSettings.Values["Lang"] = "es";

     
    miércoles, 29 de agosto de 2012 15:53
  • Hola Javier,

    Efectivamente puede hacerse que la interfaz de la aplicación sea la que seleccione el usuario y también que el cambio se haga al vuelo (sin falta de volver a abrir la aplicación). Para ello necesitamos hacer un par de cosas.

    Primero necesitamos listar los idiomas disponibles en la configuración. Esto podemos hacerlo de forma automática, por ejemplo en un combo box con el siguiente código:

                comboIdioma.ItemsSource = from language in ApplicationLanguages.ManifestLanguages
                                          select new LanguageCapsule() { Language = new Language(language) };


    La clase LanguageCapsule está para simplificar las cosas a la hora de mostrar el idioma sobrecargando el método ToString. Su código es muy simple y yo la usaría como clase anidada:

            class LanguageCapsule
            {
                public Language Language { get; set; }
                public override string ToString() { return Language.NativeName; }
            }

    Ahora necesitamos que se produzca el cambio de idioma al realizar un cambio en la selección:

            private void comboIdioma_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
            {            
                ApplicationLanguages.PrimaryLanguageOverride = ((LanguageCapsule)comboIdioma.SelectedValue).Language.LanguageTag;
                this.Frame.Navigate(this.GetType());
            }

    Si queremos que el cambio sea persistente, tendríamos que guardar el LanguageTag del idioma (preferiblemente usando Roaming de Settings) y realizar la asignación de PrimaryLanguageOverride al lanzar la aplicación.

    Si además queremos que el cambio se haga "on-the-fly", sin necesidad de reabrir la aplicación, necesitamos decirle a la App que esté pendiente de esos cambios. Para ello lo mejor es usar esto dentro del método OnLaunched de nuestro App.xaml.cs:

    Windows.ApplicationModel.Resources.Core.ResourceManager.Current.DefaultContext.QualifierValues.MapChanged += (x, y) => { };

    A ver si con esto os sirve :)



    miércoles, 29 de agosto de 2012 20:38