Sendgrid-nodejs: 如何利用模板版本提供多语言支持

创建于 2018-05-27  ·  33评论  ·  资料来源: sendgrid/sendgrid-nodejs

image

因此,看来我可以根据文档为每个客户(本地化)发送用不同语言编写的不同电子邮件,但是我该怎么做呢?
它说我需要通过API激活和更改,但是我不知道如何实现它。
还是我需要使用替换并从后端发送消息包?
任何帮助,将不胜感激!

技术细节:

  • sendgrid-nodejs版本:master(最新提交:[13af4a6])
  • Node.js版本:6.12.3
unknown or a waiting for feedback question

最有用的评论

@thinkingserious mega +1用于此功能-我们也需要此功能,对我们来说,用例有些不同,我们希望将模板的创建/维护工作分给营销人员,只有这些人不是程序员,因此我们需要每种语言的普通WYSIWYG模板。 每种语言有1个单独的版本将解决我们的问题。

以下内容会更好:

1-设置默认版本的能力(当未选择任何版本或提供了无效版本时,默认版本将取代)
2-在POST /mail/send API中只需有一个额外的参数即可添加版本

我们拥有一个平台,该平台具有12种以上的语言并在不断增加(是的,我们喜欢挑战),因此我们需要针对不同语言的特定营销人员,他们不会编写简单的模板。 另外,我们计划拥有大量用户,因此首先将所需的模板设置为活动状态,然后发送电子邮件会导致并发问题,其中会选择错误的模板。

非常感谢,

所有33条评论

你好@ ifndefdeadmau5

是有关此功能的API文档。 是使用此SDK进行该API调用的方法。

希望对您有所帮助!

最诚挚的问候,

埃尔默

谢谢您回复我@thinkingserious

我仍然无法弄清楚实际上如何可以使用“激活特定模板版本”。
我想到的场景是,我有2种版本的模板,这些模板是用两种以上的语言编写的,可能是英文和西班牙文,或者是其他任何语言。

然后,我发送一条消息,发送具有与用户语言匹配的特定模板版本的API调用

export function sendSendGridEmail()
{
  sgMail.setApiKey(config.get('sendgrid.API_KEY'));
  sgMail.setSubstitutionWrappers('{{', '}}');
  const msg = {
    to: '[email protected]',
    from: '[email protected]',
    subject: 'Sending with SendGrid is Fun',
    text: 'and easy to do anywhere, even with Node.js',
    html: '<strong>and easy to do anywhere, even with Node.js</strong>',
    templateId: isUserLocaleEnglish ? ENGLISH_TEMPLATE_ID : SPANISH_TEMPLATE_ID, // This line!
    substitutions: {
      name: 'Some One',
      city: 'Denver',
    },
  };
  sgMail.send(msg);
}

但是上面的示例需要2个单独的模板,而不是一个不同版本的模板。 这可能会导致生成单独的模板,但是内容是相关的。
我在这里想念什么? 请赐教。
再次感谢您,期待您的回音!

你好@ ifndefdeadmau5

每个模板可以有多个版本。 然后,您可以使用SDK激活特定版本。

首先,您将创建模板的多个版本。 然后,在进行上述调用之前,您将激活所需的版本。

最诚挚的问候,

埃尔默

早上好@thinkingserious

感谢您的快速回复,我没有想到可以解决这个问题。
现在,我知道如何执行此操作,但是一个问题是,为什么不第一次激活所有模板版本,然后让用户可以使用它而不用担心激活/停用事件?

我担心的是,如果使用不同语言的两个以上的用户同时(完全相同)执行某些操作,那么我们的服务器需要同时处理两个请求。 那么哪个模板版本将被激活?

下面是我们服务器代码的一部分,只是让您知道我的情况

export async function sendSendGridEmail() {
  const locale = 'ko';
  const isEnglishUser = locale === 'en';
  const PASSWORD_RESET_TEMPLATE_ID = '2096abb7-a9f8-413f-96a1-b9df0644b313';

  const { versions } = await getTemplate(PASSWORD_RESET_TEMPLATE_ID);
  const KO_VER = _.find(versions, { name: 'Korean' }).id;
  const EN_VER = _.find(versions, { name: 'English' }).id;

  await activateVersion(PASSWORD_RESET_TEMPLATE_ID, isEnglishUser ? EN_VER : KO_VER);

  sgMail.setSubstitutionWrappers('{{', '}}');
  const msg = {
    to: '[email protected]',
    from: '[email protected]',
    templateId: PASSWORD_RESET_TEMPLATE_ID,
    substitutions: {
      username: 'Test Username',
    },
  };
  sgMail.send(msg);
}

