getString()只返回英文值

时间:2015-07-20 11:35:42

标签: java android multilingual

以下是我的onActivityResult方法的代码:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == Activity.RESULT_OK) {
        String contents = data.getStringExtra("SCAN_RESULT");
        if (contents.length() == 26) {
            BillBarcode barcode = new BillBarcode(contents);
            edtBillId.setText(barcode.extract(BillBarcode.BarcodePart.BillId));
            edtPaymentId.setText(barcode.extract(BillBarcode.BarcodePart.PaymentId));
            launchService();
        } else {
            Dialog dialog = new DialogBuilder()
                    .setTitle(getString(R.string.dialog_title_global_error))
                    .setMessage(getString(R.string.unknown_barcode))
                    .build(getActivity());

            dialog.show();
        }
    }
}

问题是getString(R.string.dialog_title_global_error)getString(R.string.unknown_barcode)总是返回英文值,而我也有波斯语值,而且语言环境也是波斯语。

此问题仅存在于此方法中。

波斯语价值:

<string name="unknown_barcode">بارکد قابل استفاده نیست.</string>

英文价值:

<string name="unknown_barcode">Unknown barcode</string>

修改

当用户通过以下代码从语言页面中选择波斯语时,我有一个设置页面并设置我的语言环境:

      String languageToLoad = "fa";
Resources res = context.getResources();
            // Change locale settings in the app.
            android.content.res.Configuration conf = res.getConfiguration();
            conf.locale = new Locale(languageToLoad);

1 个答案:

答案 0 :(得分:0)

让我试着在答案中收集所有评论。您的问题是两个实现错误的组合:

  1. 您正在以编程方式设置当前Activity上下文的区域设置。但是,您是以不受支持的方式这样做,可能会产生不正确的结果。

  2. 当您的活动从OnActivityResult()中的其他活动获得结果时,您的Activity将完全重启或上下文配置重置为系统的默认语言环境。无论哪种方式,您在设置对话框中设置的区域设置都将丢失。

  3. <强>解决方案

    1. 此处概述了在本地更改应用程序区域设置的正确方法:Changing Locale within the app itself
    2. 特别是,虽然只更改配置类中的语言环境可能对您有用,但显然不是更改应用程序语言环境的正确方法。正确地完成它需要更多的工作:

        Locale locale; // set to locale of your choice, i.e. "fa"
        Configuration config = getResources().getConfiguration();
        config.setLocale(locale); // There's an setter, don't set it directly     
        getApplicationContext().getResources().updateConfiguration(
            config,
            getApplicationContext().getResources().getDisplayMetrics()
        );
        // you might even need to use getApplicationContext().getBaseContext(), here.
        Locale.setLocale(locale);
      

      在应用程序上下文中设置区域设置应该在重新启动活动后继续存在,但是根据Android的生命周期保证,您不应该假设区域设置保持不变。

      1. 如果您确实需要能够在本地更改应用的区域设置,则应保存用户指定的区域设置(例如,在SharedPreference中),并在应用或您的活动重新启动时获取并重新设置它(即至少在OnCreate())。请记住,Android可以随时保存并重新启动您的活动,并且您有责任优雅地处理重启。