我正在实现基于Accept-Language标头的multilang Web服务.我使用下一个代码来解析标头并获取所请求的语言:
var matcher = language.NewMatcher([]language.Tag{
language.English,
language.Russian,
})
header:="ru, RUS, ru-RU, ru-ru"
tags, q, err := language.ParseAcceptLanguage(header)
for key, tag := range tags {
matched, _, c := matcher.Match(tag)
fmt.Printf("%s=>%f Matched as: %s (confidence: %s)\n", tag, q[key], matched, c)
}
我得到的结果是
ru=>1.000000 Matched as: ru (confidence: Exact)
ru=>1.000000 Matched as: ru (confidence: Exact)
ru-RU=>1.000000 Matched as: ru-u-rg-ruzzzz (confidence: Exact)
ru-RU=>1.000000 Matched as: ru-u-rg-ruzzzz (confidence: Exact)
为什么’ru-RU’匹配为奇怪的标签’ru-u-rg-ruzzzz’?我如何将’ru-Ru’与’ru’相匹配?
最佳答案 创建匹配器时,需要添加“ru-RU”.
var matcher = language.NewMatcher([]language.Tag{
language.English,
language.MustParse("ru-RU"),
language.Russian,
})
当你传入一个区域并且它不在你的匹配器中时,它默认为ZZ,你在语言包中找到了这个code.
} else if r := w.RegionID.String(); len(r) == 2 {
// TODO: also filter macro and deprecated.
tt, _ = tt.SetTypeForKey("rg", strings.ToLower(r)+"zzzz")
}
如果您只想获得语言,可以使用返回的匹配标记中的Base方法
matched, _, _ := matcher.Match(tag)
base, _ := matched.Base();
fmt.Println(base.String()) // will only print the language
使用base.String()将为您提供的所有语言标题打印ru.