如何在messages.properties文件中使用命名参数?

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)


Mih*_*ita 9

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


Paw*_*yda 7

对于那些尝试过的人来说,一切皆有可能......我从来没有听说过类似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)

它并不理想,因为你实际上会用硬编码字符串来调用它(这通常是个坏主意)并且你将被迫只使用字符串,但它可以完成.唯一的问题是它是否实用.


mat*_*t b 7

不幸的是,MessageFormatAPI不支持命名参数,只支持参数索引:

模式及其解释

MessageFormat使用以下格式的模式:

MessageFormatPattern:
     String
     MessageFormatPattern FormatElement String

FormatElement:
     { ArgumentIndex }
     { ArgumentIndex , FormatType }
     { ArgumentIndex , FormatType , FormatStyle }
Run Code Online (Sandbox Code Playgroud)