安卓手机:如何检测语言设置已更改

8

如何检测手机语言是否已更改,例如Facebook应用程序会提示:请稍候,我们正在准备您的语言

我在onCreate()中使用了myString = Locale.getDefault().getDisplayLanguage();

在我的onCreate()

@Override
    public void onCreate(Bundle savedInstanceState) {
        String myString = Locale.getDefault().getDisplayLanguage();
        if(myString.equals("en"){
            ProgressDialog progressDialog = new ProgressDialog(getApplicationContext());
            progressDialog.setMessage("Please wait, we preparing your language");
            progressDialog.show();
            /*
            it will dismiss until the language has been prepared
             */
        }else{
            //do nothing
        }
    }
}

请给我一些建议,我仍在学习,会更加努力。谢谢。

4个回答

13

您可以使用:ACTION_LOCALE_CHANGED

这里有一个例子:

    private BroadcastReceiver mLangReceiver = null;

    protected BroadcastReceiver setupLangReceiver(){

        if(mLangReceiver == null) {

            mLangReceiver = new BroadcastReceiver() {

                @Override
                public void onReceive(Context context, Intent intent) {
                    // do what you want
                }

            };

            IntentFilter filter = new IntentFilter(Intent.ACTION_LOCALE_CHANGED);
            registerReceiver(mLangReceiver, filter);
        }

        return mLangReceiver;
    }

4

我已经打开了它,但是我不知道如何在我的程序中实现。 - Sarudu Matra

2

以下是使用 Flow 获取区域设置更改的一种更现代的方法。就像其他人提到的那样,我们需要一个 BroadcastReceiver 来接收 Intent.ACTION_LOCALE_CHANGED 操作。首先,添加此函数以创建 Flow

private fun getLocaleChangedFlow(context: Context) = callbackFlow {
    val receiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent) {
            if (intent.action == Intent.ACTION_LOCALE_CHANGED) {
                val locale = context?.resources?.configuration?.locales?.get(0)
                if (locale != null) {
                    trySend(locale)
                }
            }
        }
    }
    context.registerReceiver(receiver, IntentFilter(Intent.ACTION_LOCALE_CHANGED))

    awaitClose {
        context.unregisterReceiver(receiver)
    }
}

那么使用 Flow。 用您自己的逻辑替换 TODO()
getLocaleChangedFlow(context)
    .onEach {
        TODO() // Locale changed, add code here
    }
    .launchIn(coroutineScope)

要了解更多,请参阅以下链接:
- Kotlin关于callbackFlow的文档 - Intent.ACTION_LOCALE_CHANGED的Android文档 - 在Flow中包装BroadcastReceiver的StackOverflow答案

2
Locale.getDefault().getLanguage(); 

您可以使用此方法以“en”格式获取语言。 Locale.getDefault().getDisplayLanguage(); 返回语言名称,例如“英语”,而不是“en”。
这也很有用:https://dev59.com/ZZLea4cB1Zd3GeqPxAdd#34265899

如果我使用ProgressDialog作为通知,如果语言已更改,则当进度条消失时(情况:不使用计时器) - Sarudu Matra
这并没有回答问题。你的答案得到了当前的语言环境。它无法检测到语言环境何时发生了改变。 - James
在获取语言环境时,应该使用 Resources.getSystem().configuration.locales[0] 而不是 Locale.getDefault()。参考: https://medium.com/@hectorricardomendez/how-to-get-the-current-locale-in-android-fc12d8be6242 - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接