您可以使用Java ResourceBundle执行以下操作吗?
在属性文件中......
example.dynamicresource=You currently have {0} accounts.
在运行时...
int accountAcount = 3;
bundle.get("example.dynamicresource",accountCount,param2,...);
给出结果
“您目前有3个帐户。”
答案 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>
结合使用ResourceBundle
和MessageFormat
在幕后。
如果您正在使用 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 + "]";
}
}