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


include custom language files inside a while loop

很抱歉,如果标题不够清晰,我不知道如何写得更好。

这种情况是,我有一个cron作业,它向用户发送邮件。我有语言文件,根据用户的配置,我想用他的语言发送邮件。

但我不知道该怎么做。

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

en.php定义("日期","日期");define('TIME','TIME');

es.phpdefine('DATE','Fecha');define('TIME','Hora');

我需要根据用户语言显示正确的标签,但我还需要一段时间:

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

所以我觉得我不能用";include_ once";在每次迭代中。

问题是您使用了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代码的重复编译方面有很大的开销。如果有其他方法可以清除每封电子邮件的全局分数,那么这是更好的方法。但如果你不能重写你的代码,这是我唯一能想到的方法。

在这件事上,你应该根据你可以从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

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

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

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
}