你好@ ifndefdeadmau5

这是一个有效的担忧。

看来您真正需要的是我们新的(测试版)模板系统。 要加入测试版,请发送电子邮件至[email protected]

最诚挚的问候,

埃尔默

你好@thinkingserious

我通过电子邮件请求到[email protected] 谢谢!

我还查看了交易模板,以了解如何针对不同的特定于区域设置的电子邮件使用模板版本。
我同意,使用特定模板版本之前必须激活它似乎很奇怪。 对于我们的高额交易软件而言,这不是最佳解决方案。 我希望能够指定在POST /mail/send请求中使用哪个版本。

嘿@ andyblack19
无需使用我们引入的新模板进行版本控制。 在您的帐户中,您应该看到“交易”模板的选项。 在这里您可以创建一个可以支持多种语言的模板。 你可能会想看看该文档在这里和示例在这里

我确实读过该页面..但是完全错过了多语言部分! 谢谢你的帮助

上面提到的把手策略似乎无法使用“设计编辑器”模式模板。 如果要使用至少两种不同的语言为不同的用例提供多个模板,是否应该在更改常规布局时将模板代码复制粘贴到每个模板上? 为什么没有办法拥有顶级的共享布局?

另外,似乎您必须在服务器端本地化电子邮件的主题,而不是在已经为每种语言设置模板主体的模板内容中? 用这种方法将主体和身体分开是没有意义的。 还是我忽略了什么?

你好@raine

上面提到的把手策略似乎无法使用“设计编辑器”模式模板。

你是正确的语言模板的具体设计发现这里没有设计工作,在“设计编辑器”模式。 您仍然可以使用代码模块在“设计编辑器”中创建类似的内容。

如果要使用至少两种不同的语言为不同的用例提供多个模板,是否应该在更改常规布局时将模板代码复制粘贴到每个模板上? 为什么没有办法拥有顶级的共享布局?

这实际上是我们的工程师提出的。 我仍然建议您在登录帐户时使用“反馈”按钮,以使我们的工程师知道这是需要的。 提交此类反馈的人越多,我们看到这种改进的可能性就越大。 当涉及代码库之外的任何内容时,反馈按钮是直接向我们的工程师获取反馈的最佳方法之一。 我个人已对与您要寻找的东西类似的东西进行了投票。

另外,似乎您必须在服务器端本地化电子邮件的主题,而不是在已经为每种语言设置模板主体的模板内容中? 用这种方法将主体和身体分开是没有意义的。 还是我忽略了什么?

我认为您已经忽略了一些东西。 通过我自己的个人测试,我知道把手可用于设置模板的主题。 虽然我可能无法正确理解您的措辞。 我知道该主题并未经过视觉设计来支持此功能,因此最好在诸如文本编辑器之类的代码中创建代码和内容,然后将其粘贴到主题字段中。 这是建议使用反馈按钮的另一个区域。 请随时提出您认为更好的方法。

请更正我喜欢的所有内容,并提供更多详细信息,以便我更好地理解。

凯尔

多种语言的示例如何解决电子邮件主题行的翻译?

@esiqveland

在模板的主题行中,您将使用以下内容:

