Go के अंतरराष्ट्रीयकरण की संपूर्ण गाइड
मैसेज फ़ाइलों से लेकर goroutine-सुरक्षित लोकेल समाधान तक: go-i18n से अपने Go ऐप में i18n सेट अप करें, फिर AI की मदद से अनुवाद स्वचालित करें।
go-i18n इंस्टॉल करें
go-i18n, Go के लिए सबसे लोकप्रिय अंतरराष्ट्रीयकरण लाइब्रेरी है। यह CLDR के बहुवचन नियमों और वेरिएबल इंटरपोलेशन के लिए Go टेम्प्लेट का उपयोग करती है तथा JSON, TOML और YAML मैसेज फ़ाइलों का समर्थन करती है। भाषा टैग का मिलान करने के लिए आपको golang.org/x/text की भी आवश्यकता होगी।
go get -u github.com/nicksnyder/go-i18n/v2/i18n
go get -u golang.org/x/text/languageमैसेज फ़ाइलें बनाएँ
locales डायरेक्टरी में हर भाषा के लिए एक JSON फ़ाइल बनाएँ। प्रत्येक मैसेज में एक ID और बहुवचन के एक या अधिक रूप होते हैं। go-i18n वेरिएबल इंटरपोलेशन के लिए Go टेम्प्लेट सिंटैक्स (डॉट प्रीफ़िक्स वाली दोहरी कर्ली ब्रेसेज़) का उपयोग करता है।
{
"HelloWorld": { "other": "Hello, World!" },
"Greeting": { "other": "Hello, {{.Name}}!" },
"ItemCount": {
"one": "{{.Count}} item",
"other": "{{.Count}} items"
},
"WelcomeBack": {
"other": "Welcome back, {{.Name}}. You have {{.Count}} messages."
}
}Bundle लोड करें
Bundle, go-i18n की केंद्रीय रजिस्ट्री है। स्टार्टअप के समय इसे बनाएँ, अपना फ़ाइल फ़ॉर्मैट रजिस्टर करें और सभी मैसेज फ़ाइलें लोड करें। Bundle goroutine-सुरक्षित है—इसे केवल एक बार बनाएँ और अपने पूरे एप्लिकेशन में साझा करें।
package main
import (
"encoding/json"
"fmt"
"github.com/nicksnyder/go-i18n/v2/i18n"
"golang.org/x/text/language"
)
func main() {
// 1. Create a bundle with a default language
bundle := i18n.NewBundle(language.English)
// 2. Register the unmarshal function for your file format
bundle.RegisterUnmarshalFunc("json", json.Unmarshal)
// 3. Load message files
bundle.MustLoadMessageFile("locales/en.json")
bundle.MustLoadMessageFile("locales/ja.json")
bundle.MustLoadMessageFile("locales/de.json")
// 4. Create a localizer and localize a message
localizer := i18n.NewLocalizer(bundle, "ja")
msg := localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: "HelloWorld",
})
fmt.Println(msg) // "こんにちは、世界!"
}Localizer का उपयोग करें
हर अनुरोध के लिए यूज़र की पसंदीदा भाषा के साथ एक Localizer बनाएँ। Localizer, Bundle से मैसेज प्राप्त करता है, Go के text/template इंजन से टेम्प्लेट रेंडरिंग संभालता है और PluralCount के आधार पर बहुवचन का सही रूप चुनता है।
// Simple message
msg := localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: "HelloWorld",
})
// Message with template data
msg := localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: "Greeting",
TemplateData: map[string]interface{}{
"Name": "Alice",
},
})
// "Hello, Alice!" (en) or "こんにちは、Aliceさん!" (ja)
// Plural + template data
msg := localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: "ItemCount",
PluralCount: 5,
TemplateData: map[string]interface{}{
"Count": 5,
},
})
// "5 items" (en) or "5個のアイテム" (ja)
// Combined: plurals + multiple variables
msg := localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: "WelcomeBack",
TemplateData: map[string]interface{}{
"Name": "Alice",
"Count": 3,
},
})func handler(w http.ResponseWriter, r *http.Request) {
// Accept-Language: ja,en;q=0.9,de;q=0.8
accept := r.Header.Get("Accept-Language")
// NewLocalizer accepts multiple languages — first match wins
localizer := i18n.NewLocalizer(bundle, accept)
msg := localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: "HelloWorld",
})
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
w.Write([]byte(msg))
}बहुवचन नियम संभालें
go-i18n सभी भाषाओं के लिए CLDR बहुवचन नियम लागू करता है। अंग्रेज़ी में 2 रूप (one, other), अरबी में 6 (zero, one, two, few, many, other) और जापानी में 1 (other) होता है। अपनी मैसेज फ़ाइलों में सभी आवश्यक रूप निर्धारित करें—go-i18n, PluralCount के आधार पर सही रूप चुनता है।
// English: 2 forms (one, other)
{
"ItemCount": {
"one": "{{.Count}} item",
"other": "{{.Count}} items"
}
}
// Arabic: 6 forms (zero, one, two, few, many, other)
{
"ItemCount": {
"zero": "لا عناصر",
"one": "عنصر واحد",
"two": "عنصران",
"few": "{{.Count}} عناصر",
"many": "{{.Count}} عنصرًا",
"other": "{{.Count}} عنصر"
}
}
// Japanese: 1 form (other)
{
"ItemCount": {
"other": "{{.Count}}個のアイテム"
}
}// go-i18n selects the correct plural form based on PluralCount
localizer := i18n.NewLocalizer(bundle, "ar")
msg := localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: "ItemCount",
PluralCount: 3,
TemplateData: map[string]interface{}{
"Count": 3,
},
})
// Arabic "few" form: "3 عناصر"
msg = localizer.MustLocalize(&i18n.LocalizeConfig{
MessageID: "ItemCount",
PluralCount: 1,
TemplateData: map[string]interface{}{
"Count": 1,
},
})
// Arabic "one" form: "عنصر واحد"लोकेल की पहचान
वेब एप्लिकेशन में यूज़र की पसंदीदा भाषा कई स्रोतों से पहचानें: क्वेरी पैरामीटर, कुकीज़, Accept-Language हेडर या URL पाथ सेगमेंट। BCP 47 के अनुरूप भाषा चयन के लिए golang.org/x/text/language.Matcher का उपयोग करें।
// detectLocale resolves the user's preferred language.
// Priority: query param > cookie > Accept-Language header > default
func detectLocale(r *http.Request, matcher language.Matcher) string {
// 1. Explicit query parameter: ?lang=ja
if lang := r.URL.Query().Get("lang"); lang != "" {
tag, _, _ := matcher.Match(language.Make(lang))
return tag.String()
}
// 2. Cookie from previous selection
if cookie, err := r.Cookie("lang"); err == nil {
tag, _, _ := matcher.Match(language.Make(cookie.Value))
return tag.String()
}
// 3. Accept-Language header
accept := r.Header.Get("Accept-Language")
if accept != "" {
tags, _, _ := language.ParseAcceptLanguage(accept)
if len(tags) > 0 {
tag, _, _ := matcher.Match(tags...)
return tag.String()
}
}
return "en" // 4. Default
}
// Usage:
matcher := language.NewMatcher([]language.Tag{
language.English, language.Japanese,
language.German, language.Spanish,
})
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
locale := detectLocale(r, matcher)
localizer := i18n.NewLocalizer(bundle, locale)
// ... use localizer
})go-locale-chain से हर कुंजी का फ़ॉलबैक ठीक करें
go-i18n की एक ज्ञात सीमा है: किसी लोकेल का मिलान हो जाने के बाद (उसके कुछ अनुवाद लोड होने पर), अनुपलब्ध कुंजियाँ चेन के अगले लोकेल पर फ़ॉलबैक नहीं होतीं। आंशिक रूप से अनूदित pt-BR फ़ाइल वाले यूज़र को pt-PT या pt पर फ़ॉलबैक होने के बजाय खाली स्ट्रिंग मिलती हैं। go-locale-chain, 75 बिल्ट-इन लोकेल चेन में हर कुंजी के लिए फ़ॉलबैक समाधान देकर इसे ठीक करता है।
go get github.com/i18n-agent/go-locale-chainpackage main
import (
"encoding/json"
"fmt"
"github.com/nicksnyder/go-i18n/v2/i18n"
localechain "github.com/i18n-agent/go-locale-chain"
"golang.org/x/text/language"
)
func main() {
// 1. Configure fallback chains (call once at startup)
localechain.Configure()
// 2. Set up go-i18n bundle as usual
bundle := i18n.NewBundle(language.English)
bundle.RegisterUnmarshalFunc("json", json.Unmarshal)
bundle.MustLoadMessageFile("locales/en.json")
bundle.MustLoadMessageFile("locales/pt.json")
bundle.MustLoadMessageFile("locales/pt-PT.json")
bundle.MustLoadMessageFile("locales/pt-BR.json")
// 3. Resolve with per-key fallback
result, _ := localechain.ResolveWithLoader("pt-BR", func(locale string) (map[string]string, error) {
localizer := i18n.NewLocalizer(bundle, locale)
messages := make(map[string]string)
for _, id := range []string{"hello", "goodbye", "thanks"} {
msg, err := localizer.Localize(&i18n.LocalizeConfig{MessageID: id})
if err == nil {
messages[id] = msg
}
}
return messages, nil
})
fmt.Println(result["hello"]) // "Olá (BR)" — from pt-BR
fmt.Println(result["goodbye"]) // "Adeus (PT)" — fallback to pt-PT
fmt.Println(result["thanks"]) // "Obrigado" — fallback to pt
}// Standalone: zero external dependencies, works with any format
localechain.Configure()
result, _ := localechain.ResolveWithLoader("es-MX", func(locale string) (map[string]string, error) {
data, err := os.ReadFile(fmt.Sprintf("locales/%s.json", locale))
if err != nil {
return nil, err // Locale file doesn't exist — skip
}
var msgs map[string]string
json.Unmarshal(data, &msgs)
return msgs, nil
})
// es-MX -> es-419 -> es: each key resolved from most specific localeअनुवाद स्वचालित करें
i18n सेटअप पूरा होने के बाद AI का उपयोग करके अपनी लोकेल फ़ाइलों का अनुवाद करें। अपनी अंग्रेज़ी स्रोत फ़ाइल से सभी लक्षित भाषाओं के अनुवाद सीधे IDE या CI/CD पाइपलाइन में तैयार करें।
# In your IDE, ask your AI assistant:
> Translate locales/en.json to German, Japanese, and Spanish
✓ locales/de.json created (1.2s)
✓ locales/ja.json created (1.5s)
✓ locales/es.json created (1.1s)
# Or use the CLI in CI/CD:
npx i18n-agent translate locales/en.json --lang de,ja,esअनुवाद की गुणवत्ता स्वचालित करें
आम समस्याएँ
PluralCount और TemplateData का मेल न खाना
RegisterUnmarshalFunc अनुपलब्ध होना
हर कुंजी का फ़ॉलबैक काम नहीं करता
टेम्प्लेट सिंटैक्स: {'{.Var}'}, न कि {'{Var}'}
सुझाई गई फ़ाइल संरचना
my-go-app/
├── locales/
│ ├── en.json # Source language (English)
│ ├── de.json # German translations
│ ├── ja.json # Japanese translations
│ ├── es.json # Spanish translations
│ ├── pt.json # Portuguese (base)
│ ├── pt-PT.json # Portuguese (Portugal)
│ └── pt-BR.json # Portuguese (Brazil)
├── i18n/
│ ├── bundle.go # Bundle initialization
│ ├── detect.go # Locale detection logic
│ └── middleware.go # HTTP middleware for locale
├── main.go
├── go.mod
└── go.sumइनका भी अनुवाद करें:
i18n Agent अभी आज़माएँ
अपनी अनुवाद फ़ाइल यहाँ छोड़ें
JSON, YAML, PO, XML, CSV, Markdown, Properties
या ब्राउज़ करने के लिए क्लिक करें
लक्षित भाषाएँ
go-locale-chain के साथ लोकेल फ़ॉलबैक
जब pt-BR जैसे किसी क्षेत्रीय लोकेल में अनुवाद कुंजी अनुपलब्ध होती है, तो go-i18n पहले पैरेंट लोकेल pt की जाँच करने के बजाय सीधे डिफ़ॉल्ट भाषा पर चला जाता है।
go get github.com/i18n-agent/go-locale-chainimport localechain "github.com/i18n-agent/go-locale-chain"
chain := localechain.New(localechain.Config{
Fallbacks: map[string][]string{
"pt-BR": {"pt", "en"},
"zh-Hant-HK": {"zh-Hant", "zh", "en"},
},
})समर्थित फ़्रेमवर्क और 75 बिल्ट-इन चेन की पूरी सूची के लिए हमारी लोकेल फ़ॉलबैक गाइड देखें। Learn more →