From 6bd5c33a897654b6ff3364b5be3803e43117224f Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 1 May 2018 12:54:28 +0200 Subject: [PATCH 01/16] Added user language setting --- models/migrations/migrations.go | 2 ++ models/migrations/v62.go | 22 ++++++++++++++++++++++ models/user.go | 2 ++ modules/auth/user_form.go | 1 + public/swagger.v1.json | 5 +++++ routers/user/auth.go | 6 ++++++ routers/user/setting.go | 7 ++++++- templates/user/settings/profile.tmpl | 14 ++++++++++++++ vendor/code.gitea.io/sdk/gitea/user.go | 2 ++ 9 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 models/migrations/v62.go diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index 16037e1472ee8..b53249460f248 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -176,6 +176,8 @@ var migrations = []Migration{ NewMigration("add is_fsck_enabled column for repos", addFsckEnabledToRepo), // v61 -> v62 NewMigration("add size column for attachments", addSizeToAttachment), + // v62 -> v63 + NewMigration("add language comumn for user setting", addLanguageSetting), } // Migrate database to current version diff --git a/models/migrations/v62.go b/models/migrations/v62.go new file mode 100644 index 0000000000000..3008c01d98a1f --- /dev/null +++ b/models/migrations/v62.go @@ -0,0 +1,22 @@ +// Copyright 2018 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "fmt" + "github.com/go-xorm/xorm" +) + +func addLanguageSetting(x *xorm.Engine) error { + type User struct { + Language string `xorm:"VARCHAR(5)"` + } + + if err := x.Sync2(new(User)); err != nil { + return fmt.Errorf("Sync2: %v", err) + } + + return nil +} diff --git a/models/user.go b/models/user.go index aab1e99f0e1e7..b3378ac2de345 100644 --- a/models/user.go +++ b/models/user.go @@ -94,6 +94,7 @@ type User struct { Website string Rands string `xorm:"VARCHAR(10)"` Salt string `xorm:"VARCHAR(10)"` + Language string `xorm:"VARCHAR(5)"` CreatedUnix util.TimeStamp `xorm:"INDEX created"` UpdatedUnix util.TimeStamp `xorm:"INDEX updated"` @@ -185,6 +186,7 @@ func (u *User) APIFormat() *api.User { FullName: u.FullName, Email: u.getEmail(), AvatarURL: u.AvatarLink(), + Language: u.Language, } } diff --git a/modules/auth/user_form.go b/modules/auth/user_form.go index d913822a8d108..956ebd944be4b 100644 --- a/modules/auth/user_form.go +++ b/modules/auth/user_form.go @@ -109,6 +109,7 @@ type UpdateProfileForm struct { KeepEmailPrivate bool Website string `binding:"ValidUrl;MaxSize(255)"` Location string `binding:"MaxSize(50)"` + Language string `binding:"Size(5)"` } // Validate validates the fields diff --git a/public/swagger.v1.json b/public/swagger.v1.json index 86bf20a9a8808..3781bc378da48 100644 --- a/public/swagger.v1.json +++ b/public/swagger.v1.json @@ -7236,6 +7236,11 @@ "format": "int64", "x-go-name": "ID" }, + "language": { + "description": "User locale", + "type": "string", + "x-go-name": "Language" + }, "login": { "description": "the user's username", "type": "string", diff --git a/routers/user/auth.go b/routers/user/auth.go index d44939f50db57..d101273c556a6 100644 --- a/routers/user/auth.go +++ b/routers/user/auth.go @@ -333,6 +333,11 @@ func handleSignInFull(ctx *context.Context, u *models.User, remember bool, obeyR ctx.Session.Set("uid", u.ID) ctx.Session.Set("uname", u.Name) + // Language setting of the user overwrites the one previously set + if u.Language != "" { + ctx.SetCookie("lang", u.Language, nil, setting.AppSubURL) + } + // Clear whatever CSRF has right now, force to generate a new one ctx.SetCookie(setting.CSRFCookieName, "", -1, setting.AppSubURL) @@ -698,6 +703,7 @@ func SignOut(ctx *context.Context) { ctx.SetCookie(setting.CookieUserName, "", -1, setting.AppSubURL) ctx.SetCookie(setting.CookieRememberName, "", -1, setting.AppSubURL) ctx.SetCookie(setting.CSRFCookieName, "", -1, setting.AppSubURL) + ctx.SetCookie("lang", "", -1, setting.AppSubURL) // Setting the lang cookie will trigger the middleware to reset the language ot previous state. ctx.Redirect(setting.AppSubURL + "/") } diff --git a/routers/user/setting.go b/routers/user/setting.go index 2d8b53ff63e25..2293bc665b754 100644 --- a/routers/user/setting.go +++ b/routers/user/setting.go @@ -25,6 +25,7 @@ import ( "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" + "github.com/Unknwon/i18n" ) const ( @@ -105,6 +106,7 @@ func SettingsPost(ctx *context.Context, form auth.UpdateProfileForm) { ctx.User.KeepEmailPrivate = form.KeepEmailPrivate ctx.User.Website = form.Website ctx.User.Location = form.Location + ctx.User.Language = form.Language if err := models.UpdateUserSetting(ctx.User); err != nil { if _, ok := err.(models.ErrEmailAlreadyUsed); ok { ctx.Flash.Error(ctx.Tr("form.email_been_used")) @@ -115,8 +117,11 @@ func SettingsPost(ctx *context.Context, form auth.UpdateProfileForm) { return } + // Update the language to the one we just set + ctx.SetCookie("lang", ctx.User.Language, nil, setting.AppSubURL) + log.Trace("User settings updated: %s", ctx.User.Name) - ctx.Flash.Success(ctx.Tr("settings.update_profile_success")) + ctx.Flash.Success(i18n.Tr(ctx.User.Language, "settings.update_profile_success")) ctx.Redirect(setting.AppSubURL + "/user/settings") } diff --git a/templates/user/settings/profile.tmpl b/templates/user/settings/profile.tmpl index 091c2e2c53b96..4969507e3322d 100644 --- a/templates/user/settings/profile.tmpl +++ b/templates/user/settings/profile.tmpl @@ -40,6 +40,20 @@ +
+ + +
+
diff --git a/vendor/code.gitea.io/sdk/gitea/user.go b/vendor/code.gitea.io/sdk/gitea/user.go index f6b687e979ee6..85160c3fd98d1 100644 --- a/vendor/code.gitea.io/sdk/gitea/user.go +++ b/vendor/code.gitea.io/sdk/gitea/user.go @@ -22,6 +22,8 @@ type User struct { Email string `json:"email"` // URL to the user's avatar AvatarURL string `json:"avatar_url"` + // User locale + Language string `json:"language"` } // MarshalJSON implements the json.Marshaler interface for User, adding field(s) for backward compatibility From 2f1934b714723c7d71d03ecd064a16de5eb35949 Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 1 May 2018 13:00:00 +0200 Subject: [PATCH 02/16] Added translation string for setting --- options/locale/locale_en-US.ini | 1 + templates/user/settings/profile.tmpl | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 7e9a8da3e4a66..f3b881aae156c 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -331,6 +331,7 @@ change_username = Your username has been changed. change_username_prompt = Note: username changes also change your account URL. continue = Continue cancel = Cancel +language = Language lookup_avatar_by_mail = Look Up Avatar by Email Address federated_avatar_lookup = Federated Avatar Lookup diff --git a/templates/user/settings/profile.tmpl b/templates/user/settings/profile.tmpl index 4969507e3322d..a3fd3ba6df8f4 100644 --- a/templates/user/settings/profile.tmpl +++ b/templates/user/settings/profile.tmpl @@ -41,7 +41,7 @@
- +