处理多语言 Go Web 应用程序的标准/惯用方法是什么?
What is the standard/ idiomatic way to handle multilingual Go web apps?
我正在开发一个网站,该网站需要以用户选择的不同语言提供网页。例如如果用户选择西班牙语作为他的首选语言,服务器应该以西班牙语发送网页的文本元素。
在 Go 中执行此操作的标准方法是什么?我也很想知道你们用的是什么方法。
谢谢。
我总是使用地图并在其上定义一个函数,returns 给定键的文本:
type Texts map[string]string
func (t *Texts) Get(key string) string{
return (*t)[key]
}
var texts = map[string]Texts{
"de":Texts{
"title":"Deutscher Titel",
},
"en":Texts{
"title":"English title",
},
}
func executeTemplate(lang string){
tmpl, _ := template.New("example").Parse(`Title: {{.Texts.Get "title" }} `)
tmpl.Execute(os.Stdout,struct{
Texts Texts
}{
Texts: texts[lang],
})
}
如果用户的首选语言有可能不可用,您可以使用 Golang 的 text/language package 将请求的语言与支持的语言匹配。
这种类型的语言匹配是 non-trivial 问题 outlined in this excellent post in The Go Blog。
要使用语言包,请使用支持的语言片段创建一个匹配器:
var serverLangs = []language.Tag{
language.AmericanEnglish, // en-US fallback
language.German, // de
}
var matcher = language.NewMatcher(serverLangs)
然后匹配一种或多种首选语言。 (首选语言可能基于用户的 IP 地址或 Accept-Language
header。)
var userPrefs = []language.Tag{
language.Make("gsw"), // Swiss German
language.Make("fr"), // French
}
tag, index, confidence := matcher.Match(sortLanguageTags(&langs, DescendingQuality)...)
要检索该语言的相应文本,您可以使用 tag.String()
方法:
type Translation map[string]string
type Translations map[string]Translation
translations := Translations{
"knee": {
language.German.String(): "knie",
language.AmericanEnglish.String(): "knee",
},
}
fmt.Println(translations["knee"][tag.String()]) // prints "knie"
我正在开发一个网站,该网站需要以用户选择的不同语言提供网页。例如如果用户选择西班牙语作为他的首选语言,服务器应该以西班牙语发送网页的文本元素。
在 Go 中执行此操作的标准方法是什么?我也很想知道你们用的是什么方法。
谢谢。
我总是使用地图并在其上定义一个函数,returns 给定键的文本:
type Texts map[string]string
func (t *Texts) Get(key string) string{
return (*t)[key]
}
var texts = map[string]Texts{
"de":Texts{
"title":"Deutscher Titel",
},
"en":Texts{
"title":"English title",
},
}
func executeTemplate(lang string){
tmpl, _ := template.New("example").Parse(`Title: {{.Texts.Get "title" }} `)
tmpl.Execute(os.Stdout,struct{
Texts Texts
}{
Texts: texts[lang],
})
}
如果用户的首选语言有可能不可用,您可以使用 Golang 的 text/language package 将请求的语言与支持的语言匹配。
这种类型的语言匹配是 non-trivial 问题 outlined in this excellent post in The Go Blog。
要使用语言包,请使用支持的语言片段创建一个匹配器:
var serverLangs = []language.Tag{
language.AmericanEnglish, // en-US fallback
language.German, // de
}
var matcher = language.NewMatcher(serverLangs)
然后匹配一种或多种首选语言。 (首选语言可能基于用户的 IP 地址或 Accept-Language
header。)
var userPrefs = []language.Tag{
language.Make("gsw"), // Swiss German
language.Make("fr"), // French
}
tag, index, confidence := matcher.Match(sortLanguageTags(&langs, DescendingQuality)...)
要检索该语言的相应文本,您可以使用 tag.String()
方法:
type Translation map[string]string
type Translations map[string]Translation
translations := Translations{
"knee": {
language.German.String(): "knie",
language.AmericanEnglish.String(): "knee",
},
}
fmt.Println(translations["knee"][tag.String()]) // prints "knie"