{{#if english}}
Hello
{{else if spanish}}
Hola
{{else if french}}
Bonjour
{{/if}}

您基本上使用与HTML内容相同的结构。 如果您还有其他问题,请告诉我们。

@kylearoberts ,您好,有没有一种方法可以在条件中检查变量值? 因此,我不会检查englishspanish类的多个变量,而只是检查language变量是否等于enes 。 这对模板本身并没有太大的影响,但是在后端,我必须将语言代码变量转换为动态模板数据中的特殊命名的变量。

我简短地检查了车把,默认情况下似乎不支持它。 但是,也许SendGrid内置了一些自定义帮助程序。

@tlinhart

感谢您提出的重大问题。 从目前的情况来看,该系统将无法正常运行,但是稍后我们可能会允许使用类似的功能。 当我们进行此类更改时,我们可能会更新有关如何使用事务性模板的文档和示例。

你好
我目前正在为我的多语言电子邮件使用新的模板系统。 主要问题是主题领域的长度有限。 基本上,我的主题内容是这样的:

{{#if english}}
你好等等...
{{否则为西班牙文}}
你好等等...
{{否则为法语}}
你好等等...
{{/如果}}

但是有一些问题:

  1. 主题字段的长度不足以支持多种语言。 我必须减少文本和变量名,以保持在限制范围之内。 但是,如果我们必须添加一种新语言,这显然将行不通。
  2. 编辑器显示一个用于输入主题的单行字段,该字段不适用于模板主题。
  3. 编辑者主题字段愉快地减少了从粘贴中输入的文本。 这将导致模板错误,因为由于删除了模板脚本代码而导致语法错误

@布拉格玛

我遇到了与您相同的问题。 这也不是我们第一次听到这个消息。 我们喜欢这样获得反馈,因为它有助于我们改进产品。 我已确保将您的反馈意见反馈给我们的工程团队,我可以告诉您这是他们想要改进的领域之一。 当他们有机会进行改进时,这很可能就是其中之一。 再次感谢您的反馈。

@thinkingserious +1我需要本地化功能

此功能@thinkingserious巨大+1。
真正好的功能,能够处理同一模板中电子邮件的所有语言,但是如前所述,由于主题限制,该功能不可用。

@thinkingserious mega +1用于此功能-我们也需要此功能,对我们来说,用例有些不同,我们希望将模板的创建/维护工作分给营销人员,只有这些人不是程序员,因此我们需要每种语言的普通WYSIWYG模板。 每种语言有1个单独的版本将解决我们的问题。

以下内容会更好:

1-设置默认版本的能力(当未选择任何版本或提供了无效版本时,默认版本将取代)
2-在POST /mail/send API中只需有一个额外的参数即可添加版本

我们拥有一个平台,该平台具有12种以上的语言并在不断增加(是的,我们喜欢挑战),因此我们需要针对不同语言的特定营销人员,他们不会编写简单的模板。 另外,我们计划拥有大量用户,因此首先将所需的模板设置为活动状态,然后发送电子邮件会导致并发问题,其中会选择错误的模板。

非常感谢,

嘿,每个对此问题做出贡献的人!

我们正在与客户进行一些研究,以尝试了解如何最好地解决使用SendGrid发送的电子邮件的本地化/翻译问题。 如果您有时间,可以抽出宝贵的时间,我们很乐意为您提供宝贵的反馈意见,因为我们会仔细考虑如何建立正确的解决方案!

这是注册的链接,用于与我自己和我的团队就您今天如何处理翻译和本地化进行交谈: https :

非常感谢您的宝贵时间!

@ ben-grid刚刚检查了日历,但是时间对我而言不起作用,所以请您简要总结一下。

我们有一个带有沙箱和生产帐户的电子商务系统。 当我们批准模板时,我们会将其导出并导入到生产中(这也是一个很棒的功能,因为它具有带有促销管道的沙箱和生产模板)

无论如何...目前我们有2种语言,但是手头的任务是转移到5种语言。 目前,我们有11个模板。 我们现在要做的是{{if lang.en}}您好{{else}}哈罗{{/ if}},这仅适用于5种语言(在不久的将来有20种语言),因此我们现在要创建每种语言使用单独的模板,创建55个模板,而不是11个。(糟糕)

太好了!

选项1:
向API添加“版本”参数,然后仅发送提供的版本。 现在,我们至少可以发送一种书面形式的特殊版本(版本可以是模板的翻译版本,后备版本是有效版本)

选项2
将本地化参数添加到模板。 这样,我们只需翻译参数即可将模板用于多种语言。 这种方法的缺点是某些句子构造不适用于每种语言,因此您可能希望拥有更多的技巧

*选项3金色的眼泪的独角兽*
基本上每个插入的模块都有一个翻译选项卡。因此,当您插入这样的模块时
image该模块将具有多个语言环境。 基本上是不同语言的原始版本的克隆。 您需要能够设置模板的语言(将所有模块设置为包括主题和预标题的特定语言),如果尚未为该模块填充模块,则将其涂成红色

只需2美分,我希望收到您的反馈,如果您想邮寄,请通过[email protected]我联系

@reneweteling非常感谢,这非常有帮助。 我们正在开发的原型可能更像选项2和3,而不是1。当我们有值得收集的反馈信息时,我们会通过电子邮件与您联系。 再次感谢您的输入!

@reneweteling我认为选项1或2可以完成这项工作-因为它非常直观。 选项3-很好,拥有...

@ ben-grid&@ a-tonchev感谢您的辛勤工作! 我已经换了工作,但是对我来说,这不再重要了。 保持良好的工作!

关于这个有什么消息吗? 考虑到我还需要定位主题行,因此主题长度限制对我来说是个问题,我认为使用新的编辑器,主题长度会更小,主题行中可以包含大约110个字符。

IMO,似乎更可行的解决方案是生成所有文本服务器端,然后将其作为块段插入到模板中。

如果公司支持多种语言,那么他们的网站将已经有解决方案,应该在服务器端(从XML /数据库加载语言)。 我认为,与同一项目相关的任何电子邮件也应将其文本存储在这些语言文件中。

然后可以根据用户的语言从这些文件中提取必要的段落/文本,然后将其作为模板变量传递给sendgrid。 Sendgrid只是一个总体模板(如页脚等-只是样式和图像),甚至某些样式也必须保留在语言文件本身中-尤其是要加粗的单词等。

因此,模板最终将像: subject HelloLine welcomeparagraph helpparagraph footerslogan 。 就是这样。

IMO,似乎更可行的解决方案是生成所有文本服务器端,然后将其作为块段插入到模板中。

如果公司支持多种语言,那么他们的网站将已经有解决方案,应该在服务器端(从XML /数据库加载语言)。 我认为,与同一项目相关的任何电子邮件也应将其文本存储在这些语言文件中。

然后可以根据用户的语言从这些文件中提取必要的段落/文本,然后将其作为模板变量传递给sendgrid。 Sendgrid只是一个总体模板(如页脚等-只是样式和图像),甚至某些样式也必须保留在语言文件本身中-尤其是要加粗的单词等。

因此,模板最终将像: subject HelloLine welcomeparagraph helpparagraph footerslogan 。 就是这样。

这是无法管理的,因为您需要为每个广告文案更改重新部署邮件服务。 同样在某些公司中,邮件内容不是开发人员的责任,而是营销/撰稿人的责任。 您可能需要重新部署另一个UI才能对其进行编辑,但即使如此,我们也要向Sendgrid支付费用。

在一个项目中,我们使用无头CMS来编辑和创建每种语言的电子邮件模板。 服务器在运行时读取这些胡须模板,并生成要发送到Sendgrid的电子邮件正文。 Sendgrid模板编辑UX完全没有用,因此我们决定继续使用。

@cecchisandrone我同意sendgrid会更好。 他们需要添加适当的语言管理,并将其作为参数。 但是就像我说的那样,我们发送给他们的某些变量无论如何都需要本地化,例如日期/时间格式。

正如@ corneliu-gavrilovici所说
甚至现在值得。 在最近的更新中,对象的长度变得更短。 我们目前仅使用2种语言,并且在主题字段中按照以下方式进行操作:

{{#if english}}
Hello blah blah...
{{else if french}}
Hello blah blah...
{{/if}}

我不知道为什么要对此进行更新,因为这个问题,已经可以使用的产品不能再使用了。 您在文档中谈到了如何处理多种语言的模板,但是它不能正确使用。 @ ben-grid
https://sendgrid.com/docs/for-developers/sending-email/using-handlebars/#multiple -languages

IMO,似乎更可行的解决方案是生成所有文本服务器端,然后将其作为块段插入到模板中。
...
然后可以根据用户的语言从这些文件中提取必要的段落/文本,然后将其作为模板变量传递给sendgrid。 Sendgrid只是一个总体模板(如页脚等-只是样式和图像),甚至某些样式也必须保留在语言文件本身中-尤其是要加粗的单词等。

因此,模板最终将像: subject HelloLine welcomeparagraph helpparagraph footerslogan 。 就是这样。
我已经在SalesForce中使用服务器端JS完成了此操作。 json对象在模板中,但在编译过程中在服务器上运行。 它类似于具有真正的本地化功能,并且不依赖于您在ecomm环境中进行的开发发布。
我很期待看到@ ben-grid提到的SG团队提出了什么。

+1本地化功能。 如果我们有几种语言,那么很多/如果是/其他则一团糟。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

umarhussain15 picture umarhussain15  ·  3评论

Loriot-n picture Loriot-n  ·  4评论

kiranshashiny picture kiranshashiny  ·  4评论

TobiahRex picture TobiahRex  ·  3评论

thidasapankaja picture thidasapankaja  ·  4评论