【问题标题】:Cakephp send email in different user selected languageCakephp 以不同的用户选择的语言发送电子邮件
【发布时间】:2015-05-12 09:18:35
【问题描述】:

我想发送有关网络语言的特定语言的电子邮件。

例如,当用户注册时,他可以选择一种语言,例如英语 - en、意大利语 - it、德语 - de > 和法语 - fr

该网站是多语言的,所以我想做的是当用户填写表格时,例如联系表格,并在他提交表格后向他发送一封电子邮件。

假设他选择了意大利语作为网站的语言,但是当他注册时,他选择了英语。所以即使网站是意大利语的,电子邮件也应该用英文发送。

使用 .pot 文件通过 cakephp 的 __() 函数翻译电子邮件。

电子邮件模板是这样的:

contact_us_user

<h2 style="color: #ee2424;">
    <?php 
        echo __('SITENAME');
    ?>
</h2>
<?php
    echo "<h2 style='text-align: left;'>";
    if (isset($firstname) && isset($lastname) && isset($title)) {
        echo __('Hello <span style="color: #ee2424;"> %s %s</span>.', $firstname, $lastname);
    } else {
        echo __('Hello');
    }
    echo "</h2>";
    echo __('Thank you for contacting us!');
    echo "<br />";
    echo __('We will take a look to your <strong>reservation enquiry</strong> and we will get back to you with a booking quote');
    echo "<br />";
    echo "<hr />";
    echo __('<p>Thanks and Regards.</p>');
?>

发送邮件的函数是这样的:

/*  SEND MESSAGE TO THE USER    */
            $layout = 'default';
            $template = 'contact_us_user';
            $subject  = __('TEST');
            $title_for_layout = __('Contact US');
            $viewVars = array(
                "firstname"  => $this->request->data['Contact']['name'],
                "lastname"  => $this->request->data['Contact']['surname'],
            );
            if(isset($this->request->data['Contact']['email']) && !empty($this->request->data['Contact']['email']) && trim($this->request->data['Contact']['email'])!='') {
                $this->__sendEmail($this->request->data['Contact']['email'], $subject, $template, $viewVars, $layout, $title_for_layout);
            }

方法如下:

/**
 * send E-mail method
 *
 * @return boolean
 */
public function __sendEmail($emailTo, $subject = 'Email', $template = 'default', $viewVars, $layout = 'default', $title_for_layout = 'test') {
    $this->set('title_for_layout', $title_for_layout);
    App::uses('CakeEmail', 'Network/Email');
    $Email = new CakeEmail();
    $Email->template($template, $layout)
            ->emailFormat('html')
            ->viewVars($viewVars) 
            ->from(array('info@sitename.com'=>'sitename.com'))
            ->to($emailTo)
            ->subject($subject);
    return $Email->send();
}

所以我要问的是,是否有一种方法或参数可以传递给电子邮件,以指示我希望以哪种语言发送电子邮件。 比如:$language = 'en';

我的 Cakephp 版本是:2.5.6

提前致谢。

【问题讨论】:

  • 您发送电子邮件时是否尚未将其翻译成正确的语言?如果您已经在使用 Cake 的 i18n 功能来翻译 View 内容,那么当使用用户选择的语言发送电子邮件时,它也应该这样做。我在几个网站上做了非常相似的事情,没有问题。
  • @drmonkeyninja 电子邮件正在翻译中,但电子邮件是以网站的语言发送的,正如我上面解释的,电子邮件应该以用户的语言而不是网站的语言发送(对于例如,您正在使用德语浏览网站,但您注册并选择了英语作为您自己的默认语言,即使您看到的是德语网站,电子邮件也应该以英语发送。)

标签: cakephp cakephp-2.5


【解决方案1】:

我修改了一些@drmonkeyninja 代码。 这样我还告诉网站将值存储在会话中以访问正确的语言环境:

public function __sendEmailWithLanguage($emailTo, $viewVars, $lang, $subject = 'Email', $template = 'default', $layout = 'default') {
    // Store site language
    $siteLanguage = Configure::read('Config.language');

    if (isset($lang) && !empty($lang) && trim($lang)!='') {
        // Switch to preferred email language
        $this->Session->write('Config.language', $lang);
        Configure::write('Config.language', $lang);
    }

    // Send email
    App::uses('CakeEmail', 'Network/Email');
    $Email = new CakeEmail();
    $Email->template($template, $layout)
        ->emailFormat('html')
        ->viewVars($viewVars) 
        ->from(array('info@biriola.com'=>'Biriola.com'))
        ->to($emailTo)
        ->subject($subject);
    $result = $Email->send();

    // Restore to site language
    $this->Session->write('Config.language', $siteLanguage);
    Configure::write('Config.language', $siteLanguage);

    return $result;
}

因此,通过这种方式,您甚至可以更改语言的会话值,然后将它们再次更改回之前的值。

希望这会有所帮助!

【讨论】:

  • 谢谢,这正是我想要的。
【解决方案2】:

您也许可以尝试在发送电子邮件时切换配置的语言,然后在发送电子邮件后恢复站点语言:-

public function __sendEmail($emailTo, $subject = 'Email', $template = 'default', $viewVars, $layout = 'default', $title_for_layout = 'test', $lang = 'eng') {
    $this->set('title_for_layout', $title_for_layout);
    App::uses('CakeEmail', 'Network/Email');
    $Email = new CakeEmail();
    // Store site language
    $siteLanguage = Configure::read('Config.language');
    // Switch to preferred email language
    Configure::write('Config.language', $lang);
    // Send email
    $Email->template($template, $layout)
            ->emailFormat('html')
            ->viewVars($viewVars) 
            ->from(array('info@sitename.com'=>'sitename.com'))
            ->to($emailTo)
            ->subject($subject);
    $result = $Email->send();
    // Restore to site language
    Configure::write('Config.language', $siteLanguage);
    return $result;
}

不知道为什么要在此处设置title_for_layout。除了title_for_layoutdeprecated in CakePHP 2.5 之外,如果在模型中定义此方法会更好;更好的办法是将电子邮件称为Event

【讨论】:

  • title_for_layout 没有效果,只是为了测试目的,反正thanx你的回答我会试一试。
  • 电子邮件仍以浏览器语言(或网站的当前语言)发送。
猜你喜欢
  • 1970-01-01
  • 2015-10-10
  • 1970-01-01
  • 2012-01-29
  • 2022-08-10
  • 2014-01-17
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多