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"));