为了账号安全,请及时绑定邮箱和手机立即绑定

有没有办法在应用程序运行时更改语言

有没有办法在应用程序运行时更改语言

C#
慕盖茨4494581 2022-11-21 21:39:42

每个人。:) 我有一个具有多布局的应用程序,我正在尝试在运行该应用程序时更改语言。我发现这段代码可以帮助我更改语言


using Android.Content;

using Android.OS;


using Java.Util;


namespace RuntimeAppLanguage

{

    internal class 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

            var locale = new Locale(language);

            Locale.Default = locale;

            var configuration = context.Resources.Configuration;

            configuration.SetLocale(locale);

            configuration.SetLayoutDirection(locale);


            return context.CreateConfigurationContext(configuration);

        }


      

        }

    }

}

我试图让它在这种布局下工作,但我最终得到了循环:(


我想做的是当用户选中英语时,阿拉伯语开关变为取消选中等等。


查看完整描述

1 回答

?
牛魔王的故事

TA贡献1544条经验 获得超3个赞

我用“Chinese”,“English”和“Thailand”写了一个简单的例子,是否满足你的需求:

1.LanguageManager,代码同上。

2. MainActivity,包括一个TextView和一个Button;

3.在BaseActivity

public class BaseActivity: AppCompatActivity

{

    protected override void AttachBaseContext(Context @base)

    {

        base.AttachBaseContext(LanguageManager.LoadLanguage(@base));

    }


}

4.在可以设置语言的SettingActivity中,axml和你的类似


public class SettingActivity : BaseActivity, CompoundButton.IOnCheckedChangeListener

{

    private Switch swCh;

    private Switch swEn;

    private Switch swTh;

    private Bundle s;

    protected override void OnCreate(Bundle savedInstanceState)

    {

        base.OnCreate(savedInstanceState);

        SetContentView(Resource.Layout.setting);

        // Create your application here

        initView();

    }


    private void initView()

    {

        Button back = FindViewById<Button>(Resource.Id.back);

        back.Click += delegate { Finish(); };

        swCh = FindViewById<Switch>(Resource.Id.switch1);

        swEn = FindViewById<Switch>(Resource.Id.switch2);

        swTh = FindViewById<Switch>(Resource.Id.switch3);

        var s = GetSharedPreferences("myPreference", FileCreationMode.Private).GetString( "myLanguage", Locale.Default.Language);

        switch (s)

        {

            case "ch":

                swCh.Checked = true;

                break;

            case "en":

                swEn.Checked = true;

                break;

            case "th":

                swTh.Checked = true;

                break;

        }

        swCh.SetOnCheckedChangeListener(this);

        swEn.SetOnCheckedChangeListener(this);

        swTh.SetOnCheckedChangeListener(this);

    }


    public void OnCheckedChanged(CompoundButton buttonView, bool isChecked)

    {

        if (isChecked)

        {


        switch (buttonView.Id)

        {

            case Resource.Id.switch1:

                swEn.Checked = false;

                swTh.Checked = false;

                LanguageManager.ChangeLanguage(this, "ch");

                break;

            case Resource.Id.switch2:

                swCh.Checked = false;

                swTh.Checked = false;

                LanguageManager.ChangeLanguage(this, "en");

                    break;

            case Resource.Id.switch3:

                swEn.Checked = false;

                swCh.Checked = false;

                LanguageManager.ChangeLanguage(this, "th");

                    break;

        }

             //restart application to change language

            Intent intent = new Intent(this, typeof(MainActivity));

            intent.SetFlags(ActivityFlags.ClearTask | ActivityFlags.NewTask);

            StartActivity(intent);

        }

    }


}

5.创建包含每种语言的values-en , values-thstrings


a.值/字符串


<string name="change_language">改变语言</string>

<string name="setting">设置</string>

<string name="chinese">中文</string>

<string name="english">英语</string>

<string name="thailand">泰语</string>

b.values-en/字符串


<string name="change_language">change language</string>

<string name="setting">setting</string>

<string name="chinese">chinese</string>

<string name="english">english</string>

<string name="thailand">thailand</string>

c.values-th/字符串


<string name="change_language">เปลี่ยนภาษา</string>

<string name="setting">เปลี่ย</string>

<string name="chinese">ชาวจีน</string>

<string name="english">อังกฤษ</string>

<string name="thailand">ประเทศไทย</string>

ps: Text中的所有内容都要使用@string/***,并且每种语言在values/string


像这样的效果:

https://i.stack.imgur.com/JQl9X.gif

查看完整回答
反对 回复 2022-11-21
  • 1 回答
  • 0 关注
  • 7 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信