Почему language.Matcher возвращает такой странный результат? - PullRequest
0 голосов
/ 10 сентября 2018

Я реализую многоязычный веб-сервис на основе заголовка Accept-Language. Я использую следующий код для разбора заголовка и получения запрошенного языка:

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»?

1 Ответ

0 голосов
/ 10 сентября 2018

Вам нужно будет добавить «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

при использовании base.String() будет напечатано ru для всех предоставленных вами языковых заголовков.

...