1

我在 Android java 中有一个问题,我想在不同的语言中有不同的词汇表。

该应用程序被德国和瑞典的军队和警察部队使用。当然,德国人想要德语的应用程序,瑞典人想要瑞典语的应用程序,这当然可以通过将字符串资源放在 res/values-de/strings.xml 和 res/values-sv/strings.xml 下来解决,并且是由 Android 设备中的不同设置选择(请参阅资源处理)。

但我的问题是,警察部队使用的词汇与军队不同,我想在资源中以某种方式反映这一点。

有没有什么方法可以让我在 app f.ex 中设置不同的词汇资源,方法是使用 res/values-de-mil/strings.xml 或任何其他简单的方式。

4

3 回答 3

1

我不认为这是可能的。

一个选项是在共享偏好中设置用户的偏好(您可以在用户第一次打开应用程序时询问)并存储它是警察还是军人。

然后你可以使用反射来加载你的字符串资源。

<string name="string_policeMan">Word for a policeman</string>
<string name="string_military">Word for a military</string>   


SharedPreferences shared = getSharedPreferences(PREF_NAME, MODE_PRIVATE);
boolean isPoliceMan = shared.getBoolean(policeMan, false);

int resId;
if(isPoliceMan)
   resId = R.string.class.getField("string_policeMan").getInt(null);
else 
   resId = R.string.class.getField("string_military").getInt(null);

 String field = context.getResources().getString(resId);
于 2013-06-20T09:25:56.713 回答
1

实际上有一种方法可以做到这一点,即(ab)使用数量字符串。仅出于学术目的,我将在下面为您提供概念证明,但作为预先警告:要知道这种方法不能推广到任何语言环境。但是,对于德语和瑞典语,您应该没问题。

有关数量字符串(或复数,因为它们通常被称为 Android 资源)背后的理论,请阅读此处。它还解释了为什么下面概述的方法不能推广到任何语言环境。我将假设这一切都有意义,所以让我们快进到概念验证。

值-de/plurals.xml

<resources>
    <plurals name="hello_im_in_the">
        <item quantity="one">Hallo, ich bin in der Armee.</item>
        <item quantity="other">Hallo, ich bin auf der Polizei.</item>
    </plurals>
</resources>

值-sv/plurals.xml

<resources>
    <plurals name="hello_im_in_the">
        <item quantity="one">Hej, jag är på militären.</item>
        <item quantity="other">Hej, jag är på polisen.</item>
    </plurals>
</resources>

让我们在一个有四个 s 的活动中使用上述资源TextView:每个语言环境两个,每个“部队”(警察部队与军队)一个。

@Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.res_activity_layout);

    int policeForceQuantity = 0;
    int militaryQuantity = 1;

    TextView militaryTextViewDe = (TextView) findViewById(R.id.military_de);
    TextView policeForceTextViewDe = (TextView) findViewById(R.id.police_force_de);

    Configuration config = new Configuration(getResources().getConfiguration());
    config.locale = Locale.GERMAN;
    getResources().updateConfiguration(config, getResources().getDisplayMetrics());
    String militaryText = getResources().getQuantityString(R.plurals.hello_im_in_the, militaryQuantity);
    String policeForceText = getResources().getQuantityString(R.plurals.hello_im_in_the, policeForceQuantity);
    militaryTextViewDe.setText(militaryText);
    policeForceTextViewDe.setText(policeForceText);

    TextView militaryTextViewSv = (TextView) findViewById(R.id.military_sv);
    TextView policeForceTextViewSv = (TextView) findViewById(R.id.police_force_sv);

    config = new Configuration(getResources().getConfiguration());
    config.locale = new Locale("sv");
    getResources().updateConfiguration(config, getResources().getDisplayMetrics());
    militaryText = getResources().getQuantityString(R.plurals.hello_im_in_the, militaryQuantity);
    policeForceText = getResources().getQuantityString(R.plurals.hello_im_in_the, policeForceQuantity);
    militaryTextViewSv.setText(militaryText);
    policeForceTextViewSv.setText(policeForceText);
}

以上所做的就是使用一定数量的1来“选择”军事短语,以及任何其他值(0在本例中)用于特定于警察部队的短语。出于示例的目的,我只是在运行时更改语言环境,以便我们可以并排查看结果,而无需实际进入设备的语言环境设置。

结果:

在此处输入图像描述

换句话说,这说明我们能够成功利用Android的语言环境系统,并使用预定义的数量来选择军事短语或警察部队短语进行显示。

不漂亮,绝对不是数量字符串的用途,但它会在您的特定用例中完成工作。

于 2013-06-21T08:55:55.640 回答
0

据我所知,它不可能有 res/values-de-mil,因为 android 系统不知道用户是谁。您可以使用 2 组字符串来执行此方法。例如,你有一个

<string name="Name">...</string>

使它成为

<string name="mil_Name">...</string>

<string name="cop_Name">...</string>

现在,如果您知道用户是军人,那么getResources().getString(R.string.mil_Name);

于 2013-06-20T09:26:19.790 回答