Специфичные для локали сообщения в Xerces 2.11.0 (Java)
Я хочу использовать локализованные сообщения об ошибках с моими 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 не вариант между прочим.
Любая помощь приветствуется!
3 ответа
Не максимум в переносимости, но он работает, так как парсер - это парсер apache в 99% всех случаев.
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
Возможность установить / получить 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 {...}
//...
}
Я думаю, что вы должны попробовать использовать
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");
}
Это указывает на то, что, если файл пакета ресурсов объявлен в соответствии с локалью, элемент управления должен иметь возможность выбирать другой файл ресурсов, имеющий сообщение об ошибке на другом языке.