2014-11-08 17:37:33 +00:00
|
|
|
package Tools
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net/http"
|
|
|
|
"sort"
|
|
|
|
"strconv"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
2015-06-17 15:44:52 +00:00
|
|
|
// Gets the language of a request for enable I18N.
|
2014-11-08 17:37:33 +00:00
|
|
|
func GetRequestLanguage(request *http.Request) (resultLangs Languages) {
|
2015-06-17 15:44:52 +00:00
|
|
|
|
|
|
|
// Read the goven data from the request:
|
2014-11-08 17:37:33 +00:00
|
|
|
languageCodeForm := request.FormValue(`lang`)
|
|
|
|
languageCodeHeader := request.Header.Get(`Accept-Language`)
|
|
|
|
|
2015-06-17 15:44:52 +00:00
|
|
|
// Is only one language available?
|
2014-11-08 17:37:33 +00:00
|
|
|
if languageCodeForm != `` && ((len(languageCodeForm) == 2) || (len(languageCodeForm) == 5 && strings.Contains(languageCodeForm, `-`))) {
|
2015-06-17 15:44:52 +00:00
|
|
|
|
|
|
|
// Case: Only one language available.
|
2014-11-08 17:37:33 +00:00
|
|
|
resultLangs = make(Languages, 1)
|
|
|
|
resultLangs[0].Factor = 1.0
|
|
|
|
resultLangs[0].Language = strings.ToLower(languageCodeForm)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2015-06-17 15:44:52 +00:00
|
|
|
// Case: The Accept-Language fild is empty.
|
2014-11-08 17:37:33 +00:00
|
|
|
if languageCodeHeader == `` {
|
2015-06-17 15:44:52 +00:00
|
|
|
// Use the default language:
|
2014-11-08 17:37:33 +00:00
|
|
|
resultLangs = make(Languages, 1)
|
|
|
|
resultLangs[0].Factor = 1.0
|
|
|
|
resultLangs[0].Language = defaultLanguage
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2015-06-17 15:44:52 +00:00
|
|
|
// Separate each language:
|
2014-11-08 17:37:33 +00:00
|
|
|
values := strings.Split(languageCodeHeader, `,`)
|
|
|
|
langs := make(Languages, len(values))
|
2015-06-17 15:44:52 +00:00
|
|
|
|
|
|
|
// Loop over all languages:
|
2014-11-08 17:37:33 +00:00
|
|
|
for n, langData := range values {
|
2015-06-17 15:44:52 +00:00
|
|
|
|
|
|
|
// Is the factor given?
|
2014-11-08 17:37:33 +00:00
|
|
|
if factorData := strings.Split(langData, `;q=`); len(factorData) == 2 {
|
2015-06-17 15:44:52 +00:00
|
|
|
|
|
|
|
// Try to parse the factor:
|
2014-11-08 17:37:33 +00:00
|
|
|
if factor, errFactor := strconv.ParseFloat(factorData[1], 32); errFactor != nil {
|
2015-06-17 15:44:52 +00:00
|
|
|
// Case: Parsing was not possible. Use 1 instead:
|
2014-11-08 17:37:33 +00:00
|
|
|
langs[n] = Language{}
|
|
|
|
langs[n].Language = strings.ToLower(strings.Trim(factorData[0], ` `))
|
|
|
|
langs[n].Factor = 1.0
|
|
|
|
} else {
|
2015-06-17 15:44:52 +00:00
|
|
|
// Case: Factor was parsed.
|
2014-11-08 17:37:33 +00:00
|
|
|
langs[n] = Language{}
|
|
|
|
langs[n].Language = strings.ToLower(strings.Trim(factorData[0], ` `))
|
|
|
|
langs[n].Factor = float32(factor)
|
|
|
|
}
|
|
|
|
} else {
|
2015-06-17 15:44:52 +00:00
|
|
|
// Case: No factor given. Use 1 instead.
|
2014-11-08 17:37:33 +00:00
|
|
|
langs[n] = Language{}
|
|
|
|
langs[n].Language = strings.ToLower(strings.Trim(langData, ` `))
|
|
|
|
langs[n].Factor = 1.0
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-06-17 15:44:52 +00:00
|
|
|
// Sort all languages by factor:
|
2014-11-08 17:37:33 +00:00
|
|
|
sort.Sort(langs)
|
|
|
|
resultLangs = langs
|
|
|
|
return
|
|
|
|
}
|