我在PHP中使用gettext来使一些代码国际化,所以我会经历它并更改这样的代码:
<h1>Hello world</h1>
到此:
<h1><?php echo gettext('Hello world'); ?></h1>
但是,我继承的代码非常庞大,并且有很多需要翻译的字符串 - 所以我想知道是否有办法自动执行此操作?
答案 0 :(得分:3)
我认为这将非常困难。以下是一些潜在的方法及其问题。
方法1:解析PHP文件
token_get_all()
来解析PHP源文件。 T_INLINE_HTML
标记,它们代表文件中不是PHP代码的部分。问题:可靠地查找要替换的文本的唯一方法是parsing the HTML。但是文件的非PHP部分本身无法解析。它们是碎片化的,依赖于内联PHP代码来生成完整的,可解析的文件。
方法2:解析输出HTML文件
问题:您再次遇到无法解析PHP文件的问题。在这种情况下,一个简单的正则表达式方法会更好,因为您正在搜索确切的字符串,但它仍然不是100%可靠。而且你无法分辨HTML源代码的哪一部分来自HTML,以及PHP生成了哪些部分。
我认为你最好这样做。在编辑器中使自己成为一个好的键盘宏,这样一旦选择了文本,就可以通过一次击键将其转换为PHP函数。
答案 1 :(得分: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
)