Php 本地化html文档(事后发现)
我正在用PHP构建一个web应用程序,我已经决定(在整个过程中)使用不同的语言 我的问题是: 我不想费力地浏览模板文件中的所有HTMl代码来寻找需要用动态生成的lang变量替换的“单词” 是否有一个工具可以突出显示HTML中使用的“单词”,以使我的任务更简单 因此,当我向下滚动HTML文档时,我可以很容易地看到语言“单词”在哪里 通常在创建应用程序时,我会在编写代码时添加注释,如下所示Php 本地化html文档(事后发现),php,html,localization,Php,Html,Localization,我正在用PHP构建一个web应用程序,我已经决定(在整个过程中)使用不同的语言 我的问题是: 我不想费力地浏览模板文件中的所有HTMl代码来寻找需要用动态生成的lang变量替换的“单词” 是否有一个工具可以突出显示HTML中使用的“单词”,以使我的任务更简单 因此,当我向下滚动HTML文档时,我可以很容易地看到语言“单词”在哪里 通常在创建应用程序时,我会在编写代码时添加注释,如下所示 <label><!--lang-->Full Name</lable>
<label><!--lang-->Full Name</lable>
<input type="submit" value="<!--lang-->Save Changes" name="submit">
全名
您可以相对轻松地做到这一点,甚至可以使用DOMDocument
解析标记,DOMXPath
查询所有注释节点,然后访问每个节点的父节点,提取nodeValue
并将这些值列为“要翻译的字符串”:
请注意,这无法处理标记属性中使用的注释。使用这个简单的脚本,您将能够提取那些需要在“常规”标记中翻译的字符串。之后,您可以编写一个脚本,在标记属性中查找
。。。如果没有一种方法也可以使用XPath来实现这一点,我会看一看。不过现在,这应该可以帮助您开始
如果标记中没有注释,而不是
,则可以使用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 |//输入[@type=“button”]
匹配链接或按钮
//选项[@value]
:同上:匹配具有值属性的选项
(//input |//option)
:对两个表达式进行分组,[@value]
将应用于此选择中的所有匹配项
//comment()
:在dom中的任意位置选择注释
/…
:选择当前节点的父节点,因此//comment()/…
匹配包含所选注释节点的父节点
继续使用XPath表达式以获取需要翻译的所有内容
我不确定有没有办法做到这一点!你可以使用查找和replace@littleswany:为了胜利!!可以获取注释节点,但不确定属性值中的注释是否为有效标记,though@EliasVanOotegem,值属性中的注释是临时的。我只把这些用作标记。当我进行实际翻译时,它们会被删除。@littleswany我通常会使用文本编辑器(如editplus)进行查找和替换等。但在这种情况下,我的html中没有注释……因此我正在寻找一些可以突出显示html中“文本”字符串的工具(可以这么说)@fredmarks:在这种情况下:$domDocument->getElementsByTagName('*')
+foreach覆盖所有DomeElement
实例+$node->textContent
将为您提供所需内容。如果其中一些节点是输入标记,只需使用$node->tagName
并切换到$node->getAttributeNode('value')->value
即可获得这些标记的内容,就像我在回答中显示的那样
$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;
}
}