gpt4 book ai didi

android - 如何使用Android数量字符串(复数)

转载 作者:IT老高 更新时间:2023-10-28 23:02:28 30 4
gpt4 key购买 nike

我正在尝试使用 getQuantityString基于 Android 开发人员指南检索数量字符串(复数)的资源中的方法 Quantity string (plurals)
我得到的错误是

Error:(604) Multiple substitutions specified in non-positional format; did you mean to add the formatted="false" attribute?
Error:(604) Found tag where is expected


当我设置复数如下
<plurals name="productCount">
<item quantity="one" formatted="true">%1$d of %2$d product</item>
<item quantity="other" formatted="true">%1$d of %2$d products</item>
</plurals>
并尝试阅读如下
productIndexCountText.setText(getResources().getQuantityString(R.plurals.productCount, position, size));
一种解决方法是将字符串拆分为仅对字符串的最后一部分使用复数,并将两部分连接起来。但如果可能的话,我会尽量避免这样做。

最佳答案

您不需要为这些项目中的任何一个设置“格式化”属性。使用数量字符串时,只有三种可能:

  • 资源字符串为纯文本,不包含任何参数
  • 资源字符串只包含一个参数(很可能是数量);使用 %d 或您需要的任何格式
  • 资源字符串包含多个参数;所有参数都必须通过它们的位置显式访问,例如 %1$d

  • 至于 getQuantityString 方法,有两种重载:一种只有资源 id 和数量,另一种是额外的 Object... formatArgs 参数。
    对于情况 1.,您可以使用 getQuantityString(@PluralsRes int id, int quantity) 方法。
    对于所有其他情况,我。 e.如果您有任何参数,则需要 getQuantityString(@PluralsRes int id, int quantity, Object... formatArgs) 重载。注意: 所有 参数都必须存在于参数数组中。这意味着,如果资源字符串显示数量,则数量变量将 两次 传递给函数。
    这是因为在解析资源字符串的位置参数时不考虑方法本身的 quantity 参数。
    所以如果这些是你的资源,
    <resources>
    <plurals name="test0">
    <item quantity="one">Test ok</item>
    <item quantity="other">Tests ok</item>
    </plurals>
    <plurals name="test1">
    <item quantity="one">%d test ok</item>
    <item quantity="other">%d tests ok</item>
    </plurals>
    <plurals name="test2">
    <item quantity="one">%2$s: %1$d test ok</item>
    <item quantity="other">%2$s: %1$d tests ok</item>
    </plurals>
    <plurals name="test3">
    <item quantity="one">%3$s: %1$d test out of %2$d ok</item>
    <item quantity="other">%3$s: %1$d tests out of %2$d ok</item>
    </plurals>
    </resources>
    那么对 getQuantityString 的适当调用是:
    int success = 1;
    int total = 10;
    String group = "Group name";

    getResources().getQuantityString(R.plurals.test0, success)
    // Test ok
    getResources().getQuantityString(R.plurals.test1, success, success)
    // 1 test ok
    getResources().getQuantityString(R.plurals.test2, success, success, group)
    // Group name: 1 test ok
    getResources().getQuantityString(R.plurals.test3, success, success, total, group)
    // Group name: 1 test out of 10 ok

    success = 5;
    getResources().getQuantityString(R.plurals.test0, success)
    // Tests ok
    getResources().getQuantityString(R.plurals.test1, success, success)
    // 5 tests ok
    getResources().getQuantityString(R.plurals.test2, success, success, group)
    // Group name: 5 tests ok
    getResources().getQuantityString(R.plurals.test3, success, success, total, group)
    // Group name: 5 tests out of 10 ok

    数量类:了解 quantity参数
    如上所述,关键是要了解 quantitygetQuantityString 参数不是用来替换 %d%1$d 等占位符的。相反,它用于从 item 本身结合资源文件的区域设置确定适当的 plurals
    但是请注意,与属性名称及其可能值( zeroonetwofewmany 、 5 可能 67.144)相比,这是一个不太直接的映射例如,提供额外的 other will not work (at least not in English) ,即使 <item quantity="zero"> 参数的值为 0。
    原因是 quantity 在 Android 中的工作方式是通过 数量类 的概念。数量类是在给定语言中具有相同语法规则的一组数量值。这至关重要的意味着
  • 使用的数量类别,以及
  • 哪些数值被映射到它们

  • 取决于相应资源文件所在的区域设置。
    重要的是要理解这两个问题仅由语法必要性决定。这里有些例子:
  • 在中文或韩文中,仅使用 plurals,因为在这些语言中,句子在语法上不会根据给定的数量而有所不同。
  • 在英语中,有两个类:other 表示文字值 1,one 表示所有其他值,包括 0。
  • 在爱尔兰语中, 1 映射到 other , 2 映射到 one , 3-6 是 two , 7-10 是 few , 0 和 4 + 10719
  • 在斯洛文尼亚语中,值 1 所有以 01 结尾的值都映射到 many (1, 101, 3001, ...)。 2 和以 02 结尾的值映射到 other (2, 302, 1002, ...)。 3, 4 和以 03 或 04 结尾的值被映射到 one (3, 4, 6004, ...)。其他的都是 two(0、11、48、312……)。
  • 在波兰语中,5-19 和以 05-19 结尾的值被映射到 few (5, 12, 216, 4711, ...)。以 2、3 或 4 结尾的值(包括 2-4 本身)映射到 other(3、42、103、12035374,...)。然而,这尊重 12、13 和 14 是此规则的异常(exception),因为它们映射到 many 。 (旁注:是的,从语法上讲,5 多而 12035374 少。)
  • 亚美尼亚语就像英语,除了值 0 也映射到 few ,因为这就是他们的语法工作方式。你可以从这个例子中看到数量类 many 甚至不一定只代表一个数字。

  • 如您所见,确定正确的数量类别会变得相当复杂。这就是为什么 one 已经根据 one 参数和资源文件的区域设置为您完成了这项工作。 Android(主要)播放的规则在 Language Plural RulesUnicode Common Locale Data Repository 中定义。这也是数量类名称的来源。
    所有这一切意味着翻译任何数量字符串所需的数量类集可能因语言而异(中文只需要 getQuantityString ,英语需要 quantityother ,爱尔兰需要除 one 之外的所有内容,等等)。然而,在一种语言中,所有 other 都应该具有相同数量的项目,涵盖该特定语言所需的所有数量类别。
    结论
    zero 的调用可以这样理解:
    int success = 5;
    int total = 10;
    String group = "Group name";

    getResources().getQuantityString(R.plurals.test3, success, success, total, group)
    // \_____________/ \_____/ \___________________/
    // | | |
    // id: used to get the plurals resource | |
    // quantity: used to determine the appropriate quantity class |
    // formatArgs: used to positionally replace the placeholders %1, %2 and %3
    plurals 参数的值“5”将意味着使用的 getQuantityString 将是来自中文、韩语、英语、斯洛文尼亚语和亚美尼亚语资源文件的数量类为 quantity 的那个,爱尔兰语为 item 以及波兰语为 0x9145 的那个。

    我还要简要提到两种特殊情况:
    非整数
    基本上,选择的类再次取决于特定于语言的规则。选择类的方式既不通用,也不保证涵盖所有整数规则所需的任何类也可用于任何非整数。这里有一些例子:
  • 对于英语,任何带小数的值将始终映射到 other
  • 对于斯洛文尼亚语,任何带小数的值将始终映射到 few
  • 对于爱尔兰语,选择取决于整数部分。
  • 对于波兰语,与整数的复杂规则相反,非整数总是像英语一样映射到 many

  • 注意: 根据 Language Plural Rules 应该是这样的。唉,Android 目前没有针对 otherfew 的现成方法。
    一个字符串中的多个数量
    如果您的显示文本有多个数量,例如。 G。 other ,将其拆分为 三个 单独的资源:
  • float(double 项)
  • %d match(es) found in %d file(s).(%d match(es) 项)
  • plurals(普通参数化%d file(s)项)

  • 然后,您可以对 1 和 2 对 plurals 进行适当的调用,然后对 %1$s found in %2$s. 进行第三次调用,前两个容易本地化的字符串为 strings
    原因是允许翻译人员在语言需要时切换第三个资源中的参数顺序。例如,如果假设语言中唯一有效的语法是 getQuantityString ,则翻译器可以照常翻译复数,然后将第三个资源翻译为 getString 以说明交换顺序。

    关于android - 如何使用Android数量字符串(复数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41950952/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com