我在 Android java 中有一个问题,我想在不同的语言中有不同的词汇表。
该应用程序被德国和瑞典的军队和警察部队使用。当然,德国人想要德语的应用程序,瑞典人想要瑞典语的应用程序,这当然可以通过将字符串资源放在 res/values-de/strings.xml 和 res/values-sv/strings.xml 下来解决,并且是由 Android 设备中的不同设置选择(请参阅资源处理)。
但我的问题是,警察部队使用的词汇与军队不同,我想在资源中以某种方式反映这一点。
有没有什么方法可以让我在 app f.ex 中设置不同的词汇资源,方法是使用 res/values-de-mil/strings.xml 或任何其他简单的方式。
3 回答
我不认为这是可能的。
一个选项是在共享偏好中设置用户的偏好(您可以在用户第一次打开应用程序时询问)并存储它是警察还是军人。
然后你可以使用反射来加载你的字符串资源。
<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);
实际上有一种方法可以做到这一点,即(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的语言环境系统,并使用预定义的数量来选择军事短语或警察部队短语进行显示。
不漂亮,绝对不是数量字符串的用途,但它会在您的特定用例中完成工作。
据我所知,它不可能有 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);