From 1f82828c82062019a7b22bf020827f6550617401 Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Sat, 8 Nov 2014 18:37:33 +0100 Subject: [PATCH] I18N + Added language detection and default language --- ConfigurationDB/CheckConfiguration.go | 1 + Tools/Init.go | 3 ++ Tools/RequestLanguage.go | 51 +++++++++++++++++++++++++++ Tools/ResponseLanguage.go | 9 +++++ Tools/SchemeLanguage.go | 20 +++++++++++ Tools/Variables.go | 1 + 6 files changed, 85 insertions(+) create mode 100644 Tools/RequestLanguage.go create mode 100644 Tools/ResponseLanguage.go create mode 100644 Tools/SchemeLanguage.go diff --git a/ConfigurationDB/CheckConfiguration.go b/ConfigurationDB/CheckConfiguration.go index a2e4bc1..9fd36c7 100644 --- a/ConfigurationDB/CheckConfiguration.go +++ b/ConfigurationDB/CheckConfiguration.go @@ -10,6 +10,7 @@ func checkConfiguration() { Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameDATABASE, `Check now the configuration database.`) defer Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameDATABASE, `Done checking the configuration database.`) + CheckSingleConfigurationPresentsAndAddIfMissing(`DefaultLanguageCode`, `en-GB`) CheckSingleConfigurationPresentsAndAddIfMissing(`AdminWebServerBinding`, `127.0.0.1:60000`) CheckSingleConfigurationPresentsAndAddIfMissing(`AdminWebServerEnabled`, `True`) CheckSingleConfigurationPresentsAndAddIfMissing(`AdminWebServerReadTimeoutSeconds`, `10`) diff --git a/Tools/Init.go b/Tools/Init.go index 40cde30..482b0a3 100644 --- a/Tools/Init.go +++ b/Tools/Init.go @@ -31,4 +31,7 @@ func init() { allHostsIPAddresses := ReadAllIPAddresses4ThisHost() port := ConfigurationDB.Read(`PublicWebServerPort`) localIPAddressAndPort = allHostsIPAddresses[0] + `:` + port + + // Read the default language: + defaultLanguage = ConfigurationDB.Read(`DefaultLanguageCode`) } diff --git a/Tools/RequestLanguage.go b/Tools/RequestLanguage.go new file mode 100644 index 0000000..396621e --- /dev/null +++ b/Tools/RequestLanguage.go @@ -0,0 +1,51 @@ +package Tools + +import ( + "net/http" + "sort" + "strconv" + "strings" +) + +func GetRequestLanguage(request *http.Request) (resultLangs Languages) { + languageCodeForm := request.FormValue(`lang`) + languageCodeHeader := request.Header.Get(`Accept-Language`) + + if languageCodeForm != `` && ((len(languageCodeForm) == 2) || (len(languageCodeForm) == 5 && strings.Contains(languageCodeForm, `-`))) { + resultLangs = make(Languages, 1) + resultLangs[0].Factor = 1.0 + resultLangs[0].Language = strings.ToLower(languageCodeForm) + return + } + + if languageCodeHeader == `` { + resultLangs = make(Languages, 1) + resultLangs[0].Factor = 1.0 + resultLangs[0].Language = defaultLanguage + return + } + + values := strings.Split(languageCodeHeader, `,`) + langs := make(Languages, len(values)) + for n, langData := range values { + if factorData := strings.Split(langData, `;q=`); len(factorData) == 2 { + if factor, errFactor := strconv.ParseFloat(factorData[1], 32); errFactor != nil { + langs[n] = Language{} + langs[n].Language = strings.ToLower(strings.Trim(factorData[0], ` `)) + langs[n].Factor = 1.0 + } else { + langs[n] = Language{} + langs[n].Language = strings.ToLower(strings.Trim(factorData[0], ` `)) + langs[n].Factor = float32(factor) + } + } else { + langs[n] = Language{} + langs[n].Language = strings.ToLower(strings.Trim(langData, ` `)) + langs[n].Factor = 1.0 + } + } + + sort.Sort(langs) + resultLangs = langs + return +} diff --git a/Tools/ResponseLanguage.go b/Tools/ResponseLanguage.go new file mode 100644 index 0000000..efadfe0 --- /dev/null +++ b/Tools/ResponseLanguage.go @@ -0,0 +1,9 @@ +package Tools + +import ( + "net/http" +) + +func SendChosenLanguage(response http.ResponseWriter, lang Language) { + response.Header().Add(`Content-Language`, lang.Language) +} diff --git a/Tools/SchemeLanguage.go b/Tools/SchemeLanguage.go new file mode 100644 index 0000000..3e247c2 --- /dev/null +++ b/Tools/SchemeLanguage.go @@ -0,0 +1,20 @@ +package Tools + +type Language struct { + Language string + Factor float32 +} + +type Languages []Language + +func (lang Languages) Len() int { + return len(lang) +} + +func (lang Languages) Less(i, j int) bool { + return lang[i].Factor > lang[j].Factor +} + +func (lang Languages) Swap(i, j int) { + lang[i], lang[j] = lang[j], lang[i] +} diff --git a/Tools/Variables.go b/Tools/Variables.go index c0c7c38..a5a411b 100644 --- a/Tools/Variables.go +++ b/Tools/Variables.go @@ -10,4 +10,5 @@ var ( localIPAddressAndPort string = `127.0.0.1:60000` ipAddresses []string = nil internalCommPassword string = `` + defaultLanguage string = `en` )