支持带参数RTL的Java字符串国际化



我需要在我的程序中显示一条错误消息,使用参数(或者模板,如果你喜欢的话(,例如:

Connection to {0} failed with {1} status

字符串已经针对区域设置进行了编译(翻译(,但我想知道是否需要编写一个函数来填充模板,或者标准Java 8中是否已经有一个可用的函数

我在翻译器中尝试了{N}(参数键(,幸运的是,我所针对的语言不会翻译参数键,但它们会"破坏"像%s这样的标准java/C风格的东西,所以如果没有一些自定义开销,String.format()调用就无法工作。

到目前为止,我一直在解决这个问题,据我所知,这是支持错误消息的RTL和LTR国际化的最佳方式。

如果你知道一个更好的方法(不涉及库(,我完全赞成听你的回答和/或评论。

谢谢。

这是最古老的Java文本处理功能之一,早在Java中添加对C样式格式字符串的支持之前就已经存在了:

String param1 = "google.com", param2 = "ACCESS DENIED";
String formatted = MessageFormat.format(
"Connection to {0} failed with {1} status", param1, param2);
System.out.println(formatted);

上面使用的方法已经是的一种方便方法

String param1 = "google.com", param2 = "ACCESS DENIED";
String f = "Connection to {0} failed with {1} status";
MessageFormat format = new MessageFormat(f);
String formatted = format.format(new Object[] {param1, param2});
System.out.println(formatted);

这就不需要自己声明另一个CCD_ 5辅助方法。

当Java 5中添加C样式格式化功能时,它在String类中得到了显著的便利方法,然而,我不愿意将C样式格式称为"标准Java/C样式"。当您查看带有日期、数字、选项和消息格式器的java.textAPI,以及如何将前者嵌入后者时,您会注意到它比Java5的新java.util.Formatter功能更强大,而不幸的是,这些功能之间没有交互。

即使是更新的java.timeAPI也有自己的格式化程序/解析器,但它提供了一个到java.textAPI的桥,尽管不能以相同的方式将它们嵌入到MessageFormat中。并且它不提供与java.util.FormatterAPI的任何交互。

因此,Java格式API是一个绝缘特性的拼凑。但请注意,当您将这些消息与日志记录API一起使用时,可能性很高,当您使用参数(如logger.log(Level.ERROR, "Connection to {0} failed with {1} status", param1, param2);(进行日志记录时,它确实使用了MessageFormat。您应该查看日志记录API在这方面的文档。

因此,在等待时,我将其作为一个基本函数,可以直接调用,也可以由特定的案例处理程序调用:

public static String compileLocaleTemplate(String template, String... parameters){
for (int i=0; i < parameters.length; i++){
String tag = "{"+i+"}";
template = template.replace(tag, parameters[i]);
}
return template;
}

它快速而肮脏,因为它不进行任何错误检查,但(理论上(应该可以工作。

最新更新