使用Locale强制Android将特定的strings.xml文件用于不受支持的语言

use*_*117 13 android locale android-resources

......如果是的话,怎么样?

我们制作专用的Android设备,用于工业环境.它基本上是一台平板电脑,但只运行一个应用程序.用户不应该访问设备的任何其他功能,甚至系统设置,如WiFi和时间设置都是通过我们的应用程序而不是通过Android设置小部件执行的.所以基本上每个按钮和消息,他们看到使用我们strings.xml的文件.

目前,我们所有的客户都对使用默认的美式英语设置感到满意,但我们很快就会有一些客户想要使用本地语言并向我们提供翻译文件.目前其中一个是罗马尼亚语,它不是该设备上任何原生支持的语言(三星Galaxy标签4); 另一个是捷克人.

因此,我们希望strings.xml在适当的res文件夹中添加文件,非英语语言和我们的应用程序中的下拉列表,以选择我们正在使用的语言.以编程方式我们认为我们可以使用它Locale来设置strings.xml它使用的文件,例如,如果从下拉列表中选择罗马尼亚语,我们将用于Locale将平板电脑设置为罗马尼亚语,因此我们所有应用程序的UI都将使用罗马尼亚strings.xml文件.

我们的设置(包括新的下拉列表)无法供客户访问 - 它们由现场服务工程师设置在客户现场.

问题:

  1. 这会有用吗?即,即使设备没有该语言的原生支持,我们是否可以控制strings.xml它使用哪个文件Locale
  2. 由于罗马尼亚语不是本设备支持的语言,因此我们假设系统消息仍将以英语显示.这是真的?(如果确实如此,这不是问题 - 系统消息在我们的应用程序中很少见,并且如果发生这种情况,我们的产品用户会接受培训以联系支持.我只是想确保如果我们设置Locale为罗马尼亚语,捷克语或其他没有原生支持的语言,如果它确实试图发出系统消息,它不会崩溃平板电脑).

Oni*_*nik 7

这会有用吗?即,即使设备没有该语言的原生支持,我们是否可以控制strings.xml它使用哪个文件Locale

是的,你可以通过更新LocaleConfiguration(见下面的例子).如果您尝试使用没有相应资源的区域设置(在您的应用程序或系统中),将使用您应用程序的默认字符串资源(res/values/strings.xml).

由于罗马尼亚语不是本设备支持的语言,因此我们假设系统消息仍将以英语显示.这是真的?

如果英语是当前系统区域设置,则确实如此.

我只是想确保如果我们将Locale设置为罗马尼亚语,捷克语或其他语言而没有本机支持,如果它确实尝试发出系统消息,它将不会使平板电脑崩溃.

您的应用不会崩溃.在app的应用效果区域设置资源中进行的区域设置更改,而不是系统1.

一个例子回答"如果是这样,怎么样?" 该方法可用于在Activity运行*时测试区域设置更改.

public static void changeLocale(Context context, String locale) {
    Resources res = context.getResources();
    Configuration conf = res.getConfiguration();
    conf.locale = new Locale(locale);
    res.updateConfiguration(conf, res.getDisplayMetrics());
}
Run Code Online (Sandbox Code Playgroud)

*您可能希望调用recreate()以"动态"查看字符串资源更改.


S.D*_*.D. 5

是的,您绝对可以切换单个应用程序的语言环境。为此,您必须从基类扩展每个活动,如下所示:

public abstract class MyLangActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        Locale locale = // get the locale to use...
        Configuration conf = getResources().getConfiguration();
        if (Build.VERSION.SDK_INT >= 17) {
            conf.setLocale(locale);
        } else {
            conf.locale = locale;
        }

        DisplayMetrics metrics = getResources().getDisplayMetrics();
        getResources().updateConfiguration(conf, metrics);
        super.onCreate(savedInstanceState);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在关于设备不支持所应用语言的问题。正在使用的设备字体可能不支持自定义语言文件中的字符。您可以使用自己的字体文件来支持这一点。