He creado la aplicación parcial dada en mi módulo:
// 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 ); Como puede ver, mi sendUpdatePasswordEmail pasa un generador de plantillas de asunto y HTML a la función sendEmail .
Así es como se ve mi updatePasswordHTMLTemplate :
const updatePasswordHTMLTemplate = (language) => ` <!DOCTYPE html> <html lang="${language}"> ... <body> <h1>${t("auth.password.update.title", language)}</h1> </body> </html> `; Como puede ver, estoy internacionalizando los correos electrónicos que envío a los usuarios finales, utilizando algún tipo de i18n .
El problema que estoy experimentando es que necesito una forma de pasar, como argumento, el idioma del usuario a mi función sendUpdatePasswordEmail . Y, también, necesito traducir el asunto del correo electrónico:
const sendUpdatePasswordEmail = sendEmail( "Your password has been updated.", <--- t("auth.password.update.subject", language) updatePasswordHTMLTemplate );¿Hay algún patrón de diseño que deba usar aquí? Quiero decir, como pueden ver, usé la aplicación parcial para "generalizar" mi código, haciéndolo más legible, pero el gran problema viene con la traducción del tema...
Esta es la forma en que uso los métodos que describí:
const { email, language } = context.auth.token; await sendUpdatePasswordEmail(email); // I need to pass the language!¿Algunas ideas? Gracias.
He pensado en hacer algo como:
const sendUpdatePasswordEmail = (language) => sendEmail( t("subject.scope", language), updatePasswordTemplate, language );Pero entonces, tendría que usar el método de la siguiente manera:
sendUpdatePasswordEmail(language)(emailAddress);y no me gusta (no de una manera limpia).
Sugeriría simplemente hacer que el parámetro del subject sea una función que también acepte un idioma, al igual que su parámetro template ya lo es:
const makeSendEmail = (subjectTemplate, bodyTemplate) => async (to, ...props) => { const mailsRef = firestore.collection("mails"); const subject = subjectTemplate(...props); const html = bodyTemplate(...props); const mail = {…}; … };Entonces usa
const sendUpdatePasswordEmail = makeSendEmail( (language) => t("subject.scope", language), updatePasswordTemplate );y llama
sendUpdatePasswordEmail(emailAddress, language);como antes