Uluslararasılaşma (i18n)

Statigo, JSON tabanlı çeviriler ve çok dilli URL yönlendirme ile yerleşik uluslararasılaşma desteği sağlar.

Çeviri Dosyaları

Çeviriler translations/ dizininde JSON olarak depolanır:

translations/en.json:

{
  "nav": {
    "home": "Home",
    "about": "About",
    "contact": "Contact"
  },
  "pages": {
    "home": {
      "title": "Welcome",
      "subtitle": "A fast web framework"
    },
    "about": {
      "title": "About Us",
      "description": "Learn more about our company"
    }
  }
}

translations/tr.json:

{
  "nav": {
    "home": "Anasayfa",
    "about": "Hakkında",
    "contact": "İletişim"
  },
  "pages": {
    "home": {
      "title": "Hoş Geldiniz",
      "subtitle": "Hızlı bir web framework"
    },
    "about": {
      "title": "Hakkımızda",
      "description": "Şirketimiz hakkında daha fazla bilgi edinin"
    }
  }
}

Başlatma

import "statigo/framework/i18n"

i18nInstance, err := i18n.New(translationsFS, "en")
if err != nil {
    log.Fatal(err)
}

Parametreler:

  • fs.FS - Çeviri dosyalarını içeren dosya sistemi
  • defaultLang - Varsayılan dil kodu (örn. "en")

Go'da Çevirileri Kullanma

Dize Değeri Al

title := i18nInstance.Get("tr", "pages.home.title")
// Döner: "Hoş Geldiniz"

Ham Değeri Al (Her Tür)

data := i18nInstance.GetRaw("en", "pages.home")
// Döner: map[string]interface{}{"title": "Welcome", "subtitle": "..."}

Yedekli Al

value := i18nInstance.GetWithFallback("fr", "pages.home.title", "en")
// Fransızca çeviri yoksa "en"'e düşer

Şablonlarda Çeviri Kullanma

Temel Çeviri

<h1>{{t "pages.home.title"}}</h1>

İç İçe Anahtarlar

<nav>
  <a href="/">{{t "nav.home"}}</a>
  <a href="/about">{{t "nav.about"}}</a>
</nav>

Dil Balamı ile

t işlevi otomatik olarak bağlamdan mevcut dili kullanır:

<p>{{t "pages.home.description"}}</p>

Dil Algılama

Statigo dili bu öncelik sırasıyla algılar:

  1. URL Yolu - /en/ veya /tr/ öneki
  2. Çerez - lang çerez değeri
  3. Accept-Language Başlığı - Tarayıcı tercihleri
  4. Varsayılan - Yapılandırılmış varsayılan dil

Dil Ara Yazılımı

import "statigo/framework/middleware"

langConfig := middleware.LanguageConfig{
    SupportedLanguages: []string{"en", "tr"},
    DefaultLanguage:    "en",
    SkipPaths:          []string{"/robots.txt", "/sitemap.xml"},
    SkipPrefixes:       []string{"/static/", "/health/"},
}
r.Use(middleware.Language(i18nInstance, langConfig))

Mevcut Dile Erişim

İşleyicilerde

import "statigo/framework/middleware"

func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    lang := middleware.GetLanguage(r.Context())
    // lang "en", "tr", vb.
}

Şablonlarda

<p>Mevcut dil: {{.Lang}}</p>

<a href="{{localePath "/about" .Lang}}">Hakkında</a>

Yeni Dil Ekleme

  1. Çeviri dosyası oluştur:

translations/de.json:

{
  "nav": {
    "home": "Startseite",
    "about": "Über uns"
  }
}
  1. Desteklenen dillere ekle:
languages := []string{"en", "tr", "de"}
routeRegistry := router.NewRegistry(languages)
  1. Routes.json içinde rotaları ekle:
{
  "canonical": "/about",
  "paths": {
    "en": "/en/about",
    "tr": "/tr/hakkinda",
    "de": "/de/ueber-uns"
  }
}

Çeviri En İyi Uygulamaları

  1. İç içe gösterim için nokta gösterimi kullanın

    {
      "pages": {
        "home": {
          "title": "Ana Sayfa"
        }
      }
    }
    
  2. İlişkili çevirileri gruplandırın

    {
      "nav": {...},
      "pages": {...},
      "errors": {...}
    }
    
  3. Açıklayıcı anahtarlar kullanın tam cümleler yerine

    {
      "form": {
        "email_label": "E-posta Adresi",
        "email_error": "Lütfen geçerli bir e-posta girin"
      }
    }
    
  4. Tüm dillerde çevirileri eşitlenmiş tutun

  5. Eksik çeviriler için yedekler sağlayın

Çoğullaştırma

Çoğullaştırma için nesne sözdizimini kullanın:

{
  "items": {
    "zero": "Öğe yok",
    "one": "1 öğe",
    "other": "{{.Count}} öğe"
  }
}

Sonra Go'da:

count := len(items)
key := "items.zero"
if count == 1 {
    key = "items.one"
} else if count > 1 {
    key = "items.other"
}
text := i18nInstance.Get(lang, key)

Tarih/Saat Yerelleştirme

Şablonlarda formatDate ve formatDateTime işlevlerini kullanın:

<p>{{formatDate .Date "2006-01-02"}}</p>
<p>{{formatDateTime .Date "2006-01-02T15:04:05Z"}}</p>

Dile özgü biçimler için çeviri anahtarları oluşturun:

{
  "dates": {
    "short": "2 Oca 2006",
    "long": "2 Ocak 2006"
  }
}