0

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

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

但我不知道该怎么做。

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

en.php定义('日期','日期');定义('时间','时间');

es.php定义('DATE','Fecha'); 定义('时间','霍拉');

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

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

所以我认为我不能在每次迭代中使用像“include_once”这样的东西。

4

3 回答 3

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

于 2012-07-19T06:25:47.980 回答
0

在这件事上,您应该根据可以从数据库中获取的语言将模板存储到其自身的数据库中

或者

另一种方法是你必须让每个变量都有条件,比如

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
于 2012-07-19T06:20:12.310 回答
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
}
于 2012-07-19T07:13:23.450 回答