4

我正在实现基于Accept-Language标头的多语言 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”?

4

1 回答 1

1

创建匹配器时需要添加“ru-RU”。

var matcher = language.NewMatcher([]language.Tag{
    language.English,
    language.MustParse("ru-RU"),
    language.Russian,
})

当您传入一个区域并且它不在您的匹配器中时,它默认为ZZ并且您在语言包中点击此代码。

    } 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

usingbase.String()将为您提供的所有语言标题打印ru

于 2018-09-10T16:34:07.347 回答