2021-01-05 16:05:40 +03:00
// Copyright 2020 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2021-01-05 16:05:40 +03:00
2021-01-30 11:55:53 +03:00
package middleware
2021-01-05 16:05:40 +03:00
import (
"net/http"
"code.gitea.io/gitea/modules/translation"
2022-04-03 12:46:48 +03:00
"code.gitea.io/gitea/modules/translation/i18n"
2021-01-05 16:05:40 +03:00
"golang.org/x/text/language"
)
// Locale handle locale
func Locale ( resp http . ResponseWriter , req * http . Request ) translation . Locale {
// 1. Check URL arguments.
lang := req . URL . Query ( ) . Get ( "lang" )
2022-01-20 20:46:10 +03:00
changeLang := lang != ""
2021-01-05 16:05:40 +03:00
// 2. Get language information from cookies.
if len ( lang ) == 0 {
ck , _ := req . Cookie ( "lang" )
2021-01-26 18:36:53 +03:00
if ck != nil {
lang = ck . Value
}
2021-01-05 16:05:40 +03:00
}
2024-11-03 04:36:09 +03:00
if lang == "dummy" {
changeLang = false
} else if lang != "" && ! i18n . DefaultLocales . HasLang ( lang ) {
// Check again in case someone changes the supported language list.
2021-01-05 16:05:40 +03:00
lang = ""
2021-01-27 17:20:42 +03:00
changeLang = false
2021-01-05 16:05:40 +03:00
}
// 3. Get language information from 'Accept-Language'.
// 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" ) )
2021-04-14 21:52:01 +03:00
tag := translation . Match ( tags ... )
2021-01-05 16:05:40 +03:00
lang = tag . String ( )
}
2021-01-27 17:20:42 +03:00
if changeLang {
2021-03-07 11:12:43 +03:00
SetLocaleCookie ( resp , lang , 1 << 31 - 1 )
2021-01-05 16:05:40 +03:00
}
return translation . NewLocale ( lang )
}
2021-03-07 11:12:43 +03:00
// SetLocaleCookie convenience function to set the locale cookie consistently
2023-04-13 22:45:33 +03:00
func SetLocaleCookie ( resp http . ResponseWriter , lang string , maxAge int ) {
SetSiteCookie ( resp , "lang" , lang , maxAge )
2021-03-07 11:12:43 +03:00
}
// DeleteLocaleCookie convenience function to delete the locale cookie consistently
Fix various typos (#20338)
* Fix various typos
Found via `codespell -q 3 -S ./options/locale,./options/license,./public/vendor -L actived,allways,attachements,ba,befores,commiter,pullrequest,pullrequests,readby,splitted,te,unknwon`
Co-authored-by: zeripath <art27@cantab.net>
2022-07-13 00:32:37 +03:00
// Setting the lang cookie will trigger the middleware to reset the language to previous state.
2021-03-07 11:12:43 +03:00
func DeleteLocaleCookie ( resp http . ResponseWriter ) {
2023-04-13 22:45:33 +03:00
SetSiteCookie ( resp , "lang" , "" , - 1 )
2021-03-07 11:12:43 +03:00
}