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

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

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

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贡献1830条经验 获得超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 关注
  • 150 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号