多言語サイトをテンプレート化する最も効率的な方法
-
22-07-2019 - |
質問
英語/フランス語のウェブサイトを構築していますが、そのような仕事にベストプラクティスがあるかどうか疑問に思っていました。
-
サイトを複製し、適切なサイトを含むフランス語と英語のフォルダーを作成します。
-
PHPを使用して、コンテンツをhtmlタグと交換します。 例えば。 if($ lang == 'en'):
-
phpを使用して、両方のhtmlタグを同じままにしてコンテンツのみをスワップします。例えば。いたるところにif文があります。これは効率に悪いでしょうか?
その他の提案は歓迎されます
解決
私たちのサイトがこのように機能する国際化の場合のフレームワークがあります...
フォルダー構造;
/
lang/
english/
images/
text/
dutch/
images/
text/
言語固有のテキストまたは画像はページから直接削除され、定数に置き換えられます。例:ログイン画面で、ドロップインします。
echo TEXT_LOGIN_WELCOME;
/lang/english/text/login.phpで次のように定義されています。
define('TEXT_LOGIN_WELCOME', 'Welcome, please login:');
しかし/lang/dutch/text/login.phpでは、次のように定義されています。
define('TEXT_LOGIN_WELCOME', 'Welcome, please login (in dutch):');
;-)
各言語定義ファイルは、使用されるページとまったく同じ名前が付けられているため、公開ページを読み込むときに、ユーザーが話す言語を把握するだけで、関連する言語定義ファイルを含めることができます。
このシステムの良いところは、すべての言語情報が一元化されていることです。新しい言語を追加する必要がある場合は、メイン(英語?)フォルダーをコピーし、名前を変更し、すべてを圧縮して翻訳サービスに送信し、魔法をかけます。もちろん、このシステムの欠点は、言語とコンテンツの両方が成長するにつれて維持されることです...これに関して素晴らしいアイデアがあれば、ぜひ聞いてください!
ところで、IPでユーザーの場所を推測する必要がある場合は、 geoIP 。
他のヒント
テンプレートシステムを使用します。 Smarty Template Engine は、おそらく最も有名なPHPの1つです。テンプレートシステムは、あなたが達成しようとしている正確な目的を果たすだけでなく、表示コードをコンテンツから分離することでページのメンテナンスをはるかに容易にします(これにより、同じテンプレートを、同様の性質)。
1 -サイト全体を複製すると、すべてのコードを2つのフォルダーに修正する必要があります:-[
2 -のような気分を味わいたい場合
<?php if($lang=='en') { ?>
<p>English text</p>
<? } else { ?>
<p>Text français</p>
<? } ?>
このソリューションは、同じページで2つの言語を管理するのに最適です。
ただし、タグは重複しています。
3 -本当に満足できるコンテンツのみを変更します。
多分if文が拡散してphpのコンパイルを圧迫するかもしれません...わかりません。
とにかく、このアプローチではドキュメントをより簡潔にすることができます。
<?php
function interpreter($buffer) {
$pieces = explode('#', $buffer);
if (isset($_GET['lang'])) $begin=$_GET['lang'];
else $begin = 1; // 1 to display français, 2 to display english
$tot = count($pieces);
for ($i=$begin; $i<$tot; $i+=3) { // remove one language
unset($pieces[$i]); }
foreach ($pieces as $value) { // recompose the text
$output .= $value; }
return $output;
}
ob_start("interpreter");
?>
<a href="?lang=#1#2#">#Français#English#</a>
<p>#English text#Texte français#.</p>
<?php ob_end_flush() ?>
ob_start
とob_end_flush
の間のテキストは、phpのコンパイル後に解析されます。
つまり、影響を受ける文字列が来ます。 <!> lt内ではなく、echoステートメントから。 ?php?<!> gt;タグ。
また、PHPからのコンテンツにはISが含まれます。
ただし、外部cssまたはjavascriptではありません。
アテンションデリミタを保持する#
は、他の場所でまだ使用されている文字ではありません。
たぶん、||
または^^
もちろん、将来的には、このソリューションを3言語以上に適合させることができます。ただし、<!> quot;第3言語翻訳#<!> quot;を挿入する必要がある場合は、大きなサイトの多くの行で、MatWのソリューションがぴったりかもしれません。