如何在Xamarin中强制本地化文化到en-US进行整个应用

时间:2015-10-07 12:10:09

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

如何强制 Xamain - Android / iOS 美国英语文化中工作,无论用户设置如何。 我在我的申请中遇到的问题是,该应用程序仅支持美国/英国英语,但如果用户将语言首选项更改为西班牙语,德语等,则数字日期等格式将更改。

例如, 2.35 将代表西班牙语,德语为 2,35

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

所以我怀疑是,

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

请帮忙。

7 个答案:

答案 0 :(得分:4)

我正在使用Xamarin Forms应用

App班级设置文化为我做了诀窍。

using System.Globalization;
using System.Threading;


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

答案 1 :(得分:4)

我尝试了Joehl方法,但它对我没用。我用过这种方法

XML

还创建了基本活动

在这里找到答案:

changing cultureinfo on android using xamarin and c#

答案 2 :(得分: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 :(得分:1)

您必须在应用中设置当前文化。本地化工作非常好。我就这样做了:

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

答案 4 :(得分:0)

如果您正在使用Localize类并设置了翻译扩展名和lang资源,则可以在运行时在每个平台项目中使用PC上的setLocale方法,使用接口{{1 }}:

ILocalize

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

我正在使用Xamarin.Forms应用,并且我有相同的要求,因此我最终在Xamarin.Forms上使用了MultilingualPlugin