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

Java String Internationalization Supporting RTL with Parameters

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

Connection to {0} failed with {1} status

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

我在我的翻译器中尝试了 {N}(参数键),幸运的是我的目标语言不会翻译参数键,但它们会 "mangle" 标准 java/C-style %s 之类的东西,所以如果没有一些自定义开销,String.format() 调用将无法工作。

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

如果您知道更好的方法(不涉及图书馆),我非常愿意听到您的回答and/or评论。

谢谢。

所以,在等待的过程中,我想出了一个基本函数,它可以直接调用,也可以由特定的案例处理程序调用:

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;
}

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

这是 one of the oldest Java text processing features,早在 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);

这消除了您自己声明另一个 static 辅助方法的需要。

当在 Java 5 中添加 C 风格的格式化功能时,它在 String class 中显着放置了便利方法,但是,我不愿意调用C 风格格式“标准java/C-style”。当您查看带有日期、数字、选项和消息格式化程序的 java.text API 以及如何将前者嵌入后者时,您会注意到它比 Java 5 的新 java.util.Formatter 功能,而遗憾的是这些功能之间没有交互。

更新的 java.time API 本身有 formatters/parser,但提供了通往 java.text API 的桥梁,尽管您不能以同样的方式将它们嵌入到 MessageFormat 中。而且它不提供与 java.util.Formatter API.

的任何交互

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