Browse Source

Store language in session to show the login page translated

Frédéric Guillot 8 years ago
parent
commit
bdcc4134fa

+ 6 - 3
http/handler/context.go

@@ -80,8 +80,12 @@ func (c *Context) LoggedUser() *model.User {
 
 // UserLanguage get the locale used by the current logged user.
 func (c *Context) UserLanguage() string {
-	user := c.LoggedUser()
-	return user.Language
+	if c.IsAuthenticated() {
+		user := c.LoggedUser()
+		return user.Language
+	}
+
+	return c.getContextStringValue(middleware.UserLanguageContextKey)
 }
 
 // Translate translates a message in the current language.
@@ -145,7 +149,6 @@ func (c *Context) getContextStringValue(key *middleware.ContextKey) string {
 		return v.(string)
 	}
 
-	logger.Error("[Core:Context] Missing key: %s", key)
 	return ""
 }
 

+ 3 - 2
http/handler/handler.go

@@ -46,9 +46,10 @@ func (h *Handler) Use(f ControllerFunc) http.Handler {
 		ctx := NewContext(r, h.store, h.router, h.translator)
 		request := NewRequest(r)
 		response := NewResponse(w, r, h.template)
+		language := ctx.UserLanguage()
 
-		if ctx.IsAuthenticated() {
-			h.template.SetLanguage(ctx.UserLanguage())
+		if language != "" {
+			h.template.SetLanguage(language)
 		} else {
 			h.template.SetLanguage("en_US")
 		}

+ 3 - 0
http/middleware/context_keys.go

@@ -29,6 +29,9 @@ var (
 	// UserSessionTokenContextKey is the context key used to store the user session ID.
 	UserSessionTokenContextKey = &ContextKey{"UserSessionToken"}
 
+	// UserLanguageContextKey is the context key to store user language.
+	UserLanguageContextKey = &ContextKey{"UserLanguageContextKey"}
+
 	// SessionIDContextKey is the context key used to store the session ID.
 	SessionIDContextKey = &ContextKey{"SessionID"}
 

+ 1 - 0
http/middleware/session.go

@@ -59,6 +59,7 @@ func (s *SessionMiddleware) Handler(next http.Handler) http.Handler {
 		ctx = context.WithValue(ctx, OAuth2StateContextKey, session.Data.OAuth2State)
 		ctx = context.WithValue(ctx, FlashMessageContextKey, session.Data.FlashMessage)
 		ctx = context.WithValue(ctx, FlashErrorMessageContextKey, session.Data.FlashErrorMessage)
+		ctx = context.WithValue(ctx, UserLanguageContextKey, session.Data.Language)
 		next.ServeHTTP(w, r.WithContext(ctx))
 	})
 }

+ 9 - 1
http/middleware/user_session.go

@@ -50,7 +50,15 @@ func (s *UserSessionMiddleware) Handler(next http.Handler) http.Handler {
 func (s *UserSessionMiddleware) isPublicRoute(r *http.Request) bool {
 	route := mux.CurrentRoute(r)
 	switch route.GetName() {
-	case "login", "checkLogin", "stylesheet", "javascript", "oauth2Redirect", "oauth2Callback", "appIcon", "favicon", "webManifest":
+	case "login",
+		"checkLogin",
+		"stylesheet",
+		"javascript",
+		"oauth2Redirect",
+		"oauth2Callback",
+		"appIcon",
+		"favicon",
+		"webManifest":
 		return true
 	default:
 		return false

+ 4 - 3
model/session.go

@@ -17,11 +17,12 @@ type SessionData struct {
 	OAuth2State       string `json:"oauth2_state"`
 	FlashMessage      string `json:"flash_message"`
 	FlashErrorMessage string `json:"flash_error_message"`
+	Language          string `json:"language"`
 }
 
 func (s SessionData) String() string {
-	return fmt.Sprintf(`CSRF="%s", "OAuth2State="%s", FlashMessage="%s", "FlashErrorMessage="%s"`,
-		s.CSRF, s.OAuth2State, s.FlashMessage, s.FlashErrorMessage)
+	return fmt.Sprintf(`CSRF="%s", "OAuth2State="%s", FlashMessage="%s", FlashErrorMessage="%s", Lang="%s"`,
+		s.CSRF, s.OAuth2State, s.FlashMessage, s.FlashErrorMessage, s.Language)
 }
 
 // Value converts the session data to JSON.
@@ -52,5 +53,5 @@ type Session struct {
 }
 
 func (s *Session) String() string {
-	return fmt.Sprintf(`ID="%s", Data="%v"`, s.ID, s.Data)
+	return fmt.Sprintf(`ID="%s", Data={%v}`, s.ID, s.Data)
 }

+ 4 - 0
ui/login.go

@@ -67,6 +67,10 @@ func (c *Controller) CheckLogin(ctx *handler.Context, request *handler.Request,
 func (c *Controller) Logout(ctx *handler.Context, request *handler.Request, response *handler.Response) {
 	user := ctx.LoggedUser()
 
+	if err := c.store.UpdateSessionField(ctx.SessionID(), "language", user.Language); err != nil {
+		logger.Error("[Controller:Logout] %v", err)
+	}
+
 	if err := c.store.RemoveUserSessionByToken(user.ID, ctx.UserSessionToken()); err != nil {
 		logger.Error("[Controller:Logout] %v", err)
 	}