i18n.go
func I18n(options ...Options) macaron.Handler {
	opt := prepareOptions(options)
	m := initLocales(opt)
	return func(ctx *macaron.Context) {
		isNeedRedir := false
		hasCookie := false

		// 1. Check URL arguments.
		lang := ctx.Query(opt.Parameter)

		// 2. Get language information from cookies.
		if len(lang) == 0 {
			lang = ctx.GetCookie("lang")
			hasCookie = true
		} else {
			isNeedRedir = true
		}

		// Check again in case someone modify by purpose.
		if !i18n.IsExist(lang) {
			lang = ""
			isNeedRedir = false
			hasCookie = false
		}

		// 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(ctx.Req.Header.Get("Accept-Language"))
			tag, _, _ := m.Match(tags...)
			lang = tag.String()
			isNeedRedir = false
		}

		curLang := LangType{
			Lang: lang,
		}

		// Save language information in cookies.
		if !hasCookie {
			ctx.SetCookie("lang", curLang.Lang, 1<<31-1, "/"+strings.TrimPrefix(opt.SubURL, "/"), opt.CookieDomain)
		}

		restLangs := make([]LangType, 0, i18n.Count()-1)
		langs := i18n.ListLangs()
		names := i18n.ListLangDescs()
		for i, v := range langs {
			if lang != v {
				restLangs = append(restLangs, LangType{v, names[i]})
			} else {
				curLang.Name = names[i]
			}
		}

		// Set language properties.
		locale := Locale{i18n.Locale{lang}}
		ctx.Map(locale)
		ctx.Locale = locale
		ctx.Data[opt.TmplName] = locale
		ctx.Data["Tr"] = i18n.Tr
		ctx.Data["Lang"] = locale.Lang
		ctx.Data["LangName"] = curLang.Name
		ctx.Data["AllLangs"] = append([]LangType{curLang}, restLangs...)
		ctx.Data["RestLangs"] = restLangs

		if opt.Redirect && isNeedRedir {
			ctx.Redirect(opt.SubURL + ctx.Req.RequestURI[:strings.Index(ctx.Req.RequestURI, "?")])
		}
	}
}
func I18n(options ...Options) macaron.Handler {
	opt := prepareOptions(options)
	m := initLocales(opt)
	return func(ctx *macaron.Context) {
		isNeedRedir := false
		hasCookie := false

		// 1. Check URL arguments.
		lang := ctx.Query(opt.Parameter)

		// 2. Get language information from cookies.
		if len(lang) == 0 {
			lang = ctx.GetCookie("lang")
			hasCookie = true
		} else {
			isNeedRedir = true
		}

		// Check again in case someone modify by purpose.
		if !i18n.IsExist(lang) {
			lang = ""
			isNeedRedir = false
			hasCookie = false
		}

		// 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(ctx.Req.Header.Get("Accept-Language"))
			tag, _, _ := m.Match(tags...)
			lang = tag.String()
			isNeedRedir = false
		}

		curLang := LangType{
			Lang: lang,
		}

		// Save language information in cookies.
		if !hasCookie {
			ctx.SetCookie("lang", curLang.Lang, 1<<31-1, "/"+strings.TrimPrefix(opt.SubURL, "/"), opt.CookieDomain)
		}

		restLangs := make([]LangType, 0, i18n.Count()-1)
		langs := i18n.ListLangs()
		names := i18n.ListLangDescs()
		for i, v := range langs {
			if lang != v {
				restLangs = append(restLangs, LangType{v, names[i]})
			} else {
				curLang.Name = names[i]
			}
		}

		// Set language properties.
		locale := Locale{i18n.Locale{lang}}
		ctx.Map(locale)
		ctx.Locale = locale
		ctx.Data[opt.TmplName] = locale
		ctx.Data["Tr"] = i18n.Tr
		ctx.Data["Lang"] = locale.Lang
		ctx.Data["LangName"] = curLang.Name
		ctx.Data["AllLangs"] = append([]LangType{curLang}, restLangs...)
		ctx.Data["RestLangs"] = restLangs

		if opt.Redirect && isNeedRedir {
			ctx.Redirect(opt.SubURL + ctx.Req.RequestURI[:strings.Index(ctx.Req.RequestURI, "?")])
		}
	}
}
func I18n ( options ... Options ) macaron . Handler { opt := prepareOptions ( options ) m := initLocales ( opt ) return func ( ctx * macaron . Context ) { isNeedRedir := false hasCookie := false // 1. Check URL arguments. lang := ctx . Query ( opt . Parameter ) // 2. Get language information from cookies. if len ( lang ) == 0 { lang = ctx . GetCookie ( " " ) hasCookie = true } else { isNeedRedir = true } // Check again in case someone modify by purpose. if ! i18n . IsExist ( lang ) { lang = " " isNeedRedir = false hasCookie = false } // 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 ( ctx . Req . Header . Get ( " " ) ) tag , _ , _ := m . Match ( tags ... ) lang = tag . String ( ) isNeedRedir = false } curLang := LangType { Lang : lang , } // Save language information in cookies. if ! hasCookie { ctx . SetCookie ( " " , curLang . Lang , 1 << 31 - 1 , " " + strings . TrimPrefix ( opt . SubURL , " " ) , opt . CookieDomain ) } restLangs := make ( [ ] LangType , 0 , i18n . Count ( ) - 1 ) langs := i18n . ListLangs ( ) names := i18n . ListLangDescs ( ) for i , v := range langs { if lang != v { restLangs = append ( restLangs , LangType { v , names [ i ] } ) } else { curLang . Name = names [ i ] } } // Set language properties. locale := Locale { i18n . Locale { lang } } ctx . Map ( locale ) ctx . Locale = locale ctx . Data [ opt . TmplName ] = locale ctx . Data [ " " ] = i18n . Tr ctx . Data [ " " ] = locale . Lang ctx . Data [ " " ] = curLang . Name ctx . Data [ " " ] = append ( [ ] LangType { curLang } , restLangs ... ) ctx . Data [ " " ] = restLangs if opt . Redirect && isNeedRedir { ctx . Redirect ( opt . SubURL + ctx . Req . RequestURI [ : strings . Index ( ctx . Req . RequestURI , " " ) ] ) } } }
// I18n is a middleware provides localization layer for your application.
// Paramenter langs must be in the form of "en-US", "zh-CN", etc.
// Otherwise it may not recognize browser input.
I18n is a middleware provides localization layer for your application . Paramenter langs must be in the form of en - US zh - CN etc . Otherwise it may not recognize browser input .