Skip to content

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.

  1. E-posta servisi: app/lib/email.ts — çeviri sözlüğü (emailDict), getEmailStrings(locale), ortak emailLayout, Resend ile gönderim.
  2. 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.
  3. Fatura e-postası: app/routes/api.stripe.webhook.tssession.locale (örn. en-US) alınır, dil kodu (en) çıkarılır ve sendPurchaseReceiptEmailWithInvoice(..., locale) çağrılır.
  4. Layout: Tüm e-postalar emailLayout(title, body) ile aynı üst/alt yapıda; marka renkleri ve minimal footer.

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.


Fonksiyon: sendVerificationEmail(email, verificationUrl, userName?, locale?)

  • Parametre: locale varsayı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 sendVerificationEmail hook’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 fonksiyonuna locale parametresi ile iletilir.

Fonksiyon: sendPasswordResetEmail(email, resetUrl, userName?, locale?)

  • Parametre: locale varsayılan "en".
  • İçerik: Konu, başlık, açıklama ve buton metni çeviri sözlüğünden gelir.
  • Çağrı yeri: Better Auth sendPasswordResetEmail hook’u (app/lib/auth.ts). Referer’dan dil çıkarılır; sıfırlama URL’i /{locale}/reset-password?token=... formatında verilir ve locale e-posta fonksiyonuna geçirilir.

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ı zaten session.currency ve uluslararası tarih formatına göre ayarlıdır.

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.

KonuAçıklama
Dil tespiti (auth)Referer header → URL’deki dil öneki (tr, en, de, fr, es, ja); yoksa en.
Dil tespiti (fatura)Stripe session.localesplit("-")[0] ile dil kodu.
ÇevirileremailDict + getEmailStrings(locale); eksik dil → en.
LayoutOrtak emailLayout; SaaS tarzı, kurumsal.
URL’lerDoğrulama ve sıfırlama link’leri /{locale}/... ile dil önekli.

  • 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).