• Lexical
Show / Hide Table of Contents
  • Lexical.FileSystem
    • Introduction
    • Abstractions
      • IFileSystem
        • IFileSystem
        • IFileSystemBrowse
        • IFileSystemCreateDirectory
        • IFileSystemDelete
        • IFileSystemFileAttribute
        • IFileSystemMount
        • IFileSystemMove
        • IFileSystemObserve
        • IFileSystemOpen
      • IEvent
      • IEntry
      • IOption
      • IToken
    • FileSystem
    • VirtualFileSystem
    • MemoryFileSystem
    • EmbeddedFileSystem
    • HttpFileSystem
    • Decoration
    • IFileProvider
    • Utility
      • DisposeList
      • FileScanner
      • VisitTree
      • File Operation
  • Lexical.FileProvider
    • Introduction
    • Package
    • Package.Abstractions
    • Root
    • Zip
    • Dll
    • SharpCompress
    • SharpZipLib
    • FileScanner
    • Utils
  • Lexical.Localization
    • Introduction
    • Tutorial
    • Asset
      • IAsset
      • IStringAsset
    • Line
      • ILine
      • ILineFactory
      • ILineRoot
      • ILineFormat
      • ILineLogger
      • LineComparer
    • File
      • ILineReader
      • ILineWriter
      • Ini
      • Json
      • Xml
      • Resx
      • Resources
    • Miscellaneous
      • Plurality
      • ICulturePolicy
      • IStringFormat
      • Dependency Injection
    • Practices
      • Class Library
      • Class Library DI
      • Class Library DI opt.
  • Lexical.Utilities
    • Introduction
    • UnicodeString
    • FileScanner
    • Permutation
    • Tuples
    • StructList

ICulturePolicy

ICulturePolicy is an interface for controlling the active culture and the fallback culture(s).
/// <summary>
/// Interface for policy that returns active culture policy, and fallback cultures.
/// </summary>
public interface ICulturePolicy
{
    /// <summary>
    /// Array property returns the prefered culture as first element.
    /// Other cultures are considered fallback cultures.
    /// 
    /// For example: "en-UK", "en", "".
    /// </summary>
    CultureInfo[] Cultures { get; }
}

ICulturePolicyAssignable is interface for modifiable culture policy.

/// <summary>
/// Interface for policy that returns active culture policy, and fallback cultures.
/// </summary>
public interface ICulturePolicy
{
    /// <summary>
    /// Array property returns the prefered culture as first element.
    /// Other cultures are considered fallback cultures.
    /// 
    /// For example: "en-UK", "en", "".
    /// </summary>
    CultureInfo[] Cultures { get; }
}


The default implementation is CulturePolicy.

// Create policy
ICulturePolicyAssignable culturePolicy = new CulturePolicy();

ICulturePolicy is assigned to localization root from where if affects the constructed keys.

// Create localization source
var source = new Dictionary<string, string> {
    { "MyController:hello", "Hello World!" },
    { "en:MyController:hello", "Hello World!" },
    { "de:MyController:hello", "Hallo Welt!" }
};
// Create asset with culture policy
IAsset asset = new StringAsset(source, LineParameterPrinter.Default);
// Create root and assign culturePolicy
ILineRoot root = new LineRoot(asset, culturePolicy);

Direct way to use CulturePolicy is to assign prefered culture and fallback culture on the provider instance. Typical fallback culture is the root culture "".

// Set active culture and set fallback culture
ICulturePolicy cultureArray_ =
    new CulturePolicy().SetCultures(
        CultureInfo.GetCultureInfo("en-US"),
        CultureInfo.GetCultureInfo("en"),
        CultureInfo.GetCultureInfo("")
    );

They can also be assigned as strings.

// Create policy from array of cultures
ICulturePolicy culturePolicy = new CulturePolicy().SetCultures("en-US", "en", "");

.SetCultureWithFallbackCultures() assigns culture and its default fallback cultures.

// Create policy from culture, adds fallback cultures "en" and "".
ICulturePolicy culturePolicy = new CulturePolicy().SetCultureWithFallbackCultures("en-US");

Culture policy can be configured to use CultureInfo.CurrentCulture. Active culture can be controlled from that field.

// Set to use CultureInfo.CurrentCulture
ICulturePolicy culturePolicy = new CulturePolicy().SetToCurrentCulture();
// Change current culture
CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("en");

And CultureInfo.CurrentUICulture.

// Set to use CultureInfo.CurrentCulture
ICulturePolicy culturePolicy = new CulturePolicy().SetToCurrentUICulture();
// Change current culture
CultureInfo.CurrentUICulture = CultureInfo.GetCultureInfo("en");

And also current thread's culture.

// Set to use CultureInfo.CurrentCulture
ICulturePolicy culturePolicy = new CulturePolicy().SetToCurrentThreadCulture();
// Change current thread's culture
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en");
// Set to use CultureInfo.CurrentCulture
ICulturePolicy culturePolicy = new CulturePolicy().SetToCurrentThreadUICulture();
// Change current thread's culture
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en");

.SetFunc() assigns a delegate that uses the returned CultureInfo.

// Assign delegate 
ICulturePolicy culturePolicy = new CulturePolicy().SetFunc(() => CultureInfo.GetCultureInfo("fi"));

.SetSourceFunc() assigns a delegate that uses the returned ICulturePolicy.

// Assign delegate 
ICulturePolicy source = new CulturePolicy().SetToCurrentUICulture();
ICulturePolicy culturePolicy = new CulturePolicy().SetSourceFunc(() => source);

.ToSnapshot() takes an array snapshot of the source, fixing its value. .AsReadonly() creates a new policy where the enumerable cannot be changed. Together these two make an immutable policy.

// Freeze current culture
ICulturePolicy culturePolicy = new CulturePolicy()
    .SetToCurrentCulture()
    .ToSnapshot()
    .AsReadonly();

Resolve Examples

LineRoot.Global has a default CulturePolicy that uses the current thread's culture.

// Default CulturePolicy
Console.WriteLine(LineRoot.Global.Format("It is now {0:d} at {0:t}").Value(DateTime.Now));

This is similiar to C#'s String.Format.

// C#'s String.Format uses Thread.CurrentCulture
Console.WriteLine(String.Format("It is now {0:d} at {0:t}", DateTime.Now));

When explicit culture is appended to the ILine, then it overrides the culture in the ICulturePolicy.

// Format uses explicit CultureInfo "fi"
Console.WriteLine(LineRoot.Global.Format("It is now {0:d} at {0:t}").Value(DateTime.Now).Culture("fi"));
// Format uses explicit CultureInfo "sv"
Console.WriteLine(LineRoot.Global.Format("It is now {0:d} at {0:t}").Value(DateTime.Now).Culture("sv"));
// Format uses explicit CultureInfo "en"
Console.WriteLine(LineRoot.Global.Format("It is now {0:d} at {0:t}").Value(DateTime.Now).Culture("en"));

Links

  • Lexical.Localization.Abstractions (NuGet)
    • ICulturePolicy
  • Lexical.Localization (NuGet)
    • CulturePolicy
Back to top Copyright © 2015-2020 Toni Kalajainen