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

Как обнаружить, что текст, набранный в текстовой области, - RTL

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

Когда пользователь записывает в RTL, пользователь должен нажать Right-shift + ctrl, чтобы текст выравнивался вправо и был rtl. Однако в окнах (и, возможно, в других современных ОС) пользователь может установить любую комбинацию клавиш для переключения языка и направления текста.

Я знаю, как отображать текст как RTL, но как я узнаю, какое направление для отображения?

Есть ли способ обнаружить, что текст, набранный в текстовое поле/текстовое поле, был напечатан как RTL?

4b9b3361

Ответ 1

Я подошел к более простому и приятному решению. Просто добавьте dir="auto" к элементам, и браузер выполнит эту работу!

Смотрите: http://www.w3schools.com/tags/att_global_dir.asp

Ответ 2

Попробуйте следующее:

var rtl_rx = /[\u0591-\u07FF]/;
$('textarea').on('keyup',function(){
    this.style.direction = rtl_rx.test(this.value) ? 'rtl' : 'ltr';
});

Я использовал упрощенный RegExp для обнаружения RTL

/[\u0591-\u07FF]/

Хотя он не будет улавливать каждый символ RTL в таблице Unicode, он, вероятно, охватывает все случаи реальной жизни. Он включает в себя все нормальные символы на иврите и арабском языке, включая символы гласности.

Ответ 3

Вы можете написать быстрый код JavaScript/jQuery, используя регулярные выражения. Регулярные выражения ограничены в JavaScript, поэтому вам нужно будет использовать библиотеку XRegExp, которая имеет полную поддержку Unicode - если вы добавите плагины. Затем вы можете проверить символы, чтобы увидеть, к какому блоку Юникодов они принадлежат к выражениям, подобным этому \p {Иврит}. http://www.regular-expressions.info/unicode.html

Столкнувшись с той же дилеммой, я написал себе функцию, которая перебирает символы в каждой строке и подсчитывает количество вхождений символов на иврите (мой сайт двуязычный идиш/английский). Затем строка получает оценку, а класс "rtl" применяется к элементам с высокой оценкой. Вы можете легко добавить все языки RTL в Unicode в цикл for, чтобы сделать это более общим.

http://jsfiddle.net/Swyu4/9/

Обратите внимание на внешние ресурсы, связанные с библиотеками XRegExp в jsfiddle.

$('p').each(function() {
    if(isRTL($(this).text()))
        $(this).addClass('rtl');
});

function isRTL(str) {
    var isHebrew = XRegExp('[\\p{Hebrew}]');
    var isLatin = XRegExp('[\\p{Latin}]');
    var partLatin = 0;
    var partHebrew = 0;
    var rtlIndex = 0;
    var isRTL = false;

    for(i=0;i<str.length;i++){
        if(isLatin.test(str[i]))
            partLatin++;
        if(isHebrew.test(str[i]))
            partHebrew++;
    }
    rtlIndex = partHebrew/(partLatin + partHebrew);
    if(rtlIndex > .5) {
        isRTL = true;
    }
/*
console.log('Latin score: ' + partLatin);
console.log('Hebrew score: ' + partHebrew);
console.log('trlIndex score: ' + rtlIndex);
console.log('isRTL: ' + isRTL);
*/

    return isRTL;
}