《Android 编程权威指南》学习笔记 : 第17章 资源本地化
第17章 资源本地化
本地化是一个基于设备语言设置,为应用提供合适资源的过程。
本章会为CriminalIntent应用提供中文版res/values/strings.xml。
设备语言如果设置为中文,Android就会自动找到并使用相应的中文资源
资源本地化
目标语言配置修饰符的资源子目录(res/values-zh)
语言设置是设备配置的一部分。和处理屏幕方向、屏幕尺寸以及其他配置因素改变一样,Android也提供了用于不同语言的配置修饰符。本地化处理因而变得简单:
创建带目标语言配置修饰符的资源子目录,并放入备选资源。其余工作可以交给Android资源系统自动处理了。
在项目工具窗口中,右键单击res/values目录,选择New → Values resource file菜单项。
- 文件名输入 strings.xml,
- Source se t选中 main,
- Directory name设置为 values。
- 在Available qualifiers列表窗口,选中Locale,使用>>按钮把它移入Chosen qualifiers窗口,
在Language列表窗口中选中zh: Chinese,此时,右边的Specific Region Only窗口会自动选中Any Region,这就是我们想要的,无须更改。
点击【OK】按钮,自动生成 res/vaulses-zh/strings.xml 文件:
切换到【Project】视图,查看真实的路径目录:
多了一个中文语言资源修饰符目录 values-zh,如下所示:
当系统语言设置为中文时,自动加载该目录下的字符串资源
添加中文字符串资源
代码清单:res/values-zh/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">CriminalIntent</string>
<string name="crime_title_hint">crime简短描述</string>
<string name="crime_title_label">标题</string>
<string name="crime_details_label">明细</string>
<string name="crime_solved_label">是否解决</string>
<string name="new_crime">新增crime记录</string>
<string name="crime_suspect_text">嫌疑人联系方式</string>
<string name="crime_report_text">抗议或投诉</string>
<string name="crime_report">%1$s!crime发生于 %2$s. %3$s, y %4$s</string>
<string name="crime_report_solved">问题已解决</string>
<string name="crime_report_unsolved">问题未解决</string>
<string name="crime_report_no_suspect">没找到嫌疑人</string>
<string name="crime_report_suspect">嫌疑人是 %s</string>
<string name="crime_report_subject">crime处理情况报告</string>
<string name="send_report">投诉方式</string>
</resources>
运行程序,将本机或模拟的系统语言设置为中文,
Tips:如何修改虚拟机的语言环境?
点击“Settings”图标,选择[Language & input],(特别注意:不是 Language),如下图所示:
然后添加简体中文:
拖动【简体中文(中国)】,放到第一列,作为默认系统语言,如下图所示,
CriminalIntent应用就会显示中文,如下图所示:
默认资源
应为所有资源提供默认资源。没有配置修饰符的资源就是Android的默认资源。如果无法找到匹配当前配置的资源,Android就会使用默认资源。默认资源至少能保证应用正常运行。
例外的屏幕显示密度
Android默认资源使用规则并不适用于屏幕显示密度。项目的drawable目录通常按屏幕显示密度要求,带有-mdpi、-xxhdpi这样的修饰符。不过,Android决定使用哪一类drawable资源并不是简单地匹配设备的屏幕显示密度,也不是在没有匹配的资源时直接使用默认资源。
最终的选择取决于对屏幕尺寸和显示密度的综合考虑。Android甚至可能会选择低于或高于当前设备屏幕密度的drawable资源,然后通过缩放去适配设备。无论如何,请记住一点:不要在res/drawable/目录下放置默认的drawable资源。
检查资源本地化完成情况
Android Studio提供了资源翻译编辑器这个工具。这个便利工具能集中查看资源翻译完成情况,
要启动资源翻译编辑器,在项目工具窗口右键单击某个语言版本的strings.xml,选择Open Translations Editor菜单项即可
区域修饰符
修饰资源目录也可以使用语言加区域修饰符,这样可以让资源使用更有针对性。例如,西班牙语可以使用-es-rES修饰符,其中,r代表区域,ES是西班牙语的ISO 3166-1-alpha-2标准码。配置修饰符不区分大小写。但最好遵守Android命名约定:语言代码小写,区域代码大写,但前面加个小写的r。
注意,语言区域修饰符,比如-es-rES,看上去像两个不同的修饰符的合体,实际并非如此。这是因为,区域本身不能单独用作修饰符。
在运行Nougat之前的系统版本的设备上,如果找不到匹配的资源,应用就会使用无任何修饰符的默认资源。
Nougat及其之后的系统版本已优化locale支持,支持更多locale以及支持同一设备选择多个locale。因此,为了让应用显示更准确的语言,系统使用了更智能化的资源匹配
如果找不到精准匹配,也找不到仅针对语言的匹配,系统就会去匹配有同样语言而区域不同的资源。
资源应尽可能通用,最好是使用仅限语言的修饰目录,尽量少用区域修饰。就上例来说,与其维护三类不同区域西班牙语的资源,不如只提供values-es版资源。这样,不仅方便开发维护,也方便适配不同版本的系统(Nougat之前及之后的系统版本)。另外,上述结论也适用于values目录里的其他备选资源。
总之,我们应该使用通用目录提供共享资源,那些需要定制化的资源就放在带有更具体修饰符的目录里吧。
配置修饰符
目前为止,我们已见过好几个配置修饰符,它们都用于提供可选资源,比如:
- 语言(values-zh)、
- 屏幕方向(layout-land)
- 屏幕显示密度(drawable-mdpi)
不是所有配置修饰符都能在早期版本Android系统获得支持。系统知道这一点,所以会给Android 1.0之后出现的修饰符加上平台版本修饰符。例如,圆形屏幕修饰符自API 23级别引入,用到它时,系统会自动加上v23。因此,如果为新设备引入资源修饰符,根本不用担心在旧系统中会遇到问题。
可用资源优先级排定
代码清单:res/values-w600dp/strings.xml
<resources>
<string name="crime_title_hint">
Enter a meaningful, memorable title for the crime.
</string>
</resources>
有三个版本的crime_title_hint资源:
- res/values/strings.xml文件中的默认版本、
- res/values-zh/strings.xml文件中的中文备选版本,
- 以及res/values-w600dp/strings.xml文件中的宽屏备选版本
在设备语言设置为简体中文的前提下,运行CriminalIntent应用,然后旋转设备至横屏模式。因为中文备选版本的资源优先级最高,所以我们看到的是来自values-zh/strings.xml文件的字符串资源,如下图所示:
也可以将设备语言重新设置为英语,然后再次运行应用,确认宽屏模式的字符串资源使用符合预期,如下图所示:
多重配置修饰符
以在同一资源目录上使用多个配置修饰符。这需要各配置修饰符按照优先级别顺序排列。因此,values-zh-w600dp是一个有效的资源目录名,values-w600dp-zh目录名则无效。(在新建资源文件对话框中,工具会自动配置正确的目录名。)
为CriminalIntent应用准备宽屏模式的中文字符串资源。创建的资源目录名应为values-zh-w600dp。
打开values-zh-w600dp/strings.xml文件,为crime_title_hint添加中文字符串资源。
代码清单:values-zh-w600dp/strings.xml
<resources>
<string name="crime_title_hint">
请输入简短、好记的crime描述
</string>
</resources>
在设备语言已设置为简体中文的前提下,运行CriminalIntent应用,确认能看到新的备选资源,
设备屏幕宽度不够,旋转为横屏:
旋转为竖屏:
测试备选资源
开发应用时,为了查看布局以及其他资源的使用效果,一定要针对不同设备配置做好测试。在虚拟设备或实体设备上测试都行,还可以使用图形布局工具测试。
图形布局工具有很多选项,用以预览布局在不同配置下的显示效果。这些选项有屏幕尺寸、设备类型、API级别以及设备语言等。
要查看这些选项,可在图形布局工具中打开res/layout/fragment_crime.xml文件,如下图所示的工具栏上的一些选项设置。
深入学习:确定设备屏幕尺寸
Android提供了三个修饰符,用于测试设备尺寸。下表列出了这些新修饰符。
假设要指定一个布局仅在屏幕至少300dp宽时使用。据此,你可以使用一个可用的宽度修饰符,把布局文件放在res/layout-w300dp(w代表宽度。同理,h代表高度)这样的目录中。
然而,由于设备旋转,高度和宽度会交换过来。为检测某个特殊的屏幕尺寸,可以使用sw(最小宽度)。这样,就可以指定屏幕的最小尺寸了。由于设备会旋转,这个最小尺寸可以是高度,也可以是宽度。如果屏幕尺寸是1024 × 800,那么sw就是800;如果屏幕尺寸是800 × 1024,那么sw还是800。
日期本地化
本地化
(待解决)
指定格式化
代码清单:CrimeFragment.kt
private fun updateUI() {
...
val dateFormat = SimpleDateFormat("yyyy-MM-dd E a HH:mm:ss")
dateButton.text = dateFormat.format(crime.date)
中文:
英文: