我如何在Xamarin中强制整个应用的本地化文化进入美国?

本文关键字:本地化 应用 文化进 美国 Xamarin | 更新日期: 2023-09-27 18:16:30

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

例如,

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

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

所以我的疑问是

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

请帮。

我如何在Xamarin中强制整个应用的本地化文化进入美国?

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

App类中设置文化对我来说很有效。

using System.Globalization;
using System.Threading;

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

您可以使用以下属性设置默认区域性:

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

我尝试了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);

还创建了一个基本活动

在这里找到答案:

在android上使用xamarin和c#修改cultureinfo

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

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://learn.microsoft.com/en-us/xamarin/cross-platform/app-fundamentals/localization

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

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

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

基本上,我没有发现需要创建一个新的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或星期六,它显示星期六!

我正在研制Xamarin。表单应用程序和我有相同的要求,我最终使用了MultilingualPlugin for Xamarin。形式