UI Text Translation with CSharp UI

paramjit 276 Reputation points

I am translating UI from one language to another. For that I added Resource files for all languages with appropriate string and values. Than I added the two classes as follows:

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

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

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


                public event PropertyChangedEventHandler PropertyChanged;

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

        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 = LocalizationResourceManager.Instance,
                return binding;

Now I able to translate the text in Xaml with <Label Text="{helper:Translate Label_Text}" />. But unable to do so in C# with ` new Label(Text=translate.Text=LocalizationResourceManager.Instance["Label_Text"]}. Csharp version shows text once and never changes

A Microsoft open-source app platform for building Android and iOS apps with .NET and C#.
4,916 questions
{count} votes

2 answers

Sort by: Most helpful
  1. Rob Caplan - MSFT 4,156 Reputation points Microsoft Employee

    The LocationResourceManager code you provided isn't the issue: the difference in behavior is based on how you call that code. It will work the same from C# as in Xaml if you call it in the same way. It's a bit easier in Xaml because Xaml has direct support for data binding, while C# requires you wire up the Binding explicitly.

    The XAML version works because it binds to the data, and the data binding updates when the underlying data updates:

    <Label Text="{helper:Translate Label_Text}" />.

    The C# code loads the Label.Text directly without binding the data. Since it's not bound to underlying data it doesn't listen for changes to the underlying data.

    new Label(Text=translate.Text=LocalizationResourceManager.Instance["Label_Text"]}.

    You can set up data binding from code by creating a Binding object as you do in your MarkupExtension and then assigning that to your Label. See https://learn.microsoft.com/en-us/dotnet/api/xamarin.forms.binding.-ctor?view=xamarin-forms for documentation and example code.

    label.SetBinding (Label.TextProperty, new Binding ( ... );


  2. 현명 지 1 Reputation point
                TranslateExtension teIR = new TranslateExtension();
                teIR.Text = AppResources.IR;
                this.RadioName3 = teIR.Text;