我正在用 PHP 构建一个 Web 应用程序,我已经决定(在整个过程中)以不同的语言提供它。
我的问题是:
我不想遍历模板文件中的所有 HTMl 代码来寻找我需要用动态生成的 lang 变量替换的“单词”。
是否有一种工具可以突出显示 HTML 中使用的“单词”,使我的任务更轻松。
这样当我向下滚动 HTML 文档时,我可以很容易地看到语言“单词”在哪里。
通常当我创建一个应用程序时,我会在编写代码时添加评论,如下所示
<label><!--lang-->Full Name</lable>
<input type="submit" value="<!--lang-->Save Changes" name="submit">
这样当我完成后,我可以运行并轻松识别我需要添加动态变量的位......不幸的是我几乎完成了应用程序(丢失了 HTML 模板文件)而且我还没有完成所以。
我使用模板引擎 (tinybutstrong) 所以我的 HTML 非常干净(即其中没有 PHP)
最佳答案
您可以使用 DOMDocument
相对轻松地做到这一点解析标记,DOMXPath
查询所有评论节点,然后访问每个节点的父节点,提取 nodeValue
并将这些值列为“要翻译的字符串”:
$dom = new DOMDocument;
$dom->load($file);//or loadHTML in case you're working with HTML strings
$xpath = new DOMXPath($dom);//get XPath
$comments = $xpath->query('//comment()');//get all comment nodes
//this array will contain all to-translate texts
$toTranslate = array();
foreach ($comments as $comment)
{
if (trim($comment->nodeValue) == 'lang')
{//trim, avoid spaces, use stristr !== false if you need case-insensitive matching
$parent = $comment->parentNode;//get parent node
$toTranslate[] = $parent->textContent;//get parent node's text content
}
}
var_dump($toTranslate);
请注意,这不能处理标记属性中使用的注释。使用这个简单的脚本,您将能够提取那些需要在“常规” 标记中翻译的字符串。之后,您可以编写一个脚本来查找 <!--lang-->
在标签属性中...我会看看是否也没有办法使用 XPath 来做到这一点。不过现在,这应该可以帮助您入门。
如果你没有评论,除了<!--lang-->
在你的标记中,那么你可以简单地使用一个 xpath 表达式来直接选择那些注释节点的父节点:
$commentsAndInput = $xpath->query('(//input|//option)[@value]|//comment()/..');
foreach ($commentsAndInput as $node)
{
if ($node->tagName !== 'input' && $node->tagName !== 'option')
{//get the textContent of the node
$toTranslate[] = $node->textContent;
}
else
{//get value attribute's value:
$toTranslate[] = $node->getAttributeNode('value')->value;
}
}
xpath表达式解释:
-
//
: 告诉 xpath 在 DOM 中的任何位置搜索与其余条件匹配的节点 -
input
:文字标签名称://input
在 DOM 树的任何地方寻找输入标签 -
[@value]
: 提到的标签只有在具有@value
时才匹配属性 -
|
:或。//a|//input[@type="button"]
匹配链接或按钮 -
//option[@value]
: 同上:匹配有value属性的选项 -
(//input|//option)
: 对两个表达式进行分组,[@value]
适用于此选择中的所有匹配项 -
//comment()
: 选择 dom 中任意位置的评论 -
/..
: 选择当前节点的父节点,所以//comment()/..
匹配包含所选注释节点的父级。
继续处理 XPath 表达式以获得您需要翻译的所有内容
Proof of concept
关于php - 本地化 html 文档(事后),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25567039/