// setLangVer sets site language version. func setLangVer(ctx *beego.Context, input url.Values, data map[interface{}]interface{}) langType { // 1. Check URL arguments. lang := input.Get("lang") // 2. Get language information from cookies. if len(lang) == 0 { ck, err := ctx.Request.Cookie("lang") if err == nil { lang = ck.Value } } // 3. Get language information from 'Accept-Language'. if len(lang) == 0 { al := ctx.Request.Header.Get("Accept-Language") if len(al) > 2 { al = al[:2] // Only compare first two letters. for _, v := range langTypes { if al == v.Lang { lang = al break } } } } // 4. Default language is English. if len(lang) == 0 { lang = "en" } curLang := langType{ Lang: lang, } // Save language information in cookies. ctx.SetCookie("lang", curLang.Lang+";path=/", 0) restLangs := make([]*langType, 0, len(langTypes)-1) for _, v := range langTypes { if lang != v.Lang { restLangs = append(restLangs, v) } else { curLang.Name = v.Name } } // Set language properties. data["Lang"] = curLang.Lang data["CurLang"] = curLang.Name data["RestLangs"] = restLangs return curLang }
// setLangVer sets site language version. func setLangVer(ctx *beego.Context, input url.Values, data map[interface{}]interface{}) (bool, langType) { isNeedRedir := false // 1. Check URL arguments. lang := input.Get("lang") // 2. Get language information from cookies. if len(lang) == 0 { ck, err := ctx.Request.Cookie("lang") if err == nil { lang = ck.Value } } else { isNeedRedir = true } // Check again in case someone modify by purpose. isValid := false for _, v := range langTypes { if lang == v.Lang { isValid = true break } } if !isValid { lang = "" isNeedRedir = false } // 3. Get language information from 'Accept-Language'. if len(lang) == 0 { al := ctx.Request.Header.Get("Accept-Language") if len(al) > 2 { al = al[:2] // Only compare first two letters. for _, v := range langTypes { if al == v.Lang { lang = al break } } } } // 4. DefaucurLang language is English. if len(lang) == 0 { lang = "en" isNeedRedir = false } curLang := langType{ Lang: lang, } // Save language information in cookies. ctx.SetCookie("lang", curLang.Lang, 1<<31-1, "/") restLangs := make([]*langType, 0, len(langTypes)-1) for _, v := range langTypes { if lang != v.Lang { restLangs = append(restLangs, v) } else { curLang.Name = v.Name } } // Set language properties. data["Lang"] = curLang.Lang data["CurLang"] = curLang.Name data["RestLangs"] = restLangs return isNeedRedir, curLang }