Email thông báo đa ngôn ngữ theo ngôn ngữ của khách hàng
Mỗi khách hàng nhận email loyalty (earn points, tier, redeem, birthday…) bằng đúng ngôn ngữ của họ — tự động, không cần merchant dịch tay.
Ticket: JOY-260513-gA2AP6Trạng thái: Implemented · Đã verify trên devPending: QA + deploy staging
1 Vấn đề
Vì sao cần làm.
Hiện tại Joy gửi email thông báo bằng một ngôn ngữ cố định do merchant chọn thủ công. Với store bán nhiều thị trường (ví dụ Jana — 5 market: SK / CZ / PL / HU / HR), merchant chỉ chọn được 1 trong 5 ngôn ngữ →
4/5 nhóm khách nhận email sai ngôn ngữ → open rate giảm, conversion campaign thấp.
Để làm thủ công, merchant phải dịch tay 20+ loại email × N ngôn ngữ — bất khả thi.
2 Giải pháp
Merchant chỉ cần 2 thao tác; phần còn lại Joy tự lo.
① Thêm ngôn ngữ (1 lần)
Merchant thêm ngôn ngữ trong Translations admin (màn hình có sẵn). Joy tự động dịch sẵn nội dung tất cả email cho ngôn ngữ đó.
② Review / chỉnh (tuỳ chọn)
Vào email editor, chọn ngôn ngữ trong dropdown để xem & sửa bản dịch nếu muốn. Có nút gửi test "Preview in language".
Khi gửi đi: Joy tự render email theo ngôn ngữ của từng khách (lấy từ tài khoản Shopify của khách). Khách Pháp nhận bản Pháp, khách Đức nhận bản Đức — trong cùng một campaign.
3 Cách hoạt động
Hai luồng chạy song song.
Luồng A — Khi gửi email cho khách
Ngôn ngữ của khách
Lấy từ tài khoản Shopify (Customer.locale, vd fr-CA)
→
Joy lấy & lưu locale
Qua đồng bộ khách + tự bổ sung khi cần (webhook Shopify không kèm locale)
→
Chọn ngôn ngữ
Khớp chính xác → theo ngôn ngữ → biến thể vùng; thiếu thì về ngôn ngữ chính
→
Email đúng ngôn ngữ
Render bản dịch của email cho khách đó
Luồng B — Khi merchant thêm ngôn ngữ
MC thêm ngôn ngữ
Trong Translations admin
→
Auto-translate (AI)
Joy dịch toàn bộ ~20 loại email bằng Gemini, chạy nền
→
Bản dịch sẵn sàng
Lưu theo từng ngôn ngữ, từng loại email
→
MC review trong editor
Chỉnh tay nếu muốn
4 Trải nghiệm trong Email Editor
Merchant chọn ngôn ngữ ngay trên đầu trình soạn — nội dung & preview đổi theo.
Editor "Earn points" với dropdown Language: Vietnamese — Subject, nội dung, nút, footer và preview (cột phải) đều render tiếng Việt. Đổi dropdown sang ngôn ngữ khác → toàn bộ nội dung swap theo.
Dropdown "Language": ngôn ngữ chính (gắn nhãn Default) + các ngôn ngữ đã thêm.
Chuyển ngôn ngữ → editor & live preview đổi sang nội dung của ngôn ngữ đó.
Tất cả ngôn ngữ lưu chung 1 lần Save (chuyển qua lại không mất chỉnh sửa).
Shop chưa thêm ngôn ngữ nào → dropdown ẩn, editor hoạt động y như trước (không ảnh hưởng).
5 Bằng chứng demo
Đã chạy thật end-to-end trên môi trường dev (cùng email "Earn points", đổi locale của khách).
Ngôn ngữ
Tiêu đề email render (biến đã thay)
Nguồn
🇬🇧 English (gốc)
xidoke: You've earned 100 points!
Nội dung gốc
🇻🇳 Tiếng Việt
xidoke: Bạn vừa nhận được 100 points!
Bản dịch
🇫🇷 Français
{{shop_name}}: Vous avez gagné une récompense… (Birthday)
Auto-translate (AI)
🇩🇪 Deutsch
{{shop_name}}: Sie haben {{earning_points}} verdient!
Auto-translate (AI)
Email tiếng Việt render đầy đủ (demo)
xidoke · Cảm ơn bạn đã mua sắm!
🎉 Chúc mừng! Bạn vừa nhận được 100 points từ chương trình Sign up tại xidoke!
Số dư hiện tại của bạn là 100 points. Hãy quay lại cửa hàng và đổi điểm lấy ưu đãi hấp dẫn nhé!
Đổi Points Ngay
Bạn không muốn nhận email này nữa? · Hủy đăng ký tại đây
Biến động ({{earning_points}}, {{shop_name}}, {{earning_program}}) được thay đúng; chỉ phần text được dịch, logic giữ nguyên.
6 Phạm vi & Trạng thái
Đã hoàn thành DONE · dev-verified
Đồng bộ ngôn ngữ khách (Customer.locale) vào Joy
Tự bổ sung locale khi gửi nếu thiếu (an toàn, 1 lần/khách)
Render email theo ngôn ngữ khách + fallback ngôn ngữ chính
Auto-translate ~20 loại email khi thêm ngôn ngữ (AI)
Nhãn "Language" đa ngôn ngữ hoá (i18n) — đang để tiếng Anh tạm
Editor bản cũ (legacy V1) chưa có dropdown — chạy ngôn ngữ chính
Auto-translate: chuyển sang hàng đợi nền (bền hơn ở production)
Email dạng HTML thuần (custom HTML) chưa dịch nội dung body
QA đầy đủ + deploy staging để test gửi email thật
7 Ghi chú kỹ thuật (cho BA / Dev)
Nguồn ngôn ngữ khách:Customer.locale của Shopify (BCP47, vd fr-CA) — chỉ có ở GraphQL Admin API, không có ở REST/webhook. Vì vậy Joy lấy qua đồng bộ GraphQL + bổ sung lúc gửi (lazy-fetch), không dựa vào webhook.
Lưu bản dịch: theo từng loại notification, dạng map translations[locale] = {subject, heading, body, button, footer, unsubscribe}. Lưu/đọc gộp chung với notification (không cần bảng mới).
Chọn ngôn ngữ lúc gửi: khớp chính xác → theo ngôn ngữ (fr-CA → fr) → biến thể vùng cùng ngôn ngữ → ngôn ngữ chính. Fallback theo từng field (thiếu field nào dùng bản chính field đó).
Auto-translate: tái dùng hạ tầng dịch sẵn của Joy (Gemini), gộp các field thành 1 lần gọi/notification, có giới hạn tần suất.
Tác động: shop không bật đa ngôn ngữ → hành vi y như cũ. Email test & các đường gửi lại không bị đổi ngôn ngữ ngoài ý muốn.
Chất lượng: review tự động đa-góc (max effort) đã rà & sửa 7 lỗi gồm 1 lỗi ghi đè nội dung gốc khi đang sửa bản dịch; fix quan trọng nhất (lưu bản dịch không đè ngôn ngữ khác) đã verify thực tế.