2014-08-29 94 views
2

我正在建设一个PHP应用程序,我已经决定(远程过程),以不同的语言提供。本地化一个HTML文档(后视)

我的问题是这样的:

我不想通过在模板文件中的所有HTML代码涉水去寻找“字”我需要动态生成郎变量来代替。

是否有一个工具可以突出显示HTML中使用的“单词”,以使我的任务更轻松。

这样,当我向下滚动HTML文档时,我可以很容易地看到语言“词”的位置。

通常情况下,当我创建一个应用程序,我想补充评论,因为我的代码,如下面

<label><!--lang-->Full Name</lable> 
<input type="submit" value="<!--lang-->Save Changes" name="submit"> 

,这样,当我做,我可以通过运行,轻松地识别我需要添加动态位变量....不幸的是,我几乎通过应用程序(HTML模板文件丢失),我没有这样做。

我使用一个模板引擎(tinybutstrong),所以我的HTML是很干净(即在它没有PHP)

+0

我不知道有这样做的一种方式!您可以使用查找并替换 – littleswany 2014-08-29 11:13:00

+1

@littleswany:XPath获胜!获得评论节点_is_可能,不确定属性值中的注释是否为有效标记,尽管 – 2014-08-29 11:53:09

+0

@EliasVanOotegem,value属性中的注释是临时的。我只用这些作为标记。当我做实际的翻译时,他们被删除。 – fredmarks 2014-08-29 14:47:16

回答

0

你可以做到这一点,比较容易均匀,使用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"]匹配链接OR按钮
  • //option[@value]:同上:与价值属性选项相匹配
  • (//input|//option):组两个表达式中,[@value]适用于所有的比赛在本次评选
  • //comment():在任何地方选择意见dom
  • /..:选择当前节点的父节点,因此//comment()/..与包含所选评论节点的父节点匹配。

保持在XPath表达式努力让所有的内容,你需要翻译

Proof of concept