0

タイトルがはっきりしていない場合は申し訳ありません。より良い書き方がわかりませんでした。

状況は、ユーザーにメールを送信する cron ジョブがあることです。言語ファイルがあり、ユーザーの構成に応じて、メールを自分の言語で送信したいと考えています。

しかし、これを行う方法がわかりません。

各言語ファイルには、次のような定数定義があります。

en.php define('日付','日付'); define('時間','時間');

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

ユーザーの言語に応じて正しいラベルを表示する必要がありますが、while ループに入っています。

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次に、配列内のキーを使用して、言語ファイル内の用語を参照できます。もちろん、言語ファイルやディレクトリトラバーサルなどの検証チェックを作成する必要があります。しかし、それはそれを実装する1つの方法です。

コードを書き直すことができない場合は、すべての電子メールコンテンツを1つのファイルに入れて、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

あなたの場合、定数は実行中に変更できないため、機能しません。

代わりに、すべての言語情報を 1 つのファイルに含めることをお勧めします。これらは、それぞれ異なる配列を含む定数にすることができます。

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 に答える