2021-01-05 16:05:40 +03:00
// Copyright 2020 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
2021-01-30 11:55:53 +03:00
package middleware
2021-01-05 16:05:40 +03:00
import (
"net/http"
2021-03-07 11:12:43 +03:00
"code.gitea.io/gitea/modules/setting"
2021-01-05 16:05:40 +03:00
"code.gitea.io/gitea/modules/translation"
"github.com/unknwon/i18n"
"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" )
2021-01-27 17:20:42 +03:00
var 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
}
// Check again in case someone modify by purpose.
2021-01-26 18:36:53 +03:00
if lang != "" && ! i18n . IsExist ( lang ) {
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
func SetLocaleCookie ( resp http . ResponseWriter , lang string , expiry int ) {
SetCookie ( resp , "lang" , lang , expiry ,
setting . AppSubURL ,
setting . SessionConfig . Domain ,
setting . SessionConfig . Secure ,
true ,
SameSite ( setting . SessionConfig . SameSite ) )
}
// DeleteLocaleCookie convenience function to delete the locale cookie consistently
// Setting the lang cookie will trigger the middleware to reset the language ot previous state.
func DeleteLocaleCookie ( resp http . ResponseWriter ) {
SetCookie ( resp , "lang" , "" ,
- 1 ,
setting . AppSubURL ,
setting . SessionConfig . Domain ,
setting . SessionConfig . Secure ,
true ,
SameSite ( setting . SessionConfig . SameSite ) )
}