问题是您使用 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
然后,您可以使用它们在数组中的键来引用语言文件中的术语。当然,您必须为语言文件、目录遍历等创建验证检查。但这是实现它的一种方法。
如果您无法重写代码,那么我建议将所有电子邮件内容放在一个文件中,并用于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 代码的重复编译方面有很大的开销。如果有任何其他方法可以清除每封电子邮件的全局分数,那么这是更好的方法。但如果你不能重写你的代码,这是我能想到的唯一方法。