Skip to content

Commit

Permalink
Use index of the supported tags to choose user lang (#15452) (#15488)
Browse files Browse the repository at this point in the history
Backport #15452

Fix #14793.

The previous implementation used the first return value of matcher.Match, which is the chosen language tag but may contain extensions such as de-DE-u-rg-chzzzz.

As mentioned in the documentation of language package, matcher.Match also returns the index of the supported tags, so I think it is better to use it rather than manipulate the returned language tag.

Co-authored-by: Naohisa Murakami <[email protected]>
  • Loading branch information
zeripath and tiqwab authored Apr 15, 2021
1 parent 9e7e112 commit b228a0a
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 8 deletions.
16 changes: 9 additions & 7 deletions modules/translation/translation.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,9 @@ type LangType struct {
}

var (
matcher language.Matcher
allLangs []LangType
matcher language.Matcher
allLangs []LangType
supportedTags []language.Tag
)

// AllLangs returns all supported langauages
Expand All @@ -51,12 +52,12 @@ func InitLocales() {
}
}

tags := make([]language.Tag, len(setting.Langs))
supportedTags = make([]language.Tag, len(setting.Langs))
for i, lang := range setting.Langs {
tags[i] = language.Raw.Make(lang)
supportedTags[i] = language.Raw.Make(lang)
}

matcher = language.NewMatcher(tags)
matcher = language.NewMatcher(supportedTags)
for i := range setting.Names {
key := "locale_" + setting.Langs[i] + ".ini"
if err = i18n.SetMessageWithDesc(setting.Langs[i], setting.Names[i], localFiles[key]); err != nil {
Expand All @@ -79,8 +80,9 @@ func InitLocales() {
}

// Match matches accept languages
func Match(tags ...language.Tag) (tag language.Tag, index int, c language.Confidence) {
return matcher.Match(tags...)
func Match(tags ...language.Tag) language.Tag {
_, i, _ := matcher.Match(tags...)
return supportedTags[i]
}

// locale represents the information of localization.
Expand Down
2 changes: 1 addition & 1 deletion modules/web/middleware/locale.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ func Locale(resp http.ResponseWriter, req *http.Request) translation.Locale {
// The first element in the list is chosen to be the default language automatically.
if len(lang) == 0 {
tags, _, _ := language.ParseAcceptLanguage(req.Header.Get("Accept-Language"))
tag, _, _ := translation.Match(tags...)
tag := translation.Match(tags...)
lang = tag.String()
}

Expand Down

0 comments on commit b228a0a

Please sign in to comment.