Skip to content

Çoklu Dil Kullanımı

i18n (internationalization), sitenin birden fazla dilde çalışmasını sağlar. Falcon’da:

  • İngilizce (EN) varsayılan dil — URL’de önek yok: /, /blog/welcome/
  • Diğer diller — locale öneki ile: /tr/, /tr/blog/hos-geldiniz/, /de/blog/, /fr/blog/

Aynı “sayfa” farklı dillerde farklı URL ve farklı metinle sunulur. Blog yazıları da dil başına ayrılır.


  • Kurumsal site TR, DE, FR (ve ileride başka diller) ile yayınlanacak
  • EN slug’ları İngilizce, TR slug’ları Türkçe olabilir (ör. /contact/tr/iletisimsitePages.contact, Sayfa Ekle / Kaldır)
  • Blog yazılarının çevirisi ayrı MDX dosyası olarak durur
  • Metinler kodda dağınık string olmaz; t() ve routes.ts ile merkezi yönetilir

İçerik src/content/blog/ altındaki MDX dosyalarında; harici CMS yok.


i18n: {
defaultLocale: 'en',
locales: ['en', 'tr', 'de', 'fr'],
routing: { prefixDefaultLocale: false },
}

prefixDefaultLocale: false → EN için /tr gibi önek yok.

  • locales — desteklenen diller
  • prefixedLocales — URL’de önek alanlar (tr, de, fr)
  • localeMap — HTML lang ve tarih formatı (tr-TR vb.)

Her mantıksal sayfa bir pageId ile tanımlanır; her dilin path’i burada:

sitePages.blog.tr // → '/tr/blog'
sitePages.home.de // → '/de/'

Yeni sayfa eklerken önce sitePages’e satır ekle, sonra ilgili src/pages/ dosyalarını oluştur.

  • types.tsLS = { en, tr, de, fr }
  • utils.tsgetLangFromUrl(), t(), ls()
  • common.ts — Blog, Home, Back gibi UI metinleri

Örnek:

t(common.nav.blog, locale) // locale'e göre doğru metin
ls('Blog', 'Blog', 'Blog', 'Blog') // 4 dilde string

Tek koleksiyon: blog. Dil ayrımı frontmatter locale ile:

---
title: ...
locale: tr
---

Dosyalar src/content/blog/ altında (klasör değil, alan ile ayrım).

DilAna sayfaBlog listeBlog yazı
ENsrc/pages/index.astrosrc/pages/blog/src/pages/blog/[...slug].astro
TRsrc/pages/tr/index.astrosrc/pages/tr/blog/src/pages/tr/blog/[...slug].astro
DE/FRsrc/pages/de/index.astro, fr/index.astrosrc/pages/de/blog/aynı kalıp

Ortak mantık: src/lib/blog.ts (getPostsForLocale, getBlogPostPath, createBlogPostStaticPaths).


DilListeÖrnek
EN/blog//blog/welcome/
TR/tr/blog//tr/blog/hos-geldiniz/
DE/de/blog/(yazı eklenince)
FR/fr/blog/(yazı eklenince)
  • welcome.mdxlocale: en → yalnızca /blog/welcome/
  • hos-geldiniz.mdxlocale: tr → yalnızca /tr/blog/hos-geldiniz/
  • /blog/hos-geldiniz/ gibi yanlış dil + slug → sayfa üretilmez (404)

Path üretimi: getBlogPostPath(locale, post.id) veya sitePages.blog[locale] — sayfada hardcode URL yazma.


  1. src/content/blog/yazi-slug.mdx oluştur
  2. Frontmatter: title, description, pubDate, locale: tr
  3. Build → otomatik /tr/blog/yazi-slug/

Almanca/Fransızca için locale: de veya fr; ilgili src/pages/de/blog/ rotaları zaten var.

  1. src/config/routes.tssitePages.contact tüm diller için:

    contact: {
    en: '/contact',
    tr: '/tr/iletisim',
    de: '/de/kontakt',
    fr: '/fr/contact',
    }
  2. Sayfa dosyaları: src/pages/contact.astro, src/pages/tr/iletisim.astro

  3. Metinler: src/i18n/ içinde ls() / t()

  4. LanguageSwitcher pageId="contact" (sayfa eklenince)

---
import { getLangFromUrl } from '@/i18n/utils';
const locale = getLangFromUrl(Astro.url);
---

Mirror sayfalarda (tr/index.astro) locale = 'tr' sabit de olabilir; dinamik bileşenlerde URL’den okumak daha güvenli.

<LanguageSwitcher pageId="home" /> veya pageId="blog" — linkler sitePages[pageId][locale] üzerinden gelir.

Not: Blog yazısındayken dil değiştirici, translationKey ile eşleşen karşılık yazıya gidebilir (welcomehos-geldiniz); anahtar yoksa aynı dilin blog listesine döner.


YapYapma
URL’leri sitePages ve getBlogPostPath ile üret/tr/blog/ string’ini sayfaya yapıştır
Her MDX’e doğru locale yazlocale olmadan blog ekleme
Yeni dil sayfası → routes.ts + pages/Sadece TR klasörü açıp config unutma
UI metni → t(common....)Her sayfada ayrı “Blog” yazısı
EN içerik önek siz/en/blog kullanma

İsteğe bağlı iyileştirmeler:


src/config/locales.ts → diller
src/config/routes.ts → URL haritası
src/i18n/ → metinler ve t()
src/lib/blog.ts → blog filtre + path
src/content/blog/*.mdx → locale alanı
src/pages/ → EN
src/pages/tr/ → TR mirror
src/components/i18n/LanguageSwitcher.astro

Terminal window
npm run build

Tarayıcıda: /, /tr/, /blog/, /blog/welcome/, /tr/blog/, /tr/blog/hos-geldiniz/ → 200.


EN öneksiz, diğer diller /tr/, /de/, /fr/ ile. URL’ler routes.ts, metinler i18n/, blog dili locale frontmatter. Yeni içerik = MDX + doğru locale; yeni sayfa = sitePages + mirror pages.