[Applications] Set CultureInfo using LCID instread of locale (#3634)
authorhjhun <36876573+hjhun@users.noreply.github.com>
Fri, 1 Oct 2021 07:52:58 +0000 (16:52 +0900)
committerGitHub <noreply@github.com>
Fri, 1 Oct 2021 07:52:58 +0000 (16:52 +0900)
* Fix Getting CultureInfo

After this patch is applied, we use LCID to create CultureInfo properly.
If it's failed, we tries to create CultureInfo using ULocale.

Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
* Set CultureInfo before calling OnCreate()

While starting the application, the CultureInfo is wrong when the system
locale is 'uz_UZ@cyrillic'. For this case, we sets CurrentCultureInfo and
CurrentUICultureInfo using LCID of the default locale.

Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
* Fix GetCultureInfo() Method

Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
src/Tizen.Applications.Common/Interop/Interop.BaseUtilsi18n.cs
src/Tizen.Applications.Common/Tizen.Applications/CoreApplication.cs

index f2c6e01..b52d50a 100755 (executable)
@@ -27,17 +27,30 @@ internal static partial class Interop
     {
         [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);
     }
 }
index 91e9dea..f82edd1 100644 (file)
@@ -16,6 +16,7 @@
 
 using System;
 using System.Globalization;
+using System.Runtime.InteropServices;
 using System.Text;
 using System.Timers;
 using Tizen.Applications.CoreBackend;
@@ -141,6 +142,10 @@ namespace Tizen.Applications
         /// <since_tizen> 3 </since_tizen>
         protected virtual void OnCreate()
         {
+            string locale = ULocale.GetDefaultLocale();
+            ChangeCurrentUICultureInfo(locale);
+            ChangeCurrentCultureInfo(locale);
+
             Created?.Invoke(this, EventArgs.Empty);
         }
 
@@ -257,9 +262,14 @@ namespace Tizen.Applications
         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)
             {
@@ -277,28 +287,42 @@ namespace Tizen.Applications
             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);
@@ -347,6 +371,7 @@ namespace Tizen.Applications
             Script = GetScript(Locale);
             Country = GetCountry(Locale);
             Variant = GetVariant(Locale);
+            LCID = GetLCID(Locale);
         }
 
         internal string Locale { get; private set; }
@@ -354,6 +379,7 @@ namespace Tizen.Applications
         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)
         {
@@ -396,7 +422,7 @@ namespace Tizen.Applications
             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;
@@ -416,5 +442,28 @@ namespace Tizen.Applications
 
             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);
+        }
     }
 }