Use index of the supported tags to choose user lang (#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.
This commit is contained in:
		
							parent
							
								
									078df7a392
								
							
						
					
					
						commit
						1426601cf7
					
				
					 2 changed files with 10 additions and 8 deletions
				
			
		|  | @ -25,8 +25,9 @@ type LangType struct { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| 	matcher  language.Matcher | 	matcher       language.Matcher | ||||||
| 	allLangs []LangType | 	allLangs      []LangType | ||||||
|  | 	supportedTags []language.Tag | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // AllLangs returns all supported langauages
 | // 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 { | 	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 { | 	for i := range setting.Names { | ||||||
| 		key := "locale_" + setting.Langs[i] + ".ini" | 		key := "locale_" + setting.Langs[i] + ".ini" | ||||||
| 		if err = i18n.SetMessageWithDesc(setting.Langs[i], setting.Names[i], localFiles[key]); err != nil { | 		if err = i18n.SetMessageWithDesc(setting.Langs[i], setting.Names[i], localFiles[key]); err != nil { | ||||||
|  | @ -73,8 +74,9 @@ func InitLocales() { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Match matches accept languages
 | // Match matches accept languages
 | ||||||
| func Match(tags ...language.Tag) (tag language.Tag, index int, c language.Confidence) { | func Match(tags ...language.Tag) language.Tag { | ||||||
| 	return matcher.Match(tags...) | 	_, i, _ := matcher.Match(tags...) | ||||||
|  | 	return supportedTags[i] | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // locale represents the information of localization.
 | // locale represents the information of localization.
 | ||||||
|  |  | ||||||
|  | @ -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.
 | 	// The first element in the list is chosen to be the default language automatically.
 | ||||||
| 	if len(lang) == 0 { | 	if len(lang) == 0 { | ||||||
| 		tags, _, _ := language.ParseAcceptLanguage(req.Header.Get("Accept-Language")) | 		tags, _, _ := language.ParseAcceptLanguage(req.Header.Get("Accept-Language")) | ||||||
| 		tag, _, _ := translation.Match(tags...) | 		tag := translation.Match(tags...) | ||||||
| 		lang = tag.String() | 		lang = tag.String() | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue