Xerces 2.11.0(Java)中特定于语言环境的消息
我想在JAXP和Xerces2中使用特定于语言环境的错误消息。默认情况下,只有英文邮件可用 第一步是检索消息文件并将其放入包“org/apache/xerces/impl/msg/”-done。通过使用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
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 {...}
//...
}