我想在我的JAXP和Xerces2中使用特定于语言环境的错误消息。默认情况下,只有英文消息可用。
第一步是检索消息文件并将它们放入包中" org / apache / xerces / impl / msg /" - 完成。使用Locale.setDefault (Locale.GERMANY)
显示德语消息,这样就可以了。
但我希望消息在每个实例的基础上进行不同的本地化。因此,一个解析器应返回英文消息,另一个解析器应返回德语消息。
我用来创建SAX2解析器的代码是:
org.xml.sax.XMLReader ret = XMLReaderFactory.createXMLReader ();
对于DOM我使用DocumentBuilder喜欢这个(非常简化):
final DocumentBuilderFactory aDocumentBuilderFactory = DocumentBuilderFactory.newInstance ();
final DocumentBuilder aDocBuilder = aDocBuilderFactory.newDocumentBuilder ();
final Document doc = aDocumentBuilder.parse (aInputSource);
我发现类似org.apache.xerces.impl.XMLErrorReporter
类的内容有setLocale(Locale)
方法,但我找不到获取/设置方法。
切换到SAX1不是btw的选项。
感谢任何帮助!
答案 0 :(得分:4)
不是最大的可移植性,但它起作用,因为解析器是所有情况下99%的apache解析器。
final DocumentBuilderFactory aDocBuilderFactory = DocumentBuilderFactory.newInstance();
aDocBuilderFactory.setAttribute("http://apache.org/xml/properties/locale", Locale.FRANCE);
final DocumentBuilder aDocBuilder = aDocBuilderFactory.newDocumentBuilder();
final Document doc = aDocBuilder.parse (aInputSource);
对于SAXParser saxParser
,只需致电saxParser.setProperty("http://apache.org/xml/properties/locale", Locale.FRANCE);
哦,忘了官方消息来源: http://xerces.apache.org/xerces2-j/properties.html
答案 1 :(得分:2)
可能性设置/获取MessageFormatter:
Validator validator = schema.newValidator();
XMLErrorReporter property = (XMLErrorReporter) validator.getProperty("http://apache.org/xml/properties/internal/error-reporter");
MessageFormatter messageFormatter = property.getMessageFormatter("http://www.w3.org/TR/xml-schema-1");
property.putMessageFormatter(MyMessageFormatter.SCHEMA_DOMAIN, new MyMessageFormatter());
public class MyMessageFormatter implements MessageFormatter {
public static final String SCHEMA_DOMAIN = "http://www.w3.org/TR/xml-schema-1";
//...
public String formatMessage(Locale locale, String key, Object[] arguments)
throws MissingResourceException {...}
//...
}
答案 2 :(得分:0)
我认为你应该尝试使用
com.sun.org.apache.xerces.internal.impl.msg.XMLMessageFormatter
如果您正在编写自定义验证,请尝试调用其formatMessage(...)方法,您可以在其中提供区域设置名称作为参数。
apache库本身提供了相同的示例。见http://cr.openjdk.java.net/~coffeys/openJDK.7u21.sync/webrev/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_zh_CN.java-.html
或
另一种方法可能是您可以覆盖formatMessage()方法以您自己的方式实现它。请参阅以下实现的此方法的代码:
public String More ...formatMessage(Locale locale, String key, Object[] arguments)
throws MissingResourceException {
if (fResourceBundle == null || locale != fLocale) {
if (locale != null) {
fResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLMessages", locale);
// memorize the most-recent locale
fLocale = locale;
}
if (fResourceBundle == null)
fResourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLMessages");
}
这表明,如果根据语言环境声明资源包文件,则控件应该能够选择具有不同语言错误消息的不同资源文件。