您可以使用 Java ResourceBundle 执行以下操作吗?
在属性文件中...
example.dynamicresource=You currently have {0} accounts.
在运行时...
int accountAcount = 3;
bundle.get("example.dynamicresource",accountCount,param2,...);
给出一个结果
“您目前有 3 个帐户。”
您可以使用 Java ResourceBundle 执行以下操作吗?
在属性文件中...
example.dynamicresource=You currently have {0} accounts.
在运行时...
int accountAcount = 3;
bundle.get("example.dynamicresource",accountCount,param2,...);
给出一个结果
“您目前有 3 个帐户。”
并非不使用MessageFormat类,例如:
String pattern = bundle.getString("example.dynamicresource");
String message = MessageFormat.format(pattern, accountCount);
就其本身而言,ResourceBundle
不支持属性占位符。通常的想法是从捆绑包中获取 String ,并将其粘贴到 aMessageFormat
中,然后使用它来获取参数化消息。
如果您使用的是JSP/JSTL,那么您可以结合<fmt:message>
并<fmt:param>
执行此操作,这在幕后使用ResourceBundle
and MessageFormat
。
如果您碰巧在使用Spring,那么它具有ResourceBundleMessageSource
which做类似的事情,并且可以在您的程序中的任何地方使用。这种MessageSource
抽象(与 结合MessageSourceAccessor
)比ResourceBundle
.
有多种方法,具体取决于您使用的查看技术。如果您使用的是“普通的”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>
最好的地方是查阅您正在使用的技术/框架的文档(或在这里告诉它,以便我们可以提供更合适和更详细的答案)。
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 个以上的参数值)。
PS该getResources
方法仅在 StrutsAction
类中可用。
我不认为你可以为非英语属性文件做这项工作。
我的 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() 也不好
我不相信 ResourceBundle 可以自己做到这一点,但 String 可以:
String.format(bundle.getString("example.dynamicresource"), accountCount);
请记住,在使用时,如果要表示单引号 ( ),则需要在资源包中MessageFormat.format()
使用双引号( )。''
'
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 + "]";
}
}