将用户界面中的字符串从代码中提取出来保存到一个专门的文件是一个明智之举,android为每个工程提供一个资源目录,从而为这项活动提供了有效支持。
如果使用了Android SDK Tools建立工程,工程顶级目录下会创建一个名为res的目录,其中包含若干个根据资源类型划分的子目录,并自动创建一些默认文件,如用于存放字符创的res/values/strings.xml。
为了实现对多种语言的支持,在res下另外创建一个values目录,在其名称后加上“-”及ISO国家代码。例如,values-es用来包含国家代码“es”代表区域的资源。Android在运行过程中根据设备的区域设置加载对应的资源。
当开发者决定了自己的应用软件需要支持的语言种类,需要为所有的语言种类创建对应的资源子目录和string资源文件,例如:
MyProject/
res/
values/
strings.xml
values-es/
strings.xml
values-fr/
strings.xml
然后,将每个区域的字符串添加到对应stirngs文件。
应用软件运行时,Android系统根据用户设备当前的区域设置加载对应的字符串资源集。
例如,下面代码展示了不同语言所对应的字符串资源。
英语(默认区域),/values/strings.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="title">My Application</string>
<string name="hello_world">Hello World!</string>
</resources>
西班牙语,/values-es/strings.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="title">Mi Aplicación</string>
<string name="hello_world">Hola Mundo!</string>
</resources>
法语,/values-fr/strings.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="title">Mon Application</string>
<string name="hello_world">Bonjour le monde !</string>
</resources>
注意:区域修饰符(或者其他配置项的修饰符)可以影响到其他任意资源类型,如为位图提供本地版本,详见本地化。
通过<string>元素的name属性定义的资源名称,源代码或者其他XML文件可以引用对应的字符串资源。
在源代码中,使用语法R.string.<string_name>引用字符串资源,多种方法都使用这种方式来获取一个字符串资源,例如:
// Get a string resource from your app's Resources
String hello =getResources()
.getString(R.string.hello_world);
// Or supply a string resource to a method that requires a string
TextView textView =new TextView(this);
textView.setText(R.string.hello_world);
在其他XML文件中,使用语法@string/<string_name>来获取字符串资源,例如:
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" />