Локализация с помощью ICU4C и XLIFF
Локализация с помощью ICU рекомендует хранить локализуемые данные в формате XLIFF.
Поэтому я использовал GNU xgettext
извлечь строки в gettext
форматировать файлы, а затем конвертировать их в файлы XLIFF с po2xliff
,
Наконец, я попытался использовать конвертер формата XLIFF To ICU ResourceBundle, чтобы превратить их в формат ресурсов ICU, прежде чем я обнаружил, что он не работает. Жалуется на ошибку:
The XLIFF document is invalid, please check it first:
Line 2, Column 68
Error: cvc-elt.1: Cannot find the declaration of element 'xliff'.
Почти такая же ошибка была сообщена несколько лет назад и еще не исправлена.
Строка 2 плохого файла XLIFF была:
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.1" version="1.1">
Ну, я отредактировал строку в соответствии с example.xlf
в Локализация со страницей ICU (в файле примера есть много опечаток), повторили попытку и получили:
ERROR: java.lang.NullPointerException
Итак, какова лучшая практика локализации с ICU4C и XLIFF?
2 ответа
Учитывая, что конвертер формата XLIFF в ICU ResourceBundle еще не поддерживает XLIFF 1.2 (который существует уже много лет), я бы рекомендовал держаться подальше от XLIFF и использовать po-файлы для локализации. Существует несколько инструментов локализации, которые поддерживают po-файлы: в ответах на этот и этот вопрос вы найдете довольно большое количество инструментов локализации, которые обрабатывают po-файлы, и новые еще находятся в разработке ( например, этот).
Конечно, не каждый переводчик сможет или захочет работать с po-файлами, но шансы локализовать ваше программное обеспечение намного выше с помощью po, чем при попытке пойти по пути XLIFF.
Я не могу ответить на ваш вопрос о наилучшей практике локализации с помощью ICU4C и XLIFF, но я видел ошибку "Недопустимый документ XLIFF", когда я использовал неправильную версию Java JDK при создании ресурса ICU.
В моей системе я вижу ошибку при использовании jdk1.7.0_67
, Все отлично работает, если я использую jdk1.6.0_45
, Это с ICU 52.1. Возможно, вам придется проверить, что вы используете правильный JDK для той версии ICU, которую вы используете.