【问题标题】:How can I force Localization Culture to en-US for whole applicaiton in Xamarin如何在 Xamarin 中强制本地化文化以 en-US 进行整个应用程序
【发布时间】:2015-10-07 12:10:08
【问题描述】:

无论用户设置如何,如何强制 Xamain - Android / iOS美国英语 文化中工作。 我在应用程序中面临的问题是,该应用程序仅支持美国/英国英语,但如果用户将语言偏好更改为西班牙语、德语等。数字日期等格式将会改变。

例如, 2.35 将在西班牙语、德语中表示为 2,35

因此,如果用户尝试使用类似语言的应用程序,应用程序将丢失行为或崩溃。在我尝试Convert.ToDouble("2,35"); 或类似的情况下会发生崩溃。

所以我的疑问是,

是否可以在 Xamarin 中强制将文化设置为 en-US。可能在一个地方,否则我需要在执行转换的所有地方更改它。

请帮忙。

【问题讨论】:

    标签: c# xamarin xamarin.ios xamarin.android


    【解决方案1】:

    我正在使用Xamarin Forms 应用程序。

    App 类中设置文化对我有用。

    using System.Globalization;
    using System.Threading;
    
    
    private void SetCultureToUSEnglish()
    {
        CultureInfo englishUSCulture = new CultureInfo("en-US");
        CultureInfo.DefaultThreadCurrentCulture = englishUSCulture;
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用以下属性设置默认文化:

      CultureInfo.DefaultThreadCurrentCulture
      

      但这不适用于 Android。因此,对于 Android,您需要在每次恢复活动时设置文化。您可以添加一个基本活动,如:

      internal class MyBaseActivity : Activity
      {
          protected override void OnResume ()
          {
              base.OnResume ();
      
              // Here you would read it from where ever.
              var userSelectedCulture = new CultureInfo ("fr-FR");
      
              Thread.CurrentThread.CurrentCulture = userSelectedCulture;
          }
      }
      

      在 xamarin 论坛中找到:https://forums.xamarin.com/discussion/9764/how-to-set-a-global-cultureinfo-for-an-app

      【讨论】:

        【解决方案3】:

        我尝试了 Joehl 的方法,但它对我不起作用。我使用了这种方法

                string cultureName = "es-US";
                var locale = new Java.Util.Locale(cultureName);
                Java.Util.Locale.Default = locale;
        
                var config = new Android.Content.Res.Configuration { Locale = locale };
                BaseContext.Resources.UpdateConfiguration(config, BaseContext.Resources.DisplayMetrics);
        

        还创建了一个基础活动

        在这里寻找答案:

        changing cultureinfo on android using xamarin and c#

        【讨论】:

        • UpdateConfiguration 似乎已被弃用。有什么好的选择?
        【解决方案4】:

        您必须在应用中设置当前文化。本地化效果非常好。我就是这样做的:

        public void SetLocale(CultureInfo ci)
            {
                Thread.CurrentThread.CurrentCulture = ci;
                Thread.CurrentThread.CurrentUICulture = ci;
        
            }
        

        在这里您可以从设备中获得文化:

        public CultureInfo GetCurrentCultureInfo()
            {
                var netLanguage = "en";
                if (NSLocale.PreferredLanguages.Length > 0)
                {
                    var pref = NSLocale.PreferredLanguages[0];
        
                    netLanguage = iOSToDotnetLanguage(pref);
                }
        
                // this gets called a lot - try/catch can be expensive so consider caching or something
                CultureInfo ci = null;
                try
                {
                    ci = new CultureInfo(netLanguage);
                }
                catch (CultureNotFoundException e1)
                {
                }
             }
        private string iOSToDotnetLanguage(string iOSLanguage)
            {
             // Testing special cases..
            }
        

        如果您使用 PCL 项目,请使用抽象。在 PCL 中使用接口及其在原生项目中的实现。

        您可以在此处查看更多信息: https://docs.microsoft.com/en-us/xamarin/cross-platform/app-fundamentals/localization

        【讨论】:

        • 在 App.CS 中设置一次就足够了,还是应该在每个 viewModel 或后面的代码中设置本地?
        • @Ali123 抱歉我现在不小心看到评论,下次引用我的名字,所以我会收到通知。当你启动你的应用程序时,只做一次就足够了,初始化它就是这样。希望对您有所帮助!
        【解决方案5】:

        如果您使用 Localize 类并设置了翻译扩展和语言资源,则可以在运行时从 PCL 使用接口 ILocalize 调用每个平台项目中可用的 setLocale 方法,如下所示:

        CultureInfo ci=new CultureInfo("en-US");
        Xamarin.Forms.DependencyService.Get<ILocalize>().SetLocale(ci);                      
        AppResources.Culture = ci;
        

        【讨论】:

          【解决方案6】:

          我的解决方案是结合使用其他答案!

          基本上,我没有发现需要创建一个新的 Activity 并按照建议进行扩展。相反,我在 MainActivity.cs 中添加了以下覆盖:

            protected override void OnResume()
                  {
                      base.OnResume();
          
                      try
                      {
                          var userSelectedCulture = new CultureInfo("en-GB");
          
                          Thread.CurrentThread.CurrentCulture = userSelectedCulture;
                      }
                      catch (Exception exception)
                      {
          
                          Console.WriteLine(exception.Message);
                      }
                  }
          

          然后,在 OnCreate 中,我添加了以下内容:

            try
                      {
                          string cultureName = "en-GB";
                          var locale = new Java.Util.Locale(cultureName);
                          Java.Util.Locale.Default = locale;
          
                          var configg = new Android.Content.Res.Configuration { Locale = locale };
                          BaseContext.Resources.UpdateConfiguration(configg, BaseContext.Resources.DisplayMetrics);
                      }
                      catch (Exception e)
                      {
                          Console.WriteLine(e);
          
                      }
          

          我在模拟器中对其进行了测试,方法是将语言更改为法语并显示一个简单的 DateTime,以确定今天是显示为 samedi 还是星期六,然后显示为星期六!

          【讨论】:

            【解决方案7】:

            我正在开发一个 Xamarin.Forms 应用程序,我有同样的要求,我最终为 Xamarin.Forms 使用了 MultilingualPlugin

            【讨论】:

            • MultilingualPlugin 已弃用且不再受支持...所以请为自己保存一个链接点击
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多