]> source.dussan.org Git - gitea.git/commitdiff
Use index of the supported tags to choose user lang (#15452)
authorNaohisa Murakami <tiqwab.ch90@gmail.com>
Wed, 14 Apr 2021 18:52:01 +0000 (03:52 +0900)
committerGitHub <noreply@github.com>
Wed, 14 Apr 2021 18:52:01 +0000 (19:52 +0100)
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.

modules/translation/translation.go
modules/web/middleware/locale.go

index dec48c7a657b27ee4b13676fa789e17f62febaef..77cc9ac7f584735d016535c06b386053b29c4ed0 100644 (file)
@@ -25,8 +25,9 @@ type LangType struct {
 }
 
 var (
-       matcher  language.Matcher
-       allLangs []LangType
+       matcher       language.Matcher
+       allLangs      []LangType
+       supportedTags []language.Tag
 )
 
 // AllLangs returns all supported langauages
@@ -50,12 +51,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 {
@@ -73,8 +74,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.
index a08e5aaeec7a15ef630c7d95a2f3be4c79554fa3..ede38ef933c030c700db52c78a006caae3e93146 100644 (file)
@@ -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()
        }