Creazione di app multilingua in Xamarin

App multilingua in Xamarin

Francesco FrontaliBy Francesco FrontaliOttobre 2, 20204 Minuti

La gestione di più lingue è uno dei requisiti più comuni per le app mobili. La buona notizia è che la creazione di app multilingua in Xamarin è un’operazione piuttosto semplice. Può sembrare un compito difficile all’inizio, sfruttando le funzionalità offerte da .NET il tutto si rivela facile ed immediato.

In questo articolo, vedremo brevemente come fare e parleremo di alcuni problemi tipici che potresti incontrare e di come risolverli. Se hai bisogno di saperne di più su Xamarin, prima di andare avanti ti consigliamo di visitare il sito ufficiale o di leggere il nostro post dedicato a questo framework.

IMPOSTARE L’APP CULTURE

Può capitare che i requisiti progettuali non prevedano la necessità di cambiare dinamicamente lingua una volta avviata l’app, ad esempio se si tratta di app aziendali. In questo caso è sufficiente associare le stringhe XAML direttamente nella classe AppResources.

Il codice per impostare la Culture può essere tranquillamente nel metodo Startup della classe App:

Thread.CurrentThread.CurrentUICulture = language;
AppResources.Culture = language;
App.Current.MainPage = new NavigationPage(new MainPage());

LOCALIZZAZIONE DEI TESTI

Dal momento che AppResources è una classe statica, possiamo accedere direttamente al codice C# in un paio di passaggi.

Aggiungendo la stringa al file Resources:

<data name="WelcomeText" xml:space="preserve">
    <value>Welcome to my App</value>
</data>

E richiamandola quando occorre:

var text = AppResources.WelcomeText

IMPLEMENTARE IL CAMBIO LINGUA A RUNTIME

Se invece l’esigenza è quella di creare una funzione di cambio lingua su input dell’utente, allora bisogna seguire un approccio diverso. Possiamo creare una classe adhoc, chiamata LocalizationResourceManager, che gestisca i cambi lingua attraverso una specifica proprietà. In pratica, quando la lingua cambia, la proprietà viene invalidata forzando la modifica del valore.

public class LocalizationResourceManager : INotifyPropertyChanged
{
    public static LocalizationResourceManager Instance { get; } = new LocalizationResourceManager();

    public string this[string text]
    {
        get
        {
            return AppResources.ResourceManager.GetString(text, AppResources.Culture);
        }
    }

    public void SetCulture(CultureInfo language)
    {
        Thread.CurrentThread.CurrentUICulture = language;
        AppResources.Culture = language;

        Invalidate();
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void Invalidate()
    {
       PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(null));
    }
}

Invece di eseguire direttamente il binding delle stringhe in AppResources, possiamo utilizzare una classe TranslateExtension che restituisca una BindingProperty, che esegua il bind del LocalizationResourceManager.

[ContentProperty("Text")]
public class TranslateExtension : IMarkupExtension<bindingbase>
{
    public string Text { get; set; }
    object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider)
    {
        return ProvideValue(serviceProvider);
    }

    public BindingBase ProvideValue(IServiceProvider serviceProvider)
    {
        var binding = new Binding
        {
            Mode = BindingMode.OneWay,
            Path = $"[{Text}]",
            Source = ResourceManagerHelper.Instance,
        };
        return binding;
    }
}

Infine, all’interno del nostro XAML è sufficiente richiamare la nostra estensione nel modo seguente:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MultilingualXFSample.Views.ChangeLanguagePage"
             xmlns:helpers="clr-namespace:MultilingualXFSample.Helpers">

         <Label  Text="{helpers:Translate SelectLanguage}" />
</ContentPage>

CONCLUSIONI

Abbiamo visto come sia semplice la creazione di un’app multilingua in Xamarin se non abbiamo necessità di effettuare un cambio a runtime. Qualora invece si dovesse rendere necessario dare la possibilità all’utente di scegliere la propria lingua una volta avviata l’app, basta creare un paio di classi custom in più ed il gioco è fatto.

Se hai bisogno di più informazioni o desideri realizzare un’app multilingua in Xamarin, contattaci