Ksh*_*mar 4 multilingual go web
我正在一个网站上工作,该网站需要提供用户选择的不同语言的网页。例如,如果用户选择西班牙语作为他的首选语言,则服务器应以西班牙语发送网页的文本元素。
Go的标准做法是什么?我也很想知道你们正在使用什么方法。
谢谢。
小智 5
我总是使用地图并在其上定义一个函数,该函数返回给定键的文本:
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],
})
}
Run Code Online (Sandbox Code Playgroud)
如果用户的首选语言有可能不可用,您可以使用 Golang 的text/language 包将请求的语言与支持的语言进行匹配。
这种类型的语言匹配是一个非常重要的问题,如 The Go 博客中这篇优秀文章所述。
要使用语言包,请使用支持的语言片段创建匹配器:
var serverLangs = []language.Tag{
language.AmericanEnglish, // en-US fallback
language.German, // de
}
var matcher = language.NewMatcher(serverLangs)
Run Code Online (Sandbox Code Playgroud)
然后匹配一种或多种首选语言。(首选语言可能基于用户的 IP 地址或Accept-Language标题。)
var userPrefs = []language.Tag{
language.Make("gsw"), // Swiss German
language.Make("fr"), // French
}
tag, index, confidence := matcher.Match(sortLanguageTags(&langs, DescendingQuality)...)
Run Code Online (Sandbox Code Playgroud)
要检索该语言的相应文本,您可以使用以下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"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
460 次 |
| 最近记录: |