2

私はPHPでgettextを使用してコードを国際化しているので、それを調べて次のようにコードを変更します。

<h1>Hello world</h1>

これに:

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

しかし、私が継承したコードは非常に大きく、翻訳が必要な文字列がたくさんあるので、これを自動的に行う方法があるかどうか疑問に思いました。

4

2 に答える 2

3

これは非常に難しいと思います。ここにいくつかの潜在的なアプローチとそれらの問題があります。

アプローチ1:PHPファイルの解析

  1. token_get_all()PHPソースファイルを解析する ために使用します。
  2. T_INLINE_HTMLPHPコードではないファイルの部分を表すすべてのトークンを探します。
  3. ファイルのそれらの部分のテキストを見つけて置き換えます。

問題:置き換えるテキストを確実に見つける唯一の方法は、HTMLを解析することです。ただし、ファイルのPHP以外の部分は、それ自体では解析できません。それらは断片化されており、完全な解析可能なファイルを生成するためにインラインPHPコードに依存しています。

アプローチ2:出力HTMLファイルの解析

  1. ブラウザからサイトの出力HTMLファイルを保存します。これにより、解析する完全なHTMLファイルが得られます。
  2. それらのHTMLファイルを解析し、置換が必要なテキスト文字列を保存します。
  3. 元のPHPファイルに戻り、それらのテキスト文字列を検索して置き換えます。

問題:PHPファイルを解析できないという問題に再び直面しています。この場合、正確な文字列を検索しているため、単純な正規表現アプローチの方がうまく機能しますが、それでも100%信頼できるとは限りません。また、HTMLソースのどの部分がHTMLからのものであり、どの部分がPHPによって生成されたのかを判断することはできません。

手作業でこれを行うのが最善だと思います。エディターで優れたキーボードマクロを作成して、テキストを選択すると、1回のキーストロークでPHP関数に変換できるようにします。

于 2013-03-08T09:28:03.380 に答える
3

アプローチ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 
)
于 2013-03-08T09:59:57.193 に答える