《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)

中文:

英文:

posted @ 2022-06-03 20:21  easy5  阅读(135)  评论(0编辑  收藏  举报