您将如何在多语言 Laravel 应用程序中组织邮件

Pro*_*tas 3 php email laravel laravel-blade

我很好奇如何在多语言应用程序中有效地生成电子邮件。

为了使所有答案一致:假设您有一个典型的商业通讯,其中包含大量图像、标记,当然还有许多文本段落。假设所有文本都不是来自数据库,而是应该是硬编码的。此外,这些段落中的某些词可以加粗、强调、... 时事通讯将在订阅者的首选语言环境中发送。

我怎样才能建立一个系统来处理这个问题?

  • 你会trans()在 Laravel 的lang文件夹中引用每个段落并定义所有翻译吗?那么单词标记部分呢?在语言文件中加入 HTML 标签对我来说感觉有些不对。
  • 或者你会为电子邮件创建单独的语言文件夹(例如视图/电子邮件/en)并让 Laravel 获取正确的文件夹?但是随后可能会存在大量重复的邮件布局定义...
  • 或者也许是完全不同的东西?

Cy *_*nol 6

对于包含静态内容的时事通讯:

  1. 避免翻译文件
  2. 将模板组合用于可重用的结构元素

Laravel 的本地化系统适用于应用程序中的字符串,但是,对于电子邮件中的大量文本内容,这些定义维护起来很麻烦,尤其是对于包含内联标记或定期更改的内容。具有许多trans()调用的模板也呈现得更慢,尤其是在批处理数以千计的电子邮件时。

如果其他人编写了内容,那么在需要的地方添加一些 Blade 指令比将每个文本块提取到本地化条目中要容易得多。请记住,我们需要为每份时事通讯重复这项工作。

相反,只需将内容直接写入模板,并对翻译成不同语言的消息使用命名层次结构。将结构和显示元素提取到可重复使用的组件中,以最大限度地减少与内容混合的标记数量。

我们的模板文件层次结构可能如下所示:

resources/views/newsletters/
??? components/
?   ??? article_summary.blade.php
??? en/
?   ??? 2018-01-01.blade.php
??? es/
?   ??? 2018-01-01.blade.php
??? fr/
?   ??? 2018-01-01.blade.php
??? newsletter.blade.php
Run Code Online (Sandbox Code Playgroud)

newsletter.blade.php主模板包含在每一个通讯显示的基本元素,例如标题,徽标和页脚。它将@include()根据用户的区域设置和发布日期生成适当的时事通讯正文:

{{-- ... common header markup ... --}}

@include("newsletters.$locale.$date")

{{-- ... common footer markup ... --}}
Run Code Online (Sandbox Code Playgroud)

本地化文件夹中的每个模板都包含该语言的消息文本,以及一些内联 HTML 或 Markdown 以根据需要进行格式化。下面是一个例子:

# Newsletter Title

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc 
finibus sapien nec sapien dictum, vitae dictum dolor mattis. 
Nunc bibendum id augue...

@component('newsletters.components.article_summary', [
    'title' => 'Article Title 1', 
    'fullArticleUrl' => 'http://...',
])
Ut aliquet lobortis leo, cursus volutpat mi convallis ut. 
Vivamus id orci ut quam rhoncus eleifend. Nulla condimentum...
@endcomponent

@component('newsletters.components.article_summary', [
    'title' => 'Article Title 2', 
    'fullArticleUrl' => 'http://...',
])
Donec non finibus tellus, efficitur tincidunt leo. Nam nibh 
augue, consectetur tincidunt dui et, fermentum dictum eros...
@endcomponent
Run Code Online (Sandbox Code Playgroud)

正如我们所看到的,几乎没有什么可以分散消息内容的注意力。该article_summary组件从消息正文中隐藏标记:

<div class="summary">
    <a href="{{ $fullArticleUrl }}">
        <h2>{{ $title }}</h2>
    </a>

    <p>{{ $slot }}</p>
</div>
Run Code Online (Sandbox Code Playgroud)

通过使用组件,我们可以自由地更改每个时事通讯的布局,并且我们避免重写我们经常使用的标记。Laravel 为 Markdown消息提供了一些有用的内置组件

要发送消息,我们只需传入我们的主模板将从可用语言解析的语言环境和时事通讯日期:

public function build() 
{
    return $this->->markdown('newsletters.newsletter')->with([ 
        'locale' => $this->user->locale,
        'date' => '2018-01-01',
    ]);
}
Run Code Online (Sandbox Code Playgroud)

最后一点,我们不需要trans()完全跳过使用。在某些情况下可能有意义,例如在共享组件中。对于大部分内容,我们通过直接将其写入模板来获得可读性和可维护性。