{
[DllImport(Libraries.BaseUtilsi18n, EntryPoint = "i18n_ulocale_canonicalize")]
internal static extern Int32 Canonicalize(string localeID, [Out] StringBuilder name, Int32 nameCapacity);
+ // int32_t i18n_ulocale_canonicalize(const char *locale_id, char *name, int32_t name_capacity);c
[DllImport(Libraries.BaseUtilsi18n, EntryPoint = "i18n_ulocale_get_language")]
- internal static extern Int32 GetLanguage(string localeID, [Out] StringBuilder language, Int32 languageCapacity, out int bufSizeLanguage);
+ internal static extern int GetLanguage(string localeID, [Out] StringBuilder language, Int32 languageCapacity, out int bufSizeLanguage);
+ // int i18n_ulocale_get_language(const char *locale_id, char *language, int32_t language_capacity, int32_t *buf_size_language);
[DllImport(Libraries.BaseUtilsi18n, EntryPoint = "i18n_ulocale_get_script")]
internal static extern Int32 GetScript(string localeID, [Out] StringBuilder script, Int32 scriptCapacity);
+ // int32_t i18n_ulocale_get_script(const char *locale_id, char *script, int32_t script_capacity);
[DllImport(Libraries.BaseUtilsi18n, EntryPoint = "i18n_ulocale_get_country")]
internal static extern Int32 GetCountry(string localeID, [Out] StringBuilder country, Int32 countryCapacity, out int err);
+ // int32_t i18n_ulocale_get_country(const char *locale_id, char *country, int32_t country_capacity, int *error);
[DllImport(Libraries.BaseUtilsi18n, EntryPoint = "i18n_ulocale_get_variant")]
internal static extern Int32 GetVariant(string localeID, [Out] StringBuilder variant, Int32 variantCapacity);
+ // int32_t i18n_ulocale_get_variant(const char *locale_id, char *variant, int32_t variant_capacity);
+
+ [DllImport(Libraries.BaseUtilsi18n, EntryPoint = "i18n_ulocale_get_lcid")]
+ internal static extern UInt32 GetLCID(string localeID);
+ // uint32_t i18n_ulocale_get_lcid(const char *locale_id);
+
+ [DllImport(Libraries.BaseUtilsi18n, EntryPoint = "i18n_ulocale_get_default")]
+ internal static extern int GetDefault(out IntPtr localeID);
+ // int i18n_ulocale_get_default(const char **locale);
}
}
using System;
using System.Globalization;
+using System.Runtime.InteropServices;
using System.Text;
using System.Timers;
using Tizen.Applications.CoreBackend;
/// <since_tizen> 3 </since_tizen>
protected virtual void OnCreate()
{
+ string locale = ULocale.GetDefaultLocale();
+ ChangeCurrentUICultureInfo(locale);
+ ChangeCurrentCultureInfo(locale);
+
Created?.Invoke(this, EventArgs.Empty);
}
private CultureInfo ConvertCultureInfo(string locale)
{
ULocale pLocale = new ULocale(locale);
+
try
{
- return new CultureInfo(pLocale.Locale.Replace("_", "-"));
+ return new CultureInfo(pLocale.LCID);
+ }
+ catch (ArgumentOutOfRangeException)
+ {
+ return GetFallbackCultureInfo(pLocale);
}
catch (CultureNotFoundException)
{
CultureInfo.CurrentUICulture = ConvertCultureInfo(locale);
}
+ private bool ExistCultureInfo(string locale)
+ {
+ foreach (var cultureInfo in CultureInfo.GetCultures(CultureTypes.AllCultures))
+ {
+ if (cultureInfo.Name == locale)
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
private CultureInfo GetCultureInfo(string locale)
{
- CultureInfo cultureInfo = null;
+ if (!ExistCultureInfo(locale))
+ {
+ return null;
+ }
try
{
- cultureInfo = new CultureInfo(locale);
+ return new CultureInfo(locale);
}
catch (CultureNotFoundException)
{
return null;
}
-
- return cultureInfo;
}
private CultureInfo GetFallbackCultureInfo(ULocale uLocale)
{
- string locale = string.Empty;
- CultureInfo fallbackCultureInfo = null;
+ string locale = uLocale.Locale.Replace("_", "-");
+ CultureInfo fallbackCultureInfo = GetCultureInfo(locale);
- if (uLocale.Script != null && uLocale.Country != null)
+ if (fallbackCultureInfo == null && uLocale.Script != null && uLocale.Country != null)
{
locale = uLocale.Language + "-" + uLocale.Script + "-" + uLocale.Country;
fallbackCultureInfo = GetCultureInfo(locale);
Script = GetScript(Locale);
Country = GetCountry(Locale);
Variant = GetVariant(Locale);
+ LCID = GetLCID(Locale);
}
internal string Locale { get; private set; }
internal string Script { get; private set; }
internal string Country { get; private set; }
internal string Variant { get; private set; }
+ internal int LCID { get; private set; }
private string Canonicalize(string localeName)
{
int err = 0;
// Get the country name from ICU
- StringBuilder sb = new StringBuilder(ULOC_SCRIPT_CAPACITY);
+ StringBuilder sb = new StringBuilder(ULOC_COUNTRY_CAPACITY);
if (Interop.BaseUtilsi18n.GetCountry(locale, sb, sb.Capacity, out err) <= 0)
{
return null;
return sb.ToString();
}
+
+ private int GetLCID(string locale)
+ {
+ // Get the LCID from ICU
+ uint lcid = Interop.BaseUtilsi18n.GetLCID(locale);
+ return (int)lcid;
+ }
+
+ internal static string GetDefaultLocale()
+ {
+ IntPtr stringPtr = IntPtr.Zero;
+ if (Interop.BaseUtilsi18n.GetDefault(out stringPtr) != 0)
+ {
+ return string.Empty;
+ }
+
+ if (stringPtr == IntPtr.Zero)
+ {
+ return string.Empty;
+ }
+
+ return Marshal.PtrToStringAnsi(stringPtr);
+ }
}
}