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 在这方面的文档。
我需要在我的程序中显示一条错误消息,使用参数(或模板,如果您愿意)例如:
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 在这方面的文档。