zoukankan      html  css  js  c++  java
  • Android 4.0 开发者指南(27) —— Resource Types String

    前言

      本章内容为Android开发者指南的Framework Topics/Application Resources/Resource Types/String章节,译为"字符串资源",版本为Android 4.0 r1,翻译来自:"呆呆大虾",欢迎访问他的微博:"http://weibo.com/popapa",再次感谢"呆呆大虾" !期待你一起参与翻译Android的相关资料,联系我over140@gmail.com。

    声明

      欢迎转载,但请保留文章原始出处:)

        博客园:http://www.cnblogs.com/

        Android中文翻译组:http://goo.gl/6vJQl

    Resources Types - String

    译者署名: 呆呆大虾

    译者微博:http://weibo.com/popapa

    版本:Android 4.0 r1

    原文

    http://developer.android.com/guide/topics/resources/string-resource.html

     

    字符串资源

    string资源为应用程序提供字符串文本,并可附带文本样式和格式。有以下三种类型的string资源可供应用程序使用:

    String

    提供单个字符串的XML资源。

    String Array

    提供字符串数组的XML资源。

    Quantity Strings 复数

    保存单词或词组各种数量形式(单数/复数)下的字符串XML资源。

    所有字符串都能应用各种样式标记及格式参数。样式化和格式化串的信息请参阅章节和样式

     

     

    String

    能被应用程序或者其他资源文件(比如layout XML)引用的单个字符串。

    注意字符串是简单类型资源,是用名称(name)(而非XML文件名)来直接引用的。因此,在一个XML文件里,可以把字符串资源和其他简单类型资源一起放在一个<resources>元素下。

     

    文件位置

    res/values/filename.xml

    文件名可随意指定。<string>元素的name将被用作资源ID

     

    编译后资源的数据类型

    指向String的资源指针。

     

    资源引用

    Java代码:R.string.string_name

    XML代码@string/string_name

     

    语法

    <?xml version="1.0" encoding="utf-8"?>

    <resources>

    <string name="string_name">text_string</string>

    </resources>

     

    元素

    <resources>

    必填项必须是根元素。

    无属性。

     

    <string>

    可以包含样式标记的字符串。注意须对单引号或双引号进行转义。更多信息请参阅下文格式化和样式

     

    属性:

    name

    String类型。字符串的名称。此名称将作为资源ID用于引用此字符串。

     

    示例

    保存在res/values/strings.xml XML文件:

    <?xml version="1.0" encoding="utf-8"?>

    <resources>

    <string name="hello">Hello!</string>

    </resources>

     

    以下布局(layoutXML将字符串资源用于View

    <TextView

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:text="@string/hello" />

     

    以下应用程序代码读取一个字符串资源:

    String string = getString(R.string.hello);

    可以用getString(int)getText(int)来读取字符串资源,getText(int)会一并读取应用于字符串的rich text样式。

     

     

    String Array

    可被应用程序引用的字符串数组。

    注意字符串数组是简单类型资源,是用名称(而非XML文件名)来直接引用的。因此,在一个XML文件里,可以把字符串数组资源和其他简单类型资源一起放入一个<resources>元素下。

     

    文件位置

    res/values/filename.xml

    文件名可随意指定。<string-array>元素的名字name将被用作资源ID

     

    编译后资源的数据类型

    指向String数组的资源指针。

     

    资源引用

    Java代码: R.array.string_array_name

     

    语法

    <?xml version="1.0" encoding="utf-8"?> 

    <resources>

    <string-array

    name="string_array_name">

    <item

    >text_string</item>

    </string-array>

    </resources>

     

    元素

    <resources>

    必填项必须是根元素。

    无属性。

     

    <string-array>

    定义一个字符串数组。包含了一个或多个<item>元素。

     

    属性:

    Name

    String类型。字符串数组的名称。此名称将作为资源ID用于引用此数组。

                                            

    <item>

    一个字符串,可以包含样式标识。可以是对其他字符串资源的引用。必须作为<string-array>元素的子元素存在。注意对单引号和双引号须进行转义。有关如何正确地样式化及格式化字符串,请参阅下文格式化和样式

    无属性。

     

    示例

    保存在res/values/strings.xml XML文件:

    <?xml version="1.0" encoding="utf-8"?> 

    <resources>

    <string-array name="planets_array">

    <item>Mercury</item></string-array>

    <item>Venus</item>

    <item>Earth</item>

    <item>Mars</item>

    </string-array>

    </resources>

     

    以下程序代码返回字符串数组:

    Resources res = getResources(); 

    String[] planets = res.getStringArray(R.array.planets_array);

     

    Quantity Strings(复数)

    不同的语言对数量进行描述的语法规则也不同。比如在英语里,数量1是个特殊情况,我们写成“1 book”,但其他任何数量都要写成n books”。这种单复数之间的区别是很普遍的,不过其他语言会有更好的区分方式。Android支持的全集包括zeroone twofewmanyother

    决定选择和使用某种语言和复数的规则是非常复杂的,所以Android提供了诸如getQuantityString()的方法来选择合适的资源。

    注意,要按照语法规则来建立可选项。在英语里,即使数量为0,字符串零(zero)也不需要建立。因为0在英语语法表达上和2没有区别,和其他除1以外的任何数字都没有差别("zero books", "one book", "two books",等等)。 不要被two听起来似乎只能用于数量2” 样的事误导。某语言可能需要212102(等等)和1一样形式表示,而又与其他数的形式都不同。请依靠翻译人员来了解一下实际语言中的差别。

    如果和应用程序的风格一致,常可以用诸如“Books: 1”的模糊数量形式来避免使用数量字符串。这会让你和翻译人员都轻松些。

    注意:复数字符串是简单类型资源,是用名称(name)(而不是XML文件名)来直接引用的。因此,在一个XML文件里,可以把复数字符串资源和其他简单类型资源一起放在一个<resources>元素下。

     

    文件位置

    res/values/filename.xml

    文件名可随意指定。<plurals>元素的名字name将被用作资源ID

     

    资源引用

    Java代码:R.plurals.plural_name

     

    语法

    <?xml version="1.0" encoding="utf-8"?> 

    <resources>

    <plurals

    name="plural_name">

    <item_plurals

    quantity=["zero" | "one" | "two" | "few" | "many" | "other"

    >text_string</item>

    </plurals>

    </resources>

     

    元素

    <resources>

    必填项必须是根元素。

    无属性。

     

    <plurals>

    一个字符串集,每个数量表示提供一个字符串。包含一个或多个<item>元素。

     

    属性:

    name

    String类型。字符串对的名称。此名称将作为资源ID

    <item>

    一个单数或复数形式的字符串。可以是对其他字符串资源的引用。必须作为<plurals>元素的子元素存在。注意须对单引号和双引号进行转义。有关如何正确地样式化及格式化字符串,请参阅下文格式化和样式

     

    属性:

    quantity

    关键字 表示要使用此字符串的数量值。以下是合法的值(括号内列出部分语言要求):

    描述

    zero

    语言需要对数字0进行特殊处理。(比如阿拉伯语)

    one

    语言需要对类似1的数字进行特殊处理。(比如英语和其它大多数语言里的1;在俄语里,任何以1结尾但不以11结尾的数也属于此类型。)

    two

    语言需要对类似2的数字进行特殊处理。(比如威尔士语)

    few

    语言需要对较小数字进行特殊处理(比如捷克语里的234;或者波兰语里以234结尾但不是121314的数。)

    many

    语言需要对较大数字进行特殊处理(比如马耳他语里以11-99结尾的数)

    other

    语言不需要对数字进行特殊处理。

    示例

    存放在res/values/strings.xml XML文件:

    <?xml version="1.0" encoding="utf-8"?>

    <resources>

    <plurals name="numberOfSongsAvailable">

    <item quantity="one">One song found.</item>

    <item quantity="other">%d songs found.</item>

    </plurals>

    </resources>

     

    存放在res/values-pl/strings.xml XML文件:

    <?xml version="1.0" encoding="utf-8"?>

    <resources>

    <plurals name="numberOfSongsAvailable">

    <item quantity="one">Znaleziono jedną piosenkę.</item>

    <item quantity="few">Znaleziono %d piosenki.</item>

    <item quantity="other">Znaleziono %d piosenek.</item>

    </plurals>

    </resources>

     

    Java代码:

    int count = getNumberOfsongsAvailable(); 

    Resources res = getResources(); 

    String songsFound = res.getQuantityString(R.plurals.numberOfSongsAvailable, count, count);

     

    在使用getQuantityString()方法时,如果字符串包含数字格式化串,则需要传递2count参数。例如:对于字符串%d songs found”,第一个count参数选择合适的复数字符串,第二个count参数插入占位符%d中。如果复数字符串资源不包含格式化信息,就不需要给getQuantityString()传递第三个参数。

     

     

    格式化和样式化

    关于如何格式化和样式化字符串资源,下面这些比较重要的地方应该了解。

     

    单引号和双引号的转义

    如果字符串里包含单引号或双引号,必须进行转义,或者把整个串封闭在与当前引号不同的成对的引号内。下面是一些有效或无效的字符串示例:

    <string name="good_example">"This'll work"</string>

    <string name="good_example_2">This\'ll also work</string>

    <string name="good_example_2">This\'ll also work</string>

    <string name="bad_example">This doesn't work</string>

    <string name="bad_example_2">XML encodings don’t work</string>

     

    字符串的格式化

    如果需要使用String.format(String, Object...)格式化字符串,可以把格式化参数放在字符串(string)资源里。比如存在以下资源:

    <string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>

    此例中存在两个参数:%1$s是个字符串,%2$d 是个数字。则在应用程序中可以用如下方式用参数来格式化字符串:

    Resources res = getResources();

    String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);

     

    HTML标记来样式化

    可以用HTML 标记来为字符串加入样式。例如:

    <?xml version="1.0" encoding="utf-8"?>

    <resources>

    <string name="welcome">Welcome to <b>Android</b>!</string>

    </resources>

     

    支持以下HTML元素:

    ·   <b>文本加粗bold

    ·   <i>文本变斜体italic

    ·   <u>文本加下划线underline

    有时可能要创建一个样式化的文本资源,并可作为格式化串使用。通常这不能生效,因为String.format(String, Object...)方法会去除字符串内的所有的样式信息。解决方法是写入一段转义后的HTML标记,然后在格式化后再用fromHtml(String)恢复出这些样式。例如:

    1.  将样式化的文本资源存储为转义后的HTML字符串:

    <resources>

        <string name="welcome_messages">Hello, %1$s! You have &lt;b>%2$d new messages&lt;/b>.</string>

    </resources>

    在这个格式化字符串里,加入了一个<b>元素。注意左尖括号是用标记&lt转义过的HTML

    2.       然后,按照通常方式格式化字符串,并调用fromHtml(String) HTML文本转换成带样式的文本。

    Resources res = getResources(); 

    String text = String.format(res.getString(R.string.welcome_messages), username, mailCount); 

    CharSequence styledText = Html.fromHtml(text);

    因为fromHtml(String)方法会格式化所有的HTML内容,所以要确保用htmlEncode(String)对带格式化文本的字符串内所有可能的HTML字符进行转义。比如,如果要把可能包含诸如“<”“&”等字符的串作为参数传给String.format()那么必须在格式化之前对这些字符进行转义。格式化后,再把字符串传入fromHtml(String)这些特殊字符就能还原成本来意义了。例如:

    String escapedUsername = TextUtil.htmlEncode(username)

    Resources res = getResources();

    String text = String.format(res.getString(R.string.welcome_messages), escapedUsername, mailCount);

    CharSequence styledText = Html.fromHtml(text);

     

  • 相关阅读:
    Elasticsearch学习,请先看这一篇!
    加解密/数字签名/证书 原理
    C# 给对象赋null值会释放内存吗?
    打包常见问题
    友盟推送
    谈一谈可能用到数据持久化的地方
    浅谈设置字体大小
    AFN和SDWebImage请求网络图片的一点问题
    linux学习(1)——这是一个新的开始,加油吧少年
    C指针——简单总结
  • 原文地址:https://www.cnblogs.com/over140/p/2218560.html
Copyright © 2011-2022 走看看