Php 在while循环中包含自定义语言文件

Php 在while循环中包含自定义语言文件,php,include,while-loop,Php,Include,While Loop,对不起,如果标题不够清楚,我不知道如何写得更好 现在的情况是,我有一个cron任务,它向用户发送邮件。我有语言文件,根据用户的配置,我想用他的语言发送邮件 但我不知道怎么做 每个语言文件都有如下常量定义: en.php定义('DATE','DATE');定义(‘时间’,‘时间’) es.php定义('DATE','Fecha');定义(‘时间’、‘时间’) 我需要根据用户语言显示正确的标签,但我处于一个while循环中: while ($row = mysql_fetch_array($res)

对不起,如果标题不够清楚,我不知道如何写得更好

现在的情况是,我有一个cron任务,它向用户发送邮件。我有语言文件,根据用户的配置,我想用他的语言发送邮件

但我不知道怎么做

每个语言文件都有如下常量定义:

en.php定义('DATE','DATE');定义(‘时间’,‘时间’)

es.php定义('DATE','Fecha');定义(‘时间’、‘时间’)

我需要根据用户语言显示正确的标签,但我处于一个while循环中:

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

因此,我认为我不能在每次迭代中使用“include_once”之类的东西。

在这个我能做的事情中,您应该存储模板以根据您可以从DB获取的语言对其自身进行数据库化

另一种方法是让每个变量都有条件

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

问题是,您使用PHP常量进行设置,因此一旦设置了PHP常量,就无法在脚本中真正更改它们。尝试将常量及其所有引用重写为变量

假设您的语言文件命名如下
lang.code.php
,发送电子邮件的脚本位于
sendmail.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);
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代码方面有很大的开销。如果有任何其他方法来清除每封电子邮件的全球分数,那么这是更好的方法。但是如果你不能重写你的代码,这是我能想到的唯一方法

在您的情况下,常量将不起作用,因为它们在执行期间无法更改

相反,我建议将所有语言信息包含在一个文件中,这些可以是常量,每个常量包含不同的数组:

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
}

我强烈建议你考虑转机。谢谢。我喜欢你的解决方案。对每种语言使用不同的文件,但使用数组而不是常量。