Как определить язык текста с помощью jQuery и XRegExp для правильного отображения смешанного текста RTL и LTR - PullRequest
0 голосов
/ 02 октября 2019

Я пытаюсь отобразить канал Twitter на сайте WordPress. Мой клиент пишет в Твиттере на английском и арабском, а иногда и на двух языках. Мне нужно определить язык и добавить класс 'rtl' к арабским твитам, а также к тем твитам, где контент преимущественно на арабском языке. Я использую плагин, который удаляет метаданные Twitter iso_language_code.

При попытке сделать это на предыдущем сайте разработки несколько лет назад, я помню, как успешно использовал вариант решения Tristan, найденный здесь:

Как определить, что текст, набранный в текстовой области, имеет вид RTL

К сожалению, он, похоже, больше не работает.

Jsfiddle Тристана также больше не работает.

Я использую этот ресурс:

http://cdnjs.cloudflare.com/ajax/libs/xregexp/2.0.0/xregexp-min.js

и этот сценарий:

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

    function isRTL(str) {
        var isArabic = XRegExp('[\\p{Arabic}]');
        var isLatin = XRegExp('[\\p{Latin}]');
        var partLatin = 0;
        var partArabic = 0;
        var rtlIndex = 0;
        var isRTL = false;

        for(i=0;i<str.length;i++){
            if(isLatin.test(str[i]))
                partLatin++;
            if(isArabic.test(str[i]))
                partArabic++;
        }
        rtlIndex = partArabic/(partLatin + partArabic);
        if(rtlIndex > .5) {
            isRTL = true;
        }

        return isRTL;
    }

    });

Может кто-нибудь помочь мне с тем, где я иду не так?

Большое спасибо,

Фил


Обновление


Мне удалось получить работающее частичное решение:

    jQuery(document).ready(function($) {

    var arabic = /[\u0600-\u06FF]/;

    $('p').each(function() {

        if (arabic.test($(this).text())) {
      $(this).addClass( "rtl" ).attr('style','text-align:right;direction:rtl');
      }

      else {
      $(this).addClass( "ltr" ).attr('style','text-align:left;direction:ltr');
      }

    });

    });

Заранее извиняюсь - я очень начинающий в этом.

Я сделал jsfiddle здесь:

http://jsfiddle.net/philnicholl/4xn6jftw

Это работает, если текст полностью арабский или весь английский, но одно слово арабского языка в английском твитевсе испортит.

Странно, когда я добавил этот скрипт в реальный тест WordPress, он дал совершенно противоположный результат от того, что я хотел, так как в арабских абзацах и твитах были заданы класс LTR и стилизация иТекст на английском языке предоставлен RTL.

Изменение оператора if else дает правильный результат.

Любая помощь будет принята с благодарностью.

Еще раз спасибо.

Фил

1 Ответ

0 голосов
/ 03 октября 2019

Я предлагаю другое решение, если вы используете WordPress, вы можете назначить переменную в начале header.php или в конце вашего footer.php файла

Вы можете назначить новую переменную, проверив функцию wordpress is_rtl ()

пример: Js-код в header.php или footer.php между тегом

  <?php if ( is_rtl() ) :?>
    var is_rtl = true
  <php else:?>
    var is_rtl = false;
  <?php endif;?>

Затем в вашем js-файле используйте его для проверки

jQuery(document).ready(function($) {
    $('p').each(function() {
    if(is_rtl)
      $(this).addClass('rtl');
});
...