问题是,你使用它的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 = '[email protected]';
$subject = 'Test';
$body = "The $date today is: " . date('r');
mail(...);
}
foreach($users as $user)
sendEmail($user->preferredLanguage);
然后,您可以使用$terms
阵列中的钥匙引用您的语言文件条款。当然,你必须为语言文件,目录遍历等创建验证检查。但这是实现它的一种方式。
如果您不能重写您的代码,那么我建议您将所有电子邮件内容放入一个文件中,并使用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 = '[email protected]';
$subject = 'Test';
foreach($users as $user)
{
$contents = file_get_contents('http://yourhost.com/emailcontent.php?lang=en');
mail(...);
}
当然,你需要添加一些安全检查,以防止本地文件包含,访问emailcontent.php等,但这是它的要点。然而这在延迟和反复编译你的PHP代码方面有很大的开销。如果还有其他方法可以清除每封电子邮件的全球分数,那么这是更好的方法。但如果你不能重写你的代码,这是我能想到的唯一方法。
我强烈建议您考虑切换到[gettext](http://php.net/manual/en/book.gettext.php)。 – JJJ 2012-07-19 06:04:37