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

String 支持带参数的RTL的Java字符串国际化,string,templates,java-8,locale,String,Templates,Java 8,Locale,我需要在我的程序中显示错误消息,使用参数(或模板,如果您愿意),例如: 到{0}的连接失败,状态为{1} 字符串已经针对区域设置进行了编译(翻译),但是我想知道是否需要编写一个函数来填充模板,或者在标准Java8中是否已经有一个可用的函数 我在我的翻译器中尝试了{N}(参数键),幸运的是,我所针对的语言不会翻译参数键,但它们会“破坏”标准java/C风格的东西,如%s,因此String.format()调用在没有自定义开销的情况下无法工作 到目前为止,我一直在解决这个问题,据我所知,这是支持错误

我需要在我的程序中显示错误消息,使用参数(或模板,如果您愿意),例如:

到{0}的连接失败,状态为{1}

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

我在我的翻译器中尝试了
{N}
(参数键),幸运的是,我所针对的语言不会翻译参数键,但它们会“破坏”标准java/C风格的东西,如
%s
,因此
String.format()
调用在没有自定义开销的情况下无法工作

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

如果你知道一个更好的方法(不涉及图书馆),我非常感谢你的回答和/或评论


谢谢。

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

公共静态字符串编译器缩放模板(字符串模板、字符串…参数){
对于(int i=0;i
它的速度快而且脏,因为它不做任何错误检查,但它应该可以工作(理论上)。

在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);
这样就不需要自己声明另一个
静态
助手方法

当Java 5中添加C风格格式特性时,它在
String
类中得到了显著的便利方法,然而,我不愿意将C风格格式称为“标准Java/C风格”。当您查看带有日期、编号、选项和消息格式化程序的
java.text
API以及如何将前者嵌入后者时,您会注意到它比java 5的新
java.util.formatter
功能更强大,但不幸的是,这些功能之间没有交互

甚至更新的
java.time
API本身就有格式化程序/解析器,但提供了到
java.text
API的桥梁,尽管不能以同样的方式将它们嵌入到
MessageFormat
中。而且它不提供与
java.util.Formatter
API的任何交互


因此,Java格式化API是隔离特性的拼凑。但是请注意,当您准备将这些消息与日志API一起使用时,很有可能在您使用参数进行日志记录时,它已经使用了
MessageFormat
,例如
logger.log(Level.ERROR,“连接到{0}失败,状态为{1}”,param1,param2)
您应该检查日志API在这方面的文档。

我接受您的答案作为首选解决方案,但是其他有兴趣的参与者应该注意,
{N}
参数不能保证不会被语言转换器损坏,这将破坏此功能作为一个可行的选项,并且需要一个定制的静态方法来使用特定的参数密钥嵌入方案来膨胀模板。[感谢您的高质量回答,非常感谢您的工作。]“标准java/C风格”充分反映了这样一个事实,
%s
用法是跨语言边界的共享格式样式,尽管在数字的实现上存在显著差异,但我的具体用法是关于字符串,而不是数字(使用稍有不同的格式符号)。向前的索利多金币(
/
)在所有意图和目的上都意味着
。因此,无论我们使用Java还是C,基于
%
的格式说明符都不是一个可行的选择。[注意]是的,翻译人员必须知道不可翻译的占位符。但是,正如前面所说的,
{n}
格式是Java最古老的格式,自1993年以来一直存在,并得到大多数支持工具的支持。