41

您可以使用 Java ResourceBundle 执行以下操作吗?

在属性文件中...

example.dynamicresource=You currently have {0} accounts.

在运行时...

int accountAcount = 3;
bundle.get("example.dynamicresource",accountCount,param2,...);

给出一个结果

“您目前有 3 个帐户。”

4

8 回答 8

73

并非不使用MessageFormat类,例如:

String pattern = bundle.getString("example.dynamicresource");
String message = MessageFormat.format(pattern, accountCount);
于 2010-03-15T22:58:51.743 回答
10

就其本身而言,ResourceBundle不支持属性占位符。通常的想法是从捆绑包中获取 String ,并将其粘贴到 aMessageFormat中,然后使用它来获取参数化消息。

如果您使用的是JSP/JSTL,那么您可以结合<fmt:message><fmt:param>执行此操作,这在幕后使用ResourceBundleand MessageFormat

如果您碰巧在使用Spring,那么它具有ResourceBundleMessageSourcewhich做类似的事情,并且可以在您的程序中的任何地方使用。这种MessageSource抽象(与 结合MessageSourceAccessor)比ResourceBundle.

于 2010-03-15T23:02:23.213 回答
6

有多种方法,具体取决于您使用的查看技术。如果您使用的是“普通的”Java(例如 Swing),那么请使用MessageFormat之前回答的 API。如果您使用的是 web 应用程序框架(这是真的,如果我在这里正确判断您的问题历史),那么方式取决于您使用的视图技术和/或 MVC 框架。例如,如果它是“plain vanilla”JSP,那么您可以fmt:message为此使用 JSTL。

<fmt:message key="example.dynamicresource">
    <fmt:param value="${bean.accountCount}">
</fmt:message>

如果它是例如 JSF,您可以使用h:outputFormat它。

<h:outputFormat value="#{bundle['example.dynamicresource']}">
    <f:param value="#{bean.accountCount}">
</h:outputFormat>

最好的地方是查阅您正在使用的技术/框架的文档(或在这里告诉它,以便我们可以提供更合适和更详细的答案)。

于 2010-03-15T23:03:46.087 回答
3

Struts 有一个很好的实用MessageResources程序,它可以满足您的要求......

例如

MessageResources resources = getResources(request, "my_resource_bundle"); // Call your bundle exactly like ResourceBundle.getBundle() method
resources.getMessage("example.dynamicresource",accountCount,param2,...);

限制 它只允许最多 3 个参数(即资源属性、param1、...、param3)。

我建议按照 David Sykes 的建议使用MessageFormat(如果您想使用 3 个以上的参数值)。

PSgetResources方法仅在 StrutsAction类中可用。

于 2010-03-15T23:13:42.173 回答
1

我不认为你可以为非英语属性文件做这项工作。

我的 message.properties 文件有以下行:

info.fomat.log.message.start=开始解析 {0} 格式的日志消息。

我的 message_fr_FR.properties 文件有以下行:

info.fomat.log.message.start=partir d'analyser le 消息连接器 {0} 格式。

此代码仅适用于英文代码

String.format((String) 消息 .getString(GlobalConstants.MESSAGE_FORMAT_START), GlobalConstants.STR_JSON));

当我的语言/区域设置为法语时,它不会用值替换占位符:-(

甚至 MessageFormat.fomat() 也不好

于 2011-07-19T17:44:30.883 回答
0

我不相信 ResourceBundle 可以自己做到这一点,但 String 可以:

String.format(bundle.getString("example.dynamicresource"), accountCount);
于 2010-03-15T23:03:10.093 回答
0

请记住,在使用时,如果要表示单引号 ( ),则需要在资源包中MessageFormat.format()使用双引号( )。'''

于 2013-10-07T18:42:31.137 回答
0

MessageFormat#format适用于以下情况:

greetingTo=Have Param, saying hello {0}

您可以像这样声明两个方法,其中 RB 是 ResourceBundle 的一个实例:

/**This is a method that takes the param to substitute the placeholder**/
public String getString(String key, Object... params  ) {
    try {
        return MessageFormat.format(this.RB.getString(key), params);
    } catch (MissingResourceException e) {
        return "[" + key + "]";
    }
}

/**Without a param, this will derectly delegate to ResourceBundle#getString**/
public String getString(String key) {
    try {
        return this.RB.getString(key);
    } catch (MissingResourceException e) {
        return "[" + key + "]";
    }
} 
于 2015-04-01T02:38:45.423 回答