2

我在 PHP 中使用 gettext 来国际化一些代码,所以我正在浏览它并更改如下代码:

<h1>Hello world</h1>

对此:

<h1><?php echo gettext('Hello world'); ?></h1>

但是,我继承的代码非常大,并且有很多需要翻译的字符串 - 所以我想知道是否有办法自动执行此操作?

4

2 回答 2

3

方法 3:将源 php 文件解析为带有处理指令的 HTML,或者“真正的 php 文档是什么”

这并不完美,但它是一个起点:

$dom = new DOMDocument();

// load source
$dom->loadHTML('
  <html>
   <body>
    <h1>I\'m a title</h1>
    <p>My name is <?php echo $myname; ?></p>
    <style>
       p { margin-bottom: 1em; }
    </style>
    <script>
       alert(\'a really funny script that we don\\\'t want to enclose\');
    </script>
   </body>
  </html>');


//get all text nodes
$xpath = new DOMXPath($dom);
$textnodes = $xpath->evaluate('/html/body//*[not(self::script)][not(self::style)]/text()');

//store a list of translation keys:
$keys = array();

//wrap text nodes into php processing instructions
foreach($textnodes as $node) {
  $content = $node->nodeValue;
  $keys[] = $content;
  $content = trim(addcslashes($content, '\\\''));
  $wrap = $dom->createProcessingInstruction('php', 'gettext(\'' . $content . '\'); ?');
  $node->parentNode->replaceChild($wrap, $node);
}

//output or save the result;
echo $dom->saveHTML();

//output or store the keys, a little help for creating the translation files
print_r($keys);

在这里测试它:http: //sandbox.onlinephpfunctions.com/code/559542d98e8ddc60eeb7e156888d9d2fda61b843

上面的代码段输出:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
        <h1><?php gettext('I\'m a title'); ?></h1>
        <p><?php gettext('My name is'); ?><?php echo $myname; ?></p>
        <style>
           p { margin-bottom: 1em; }
        </style><script>
           alert('a really funny script that we don\'t want to enclose');
        </script></body></html>
Array
(
    [0] => I'm a title
    [1] => My name is 
)
于 2013-03-08T09:59:57.193 回答
3

我认为这将是非常困难的。以下是一些潜在的方法及其问题。

方法一:解析 PHP 文件

  1. 用于token_get_all()解析 PHP 源文件。
  2. 查找所有T_INLINE_HTML标记,它们代表文件中不是 PHP 代码的部分。
  3. 在文件的这些部分中查找和替换文本。

问题:可靠地找到要替换的文本的唯一方法是解析 HTML。但是文件的非 PHP 部分无法自行解析。它们是零散的,并且依赖于内联 PHP 代码来生成完整的、可解析的文件。

方法 2:解析输出 HTML 文件

  1. 从浏览器保存站点的输出 HTML 文件。这将为您提供完整的 HTML 文件以进行解析。
  2. 解析那些 HTML 文件,保存需要替换的文本字符串。
  3. 返回原始 PHP 文件,搜索那些文本字符串并替换它们。

问题:您再次面临无法解析PHP文件的问题。在这种情况下,一个简单的正则表达式方法会更好,因为您正在搜索精确的字符串,但它仍然不是 100% 可靠的。而且您将无法分辨 HTML 源代码的哪些部分来自 HTML,以及哪些部分是由 PHP 生成的。

我认为你最好用手来做这件事。在你的编辑器中让自己成为一个好的键盘宏,这样一旦你选择了文本,你就可以一键将其转换为 PHP 函数。

于 2013-03-08T09:28:03.380 回答