Индивидуальная транслитерация ICU - PullRequest
4 голосов
/ 07 июня 2011

Я собираюсь использовать библиотеку ICU для транслитерации, но я хотел бы предоставить специальный файл транслитерации для набора конкретных пользовательских транслитераций, который будет включен в ядро ​​ICU во время компиляции для использования в двоичной форме в другом месте. Я работаю с источником ICU 4.2 по причинам совместимости.

Насколько я понимаю, со страницы данных ICU на их веб-сайте один из способов сделать это - создать файл trnslocal.mk в ICUHOME / source / data / translit / и в этом файл имеет одну строку TRANSLIT_SOURCE_LOCAL=custom.txt.

Для самого файла custom.txt я использовал следующий формат, основанный на мастер-файле root.txt:

custom{
    RuleBasedTransliteratorIDs {
            Kanji-Romaji {
            file {
              resource:process(transliterator){"custom/Kanji_Romaji.txt"}
              direction{"FORWARD"}
            }
         }
    }
    TransliteratorNamePattern {
        // Format for the display name of a Transliterator.
        // This is the language-neutral form of this resource.
        "{0,choice,0#|1#{1}|2#{1}-{2}}" // Display name
    }
    // Transliterator display names
    // This is the English form of this resource.
    "%Translit%Hex"         { "%Translit%Hex" }
    "%Translit%UnicodeName" { "%Translit%UnicodeName" }
    "%Translit%UnicodeChar" { "%Translit%UnicodeChar" }
    TransliterateLATIN{        
        "",
        ""
    }
}

Затем я сохраняю в каталоге custom файл Kanji_Romaji.txt, найденный здесь . Поскольку он использует > вместо , который я видел в других файлах, я преобразовал каждую запись соответствующим образом, и теперь они выглядят так:

丁 → Tei ;
七 → Shichi ;

Когда я компилирую проект ICU, мне сообщают без ошибок.

Однако, когда я пытаюсь использовать этот пользовательский транслитератор в тестовом файле (тестовый файл, который отлично работает со встроенными транслитераторами), я сталкиваюсь с ошибкой error: 65569:U_INVALID_ID.

Я использую следующий код для построения транслитератора и вывода ошибки:

UErrorCode status = U_ZERO_ERROR;
Transliterator *K_R = Transliterator::createInstance("Kanji-Romaji", UTRANS_FORWARD, status);
if (U_FAILURE(status))
{
std::cout << "error: " << status << ":" << u_errorName(status) << std::endl;
return 0;
}

Кроме того, цикл до Transliterator::countAvailableIDs() и Transliterator::getAvailableID(i) не перечисляет мою пользовательскую транслитерацию. Я не забываю читать в отношении пользовательских конвертеров, что они должны быть зарегистрированы в /source/data/mappings/convrtrs.txt. Есть ли аналогичный файл для транслитераторов?

Кажется, что мой пользовательский транслитератор либо не встроен в соответствующие пакеты (хотя ошибок компиляции нет), либо неправильно отформатирован, либо каким-то образом не зарегистрирован для использования. Кстати, мне известен маршрут RuleBasedTransliterator во время выполнения, но я бы предпочел иметь возможность компилировать пользовательские транслитерации для использования в любом произведенном двоичном файле.

Дайте мне знать, если понадобятся какие-либо дополнительные разъяснения. Я знаю, что здесь есть по крайней мере один программист ICU, который очень помог в других постах, которые я написал и видел в других местах. Я был бы признателен за любую помощь, которую я могу найти. Заранее спасибо!

1 Ответ

3 голосов
/ 09 июня 2011

Транслитераторы получены из CLDR - вы можете добавить свой транслитератор в CLDR (каталог для перекрестного подключения содержит его в формате XML в каталоге cldr /) и перестроить данные ICU.В ICU нет простого механизма добавления транслитераторов, как вы пытаетесь это сделать.Что я хотел бы сделать, так это забыть о trnslocal.mk или custom.txt, так как вам не нужно добавлять какие-либо файлы, и просто измените root.txt - вы можете сообщить об ошибке, если у вас есть предложенное улучшение.

...