問題是,你使用它的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