Dynamically Updating Language Library in MAUI

Dynamically updating language library in MAUI

  1. Create a class.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    public class LocalizationResourceManager : INotifyPropertyChanged
    {
        private LocalizationResourceManager()
        {
            AppResources.Culture = CultureInfo.CurrentCulture;
        }
    
        public static LocalizationResourceManager Instance { get; } = new();
    
        public object this[string resourceKey] =>
            AppResources.ResourceManager.GetObject(resourceKey, AppResources.Culture) ?? Array.Empty<byte>();
    
        public event PropertyChangedEventHandler? PropertyChanged;
    
        public void SetCulture(CultureInfo culture)
        {
            AppResources.Culture = culture;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(null));
        }
    }
    

    This class creates a static instance Instance.

  2. Create resource files.
    Create a new project Resource1.resx.

  3. Switch languages.

    1
    2
    
    LocalizationResourceManager.Instance.SetCulture(new CultureInfo("zh"));
    LocalizationResourceManager.Instance.SetCulture(new CultureInfo("en"));
    
  4. Frontend reference.
    Add namespace reference.

    1
    
    xmlns:resources="clr-namespace:RuiChao.Resource.Classes;assembly=RuiChao.Resource"
    

    Direct static binding.

    1
    
    <Label Text="{Binding Source={x:Static resources:LocalizationResourceManager.Instance}, Path=[Ventilation]}" />
    

    Create a resource dictionary binding.

    1
    2
    3
    4
    
    <ResourceDictionary>
        <x:StaticExtension Member="resources:LocalizationResourceManager.Instance" x:Key="Localization"/>   
    </ResourceDictionary>
    <Label Text="{Binding Source={StaticResource Localization}, Path=[MainTitle]}" />
    

    If dynamic updates are not needed, bind directly to text resources.

    1
    2
    
    xmlns:resources="clr-namespace:RuiChao.Resource.Localization;assembly=RuiChao.Resource"
    <RadioButton Content="{x:Static resources:AppResources.Ventilation}" Value="{x:Byte 0}" />
    
  5. Backend reference.

    1
    
    string Name = $"{LocalizationResourceManager.Instance["Volume"]}";
    
Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy