strings.xml 中的参数是不是可能? [复制]

Posted

技术标签:

【中文标题】strings.xml 中的参数是不是可能? [复制]【英文标题】:Are parameters in strings.xml possible? [duplicate]strings.xml 中的参数是否可能? [复制] 【发布时间】:2011-01-24 18:03:54 【问题描述】:

在我的 android 应用程序中,我将通过国际化来实现我的字符串。我对语法和不同语言的句子构建方式有疑问。

例如:

“5 分钟前”- 英语

"vor 5 Minuten" - 德语

我可以在 strings.xml 中执行以下操作吗?

<string name="timeFormat">0 minutes ago</string>

然后是一些魔法,比如

getString(R.id.timeFormat, dynamicTimeValue)

这种行为也可以解决不同词序的另一个问题。

【问题讨论】:

【参考方案1】:

是的,只需以标准 String.format() 方式格式化您的字符串。

请参阅方法 Context.getString(int, Object...) 和 Android 或 Java Formatter 文档。

在您的情况下,字符串定义将是:

<string name="timeFormat">%1$d minutes ago</string>

【讨论】:

【参考方案2】:

如果需要XML中的两个变量,可以使用:

%1$d text... %2$d%1$s text... %2$s 用于字符串变量。

例子:

strings.xml

<string name="notyet">Website %1$s isn\'t yet available, I\'m working on it, please wait %2$s more days</string>

activity.java

String site = "site.tld";
String days = "11";

//Toast example
String notyet = getString(R.string.notyet, site, days);
Toast.makeText(getApplicationContext(), notyet, Toast.LENGTH_LONG).show();

【讨论】:

顺序没有你说的那么重要。字符串中的数字实际上是参数的顺序。根据语言,您可以按不同的顺序排列数字。 需要注意的是先修改xml,否则.java代码getString将无法编译,因为getString需要提前知道需要多少参数。【参考方案3】:

如果您需要使用 String.format(String, Object...) 格式化字符串,则可以通过将格式参数放入字符串资源中来实现。例如,使用以下资源:

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

如果您想了解更多信息,请查看:http://developer.android.com/intl/pt-br/guide/topics/resources/string-resource.html#FormattingAndStyling

【讨论】:

【参考方案4】:

有很多方法可以使用它,我建议您查看有关字符串格式的文档。

http://developer.android.com/intl/pt-br/reference/java/util/Formatter.html

但是,如果您只需要一个变量,则需要使用 %[type] 其中 [type] 可以是任何标志(请参阅站点内的标志类型更多)。 (即“我的名字是 %s”或要将我的名字设置为大写,请使用“我的名字是 %S”)

<string name="welcome_messages">Hello, %1$S! You have %2$d new message(s) and your quote is %3$.2f%%.</string>

Hello, ANDROID! You have 1 new message(s) and your quote is 80,50%.

【讨论】:

【参考方案5】:

请注意,对于这个特定的应用程序,有一个标准库函数 android.text.format.DateUtils.getRelativeTimeSpanString()

【讨论】:

这个 lib 函数虽然是一个绝妙的主意,但在其他语言中存在语法错误和误译……西班牙语就是其中之一,我觉得这很荒谬。当我遇到它时,我感到如释重负,当我发现它并非应有的魔法时,我感到很生气。 在一般情况下使用仍然是一个好主意,也许仅在特定情况下才覆盖。这样您就可以获得系统更新的免费改进(如果有错误,您可能应该继续报告它们)。

以上是关于strings.xml 中的参数是不是可能? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 android strings.xml 中引用字符串数组

OpenCV C++中的矩阵复共轭

在 Strings.xml 与代码中存储字符串是不是会使逆向工程变得更加乏味?

在android开发中,关于string和string.xml的问题

Proguard 不会混淆 android 中的 strings.xml

是否可以使用 SQLite 来存储翻译而不是像 strings.xml 这样的 XML 资源