Xerces 2.11.0(Java)中特定于语言环境的消息

时间:2013-08-30 11:18:57

标签: java localization xerces xerces2-j

我想在我的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的选项。

感谢任何帮助!

3 个答案:

答案 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

http://www.docjar.com/html/api/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter.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");
         }

这表明,如果根据语言环境声明资源包文件,则控件应该能够选择具有不同语言错误消息的不同资源文件。