1

私は現在、PHPを使用してgettextで国際化を行っています。この例に良い方法があるかどうか疑問に思いました。

By using this website, you accept the <a href="<?php print($dir); ?>/tos/">Terms of Use</a>.

en_USの場合、この文はそのような形式に従います。ただし、別の言語では、「利用規約」のリンクが文の先頭にある場合があります。これを行うためのエレガントな方法はありますか?御時間ありがとうございます。

4

2 に答える 2

1

簡単な国際化のために、言語ごとに配列を作成し、適切なファイルをインクルードして、あなたがしていることをするのではなく、その配列にアクセスします。

en.php:

$text = array(
     'footer' => 'By using this website, you accept the <a href="' . $dir . '/tos/">Terms of Use</a>.',
     'welcome' => 'Welcome to our website!'
);

index.php:

$langdir = '/path/to/languages';
$lang = ( $_GET['lang'] ) ? $langdir . '/' . $_GET['lang'] . '.php' : $langdir . '/en.php';
if( dirname($lang) != $langdir || !require_once( $lang ) )
     exit('Language does not exist');

echo '<p class="footer">' . $text['footer'] . '</p>';

dirname()呼び出しは重要です。そうしないと、ユーザーはファイルシステム上の任意の php ファイルにアクセスできなくなります。

于 2009-09-28T01:03:02.507 に答える
0

これが私がそれを行う方法です。翻訳するフレーズは

By using this website, you accept the <a>Terms of Use</a>.

次に、フレーズがローカライズされた後にリンクを置き換えます。

$str = _('By using this website, you accept the <a>Terms of Use</a>.');
$str = preg_replace('#<a>(.*?)</a>#', '<a href="' . $dir . '/tos/">$1</a>', $str);

もちろん、 and は、あなたと翻訳者にとって意味のあるものに置き換えることができ<a>ます</a>。考えてみると、翻訳者が (意図的であろうとなかろうと) HTML を台無しにしないように出力をエスケープする必要があるため、おそらく次のようなものを使用します。

$str = htmlspecialchars(_('By using this website, you accept the [tos_link]Terms of Use[/tos_link].'));
$str = preg_replace('#\\[tos_link\\](.*?)\\[/tos_link\\]#', '<a href="' . $dir . '/tos/">$1</a>', $str);
于 2009-09-28T01:01:36.737 に答える