Рубрики
Без рубрики

Python i18n – локализация шаблонов электронной почты

Используйте Python, Jinja и I18n союзника для определения, локализации и предварительного просмотра транзакционных электронных писем … Теги с i18n, Python, Email, Jinja.

Используйте Ally Python, Jinja и I18n, чтобы определить, локализовать и предварительный просмотр транзакционных писем

Приложения, которые поддерживают локализацию Frontend, обычно также требуют некоторых стратегий локализации для Backend Services. Видный пример – генерация локализованных транзакционных писем. В этой статье обсуждаются стратегии и рабочие процессы I18N для транзакционных электронных писем, обрабатываемых через бэкэндов Python. Это зависит главным образом по следующим ресурсам:

Если вы заинтересованы в рассмотрении полной реализации:

https://github.com/visini/email-templates-i18n

Определение почтовых сообщений

Для каждого «типа» или своего рода электронное сообщение наследовать из общего родительского класса EmailMessage , что, в свою очередь, реализует необходимые атрибуты и методы (например, рендеринг шаблонов). Смотрите Партспионский репозиторий для возможной реализации.

class EmailVerification(EmailMessage):
    def __init__(self, config, locale, variables):
        email_type = "email_verification"
        required = ["cta_url"]
        super().__init__(config, email_type, required, locale, variables)

class PasswordReset(EmailMessage):
    def __init__(self, config, locale, variables):
        email_type = "password_reset"
        required = ["cta_url", "operating_system", "browser_name"]
        super().__init__(config, email_type, required, locale, variables)

Сведения о новом сообщении с локалями и переменными и извлеките все необходимые атрибуты для отправки локализованных электронных писем:

message = EmailVerification(config, "en-US", {"foo": "bar"})
# print(message.subject)  # localized subject
# print(message.html)     # localized HTML with inlined CSS
# print(message.txt)      # localized plaintext email
# ...
send_email(recepient, message.subject, message.html, message.txt)

Локали и шаблоны

Все строки локали хранятся в формате JSON. Это обеспечивает гибкость с обоими рабочими процессом локализации и должна быть относительно устойчивым к изменяющимся требованиям. Глобальные переменные определяются по всему локам, поскольку они обычно не зависят от контекста локали (E.g., Компании или имена продуктов).

{
  "company_name": "Company Name",
  "product_name": "Product Name",
  "product_website": "https://www.example.com/"
}

Файлы строк локали содержат глобальный Ключ и ключ для каждого типа сообщения электронной почты, например подтверждение адреса электронной почты . Первый содержит «локализованные глобалы», то есть строки, многоразовые в различных типах сообщений электронной почты. Последнее определяет все строки определенного типа электронной почты.

{
  "global": {
    "greetings": "Viele Grüsse,",
    "all_rights_reserved": "Alle Rechte vorbehalten."
  },
  "email_verification": {
    "subject": "E-Mail-Adresse bestätigen",
    "thank_you": "Vielen Dank für deine Registrierung!"
  }
}

Используйте блоки для наследования макета из более высокого порядка, более общие шаблоны. В Партспионский репозиторий Предлагается трехслойное иерархическое наследование (макет Barebone с базовым стилем → Многоразовый макет электронной почты → Определенные шаблоны сообщения электронной почты). Шаблонные файлы интерполируют как локальные строки, так и переменные с двойной фигурной скобойкой.

{% extends "layouts/call_to_action.html" %}
{% block body_top %}
{{localized.thank_you}}
{% endblock %}
{% block body_bottom %}
{{localized.contact_us_for_help}}
{% endblock %}

Определите отдельный шаблон для простых текстовых электронных писем – добавьте разделители, чтобы структурировать шаблон без какой-либо разметки. Посмотреть Отстойки лучших практик Для получения более подробной информации о том, как форматировать простые текстовые электронные письма.

{% extends "layouts/call_to_action.txt" %}
{% block body_top %}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
{{localized.thank_you}}
{% endblock %}
{% block body_bottom %}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
{{localized.contact_us_for_help}}
{% endblock %}

