简介
我已经在我的模块中创建了给定的部分应用程序:
// GENERIC
const sendEmail = (subject, template) =>
async (to, ...props) => {
const mailsRef = firestore.collection("mails");
const html = template(...props);
const mail = {
to,
message: {
subject,
html,
},
};
await mailsRef.add(mail);
functions.logger.log("Email queued for delivery!");
};
// SPECIFIC
const sendUpdatePasswordEmail = sendEmail(
"Your password has been updated.",
updatePasswordHTMLTemplate
);
const sendSignUpWelcomeEmail = sendEmail(
"Welcome to Binance!",
signUpWelcomeHTMLTemplate
);
const sendBitcoinAddressUpdatedEmail = sendEmail(
"Your bitcoin address has been updated.",
bitcoinWalletAddressHTMLTemplate
);
如您所见,我的sendUpdatePasswordEmail
将主题和HTML
模板生成器传递给sendEmail
函数。
这就是我的updatePasswordHTMLTemplate
的样子:
const updatePasswordHTMLTemplate = (language) => `
<!DOCTYPE html>
<html lang="${language}">
...
<body>
<h1>${t("auth.password.update.title", language)}</h1>
</body>
</html>
`;
正如你所看到的,我正在使用某种i18n
将我发送给最终用户的电子邮件国际化。
问题
我遇到的问题是,我需要一种方法将用户的语言作为参数传递给我的sendUpdatePasswordEmail
函数。而且,我还需要翻译电子邮件的主题:
const sendUpdatePasswordEmail = sendEmail(
"Your password has been updated.", <--- t("auth.password.update.subject", language)
updatePasswordHTMLTemplate
);
这里有我应该使用的设计模式吗?我的意思是,正如你所看到的,我使用部分应用程序是为了";泛化";我的代码,使其可读性更强,但大问题来自主题翻译。。。
这是我使用我描述的方法的方式:
const { email, language } = context.auth.token;
await sendUpdatePasswordEmail(email); // I need to pass the language!
有什么想法吗?非常感谢。
我想做一些类似的事情:
const sendUpdatePasswordEmail = (language) => sendEmail(
t("subject.scope", language),
updatePasswordTemplate,
language
);
但是,我必须使用以下方法:
sendUpdatePasswordEmail(language)(emailAddress);
我不喜欢这样(不是一种干净的方式)。
我建议简单地将subject
参数作为一个接受语言的函数,就像您的template
参数已经是:
const makeSendEmail = (subjectTemplate, bodyTemplate) => async (to, ...props) => {
const mailsRef = firestore.collection("mails");
const subject = subjectTemplate(...props);
const html = bodyTemplate(...props);
const mail = {…};
…
};
然后使用
const sendUpdatePasswordEmail = makeSendEmail(
(language) => t("subject.scope", language),
updatePasswordTemplate
);
并呼叫
sendUpdatePasswordEmail(emailAddress, language);
与之前一样