Skip to content

Nepitwin/I18N.Avalonia

Repository files navigation

Avalonia Internationalizing

License
Builds
.NET Core
Avalonia
Core NuGet
Prism NuGet
Reactive NuGet
Prism ReactiveUi

How to use it

Ressource manager files (.resx)

Prism registration

protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    containerRegistry.RegisterInstance<ILocalizer>(new Localizer(Properties.Resource.ResourceManager));
}

Include prism internationalizing module by .axaml

xmlns:i18N="clr-namespace:I18N.Avalonia.Prism;assembly=I18N.Avalonia.Prism"

Usage in .axaml

<StackPanel>
    <TextBlock Text="{i18N:PrismLocalization Welcome}"
               HorizontalAlignment="Center"
               VerticalAlignment="Center"
               Margin="0, 24, 0,24"
               FontSize="17"
               FontWeight="Heavy" />

    <Button Content="{i18N:PrismLocalization English}"
            Margin="0,0,0,8"
            Command="{Binding SwitchLanguage}"
            CommandParameter="en"/>

    <Button Content="{i18N:PrismLocalization German}"
            Margin="0,0,0,8"
            Command="{Binding SwitchLanguage}"
            CommandParameter="de"/>

</StackPanel>

ReactiveUi registration (Splat)

public override void RegisterServices()
{
    base.RegisterServices();
    Locator.CurrentMutable.RegisterLazySingleton(() => new Localizer(Properties.Resource.ResourceManager), typeof(ILocalizer));
}

Include reactive internatinalizing module by .axaml

xmlns:i18N="clr-namespace:I18N.Avalonia.ReactiveUi;assembly=I18N.Avalonia.ReactiveUi"

Usage in .axaml

<StackPanel>
    <TextBlock Text="{i18N:ReactiveUiLocalization Welcome}"
                HorizontalAlignment="Center"
                VerticalAlignment="Center"
                Margin="0, 24, 0,24"
                FontSize="17"
                FontWeight="Heavy" />

    <Button Content="{i18N:ReactiveUiLocalization English}"
            Margin="0,0,0,8"
            Command="{Binding SwitchLanguage}"
            CommandParameter="en"/>

    <Button Content="{i18N:ReactiveUiLocalization German}"
            Margin="0,0,0,8"
            Command="{Binding SwitchLanguage}"
            CommandParameter="de"/>

</StackPanel>

Usage in model view

public LanguageViewModel(ILocalizer i18N)
{
    i18N.LanguageChangedNotification += OnLanguageChangedNotification;
}

private void OnLanguageChangedNotification()
{
    Console.WriteLine(@"Change language to" + _localizer.Language.TwoLetterISOLanguageName);
    // Your binding can be changed here or notify property changed can be called to refresh
}

Language change

  • After language is set all binding properties will be automatic refreshed and LanguageChangedNotification is called to refresh bindings.
public LanguageViewModel(ILocalizer i18N)
{
    i18N.Language = new CultureInfo("de");
}

Acknowledgment

Thanks to Sakya which has written this nice blog to understand this behavior and to build a nuget package with some changes.