2012-07-19 77 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 
}