Подтвердить что ты не робот

Как обрабатывать языки 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 еще не предоставил такую ​​библиотеку.

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

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

Обратитесь к: http://developer.android.com/reference/android/support/v4/text/BidiFormatter.html