FallbackCultureProvider
ILocalization.FallbackCultureProvider is a property (IProvider<string, string[]>) that determines which cultures are to be used for fallback when resource for requested culture is not found.
// Get culture provider
IProvider<string, string[]> fallbackCultureProvider = Localization.Default.FallbackCultureProvider;
// Retrieve fallback cultures
string[] fallbackCultures = fallbackCultureProvider["fi-FI"];
// Print fallback cultures in evaluation order
WriteLine($"\"{String.Join("\" → \"", fallbackCultures)}\""); // "fi-FI" → "fi" → ""
FallbackCultureProvider.Default provider returns following cultures:
- Requested culture
- Requested culture's parents
- Culture from application assembly's System.Resources.NeutralResourcesLanguageAttribute.
- Application's fallback culture parents
- Invariant culture ""
The default culture provider searches for System.Resources.NeutralResourcesLanguageAttribute from application assembly (not from class libraries).
[assembly: System.Resources.NeutralResourcesLanguageAttribute("en-UK")]
If [NeutralResourcesLanguage] is detected, then its fallback cultures are also provided.
// Get culture provider
IProvider<string, string[]> fallbackCultureProvider = Localization.Default.FallbackCultureProvider;
// Retrieve fallback cultures
string[] fallbackCultures = fallbackCultureProvider["fi-FI"];
// Print fallback cultures in evaluation order
WriteLine($"\"{String.Join("\" → \"", fallbackCultures)}\""); // "fi-FI" → "fi" → "en-UK" → "en" → ""
new FallbackCultureProvider(culture) creates culture provider that uses the specified fallback culture, or 'null' for none. It also returns invariant culture. This constructor does not use [NeutralResourcesLanguageAttribute].
// Create localization
ILocalization localization = new Localization()
.SetFallbackCultureProvider(new FallbackCultureProvider("sv"));
// Get fallback cultures
string[] fallbackCultures = localization.FallbackCultureProvider["fi-FI"];
// Print fallback cultures in evaluation order
WriteLine($"\"{String.Join("\" → \"", fallbackCultures)}\""); // "fi-FI" → "fi" → "sv" → ""
FallbackCultureProvider.Get(culture) gets or creates cached culture provider.
// Create localization
ILocalization localization = new Localization();
// Assign culture provider "en"
localization.FallbackCultureProvider = FallbackCultureProvider.Get("en");
// Get fallback cultures
string[] fallbackCultures = localization.FallbackCultureProvider["fi-FI"];
// Print fallback cultures in evaluation order
WriteLine($"\"{String.Join("\" → \"", fallbackCultures)}\""); // "fi-FI" → "fi" → "en" → ""
FallbackCultureProvider.Invariant returns "" as fallback culture.
// Create localization
ILocalization localization = new Localization();
// Assign culture provider "en"
localization.FallbackCultureProvider = FallbackCultureProvider.Invariant;
// Get fallback cultures
string[] fallbackCultures = localization.FallbackCultureProvider["fi-FI"];
// Print fallback cultures in evaluation order
WriteLine($"\"{String.Join("\" → \"", fallbackCultures)}\""); // "fi-FI" → "fi" → "en" → ""
Culture provider can be adapted from delegate.
// Create fallback provider function
Func<string, string[]> func = culture => new string[] { culture, "en", "" }.Distinct().ToArray();
// Create provider
IProvider<string, string[]> fallbackCultureProvider = Providers.Func(func).Cached();
// Get fallback cultures
string[] fallbackCultures = fallbackCultureProvider["fi"];
// Print fallback cultures in evaluation order
WriteLine($"\"{String.Join("\" → \"", fallbackCultures)}\""); // "fi" → "en" → ""
FallbackCultureProvider.NoFallback is provider that does not use fallback.
// Get culture provider
IProvider<string, string[]> fallbackCultureProvider = FallbackCultureProvider.NoFallback;
// Retrieve fallback cultures
string[] fallbackCultures = fallbackCultureProvider["fi-FI"];
// Print fallback cultures in evaluation order
WriteLine($"\"{String.Join("\" → \"", fallbackCultures)}\""); // "fi-FI"
The localization.FallbackCultureProvider is applied to all the providers in the 'localization'.
// Create localization
ILocalization localization = new Localization()
.SetFallbackCultureProvider(FallbackCultureProvider.Default)
.AddLines(new LocalizationReaderYaml.File("fallbackcultureprovider/fallbackcultureprovider.l.yaml"));
// Get localizable text
ILocalizableText localizable = localization.LocalizableTextCached["Namespace.HelloCasual"];
// Cultures to print with
foreach (string requested_culture in new string[] { "en", "en-NZ", "en-AU", "en-UK", "en-US", "en-CA" })
{
// Localize to culture
ILocalizedText localized = localizable.Localize(requested_culture)?.Value!;
// Get the culture where fallback landed to
string supplied_culture = localized.Culture;
// Print text
WriteLine($"{requested_culture,-5} {supplied_culture,-5}: {localized.Print(null)}");
}
// en en : Hello fella
// en-NZ en : Hello fella
// en-AU en-AU: Hello mate
// en-UK en-UK: Hello chap
// en-US en-US: Hello dude
// en-CA en-CA: Hello buddy
fallbackcultureprovider/fallbackcultureprovider.l.yaml [Demo]
TemplateFormat: Detect
Items:
- Key: Namespace.HelloCasual
Items:
- Text: "Hello fella"
Culture: en
- Text: "Hello mate"
Culture: en-AU
- Text: "Hello chap"
Culture: en-UK
- Text: "Hello dude"
Culture: en-US
- Text: "Hello buddy"
Culture: en-CA
Full Example
Full example
using System.Globalization;
using Avalanche.Localization;
using Avalanche.Utilities.Provider;
using static System.Console;
class fallbackcultureprovider
{
public static void Run()
{
{
// <01>
// Get culture provider
IProvider<string, string[]> fallbackCultureProvider = Localization.Default.FallbackCultureProvider;
// Retrieve fallback cultures
string[] fallbackCultures = fallbackCultureProvider["fi-FI"];
// Print fallback cultures in evaluation order
WriteLine($"\"{String.Join("\" → \"", fallbackCultures)}\""); // "fi-FI" → "fi" → ""
// </01>
}
{
// <02>
// Get culture provider
IProvider<string, string[]> fallbackCultureProvider = Localization.Default.FallbackCultureProvider;
// Retrieve fallback cultures
string[] fallbackCultures = fallbackCultureProvider["fi-FI"];
// Print fallback cultures in evaluation order
WriteLine($"\"{String.Join("\" → \"", fallbackCultures)}\""); // "fi-FI" → "fi" → "en-UK" → "en" → ""
// </02>
}
{
// <03>
// Create localization
ILocalization localization = new Localization()
.SetFallbackCultureProvider(new FallbackCultureProvider("sv"));
// Get fallback cultures
string[] fallbackCultures = localization.FallbackCultureProvider["fi-FI"];
// Print fallback cultures in evaluation order
WriteLine($"\"{String.Join("\" → \"", fallbackCultures)}\""); // "fi-FI" → "fi" → "sv" → ""
// </03>
}
{
// <03A>
// Create localization
ILocalization localization = new Localization();
// Assign culture provider "en"
localization.FallbackCultureProvider = FallbackCultureProvider.Get("en");
// Get fallback cultures
string[] fallbackCultures = localization.FallbackCultureProvider["fi-FI"];
// Print fallback cultures in evaluation order
WriteLine($"\"{String.Join("\" → \"", fallbackCultures)}\""); // "fi-FI" → "fi" → "en" → ""
// </03A>
}
{
// <03B>
// Create localization
ILocalization localization = new Localization();
// Assign culture provider "en"
localization.FallbackCultureProvider = FallbackCultureProvider.Invariant;
// Get fallback cultures
string[] fallbackCultures = localization.FallbackCultureProvider["fi-FI"];
// Print fallback cultures in evaluation order
WriteLine($"\"{String.Join("\" → \"", fallbackCultures)}\""); // "fi-FI" → "fi" → "en" → ""
// </03B>
}
{
// <04>
// Create fallback provider function
Func<string, string[]> func = culture => new string[] { culture, "en", "" }.Distinct().ToArray();
// Create provider
IProvider<string, string[]> fallbackCultureProvider = Providers.Func(func).Cached();
// Get fallback cultures
string[] fallbackCultures = fallbackCultureProvider["fi"];
// Print fallback cultures in evaluation order
WriteLine($"\"{String.Join("\" → \"", fallbackCultures)}\""); // "fi" → "en" → ""
// </04>
}
{
// <05>
// Get culture provider
IProvider<string, string[]> fallbackCultureProvider = FallbackCultureProvider.NoFallback;
// Retrieve fallback cultures
string[] fallbackCultures = fallbackCultureProvider["fi-FI"];
// Print fallback cultures in evaluation order
WriteLine($"\"{String.Join("\" → \"", fallbackCultures)}\""); // "fi-FI"
// </05>
}
{
// <06>
// Create localization
ILocalization localization = new Localization()
.SetFallbackCultureProvider(FallbackCultureProvider.Default)
.AddLines(new LocalizationReaderYaml.File("fallbackcultureprovider/fallbackcultureprovider.l.yaml"));
// Get localizable text
ILocalizableText localizable = localization.LocalizableTextCached["Namespace.HelloCasual"];
// Cultures to print with
foreach (string requested_culture in new string[] { "en", "en-NZ", "en-AU", "en-UK", "en-US", "en-CA" })
{
// Localize to culture
ILocalizedText localized = localizable.Localize(requested_culture)?.Value!;
// Get the culture where fallback landed to
string supplied_culture = localized.Culture;
// Print text
WriteLine($"{requested_culture,-5} {supplied_culture,-5}: {localized.Print(null)}");
}
// en en : Hello fella
// en-NZ en : Hello fella
// en-AU en-AU: Hello mate
// en-UK en-UK: Hello chap
// en-US en-US: Hello dude
// en-CA en-CA: Hello buddy
// </06>
}
}
}