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 sistemidefaultLang- 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:
- URL Yolu -
/en/veya/tr/öneki - Çerez -
langçerez değeri - Accept-Language Başlığı - Tarayıcı tercihleri
- 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
- Çeviri dosyası oluştur:
translations/de.json:
{
"nav": {
"home": "Startseite",
"about": "Über uns"
}
}
- Desteklenen dillere ekle:
languages := []string{"en", "tr", "de"}
routeRegistry := router.NewRegistry(languages)
- Routes.json içinde rotaları ekle:
{
"canonical": "/about",
"paths": {
"en": "/en/about",
"tr": "/tr/hakkinda",
"de": "/de/ueber-uns"
}
}
Çeviri En İyi Uygulamaları
İç içe gösterim için nokta gösterimi kullanın
{ "pages": { "home": { "title": "Ana Sayfa" } } }İlişkili çevirileri gruplandırın
{ "nav": {...}, "pages": {...}, "errors": {...} }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" } }Tüm dillerde çevirileri eşitlenmiş tutun
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"
}
}