Ответ 1
Я подошел к более простому и приятному решению. Просто добавьте dir="auto"
к элементам, и браузер выполнит эту работу!
У меня есть текстовое поле, в котором пользователь может вводить текст на английском языке (или любой другой язык слева направо) или на языке RTL.
Когда пользователь записывает в RTL, пользователь должен нажать Right-shift + ctrl, чтобы текст выравнивался вправо и был rtl. Однако в окнах (и, возможно, в других современных ОС) пользователь может установить любую комбинацию клавиш для переключения языка и направления текста.
Я знаю, как отображать текст как RTL, но как я узнаю, какое направление для отображения?
Есть ли способ обнаружить, что текст, набранный в текстовое поле/текстовое поле, был напечатан как RTL?
Я подошел к более простому и приятному решению. Просто добавьте dir="auto"
к элементам, и браузер выполнит эту работу!
Попробуйте следующее:
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, он, вероятно, охватывает все случаи реальной жизни. Он включает в себя все нормальные символы на иврите и арабском языке, включая символы гласности.
Вы можете написать быстрый код JavaScript/jQuery, используя регулярные выражения. Регулярные выражения ограничены в JavaScript, поэтому вам нужно будет использовать библиотеку XRegExp, которая имеет полную поддержку Unicode - если вы добавите плагины. Затем вы можете проверить символы, чтобы увидеть, к какому блоку Юникодов они принадлежат к выражениям, подобным этому \p {Иврит}. http://www.regular-expressions.info/unicode.html
Столкнувшись с той же дилеммой, я написал себе функцию, которая перебирает символы в каждой строке и подсчитывает количество вхождений символов на иврите (мой сайт двуязычный идиш/английский). Затем строка получает оценку, а класс "rtl" применяется к элементам с высокой оценкой. Вы можете легко добавить все языки RTL в Unicode в цикл for, чтобы сделать это более общим.
Обратите внимание на внешние ресурсы, связанные с библиотеками 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;
}