我在一个网站上工作,该网站需要提供用户选择的不同语言的网页。例如如果用户选择西班牙语作为首选语言,则服务器应使用西班牙语发送网页的文本元素。
在Go中执行此操作的标准方法是什么?我也很想知道你们正在使用什么方法。
谢谢。
答案 0 :(得分:4)
我总是使用地图并在其上定义一个函数,该函数返回给定键的文本:
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],
})
}
答案 1 :(得分:4)
如果用户的首选语言可能无法使用,则可以使用Golang的text/language package将请求的语言与支持的语言进行匹配。
像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
标头。)
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"