Table of Contents

Dividers

A divider is an identifier that divides multiple sets of translation values within a translation set. The most common divider would be a CultureInfo so you can have translated values for different cultures. But you can use anything really, because it results in a string key, as long as it implements the IDivider interface.

A ICurrentDividerProvider implementation is used to provide the divider to be used if no divider is given when requesting a translation value.

Specifying supported dividers

When registering TechTolk with your DI container, you have to specify which dividers you want to support. Building translation sets as well as requested translation values will only be possible with supported dividers.

To specify the supported dividers, you should use the IDividerConfigurationBuilder when calling .ConfigureDividers(Action<IDividerConfigurationBuilder>).

services
    .AddTechTolk()
    .ConfigureDividers(config => {
        config.AddSupportedDivider(CultureInfoDivider.FromCulture("nl-NL"));
        config.AddSupportedDivider(CultureInfoDivider.FromCulture("en-US"));
    });
Tip

You can use a shorthand extension method to use the built in CultureInfoDivider as dividers. This method also sets an ICurrentDividerProvider that returns the current UI culture of the current thread.

services
    .AddTechTolk()
    .UseCultureInfoDividers("nl-NL", "en-US")
    // (... translation sets)

The CultureInfoDivider contains an implicit operator so you can easily pass a string, where a CultureInfoDivider is asked. That's why you can pass in strings into the .UseCultureInfoDividers() extension method. Note that you can't use strings for obtaining translations for a specific divider, like _tolk.Translate("nl-NL", "MyKey"), as it will be seen as a call to Translate(string key, object? data). Use an actual IDivider implementation when needed.

The ICurrentDividerProvider

When a translation value is requested without specifying an IDivider, the configured implementation of ICurrentDividerProvider is used to get a divider to use for translating the value.

By default, an internal provider is used that will give you the current CultureInfo from the current UI thread. But you can use your own by calling .SetCurrentDividerProvider().

services
    .AddTechTolk()
    .ConfigureDividers(config => {
        
        // ...

        // Register your type as a singleton
        config.SetCurrentDividerProvider<MyCurrentDividerProvider>();

        // or you can register your instance with a factory method
        config.SetCurrentDividerProvider((serviceProvider) => {
            return new MyCurrentDividerProvider(serviceProvider.GetRequiredService<MyDependentService>());
        });
    });