Java中的资源包是否支持运行时字符串替换?

时间:2010-03-15 22:56:35

标签: java resourcebundle

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

在属性文件中......

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

在运行时...

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

给出结果

“您目前有3个帐户。”

8 个答案:

答案 0 :(得分:64)

不使用MessageFormat类,例如:

String pattern = bundle.getString("example.dynamicresource");
String message = MessageFormat.format(pattern, accountCount);

答案 1 :(得分:10)

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

如果您使用的是 JSP / JSTL ,则可以将<fmt:message><fmt:param>结合使用ResourceBundleMessageFormat在幕后。

如果您正在使用 Spring ,那么它具有ResourceBundleMessageSource does something similar,并且可以在您的程序中的任何位置使用。这个MessageSource抽象(与MessageSourceAccessor结合使用)比ResourceBundle更好用。

答案 2 :(得分:6)

根据您使用的视图技术,有多种方法。如果您使用的是“普通香草”Java(例如Swing),那么请使用前面已回答的MessageFormat API。如果您正在使用Web应用程序框架(如果我在这里正确判断您的问题历史记录,那就是这样),那么方式取决于您正在使用的视图技术和/或MVC框架。如果它是例如“普通的vanilla”JSP,那么你可以使用JSTL fmt:message

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

最好的地方是查阅您正在使用的技术/框架的文档(或在此处说明,以便我们提供更合适和更详细的答案)。

答案 3 :(得分:3)

Struts有一个名为MessageResources的很好的工具,它完全符合你的要求......

e.g。

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个以上的参数值)。

PS getResources方法仅适用于Struts Action类。

答案 4 :(得分:1)

我认为你不能为非英语属性文件工作。

我的message.properties文件包含以下行:

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

我的message_fr_FR.properties文件包含以下行:

info.fomat.log.message.start = partir d'analyzer le message connecter {0}格式。

此代码仅适用于英文版

String.format((String)messages .getString(GlobalConstants.MESSAGE_FORMAT_START),GlobalConstants.STR_JSON));

当我的语言/语言环境为法语时, NOT 将占位符替换为值: - (

即使MessageFormat.fomat()也不好

答案 5 :(得分:0)

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

String.format(bundle.getString("example.dynamicresource"), accountCount);

答案 6 :(得分:0)

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

答案 7 :(得分:0)

MessageFormoat#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 + "]";
    }
}