2012-07-19 76 views
0

對不起,如果標題不夠清晰,我不知道如何寫得更好。包含一個while循環內的自定義語言文件

情況是,我有一個cron作業發送郵件給用戶。我有語言文件,並根據用戶的配置,我想用他的語言發送郵件。

但我不知道該怎麼做。

每個語言文件有常量的定義,如:

en.php定義( '日期', '日期');定義( '時間', '時間');

es.php define('DATE','Fecha');定義( 'TIME', '的Hora');

,我需要根據顯示用戶的語言正確的標籤,但我是在一個while循環:

while ($row = mysql_fetch_array($res)) { 
    if ($row['lang'] == en) //load the english labels 
} 

所以我覺得我不能使用類似「include_once」每迭代。

+1

我強烈建議您考慮切換到[gettext](http://php.net/manual/en/book.gettext.php)。 – JJJ 2012-07-19 06:04:37

回答

1

問題是,你使用它的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代碼方面有很大的開銷。如果還有其他方法可以清除每封電子郵件的全球分數,那麼這是更好的方法。但如果你不能重寫你的代碼,這是我能想到的唯一方法。

+0

謝謝。我喜歡你的解決方案。爲每種語言使用不同的文件,但使用數組而不是常量。 – Memochipan 2012-08-01 15:44:28

0

在此我可以,你應該存儲模板的事情DATEBASE自身的基礎上,語言就可以從數據庫

或者

獲取的另一種方式,你必須得到每一個變量條件像

en.php define('DATE_EN','Date'); define('TIME','Time'); 
es.php define('DATE_FR','Fecha'); define('TIME','Hora'); 

if ($row['lang'] == en) 
    DATE_EN 
else 
    DATE_FR 
0

在你的情況下,常量不起作用,因爲它們在執行過程中無法更改。

相反,我會建議,包括在一個文件中的所有語言的信息,這些可以是常量各自包含不同的陣列:

langs.php

define('EN', array(
    'DATE' => 'Date', 
    'TIME' => 'Time', 
)); 

define('ES', array(
    'DATE' => 'Fecha', 
    'TIME' => 'Hora', 
)); 

接下來,您可以添加一個值到每個用戶的數組$row,或者您可以使用像$lang這樣的變量,它將在每個while循環中被覆蓋。

require_once 'langs.php' //or include_once 

while ($row = mysql_fetch_array($res)) { 
    if ($row['lang'] == en) { //load the english labels 
     $lang = EN; 
    } elseif ($row['lang'] == es { 
     $lang = ES; 
    } 

    echo "Welcome {$row['name']}, today it's {$lang['DATE']}" //will display the corresponding $lang value 
}