如何使用 Android xliff:g

25

有人能否解释一下用于字符串/本地化的 xliff:g 是什么意思。

我知道 xliff:g 不应翻译 <> 中的任何内容,但我不确定在代码中该如何使用它。

我在我的情况中有一个示例,即我所拥有的西班牙语翻译实践:

<string name="order_quantity">Cantidad: <xliff:g id="quantity" example="2">%d/xliff:g</string>

我现在正在尝试使用xliff:g获取本地化字符串。

这里的id是什么,它是做什么的?它叫什么名字?

%d是什么,它是做什么的?example有什么意义?如果有的话,我如何将它调用到代码中?

为什么不能直接使用以下代码插入以下XML:

<string name="quant">Quantity: </string>

就像这样进入Java:

getString(R.string.quant) + quantity

这样就可以将数量变量连接到 getString 中了吗?

2个回答

39

您的示例中有一个小错别字,应该加上一个闭合标签:

<string name="order_quantity">Cantidad: <xliff:g id="quantity" example="2">%d</xliff:g></string>

id 属性只是用于标识代替参数的含义(在您的情况下,它表示数量)。就像你说的那样,它是一条注释,实际上并没有在编程中使用。

话虽如此,在 Android Studio 中,如果您启用了字符串的 Code Folding,则会在显示折叠字符串时替换 ID。您会看到类似于这样的东西:

// This...
mTextView.setText(getString(R.string.order_quantity, 2));

// Will show as this when folded:
mTextView.setText("Cantidad: {quantity}");

至于您的第二个问题,为什么不只使用字符串连接?在其他语言中,替换可能不会放在字符串的末尾。您可以像这样:

values/strings.xml
    <string name="order_quantity">%d items</string>

values-es/strings.xml
    <string name="order_quantity">Cantidad: %d</string>

所以你可以看到,在这种情况下,简单地将字符串连接在一起不会给你一个有效的结果。


抱歉,我手动输入的。在实际的 XML 中是正确的 :p - Tal C
我本意是要连接Java,而不是XML。因此基本上在XML中有翻译后的字符串,然后在Java中连接该值。 - Tal C
再次强调,这是不行的,因为在我的例子中,替换参数位于不同的位置(例如,3个项目 vs 项目:3)。 - Kevin Coppock
5
在占位符上的 id 属性实际上可以用于验证翻译:如果源语言字符串中包含一个带有 id="quantity" 的占位符,您也想在目标语言中使用这样的占位符。如果您的字符串中有两个或更多的占位符,翻译人员也可以在必要时更改它们的顺序。example 属性为翻译人员提供了一个示例,以便他知道占位符代表整数、日期、名称、组织或完全不同的内容,这可能会影响目标语言中的语法。 - Jenszcz

-1

%d 用于将内存中的一部分表示为整数。 它最常用于将某些数字打印到标准输出,如下所示:

#include <stdio.h>
int main()
{
    int n = 42;
    printf("The answer to life, universe and everything is %d", n);
    return 0;
}

与Java不同,Java可以简单地连接数字和字符串等,C使用%something来指示正在编写的内容。%d表示,在printf()中,逗号后面将有一个参数(在我们的情况下是n),应表示为int。

请参阅C编程中所有格式说明符的列表以获取完整的格式说明符列表

还请参阅官方Android开发者文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接