私はPHPでgettextを使用してコードを国際化しているので、それを調べて次のようにコードを変更します。
<h1>Hello world</h1>
これに:
<h1><?php echo gettext('Hello world'); ?></h1>
しかし、私が継承したコードは非常に大きく、翻訳が必要な文字列がたくさんあるので、これを自動的に行う方法があるかどうか疑問に思いました。
私はPHPでgettextを使用してコードを国際化しているので、それを調べて次のようにコードを変更します。
<h1>Hello world</h1>
これに:
<h1><?php echo gettext('Hello world'); ?></h1>
しかし、私が継承したコードは非常に大きく、翻訳が必要な文字列がたくさんあるので、これを自動的に行う方法があるかどうか疑問に思いました。
これは非常に難しいと思います。ここにいくつかの潜在的なアプローチとそれらの問題があります。
アプローチ1:PHPファイルの解析
token_get_all()
PHPソースファイルを解析する ために使用します。T_INLINE_HTML
PHPコードではないファイルの部分を表すすべてのトークンを探します。問題:置き換えるテキストを確実に見つける唯一の方法は、HTMLを解析することです。ただし、ファイルのPHP以外の部分は、それ自体では解析できません。それらは断片化されており、完全な解析可能なファイルを生成するためにインラインPHPコードに依存しています。
アプローチ2:出力HTMLファイルの解析
問題:PHPファイルを解析できないという問題に再び直面しています。この場合、正確な文字列を検索しているため、単純な正規表現アプローチの方がうまく機能しますが、それでも100%信頼できるとは限りません。また、HTMLソースのどの部分がHTMLからのものであり、どの部分がPHPによって生成されたのかを判断することはできません。
手作業でこれを行うのが最善だと思います。エディターで優れたキーボードマクロを作成して、テキストを選択すると、1回のキーストロークでPHP関数に変換できるようにします。
アプローチ3:ソースphpファイルを処理命令または「phpドキュメントが実際に何であるか」を使用してHTMLとして解析します
これは完璧ではありませんが、出発点です。
$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
)