2013-03-08 75 views
2

我使用的gettext在PHP国际化一些代码,所以我打算通过它,改变这样的代码:自动插入gettext调用的方法?

<h1>Hello world</h1> 

这样:

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

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

+0

源文件是什么语言? PHP混合到HTML或纯HTML中? – Roman 2013-03-08 09:11:54

+0

PHP混合到HTML中。 – 2013-03-08 09:14:55

+1

您可以使用'_()'而不是'gettext()'来减少工作量。但遗憾的是,我不认为有办法自动调用它。 – Rikesh 2013-03-08 09:23:28

回答

3

我认为这会非常困难。这里有一些潜在的方法和他们的问题。

方法1:解析PHP文件

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

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

方法2:解析输出HTML文件

  1. 从浏览器保存你的网站的输出HTML文件。这会给你完整的HTML文件来解析。
  2. Parse those HTML files,保存需要替换的文本字符串。
  3. 返回到原始PHP文件,搜索这些文本字符串并将其替换。

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

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

+0

很好的答案,谢谢。我认为我同意你的观点 - 手工操作是目前最可靠的方式。除非我确定,否则我不希望解析器替换某些文本。有一个宏包装选定的文本是一个很好的主意,我没有想到。一个vim宏上来了! :-) – 2013-03-11 14:19:31

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 
) 
+0

好的解决方案,喜欢它。我想我想为每个人增加一些确认,就像在文本编辑器中搜索和替换,要求您确认替换或移到下一个。我现在要用手动方式去做,但如果我稍后再来,我会考虑将其添加到您的代码中。谢谢! – 2013-03-11 14:17:23