問題は、PHP定数を使用しているため、一度設定すると、スクリプト内で実際に変更できないことです。定数とそれらのすべての参照を変数に書き直してみてください。
言語ファイルの名前がこのようlang.code.php
になっていて、電子メールを送信するスクリプトがにあるとしますsendemail.php
。あなたはこのようなことをすることができます:
In lang.en.php
<?php
$terms['date'] = 'Date';
In lang.es.php
<?php
$terms['date'] = 'Fecha';
In sendemail.php:
<?php
function sendEmail($language = 'en')
{
include "lang.$language.php";
extract($terms);
$to = 'foo@bar.com';
$subject = 'Test';
$body = "The $date today is: " . date('r');
mail(...);
}
foreach($users as $user)
sendEmail($user->preferredLanguage);
$terms
次に、配列内のキーを使用して、言語ファイル内の用語を参照できます。もちろん、言語ファイルやディレクトリトラバーサルなどの検証チェックを作成する必要があります。しかし、それはそれを実装する1つの方法です。
コードを書き直すことができない場合は、すべての電子メールコンテンツを1つのファイルに入れて、file_get_contents()
HTTP経由で電子メールコンテンツをフェッチするために使用することをお勧めします。そのファイル内には、必要な言語ファイルをロードする条件があります。
電子メールの内容を生成するファイルがと呼ばれているとしましょう。次のemailcontent.php
ように実行できます。
In lang.en.php
<?php
define('DATE', 'Date');
In lang.es.php
<?php
define('DATE, 'Fecha');
In emailcontent.php
<?php
require "lang.{$_GET['lang']}.php";
echo 'The ' . DATE . ' today is: ' . date('r');
In sendemail.php
<?php
$to = 'foo@bar.com';
$subject = 'Test';
foreach($users as $user)
{
$contents = file_get_contents('http://yourhost.com/emailcontent.php?lang=en');
mail(...);
}
もちろん、ローカルファイルのインクルード、emailcontent.phpへのアクセスなどを防ぐために、いくつかのセキュリティチェックを追加する必要があります。しかし、これがその要点です。ただし、これにはレイテンシーとPHPコードの繰り返しコンパイルの点で大きなオーバーヘッドがあります。各メールのグローバルスコアをクリアする他の方法がある場合は、それがより良い方法です。しかし、これが、コードを書き直せない場合に私が考えることができる唯一の方法です。