Xamarin Android区域设置不变

问题描述 投票:0回答:3

我想在我的APP中更改语言环境...我读了很多文章,现在我有了这段代码,它不起作用并且没有给我一个错误:

  1. 我的语言活动

    公共类LanguageActivity:BaseActivity{

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.Language);
    
        LanguageManager.ChangeLanguage(this, "fa");
    
        Intent intent = new Intent(this, typeof(MainActivity));
        intent.SetFlags(ActivityFlags.ClearTask | ActivityFlags.NewTask);
        StartActivity(intent);
    }
    

    }

  2. My BaseActivity

    公共类BaseActivity:活动{

    protected override void AttachBaseContext(Context @base)
    {
        base.AttachBaseContext(LanguageManager.LoadLanguage(@base));
    }
    

    }

  3. 我的语言管理器

    公共类LanguageManager{

    private const string MYLANGUAGE = "myLanguage";
    private const string MYPREF = "myPreference";
    
    public static Context LoadLanguage(Context context)
    {
        var loadedLanguage = GetLanguage(context, Locale.Default.Language);
        return ChangeLanguage(context, loadedLanguage);
    }
    
    public static Context ChangeLanguage(Context context, string language)
    {
        SaveLanguage(context, language);
        if (Build.VERSION.SdkInt >= BuildVersionCodes.N)
        {
            return ChangeForAPI24(context, language);
        }
        return ChangeForLegacy(context, language);
    }
    
    private static string GetLanguage(Context context, string Language)
    {
        var privatePreference = context.GetSharedPreferences(MYPREF, FileCreationMode.Private);
        return privatePreference.GetString(MYLANGUAGE, Language);
    }
    
    private static void SaveLanguage(Context context, string language)
    {
        var privatePreference = context.GetSharedPreferences(MYPREF, FileCreationMode.Private);
        var editor = privatePreference.Edit();
        editor.PutString(MYLANGUAGE, language);
        editor.Apply();
    }
    
    private static Context ChangeForAPI24(Context context, string language)
    {
        // for api >= 24
        Locale locale = new Locale(language);
        Locale.Default = locale;
    
        var configuration = context.Resources.Configuration;
        configuration.SetLocale(locale);
        configuration.SetLayoutDirection(locale);
    
        return context.CreateConfigurationContext(configuration);
    }
    
    private static Context ChangeForLegacy(Context context, string language)
    {
        var locale = new Locale(language);
        Locale.Default = locale;
        var resources = context.Resources;
        var configuration = resources.Configuration;
        configuration.Locale = locale;
        resources.UpdateConfiguration(configuration, resources.DisplayMetrics);
        return context;
    }
    

    }

为什么不起作用?我读了thisthis。他们正在使用相同的方法!

PS1:我在那里有values-fa文件夹和Strings.xml。在手机设置中更改语言时,我看到了更改。因此,当我在电话上更改语言环境时,它就可以使用!

PS2:我简化了代码,这就是为什么我在LanguageActivity中删除了SharedPreference部分!

PS3:下载项目:Download

android xamarin locale
3个回答
0
投票

记录下来,我过去已经这样做过,并且在应用程序中更改语言是一个坏主意。它永远无法很好地工作,通常会带来很多错误。只让应用程序语言由手机语言设置来确定会更好。

如果您确实需要通过应用更改语言,尽管您需要在配置中设置语言环境:

Configuration config = BaseContext.Resources.Configuration;
config.Locale = myLocale;
BaseContext.Resources.UpdateConfiguration(config, BaseContext.Resources.DisplayMetrics);

其中MyLocale是要设置的语言,例如

var myLocale = new Locale("en");

编辑:更新为xamarin代码


0
投票

对于Xamarin.Android,您可以这样操作:

  • 像这样创建自己的上下文包装器:

     public class MyContextWrapper : ContextWrapper
    {
       public MyContextWrapper(Context context) : base(context)          
       {
    
       }
    public static Locale getSystemLocaleLegacy(Configuration config)
    {
        return config.Locale;
    }
    public static Locale getSystemLocale(Configuration config)
    {
        return config.Locales.Get(0);
    }
    public static void setSystemLocaleLegacy(Configuration config, Locale locale)
    {
        config.SetLocale(locale);
        config.SetLayoutDirection(locale);
    }
    public static void setSystemLocale(Configuration config, Locale locale)
    {
        config.SetLocale(locale);
        config.SetLayoutDirection(locale);
    }
    
    public static ContextWrapper wrap(Context context, string language)
    {
        Configuration config = context.Resources.Configuration;
        Locale sysLocale = null;
        if (Build.VERSION.SdkInt >= BuildVersionCodes.N)
        {
            sysLocale = getSystemLocale(config);
        }
        else
        {
            sysLocale = getSystemLocaleLegacy(config);
        }
    
        Locale locale;
    
        if (language == "en")
        {
            locale = new Locale(language, "US");
        }
        else if (language == "zh")
        {
            locale = new Locale(language, "CN");
        }
        else
        {
            locale = new Locale("en", "US");
        }
    
        Locale.Default = (locale);
    
        if (Build.VERSION.SdkInt >= BuildVersionCodes.N)
        {
            setSystemLocale(config, locale);
        }
        else
        {
            setSystemLocaleLegacy(config, locale);
        }
    
        if (Build.VERSION.SdkInt >= BuildVersionCodes.JellyBeanMr1)
        {
            context = context.CreateConfigurationContext(config);
        }
        else
        {
            context.Resources.UpdateConfiguration(config, context.Resources.DisplayMetrics);
        }
    
        return new MyContextWrapper(context);
    }
    

    }

  • 将以下代码添加到您的活动中:

     protected override void AttachBaseContext(Context @base)
     {
        try
        {              
            base.AttachBaseContext(MyContextWrapper.wrap(@base,"Your_language"));
        }
        catch{}
     }
    

请确保每次您的语言更改时都重新启动当前活动。

另外,请根据您的语言要求尝试更新我的代码

祝你好运,

如有疑问,请随时回来


0
投票

抱歉,稍后再回答,我周末不上班,我测试您的项目。问题是您没有让LoginActivity扩展为BaseActivity。您应该让所有活动都扩展为BaseActivity

更改

public class LoginActivity : Activity

public class LoginActivity : BaseActivity
© www.soinside.com 2019 - 2024. All rights reserved.