que*_*ner 20 java spring internationalization
有没有办法让message.properties记录如下
message.myMessage=This message is for ${name} in ${location}
Run Code Online (Sandbox Code Playgroud)
而不是
message.myMessage = This message is for {0} in {1}
Run Code Online (Sandbox Code Playgroud)
当我创建消息时,我不一定知道顺序/需要多少参数,但我只能按名称传递几个属性,并且只使用正确的属性.
Yur*_*rev 15
在面对同样的问题并在源代码中进行挖掘之后,我发现了一个"循环漏洞",它可以以一种非常简单的方式实现:
message.myMessage = This message is for {0,,name} in {1,,location}
Run Code Online (Sandbox Code Playgroud)
这种方法不会消除数字的使用.使用它的原因是为翻译人员提供提示.
kro*_*ock 10
我恐怕不会,参数是一个Object数组,所以没有办法为它们定义名称.如果你总是以相同的顺序传入参数数组,尽管你可以像这样使用它们:
message.myMessage = This message is for {0} in {1}
message.myNameMessage = This message is for {0}
message.myLocationMessage = This message is for people in {1}
message.myAlternateMessage = The message params are location: {1}; name: {0}
Run Code Online (Sandbox Code Playgroud)
看看ICU4J
它允许这样的事情:
message.myMessage=This message is for {name} in {location}.
Run Code Online (Sandbox Code Playgroud)
并且它比建议的简单替换更强大,因为可以对参数进行区域设置感知格式化(即:"订阅到期时间:{expirationDate,date,long})
http://icu-project.org/apiref/icu4j/com/ibm/icu/text/MessageFormat.html
对于那些尝试过的人来说,一切皆有可能......我从来没有听说过类似Java的东西,但你可以自己写.
请看一下这个例子:
public String format(String message, String... arguments) {
for (String argument : arguments) {
String[] keyValue = argument.split("=");
if (keyValue.length != 2)
throw new IllegalArgumentException("Incorrect argument: " + argument);
String placeholder = "${" + keyValue[0] + "}";
if (!message.contains(placeholder))
throw new IllegalArgumentException(keyValue[0] + " does not exists.");
while (message.contains(placeholder))
message = message.replace(placeholder, keyValue[1]);
}
return message;
}
Run Code Online (Sandbox Code Playgroud)
它并不理想,因为你实际上会用硬编码字符串来调用它(这通常是个坏主意)并且你将被迫只使用字符串,但它可以完成.唯一的问题是它是否实用.
不幸的是,MessageFormatAPI不支持命名参数,只支持参数索引:
模式及其解释
MessageFormat使用以下格式的模式:
MessageFormatPattern:
String
MessageFormatPattern FormatElement String
FormatElement:
{ ArgumentIndex }
{ ArgumentIndex , FormatType }
{ ArgumentIndex , FormatType , FormatStyle }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23490 次 |
| 最近记录: |