gpt4 book ai didi

php - 本地化 html 文档(事后)

转载 作者:行者123 更新时间:2023-11-28 03:18:55 26 4
gpt4 key购买 nike

我正在用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com