Вставить текст RTL правильно в шаблон PHPWord

Я использую PHP-шаблон для вставки некоторого текста в шаблон.

Шаблон слова отформатирован LTR, так как все метки являются английскими.

Вот строка в шаблоне слова:

User Name: ${name}

Вот строка PHP, которая заменяет значение:

$template->setValue('name', $user->name);

Предложение двунаправлено. Метка - английский (LTR), и имя пользователя всегда арабское (RTL).

Вот сгенерированная строка кода в файле document.xml после распаковки файла слова:

<w:r><w:rPr><w:b/><w:bCs/><w:lang w:val="en-US" w:bidi="ar-EG"/></w:rPr><w:t>User Name:</w:t></w:r><w:r><w:rPr><w:lang w:val="en-US" w:bidi="ar-EG"/></w:rPr><w:t xml:space="preserve"> عمرو هشام</w:t><w:tab/></w:r>

Замененный текст отображается правильно RTL в LibreOffice, но появляется LTR (в обратном порядке) в Microsoft Word.

Что я могу сделать, чтобы он выглядел корректно (RTL) в Microsoft Word?

Ответ 1

вы только что сделали неправильное действие, в первую очередь исправляя PHPword для работы с строками UTF-8.
в соответствии с этим есть два способа исправить PHPword, и я попробовал оба. правильным является следующее:

В строке 150, Shared/String.php:

Заменить

public static function IsUTF8($value = '') {
    return utf8_encode(utf8_decode($value)) === $value;
}

С

public static function IsUTF8($value = '') {
    return mb_check_encoding($value, "UTF-8");
}

Затем, если вы делаете

$ grep -rn "utf8_encode" .

В корне проекта вы найдете все строки, в которых используется utf8_encode. Вы увидите строки типа

$linkSrc = utf8_encode($linkSrc); //$linkSrc = $linkSrc;

$givenText = utf8_encode($text); //$givenText = $text;

Вы можете просто удалить utf8_encode, как показано в комментариях.