E-posta Uluslararasılaştırması (i18n)
Doğrulama, şifre sıfırlama ve fatura e-postalarında çoklu dil desteği; referer ve Stripe locale ile dil tespiti; SaaS e-posta layout.
Achidemy’de kullanıcıya giden e-postalar (hesap doğrulama, şifre sıfırlama, satın alma makbuzu/fatura) dil bazlı içerikle gönderilir. Dil, kayıt/şifre sıfırlama için HTTP Referer üzerinden, fatura için Stripe Checkout session.locale üzerinden tespit edilir. Tüm şablonlar ortak SaaS e-posta layout’u ile sade ve kurumsal bir görünüme sahiptir.
Genel Akış
Section titled “Genel Akış”- E-posta servisi:
app/lib/email.ts— çeviri sözlüğü (emailDict),getEmailStrings(locale), ortakemailLayout, Resend ile gönderim. - Auth e-postaları:
app/lib/auth.ts— Better Auth hook’larında referer’dan dil çıkarılır; doğrulama ve şifre sıfırlama URL’i ilgili dil önekiyle oluşturulur. - Fatura e-postası:
app/routes/api.stripe.webhook.ts—session.locale(örn.en-US) alınır, dil kodu (en) çıkarılır vesendPurchaseReceiptEmailWithInvoice(..., locale)çağrılır. - Layout: Tüm e-postalar
emailLayout(title, body)ile aynı üst/alt yapıda; marka renkleri ve minimal footer.
Çeviri Sözlüğü (emailDict)
Section titled “Çeviri Sözlüğü (emailDict)”Dosya: app/lib/email.ts
- emailDict:
Record<string, Record<string, string>>— dil kodu (tr, en, …) → anahtar → metin. - Anahtarlar (örnek):
verifySubject,verifyTitle,verifyDesc,verifyBtn,resetSubject,resetTitle,resetDesc,resetBtn. - getEmailStrings(locale): Verilen locale sözlükte yoksa
"en"döner; böylece desteklenmeyen dillerde İngilizce kullanılır.
Yeni dil eklemek için emailDict içine yeni bir dil kodu ve aynı anahtarlarla çeviriler eklenir.
Hesap Doğrulama E-postası
Section titled “Hesap Doğrulama E-postası”Fonksiyon: sendVerificationEmail(email, verificationUrl, userName?, locale?)
- Parametre:
localevarsayılan"en". - İçerik: Başlık ve gövde
getEmailStrings(locale)ile alınan metinlerle doldurulur; buton metni ve konu (subject) dahil. - Çağrı yeri: Better Auth
sendVerificationEmailhook’u (app/lib/auth.ts). Hook içinde referer header’ı okunur; URL’deki dil öneki (/tr/,/en/,/de/,/fr/,/es/,/ja/) regex ile bulunur, yoksa"en"kullanılır. Doğrulama link’i ilgili dil önekine sahip olacak şekilde (örn./{locale}/verify-email?token=...) oluşturulur ve e-posta fonksiyonunalocaleparametresi ile iletilir.
Şifre Sıfırlama E-postası
Section titled “Şifre Sıfırlama E-postası”Fonksiyon: sendPasswordResetEmail(email, resetUrl, userName?, locale?)
- Parametre:
localevarsayılan"en". - İçerik: Konu, başlık, açıklama ve buton metni çeviri sözlüğünden gelir.
- Çağrı yeri: Better Auth
sendPasswordResetEmailhook’u (app/lib/auth.ts). Referer’dan dil çıkarılır; sıfırlama URL’i/{locale}/reset-password?token=...formatında verilir velocalee-posta fonksiyonuna geçirilir.
Satın Alma Makbuzu / Fatura E-postası
Section titled “Satın Alma Makbuzu / Fatura E-postası”Fonksiyon: sendPurchaseReceiptEmailWithInvoice(..., locale?)
- Parametre: Son parametre
locale, varsayılan"en". - İçerik: Fatura/makbuz metinleri (başlık, tablo etiketleri, toplam vb.) locale’e göre seçilir; desteklenmeyen dilde İngilizce kullanılır.
- Çağrı yeri:
app/routes/api.stripe.webhook.ts— Checkout tamamlandığında (tek kurs ve sepet satışı).session.locale(örn.fr-FR,en) alınır;locale = (session.locale || "en").split("-")[0]ile dil kodu çıkarılır ve fatura e-postası bu locale ile gönderilir. Para birimi ve tarih formatı zatensession.currencyve uluslararası tarih formatına göre ayarlıdır.
E-posta Layout (SaaS Tasarımı)
Section titled “E-posta Layout (SaaS Tasarımı)”Fonksiyon: emailLayout(title, body) — app/lib/email.ts
- Yapı: Tek bir HTML şablonu; geniş max-width, beyaz kart, hafif gölge; üstte başlık, ortada
body(içerik), altta minimal footer. “System Notification” vb. gereksiz rozetler kaldırılmış; kurumsal ve sade görünüm. - Kullanım: Doğrulama, şifre sıfırlama ve fatura e-postalarının HTML gövdesi bu layout’a sarılarak gönderilir; böylece tüm e-postalar görsel olarak tutarlıdır.
| Konu | Açıklama |
|---|---|
| Dil tespiti (auth) | Referer header → URL’deki dil öneki (tr, en, de, fr, es, ja); yoksa en. |
| Dil tespiti (fatura) | Stripe session.locale → split("-")[0] ile dil kodu. |
| Çeviriler | emailDict + getEmailStrings(locale); eksik dil → en. |
| Layout | Ortak emailLayout; SaaS tarzı, kurumsal. |
| URL’ler | Doğrulama ve sıfırlama link’leri /{locale}/... ile dil önekli. |
İlgili Dosyalar
Section titled “İlgili Dosyalar”app/lib/email.ts— emailDict, getEmailStrings, emailLayout, sendVerificationEmail, sendPasswordResetEmail, sendPurchaseReceiptEmailWithInvoice.app/lib/auth.ts— sendVerificationEmail / sendPasswordResetEmail hook’ları; referer ile locale.app/routes/api.stripe.webhook.ts— session.locale, sendPurchaseReceiptEmailWithInvoice(…, locale).