在PHPWord模板中正确插入RTL文本

Amr*_*eed 11 php bidi right-to-left phpword

我正在使用PHPWord模板处理器在模板中插入一些文本.

单词模板格式为LTR,因为所有标签都是英文.

这是单词模板中的行:

User Name: ${name}
Run Code Online (Sandbox Code Playgroud)

以下是替换值的PHP行:

$template->setValue('name', $user->name);
Run Code Online (Sandbox Code Playgroud)

这句话是双向的.标签为英文(LTR),用户名始终为阿拉伯语(RTL).

解压缩word文件后,这是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>
Run Code Online (Sandbox Code Playgroud)

替换的文本在LibreOffice中正确显示RTL,但在Microsoft Word中显示为LTR(反转).

我该怎么做才能使它在Microsoft Word中正确显示(RTL)?

mor*_*ebi 1

您只是首先执行了错误的操作,更正了 PHPword 以使用 UTF-8 字符串。
据此有两种方法可以修复 PHPword,我都尝试了。正确的是这样的:

第 150 行Shared/String.php

代替

public static function IsUTF8($value = '') {
    return utf8_encode(utf8_decode($value)) === $value;
}
Run Code Online (Sandbox Code Playgroud)

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

那么,如果你这样做

$ grep -rn "utf8_encode" .
Run Code Online (Sandbox Code Playgroud)

在项目根目录中,您将找到utf8_encode使用的所有行。你会看到类似这样的行

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

$givenText = utf8_encode($text); //$givenText = $text;
Run Code Online (Sandbox Code Playgroud)

您只需删除utf8_encode评论中所示的即可。