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

Xerces 2.11.0(Java)中特定于语言环境的消息,java,localization,xerces,xerces2-j,Java,Localization,Xerces,Xerces2 J,我想在JAXP和Xerces2中使用特定于语言环境的错误消息。默认情况下,只有英文邮件可用 第一步是检索消息文件并将其放入包“org/apache/xerces/impl/msg/”-done。通过使用Locale.setDefault(Locale.dermany)显示德语消息,这样就可以正常工作 但是我希望消息在每个实例的基础上进行不同的本地化。因此,一个解析器应该返回英语消息,另一个解析器应该返回德语消息 我用来创建SAX2解析器的代码是: org.xml.sax.XMLReader re

我想在JAXP和Xerces2中使用特定于语言环境的错误消息。默认情况下,只有英文邮件可用

第一步是检索消息文件并将其放入包“org/apache/xerces/impl/msg/”-done。通过使用
Locale.setDefault(Locale.dermany)
显示德语消息,这样就可以正常工作

但是我希望消息在每个实例的基础上进行不同的本地化。因此,一个解析器应该返回英语消息,另一个解析器应该返回德语消息

我用来创建SAX2解析器的代码是:

org.xml.sax.XMLReader ret = XMLReaderFactory.createXMLReader ();
对于DOM,我使用的DocumentBuilder如下(非常简化):

我找到了类似于
org.apache.xerces.impl.XMLErrorReporter
的类,它有一个
setLocale(Locale)
方法,但我没有找到获取/设置它的方法

顺便说一句,切换到SAX1不是一个选项


感谢您的帮助

我想你应该试试使用

com.sun.org.apache.xerces.internal.impl.msg.XMLMessageFormatter 
如果要编写自定义验证,请尝试调用其formatMessage(…)方法,在该方法中可以提供区域设置名称作为参数

apache库本身提供了一个相同的示例。看到了吗

另一种方法是,您可以重写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");
         }

这表明,如果资源包文件是根据区域设置声明的,那么控件应该能够选择具有不同语言错误消息的不同资源文件。

不是可移植性的最大值,但在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“,地点:法国)

哦,忘了官方消息来源:
可能性设置/获取消息格式化程序:

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 {...}
    //...

}

我曾考虑使用XMLMessageFormatter,但在提供的示例中,他们正在使用一些
XMLSchemaValidatorComponentManager
来获取和更新XMLMessageFormatter(我没有)。必须有一种方法可以通过标准DocumentBuilder设置来完成…对不起,我的错。。我放错了链接。。已经更新了正确的一个。希望这有帮助。感谢更新链接。所以在我看来,我不能直接设置区域设置。那么如何设置XMLMessageFormatter呢?使用哪种财产?即使这个解决方案不是最优的,因为它绑定到Xerces…..我想,您需要在这里使用formatMessage()方法。有一件事我可以建议,如果您希望有一个setter方法,您应该考虑创建一个子类,该类使用setter方法to locale和您自己的format方法调用父类的super.formatMessage()通过setter方法传递区域设置信息集。但这完全干扰了JAXP的工厂概念-必须有一种“简单”的方法将区域设置(或消息格式化程序)设置为DocumentBuilder或DocumentBuilderFactory谢谢-这正是我想要的!注意:如果要强制执行英文验证消息,可能需要输入一个空的区域设置对象。这是因为JRE不包含XMLMessage_en.properties,因此会尝试默认的语言环境集(在我的例子中是德语或法语),该语言环境集可以很好地解析包含的bundle。在使用空区域设置时,您强制ResourceBundle机制只需尝试basename(在JRE中包含英文属性)。请注意,因为我在使用XSD验证时遇到了一个类似的问题:如果您有
验证程序
实例,您可以使用
验证程序.setProperty(“http://apache.org/xml/properties/locale",法国)-但如果您的语言环境使用“en”语言,但使用的是非英语默认语言环境,请小心-使用
Locale.ROOT
强制执行英语消息@PhilipHelger谢谢你的留言,非常有用。要强制非英语用户使用英语,必须使用Locale.ROOT。
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 {...}
    //...

}