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

    中文:

    英文:

  • 相关阅读:
    排序
    git常用操作_分支合并_新建工程等
    ibatis 中调用存储过程
    IDEA试用期结束激活问题
    kafka本地工程的调用说明
    python yield 和 yield from用法总结
    ubuntu14.06 Lts开启ssh服务
    QT-1-环境搭建QT5.4.1&MinGW4.9.1
    虚拟机Ping不通主机解决
    CRC类(处理ITU表)
  • 原文地址:https://www.cnblogs.com/easy5weikai/p/16340503.html
Copyright © 2020-2023  润新知