Специфичные для локали сообщения в 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

или же

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");
         }

Это указывает на то, что, если файл пакета ресурсов объявлен в соответствии с локалью, элемент управления должен иметь возможность выбирать другой файл ресурсов, имеющий сообщение об ошибке на другом языке.

Другие вопросы по тегам