Intereting Posts

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

Задний план

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

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

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

  • Гласные позиции. Иврит не требует гласных, чтобы читать текст, но иногда их очень трудно читать без них (особенно библия). Для гласных на иврите есть так называемое «NIKUD», которое на самом деле похоже на точки внутри букв. Проблема в Android заключалась в том, что они обычно располагались в неправильном месте.

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

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

Проблема

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

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

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

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

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

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

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

Вопрос

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

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

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

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

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

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

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

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

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

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

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

См. Также: http://developer.android.com/reference/android/support/v4/text/BidiFormatter.html.