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

标签 php html localization

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

相关文章:

php - 在 CodeIgniter 中,如何从一个模型访问另一个模型?

javascript - 根据输入值启用按钮

html - 鼠标悬停在按钮上的问题

ios - Storyboard中的标签没有采用正确的本地化值

codeigniter - PyroCMS 语言支持

php - Kohana PHP框架MySQL数据库连接异常

php - 这个登录脚本是否良好/当前/安全?

php - 如何在浏览器中存储缓存?

javascript - appMobi onClick 不起作用

php - 本地化 Laravel