Как работать с языками RTL в версиях Android до 4.2?

Фон

TextView всегда имел проблемы с языками RTL (справа налево) . Поскольку я знаю только как читать на иврите (помимо английского), я расскажу о его проблемах:

  • Выравнивание текста (и я не говорю о гравитации) . Как язык RTL, иврит помещает слова справа налево (по сравнению с английским языком, который противоположен) .

    Чтобы продемонстрировать, насколько это раздражает, представьте, что вместо того, чтобы показывать "Hello world". Вы обычно получаете ". Привет мир". Это может быть легко исправлено, если вы поместите его в одном предложении, но это сложнее, когда есть несколько знаков препинания.

  • Позиции гласных. Для чтения текста на иврите не нужны гласные, но иногда без них очень трудно читать (особенно Библию) . Для гласных, иврит имеет то, что называется "НИКУД", которые на самом деле похожи на точки внутри букв. Проблема в Android заключалась в том, что они обычно располагались не в том месте.

    Чтобы продемонстрировать, насколько это раздражает, представьте, что вместо того, чтобы показывать "Hello world". Вы обычно получаете ".eHlol owrld" . Даже если вы попытаетесь это исправить (поместите гласные всегда на один символ после текущего), позиция в букве будет неправильной (представьте, что буква "e" в "Hello" будет как над буквой "H", для пример) .

Только в версии 4.2 (читайте здесь, в разделе "Поддержка нативного RTL"), Google исправил все проблемы, связанные с ивритом (или, по крайней мере, так кажется) .

Эта проблема

проблемы с ивритом привели к тому, что у каждого израильского оператора и каждого изготовителя нестандартного ПЗУ есть свое собственное решение того, как исправить различные проблемы, что делает практически невозможным обработку текста RTL на устройствах до 4.2.

Вещи могут стать еще более разочаровывающими, если текст будет содержать буквы как на иврите, так и на английском языке.

Что я пробовал

Я читал много сайтов, рассказывающих об этих проблемах, и я пробовал много вариантов решений, но ни один не решил проблему на всех устройствах:

  • Некоторые предлагают поставить символ "\u200F" (или "\u202D") в конце / начале / обоих текстов.

  • Некоторые предлагают использовать метод Html.fromHtml() и добавить туда что-то особенное.

  • Некоторые даже предлагают вместо этого использовать WebView (и, возможно, использовать WebSettings.setDefaultTextEncodingName ()) .

Вопрос

Есть ли определенное решение этой проблемы?

Я бы предположил, что лучше всего то, что поскольку Android 4.2 решает эту проблему, а Android является открытым исходным кодом, мы должны импортировать его TextView в библиотеку, которую мы можем использовать, но Google еще не предоставил такую ​​библиотеку.

2 ответа

К сожалению, я не думаю, что есть хорошее решение ("хорошее" означает "делает работу и легко доступно"). Для наших собственных приложений Android, которые поддерживают иврит, мы используем специальный механизм рендеринга, который мы разрабатывали в течение многих лет. Механизм рендеринга делает все: фирменные шрифты; двунаправленный (двунаправленный) анализ; размещение глифа; анализ разрыва строки; поток текста; и т. д. Некоторые проблемы, возникающие при попытке использовать собственные функции обработки текста Android (особенно до 4.2):

  1. Действительно дерьмовые шрифты. Однако вы можете упаковать сторонние шрифты, такие как DejaVu, которые довольно хороши. Правильный шрифт может творить чудеса с позиционированием некудот и теамим1, если вам это нужно. (Я согласен с вами относительно важности правильного размещения указателей; чтение текста на иврите с неуместным некудотом похоже на чтение экрана CAPTCHA.)

  2. Багги биди анализ. Что еще хуже, ошибки кажутся разными для разных версий Android. Изменение текста для включения в него стратегически размещенных кодов двухстороннего форматирования (метка RTL; метка LTR и т. Д.) Может преодолеть многие из этих ошибок (см. Обсуждение здесь, которое не относится к Android). Однако делать это неудобно, и из-за несоответствий между версиями Android сложно заранее предсказать, какая помощь понадобится платформе.

  3. Отсутствие (или плохо продуманная) осведомленность на уровне структуры о проблемах справа налево. Например, удачи в том, чтобы полоса прокрутки отображалась в левой части древнееврейского TextView. Для наших приложений нам пришлось создать целую систему полос прокрутки, чтобы заставить ее работать так, как мы хотели. (Хорошо, думаю, что Android с открытым исходным кодом!)

  4. Плохой анализ строк и разрывов слов. По крайней мере, одна ранняя версия Android, на которой мы тестировали, думала, что каждая метка nikud является границей слова. Когда дело доходит до разрывов строк, система часто не знает, как обрабатывать знаки препинания на иврите, такие как макаф, гершайим или мягкий пасук.

  5. Некоторые из более новых символов Unicode (например, HOLAM HASER FOR VAV - U+05BA - новинка в Unicode 5.0) не распознаются системой как ивритский сценарий.

Я рекомендую, чтобы, если вы не готовы сами построить систему обработки текста сверху вниз, вы отказываетесь от высококачественного отображения текста в версиях Android до 4.2, особенно если вам нужна поддержка nekudot и te'amim., Кроме того, планируйте использовать методы, которые я упомянул в первых двух пунктах выше.

1 библейская кантилляция

По состоянию на август 2013 года Android опубликовал документацию API для двунаправленного форматера, который может удовлетворить ваши потребности. Это содержится в библиотеке поддержки Android v4, которая, по моему мнению, должна работать в версиях до Android 4.2.

См. http://developer.android.com/reference/android/support/v4/text/BidiFormatter.html

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