diff --git a/server/controllers/masters.go b/server/controllers/masters.go index 1813175..835d85b 100644 --- a/server/controllers/masters.go +++ b/server/controllers/masters.go @@ -19,6 +19,7 @@ func RegisterAnonMasterConroller(router *gin.RouterGroup) { "distanceUnits": db.DistanceUnitDetails, "roles": db.RoleDetails, "currencies": models.GetCurrencyMasterList(), + "languages": models.GetLanguageMastersList(), }) }) } @@ -52,7 +53,7 @@ func udpateSettings(c *gin.Context) { func udpateMySettings(c *gin.Context) { var model models.UpdateSettingModel if err := c.ShouldBind(&model); err == nil { - err := service.UpdateUserSettings(c.MustGet("userId").(string), model.Currency, *model.DistanceUnit, model.DateFormat) + err := service.UpdateUserSettings(c.MustGet("userId").(string), model.Currency, *model.DistanceUnit, model.DateFormat, model.Language) if err != nil { c.JSON(http.StatusUnprocessableEntity, common.NewError("udpateMySettings", err)) return diff --git a/server/db/dbModels.go b/server/db/dbModels.go index 71682bb..aec7665 100644 --- a/server/db/dbModels.go +++ b/server/db/dbModels.go @@ -19,6 +19,7 @@ type User struct { Name string `json:"name"` Vehicles []Vehicle `gorm:"many2many:user_vehicles;" json:"vehicles"` IsDisabled bool `json:"isDisabled"` + Language string `json:"language"` } func (b *User) MarshalJSON() ([]byte, error) { diff --git a/server/db/migrations.go b/server/db/migrations.go index 598dd29..347648d 100644 --- a/server/db/migrations.go +++ b/server/db/migrations.go @@ -27,6 +27,10 @@ var migrations = []localMigration{ Name: "2022_03_08_13_16_AddVIN", Query: "ALTER TABLE vehicles ADD COLUMN vin text", }, + { + Name: "2023_02_26_13_42_AddLanguage", + Query: "ALTER TABLE users ADD COLUMN language text default 'en'", + }, } func RunMigrations() { diff --git a/server/models/language.go b/server/models/language.go new file mode 100644 index 0000000..c8e655f --- /dev/null +++ b/server/models/language.go @@ -0,0 +1,24 @@ +package models + +type LanguageModel struct { + Emoji string `json:"emoji"` + Name string `json:"name"` + NameNative string `json:"nameNative"` + Shorthand string `json:"shorthand"` +} + +func GetLanguageMastersList() []LanguageModel { + return []LanguageModel{ + { + Emoji: "🇬🇧", + Name: "English", + NameNative: "English", + Shorthand: "en", + }, { + Emoji: "🇩🇪", + Name: "German", + NameNative: "Deutsch", + Shorthand: "de", + }, + } +} \ No newline at end of file diff --git a/server/models/misc.go b/server/models/misc.go index 3171db2..5356617 100644 --- a/server/models/misc.go +++ b/server/models/misc.go @@ -6,6 +6,7 @@ type UpdateSettingModel struct { Currency string `json:"currency" form:"currency" query:"currency"` DateFormat string `json:"dateFormat" form:"dateFormat" query:"dateFormat"` DistanceUnit *db.DistanceUnit `json:"distanceUnit" form:"distanceUnit" query:"distanceUnit" ` + Language string `json:"language" form:"language" query:"language"` } type ClarksonMigrationModel struct { diff --git a/server/service/miscService.go b/server/service/miscService.go index ef344a3..3705878 100644 --- a/server/service/miscService.go +++ b/server/service/miscService.go @@ -1,7 +1,9 @@ package service import ( + "errors" "hammond/db" + "hammond/models" ) func CanInitializeSystem() (bool, error) { @@ -14,15 +16,30 @@ func UpdateSettings(currency string, distanceUnit db.DistanceUnit) error { setting.DistanceUnit = distanceUnit return db.UpdateSettings(setting) } -func UpdateUserSettings(userId, currency string, distanceUnit db.DistanceUnit, dateFormat string) error { +func UpdateUserSettings(userId, currency string, distanceUnit db.DistanceUnit, dateFormat string, language string) error { user, err := db.GetUserById(userId) if err != nil { return err } + // TODO: Pull into function + languageExists := false + languages := models.GetLanguageMastersList(); + for _, lang := range languages { + if (language == lang.Shorthand){ + languageExists = true + } + } + + if (!languageExists) { + return errors.New("Language not in masters list") + } + + user.Currency = currency user.DistanceUnit = distanceUnit user.DateFormat = dateFormat + user.Language = language return db.UpdateUser(user) } diff --git a/ui/src/router/views/settings.vue b/ui/src/router/views/settings.vue index ca4b326..1c5c822 100644 --- a/ui/src/router/views/settings.vue +++ b/ui/src/router/views/settings.vue @@ -22,11 +22,13 @@ export default { data: function() { return { settingsModel: { + language: this.me.language, currency: this.me.currency, distanceUnit: this.me.distanceUnit, dateFormat: this.me.dateFormat, }, tryingToSave: false, + selectedLanguage: "", changePassModel: { old: '', new: '', @@ -36,7 +38,7 @@ export default { } }, computed: { - ...mapState('vehicles', ['currencyMasters', 'distanceUnitMasters']), + ...mapState('masters', ['currencyMasters', 'languageMasters', 'distanceUnitMasters']), passwordValid() { if (this.changePassModel.new === '' || this.changePassModel.renew === '') { return true @@ -59,6 +61,9 @@ export default { }) }, }, + mounted() { + this.selectedLanguage = this.formatLanguage(this.languageMasters.filter(x => x.shorthand === this.me.language)[0]) + }, methods: { changePassword() { if (!this.passwordValid) { @@ -110,6 +115,7 @@ export default { type: 'is-success', duration: 3000, }) + this.$i18n.locale = this.settingsModel.language }) .catch((ex) => { this.$buefy.toast.open({ @@ -126,6 +132,9 @@ export default { formatCurrency(option) { return `${option.namePlural} (${option.code})` }, + formatLanguage(option) { + return `${option.nameNative} ${option.emoji}` + }, }, } @@ -136,9 +145,18 @@ export default {