Кроме того, в шаблонах файлов, переменные могут использоваться для интерполирующих значений в локализации файлов с той же обозначением. Интерполировать …

  • Глобальные строки → {{наименование товара}}
  • Локаль-специфические строки («Локализованные глобалы») → {{localizalized.support_phone_us}}
  • Переменные → {{variables.Operating_system}}
{
  "global": {
    "greetings": "Regards,",
    "team_signature": "Your {{product_name}} Team",
    "support_phone_us": "1-800-000-0000"
  },
  "password_reset": {
    "subject": "Password Reset Request",
    "support_message": "Need help? Call {{localized.support_phone_us}}.",
    "security_information": "This request was received from a {{variables.operating_system}} device."
  }
}

Это даже возможно использовать более сложные функции Jinja, такие как условные операторы, непосредственно в строках локали.

{
  "discounted_items_cart_abandonment_notification": {
    "subject": "There are {{variables.no_items_in_cart}} items in your shopping cart!",
    "promo_message": "{{'One item has a discount!' if variables.no_items_in_cart_discounted < 2 else variables.no_items_in_cart_discounted + ' items have a discount!'}}"
  }
}

Однако более удобный подход – это разгрузить всю логику в соответствующие шаблоны и использовать простое переменную интерполяцию в строковых файлах локали для удобства.

Рабочий процесс локализации

I18N. Союзник это расширение по коде для локализации. Он интегрируется с различными рамками (например, Vue.js), но также может быть использован для ускорения рабочих процессов локализации статического каталога файлов Locale JSON. Он даже включает в себя функции для совместной обзор и обсуждения локализации.

Предварительный просмотр сгенерированных электронных писем

В Партспионский репозиторий Предоставляется реализация образца для тонкой утилиты для генерации и выполненных шаблонов.

  • Автоматическая перезагрузка После обнаружения изменений файлов (шаблоны и строки локали)
  • Интерактивный переключатель между локалью, типом электронной почты и форматом (HTML и простой текст)
  • Отзывчивый вид (например, Chrome devtools) позволяет просматривать представленные шаблоны в различных сценариях
  • На основе Vue.js и fastapi, расширяемой и с минимальным накладным расходом
  • Работа в процессе

Отправка электронной почты (AWS SES)

Доступ к атрибутам класса экземплярованного сообщения электронной почты для реализации функций отправки электронной почты. Для иллюстрации приведен пример для AWS SES приведен ниже:

import boto3
from botocore.exceptions import ClientError

from src.messages import EmailVerification

config_path = "./src/data"
lang_path = "./src/data/lang"
templates_path = "./src/templates"

# Message config
locale = "en-US"
variables = {"cta_url": "https://www.example.com/"}
message = EmailVerification(config, locale, variables)

#  Application config
SENDER = "Sender Name "
RECIPIENT = "recipient@example.com"
CONFIGURATION_SET = "ConfigSet"
AWS_REGION = "us-west-2"

client = boto3.client("ses", region_name=AWS_REGION)

try:
    response = client.send_email(
        Destination={"ToAddresses": [RECIPIENT] },
        Message={
            "Body": {
                "Html": {"Charset": "UTF-8", "Data": message.html},
                "Text": {"Charset": "UTF-8", "Data": message.txt},
            },
            "Subject": {"Charset": "UTF-8", "Data": message.subject},
        },
        Source=SENDER,
        ConfigurationSetName=CONFIGURATION_SET,
    )

except ClientError as e:
    print(e.response["Error"]["Message"])
else:
    print("Email sent! Message ID:"),
    print(response["MessageId"])

Заключение

Поддержка нескольких локалей для транзакционных электронных писем требует дополнительных соображений для определения строк шаблонов и локали. Предлагаемый подход включает в себя классы и дополнительную инструмент для реализации электронных писем I18N в приложениях Python.

Я надеюсь, что вы нашли эту статью информацию о том, как подойдут I18N в Britending Python!

Оригинал: “https://dev.to/visini/python-i18n-localizing-transactional-email-templates-255j”