浏览代码

Merge branch 'nztqa-improve-account' into devel

Change Email address. Thanks to nztqa ! Closes #848
Lauri Ojansivu 8 年之前
父节点
当前提交
719c5404f3

+ 2 - 1
.eslintrc.json

@@ -129,6 +129,7 @@
     "JsonRoutes": true,
     "JsonRoutes": true,
     "Authentication": true,
     "Authentication": true,
     "Integrations": true,
     "Integrations": true,
-    "HTTP": true
+    "HTTP": true,
+    "AccountSettings": true
   }
   }
 }
 }

+ 2 - 1
CHANGELOG.md

@@ -4,7 +4,8 @@ This release adds the following new features:
 
 
 * [Add Bounties and Commercial Support to wiki](https://github.com/wekan/wekan/wiki);
 * [Add Bounties and Commercial Support to wiki](https://github.com/wekan/wekan/wiki);
 * [Add display Wekan version number and runtime
 * [Add display Wekan version number and runtime
-   environment to Admin Panel](https://github.com/wekan/wekan/pull/1156).
+   environment to Admin Panel](https://github.com/wekan/wekan/pull/1156);
+* [Change Email address](https://github.com/wekan/wekan/pull/1161).
 
 
 Thanks to GitHub users nztqa and xet7 for their contributions.
 Thanks to GitHub users nztqa and xet7 for their contributions.
 
 

+ 16 - 0
client/components/settings/settingBody.jade

@@ -12,6 +12,8 @@ template(name="setting")
               a.js-setting-menu(data-id="registration-setting") {{_ 'registration'}}
               a.js-setting-menu(data-id="registration-setting") {{_ 'registration'}}
             li
             li
               a.js-setting-menu(data-id="email-setting") {{_ 'email'}}
               a.js-setting-menu(data-id="email-setting") {{_ 'email'}}
+            li
+              a.js-setting-menu(data-id="account-setting") {{_ 'accounts'}}
         .main-body
         .main-body
           if loading.get
           if loading.get
             +spinner
             +spinner
@@ -19,6 +21,8 @@ template(name="setting")
             +general
             +general
           else if emailSetting.get
           else if emailSetting.get
             +email
             +email
+          else if accountSetting.get
+            +accountSettings
 
 
 template(name="general")
 template(name="general")
   ul#registration-setting.setting-detail
   ul#registration-setting.setting-detail
@@ -80,3 +84,15 @@ template(name='email')
 
 
     li
     li
       button.js-save.primary {{_ 'save'}}
       button.js-save.primary {{_ 'save'}}
+
+template(name='accountSettings')
+  ul#account-setting.setting-detail
+    li.smtp-form
+      .title {{_ 'accounts-allowEmailChange'}}
+      .form-group.flex
+        input.form-control#accounts-allowEmailChange(type="radio" name="allowEmailChange" value="true" checked="{{#if allowEmailChange}}checked{{/if}}")
+        span {{_ 'yes'}}
+        input.form-control#accounts-allowEmailChange(type="radio" name="allowEmailChange" value="false" checked="{{#unless allowEmailChange}}checked{{/unless}}")
+        span {{_ 'no'}}
+    li
+      button.js-accounts-save.primary {{_ 'save'}}

+ 22 - 0
client/components/settings/settingBody.js

@@ -1,5 +1,6 @@
 Meteor.subscribe('setting');
 Meteor.subscribe('setting');
 Meteor.subscribe('mailServer');
 Meteor.subscribe('mailServer');
+Meteor.subscribe('accountSettings');
 
 
 BlazeComponent.extendComponent({
 BlazeComponent.extendComponent({
   onCreated() {
   onCreated() {
@@ -7,6 +8,7 @@ BlazeComponent.extendComponent({
     this.loading = new ReactiveVar(false);
     this.loading = new ReactiveVar(false);
     this.generalSetting = new ReactiveVar(true);
     this.generalSetting = new ReactiveVar(true);
     this.emailSetting = new ReactiveVar(false);
     this.emailSetting = new ReactiveVar(false);
+    this.accountSetting = new ReactiveVar(false);
   },
   },
 
 
   setError(error) {
   setError(error) {
@@ -62,6 +64,7 @@ BlazeComponent.extendComponent({
       const targetID = target.data('id');
       const targetID = target.data('id');
       this.generalSetting.set('registration-setting' === targetID);
       this.generalSetting.set('registration-setting' === targetID);
       this.emailSetting.set('email-setting' === targetID);
       this.emailSetting.set('email-setting' === targetID);
+      this.accountSetting.set('account-setting' === targetID);
     }
     }
   },
   },
 
 
@@ -130,3 +133,22 @@ BlazeComponent.extendComponent({
     }];
     }];
   },
   },
 }).register('setting');
 }).register('setting');
+
+BlazeComponent.extendComponent({
+  saveAllowEmailChange() {
+    const allowEmailChange = ($('input[name=allowEmailChange]:checked').val() === 'true');
+    AccountSettings.update('accounts-allowEmailChange', {
+      $set: { 'booleanValue': allowEmailChange },
+    });
+  },
+
+  allowEmailChange() {
+    return AccountSettings.findOne('accounts-allowEmailChange').booleanValue;
+  },
+
+  events() {
+    return [{
+      'click button.js-accounts-save': this.saveAllowEmailChange,
+    }];
+  },
+}).register('accountSettings');

+ 8 - 0
client/components/users/userHeader.jade

@@ -36,6 +36,14 @@ template(name="editProfilePopup")
     label
     label
       | {{_ 'initials'}}
       | {{_ 'initials'}}
       input.js-profile-initials(type="text" value=profile.initials)
       input.js-profile-initials(type="text" value=profile.initials)
+    label
+      | {{_ 'email'}}
+      span.error.hide.email-taken
+        | {{_ 'error-email-taken'}}
+      if allowEmailChange
+        input.js-profile-email(type="email" value="{{emails.[0].address}}")
+      else
+        input.js-profile-email(type="email" value="{{emails.[0].address}}" readonly)
     input.primary.wide(type="submit" value="{{_ 'save'}}")
     input.primary.wide(type="submit" value="{{_ 'save'}}")
 
 
 template(name="editNotificationPopup")
 template(name="editNotificationPopup")

+ 41 - 2
client/components/users/userHeader.js

@@ -20,18 +20,47 @@ Template.memberMenuPopup.events({
   },
   },
 });
 });
 
 
+Template.editProfilePopup.helpers({
+  allowEmailChange() {
+    return AccountSettings.findOne('accounts-allowEmailChange').booleanValue;
+  },
+});
+
 Template.editProfilePopup.events({
 Template.editProfilePopup.events({
   submit(evt, tpl) {
   submit(evt, tpl) {
     evt.preventDefault();
     evt.preventDefault();
     const fullname = tpl.find('.js-profile-fullname').value.trim();
     const fullname = tpl.find('.js-profile-fullname').value.trim();
     const username = tpl.find('.js-profile-username').value.trim();
     const username = tpl.find('.js-profile-username').value.trim();
     const initials = tpl.find('.js-profile-initials').value.trim();
     const initials = tpl.find('.js-profile-initials').value.trim();
+    const email = tpl.find('.js-profile-email').value.trim();
+    let isChangeUserName = false;
+    let isChangeEmail = false;
     Users.update(Meteor.userId(), {$set: {
     Users.update(Meteor.userId(), {$set: {
       'profile.fullname': fullname,
       'profile.fullname': fullname,
       'profile.initials': initials,
       'profile.initials': initials,
     }});
     }});
-
-    if (username !== Meteor.user().username) {
+    isChangeUserName = username !== Meteor.user().username;
+    isChangeEmail = email.toLowerCase() !== Meteor.user().emails[0].address.toLowerCase();
+    if (isChangeUserName && isChangeEmail) {
+      Meteor.call('setUsernameAndEmail', username, email.toLowerCase(), function(error) {
+        const usernameMessageElement = tpl.$('.username-taken');
+        const emailMessageElement = tpl.$('.email-taken');
+        if (error) {
+          const errorElement = error.error;
+          if (errorElement === 'username-already-taken') {
+            usernameMessageElement.show();
+            emailMessageElement.hide();
+          } else if (errorElement === 'email-already-taken') {
+            usernameMessageElement.hide();
+            emailMessageElement.show();
+          }
+        } else {
+          usernameMessageElement.hide();
+          emailMessageElement.hide();
+          Popup.back();
+        }
+      });
+    } else if (isChangeUserName) {
       Meteor.call('setUsername', username, function(error) {
       Meteor.call('setUsername', username, function(error) {
         const messageElement = tpl.$('.username-taken');
         const messageElement = tpl.$('.username-taken');
         if (error) {
         if (error) {
@@ -41,6 +70,16 @@ Template.editProfilePopup.events({
           Popup.back();
           Popup.back();
         }
         }
       });
       });
+    } else if (isChangeEmail) {
+      Meteor.call('setEmail', email.toLowerCase(), function(error) {
+        const messageElement = tpl.$('.email-taken');
+        if (error) {
+          messageElement.show();
+        } else {
+          messageElement.hide();
+          Popup.back();
+        }
+      });
     } else Popup.back();
     } else Popup.back();
   },
   },
 });
 });

+ 6 - 1
i18n/ar.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "لا يمكنك دعوة نفسك",
     "error-user-notAllowSelf": "لا يمكنك دعوة نفسك",
     "error-user-notCreated": "This user is not created",
     "error-user-notCreated": "This user is not created",
     "error-username-taken": "إسم المستخدم مأخوذ مسبقا",
     "error-username-taken": "إسم المستخدم مأخوذ مسبقا",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Export board",
     "export-board": "Export board",
     "filter": "تصفية",
     "filter": "تصفية",
     "filter-cards": "تصفية البطاقات",
     "filter-cards": "تصفية البطاقات",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/br.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notCreated": "This user is not created",
     "error-user-notCreated": "This user is not created",
     "error-username-taken": "This username is already taken",
     "error-username-taken": "This username is already taken",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Export board",
     "export-board": "Export board",
     "filter": "Filter",
     "filter": "Filter",
     "filter-cards": "Filter Cards",
     "filter-cards": "Filter Cards",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/ca.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "No et pots convidar a tu mateix",
     "error-user-notAllowSelf": "No et pots convidar a tu mateix",
     "error-user-notCreated": "L'usuari no s'ha creat",
     "error-user-notCreated": "L'usuari no s'ha creat",
     "error-username-taken": "Aquest usuari ja existeix",
     "error-username-taken": "Aquest usuari ja existeix",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Exporta tauler",
     "export-board": "Exporta tauler",
     "filter": "Filtre",
     "filter": "Filtre",
     "filter-cards": "Fitxes de filtre",
     "filter-cards": "Fitxes de filtre",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/cs.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notCreated": "Tento uživatel není vytvořen",
     "error-user-notCreated": "Tento uživatel není vytvořen",
     "error-username-taken": "This username is already taken",
     "error-username-taken": "This username is already taken",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Exportovat tablo",
     "export-board": "Exportovat tablo",
     "filter": "Filtr",
     "filter": "Filtr",
     "filter-cards": "Filtrovat karty",
     "filter-cards": "Filtrovat karty",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 31 - 26
i18n/de.i18n.json

@@ -56,7 +56,7 @@
     "and-n-other-card": "und eine andere Karte",
     "and-n-other-card": "und eine andere Karte",
     "and-n-other-card_plural": "und __count__ andere Karten",
     "and-n-other-card_plural": "und __count__ andere Karten",
     "apply": "Übernehmen",
     "apply": "Übernehmen",
-    "app-is-offline": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
+    "app-is-offline": "Wekan lädt gerade, bitte warten Sie. Wenn Sie die Seite neu laden, gehen nicht übertragene Änderungen verloren. Sollte Wekan nicht geladen werden, überprüfen Sie bitte, ob der Server noch läuft.",
     "archive": "Archiv",
     "archive": "Archiv",
     "archive-all": "Alles archivieren",
     "archive-all": "Alles archivieren",
     "archive-board": "Board archivieren",
     "archive-board": "Board archivieren",
@@ -141,12 +141,12 @@
     "color-yellow": "gelb",
     "color-yellow": "gelb",
     "comment": "Kommentar",
     "comment": "Kommentar",
     "comment-placeholder": "Kommentar schreiben",
     "comment-placeholder": "Kommentar schreiben",
-    "comment-only": "Comment only",
+    "comment-only": "Nur kommentierbar",
     "comment-only-desc": "Kann Karten nur Kommentieren",
     "comment-only-desc": "Kann Karten nur Kommentieren",
     "computer": "Computer",
     "computer": "Computer",
     "create": "Erstellen",
     "create": "Erstellen",
     "createBoardPopup-title": "Board erstellen",
     "createBoardPopup-title": "Board erstellen",
-    "chooseBoardSourcePopup-title": "Import board",
+    "chooseBoardSourcePopup-title": "Board importieren",
     "createLabelPopup-title": "Label erstellen",
     "createLabelPopup-title": "Label erstellen",
     "current": "aktuell",
     "current": "aktuell",
     "date": "Datum",
     "date": "Datum",
@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "Sie können sich nicht selbst einladen.",
     "error-user-notAllowSelf": "Sie können sich nicht selbst einladen.",
     "error-user-notCreated": "Dieser Nutzer ist nicht angelegt",
     "error-user-notCreated": "Dieser Nutzer ist nicht angelegt",
     "error-username-taken": "Dieser Benutzername ist bereits vergeben",
     "error-username-taken": "Dieser Benutzername ist bereits vergeben",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Board exportieren",
     "export-board": "Board exportieren",
     "filter": "Filter",
     "filter": "Filter",
     "filter-cards": "Karten filtern",
     "filter-cards": "Karten filtern",
@@ -206,15 +207,15 @@
     "headerBarCreateBoardPopup-title": "Board erstellen",
     "headerBarCreateBoardPopup-title": "Board erstellen",
     "home": "Home",
     "home": "Home",
     "import": "Importieren",
     "import": "Importieren",
-    "import-board": "import board",
-    "import-board-c": "Import board",
+    "import-board": "Board importieren",
+    "import-board-c": "Board importieren",
     "import-board-title-trello": "Board von Trello importieren",
     "import-board-title-trello": "Board von Trello importieren",
-    "import-board-title-wekan": "Import board from Wekan",
-    "import-sandstorm-warning": "Imported board will delete all existing data on board and replace it with imported board.",
-    "from-trello": "From Trello",
-    "from-wekan": "From Wekan",
+    "import-board-title-wekan": "Board von Wekan importieren",
+    "import-sandstorm-warning": "Das importierte Board wird alle bereits existierenden Daten löschen und mit den importierten Daten überschreiben.",
+    "from-trello": "Von Trello",
+    "from-wekan": "Von Wekan",
     "import-board-instruction-trello": "Gehen Sie in ihrem Trello-Board auf 'Menü', dann 'Mehr', 'Drucken und Exportieren', 'JSON-Export' und kopieren Sie den dort angezeigten Text",
     "import-board-instruction-trello": "Gehen Sie in ihrem Trello-Board auf 'Menü', dann 'Mehr', 'Drucken und Exportieren', 'JSON-Export' und kopieren Sie den dort angezeigten Text",
-    "import-board-instruction-wekan": "In your Wekan board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.",
+    "import-board-instruction-wekan": "Gehen Sie in Ihrem Wekan board auf 'Menü', und dann auf 'Board exportieren'. Kopieren Sie anschließend den Text aus der heruntergeladenen Datei.",
     "import-json-placeholder": "Fügen Sie die korrekten JSON-Daten hier ein",
     "import-json-placeholder": "Fügen Sie die korrekten JSON-Daten hier ein",
     "import-map-members": "Mitglieder zuordnen",
     "import-map-members": "Mitglieder zuordnen",
     "import-members-map": "Das importierte Board hat einige Mitglieder. Bitte ordnen Sie die Mitglieder, die importiert werden sollen, Wekan-Nutzern zu",
     "import-members-map": "Das importierte Board hat einige Mitglieder. Bitte ordnen Sie die Mitglieder, die importiert werden sollen, Wekan-Nutzern zu",
@@ -364,20 +365,24 @@
     "email-invite-register-text": "Hallo __user__,\n\n__inviter__ hat Sie für Ihre Zusammenarbeit zu Wekan eingeladen.\n\nBitte klicken Sie auf folgenden Link:\n__url__\n\nIhr Einladungscode lautet: __icode__\n\nDanke.",
     "email-invite-register-text": "Hallo __user__,\n\n__inviter__ hat Sie für Ihre Zusammenarbeit zu Wekan eingeladen.\n\nBitte klicken Sie auf folgenden Link:\n__url__\n\nIhr Einladungscode lautet: __icode__\n\nDanke.",
     "error-invitation-code-not-exist": "Ungültiger Einladungscode",
     "error-invitation-code-not-exist": "Ungültiger Einladungscode",
     "error-notAuthorized": "Sie sind nicht berechtigt diese Seite zu sehen.",
     "error-notAuthorized": "Sie sind nicht berechtigt diese Seite zu sehen.",
-    "outgoing-webhooks": "Outgoing Webhooks",
-    "outgoingWebhooksPopup-title": "Outgoing Webhooks",
-    "Wekan_version": "Wekan version",
-    "Node_version": "Node version",
-    "OS_Arch": "OS Arch",
-    "OS_Cpus": "OS CPU Count",
-    "OS_Freemem": "OS Free Memory",
-    "OS_Loadavg": "OS Load Average",
-    "OS_Platform": "OS Platform",
-    "OS_Release": "OS Release",
-    "OS_Totalmem": "OS Total Memory",
-    "OS_Type": "OS Type",
-    "OS_Uptime": "OS Uptime",
-    "hours": "hours",
-    "minutes": "minutes",
-    "seconds": "seconds"
+    "outgoing-webhooks": "Ausgehende Webhooks",
+    "outgoingWebhooksPopup-title": "Ausgehende Webhooks",
+    "Wekan_version": "Wekan-Version",
+    "Node_version": "Node-Version",
+    "OS_Arch": "Betriebssystem-Architektur",
+    "OS_Cpus": "Anzahl Prozessoren",
+    "OS_Freemem": "Freier Arbeitsspeicher",
+    "OS_Loadavg": "Mittlere Systembelastung",
+    "OS_Platform": "Plattform",
+    "OS_Release": "Version des Betriebssystem",
+    "OS_Totalmem": "Gesamter Arbeitsspeicher",
+    "OS_Type": "Typ des Betriebssystems",
+    "OS_Uptime": "Laufzeit des Systems",
+    "hours": "Stunden",
+    "minutes": "Minuten",
+    "seconds": "Sekunden",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/en-GB.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notCreated": "This user is not created",
     "error-user-notCreated": "This user is not created",
     "error-username-taken": "This username is already taken",
     "error-username-taken": "This username is already taken",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Export board",
     "export-board": "Export board",
     "filter": "Filter",
     "filter": "Filter",
     "filter-cards": "Filter Cards",
     "filter-cards": "Filter Cards",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/en.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notCreated": "This user is not created",
     "error-user-notCreated": "This user is not created",
     "error-username-taken": "This username is already taken",
     "error-username-taken": "This username is already taken",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Export board",
     "export-board": "Export board",
     "filter": "Filter",
     "filter": "Filter",
     "filter-cards": "Filter Cards",
     "filter-cards": "Filter Cards",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/eo.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notCreated": "Uzanto ne kreita",
     "error-user-notCreated": "Uzanto ne kreita",
     "error-username-taken": "Uzantnomo jam prenita",
     "error-username-taken": "Uzantnomo jam prenita",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Export board",
     "export-board": "Export board",
     "filter": "Filter",
     "filter": "Filter",
     "filter-cards": "Filter Cards",
     "filter-cards": "Filter Cards",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/es.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "No puedes invitarte a ti mismo",
     "error-user-notAllowSelf": "No puedes invitarte a ti mismo",
     "error-user-notCreated": "This user is not created",
     "error-user-notCreated": "This user is not created",
     "error-username-taken": "Este nombre de usuario ya está en uso",
     "error-username-taken": "Este nombre de usuario ya está en uso",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Export board",
     "export-board": "Export board",
     "filter": "Filter",
     "filter": "Filter",
     "filter-cards": "Fichas de filtro",
     "filter-cards": "Fichas de filtro",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/eu.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "Ezin duzu zure burua gonbidatu",
     "error-user-notAllowSelf": "Ezin duzu zure burua gonbidatu",
     "error-user-notCreated": "Erabiltzaile hau sortu gabe dago",
     "error-user-notCreated": "Erabiltzaile hau sortu gabe dago",
     "error-username-taken": "Erabiltzaile-izen hori hartuta dago",
     "error-username-taken": "Erabiltzaile-izen hori hartuta dago",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Esportatu arbela",
     "export-board": "Esportatu arbela",
     "filter": "Iragazi",
     "filter": "Iragazi",
     "filter-cards": "Iragazi txartelak",
     "filter-cards": "Iragazi txartelak",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 13 - 8
i18n/fa.i18n.json

@@ -39,14 +39,14 @@
     "activity-checklist-added": "سیاهه به %s اضافه شد",
     "activity-checklist-added": "سیاهه به %s اضافه شد",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "activity-checklist-item-added": "added checklist item to '%s' in %s",
     "add": "افزودن",
     "add": "افزودن",
-    "add-attachment": "Add Attachment",
-    "add-board": "Add Board",
-    "add-card": "Add Card",
-    "add-checklist": "Add Checklist",
+    "add-attachment": "افزودن ضمیمه",
+    "add-board": "افزودن برد",
+    "add-card": "افزودن کارت",
+    "add-checklist": "افزودن چک لیست",
     "add-checklist-item": "افزودن مورد به سیاهه",
     "add-checklist-item": "افزودن مورد به سیاهه",
     "add-cover": "جلد کردن",
     "add-cover": "جلد کردن",
-    "add-label": "Add Label",
-    "add-list": "Add List",
+    "add-label": "افزودن لیبل",
+    "add-list": "افزودن لیست",
     "add-members": "افزودن اعضا",
     "add-members": "افزودن اعضا",
     "added": "اضافه گردید",
     "added": "اضافه گردید",
     "addMemberPopup-title": "اعضا",
     "addMemberPopup-title": "اعضا",
@@ -61,7 +61,7 @@
     "archive-all": "تمامی بایگانی ها",
     "archive-all": "تمامی بایگانی ها",
     "archive-board": "بایگانی برد",
     "archive-board": "بایگانی برد",
     "archive-card": "بایگانی کارت",
     "archive-card": "بایگانی کارت",
-    "archive-list": "Archive List",
+    "archive-list": "آرشیو لیست",
     "archive-selection": "بایگانی موارد انتخاب شده ها",
     "archive-selection": "بایگانی موارد انتخاب شده ها",
     "archiveBoardPopup-title": "آیا می خواهید بایگانی شود؟",
     "archiveBoardPopup-title": "آیا می خواهید بایگانی شود؟",
     "archived-items": "آیتم های بایگانی شده",
     "archived-items": "آیتم های بایگانی شده",
@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "عدم امکان دعوت خود",
     "error-user-notAllowSelf": "عدم امکان دعوت خود",
     "error-user-notCreated": "این کاربر ایجاد نشده است",
     "error-user-notCreated": "این کاربر ایجاد نشده است",
     "error-username-taken": "این نام کاربری استفاده شده است",
     "error-username-taken": "این نام کاربری استفاده شده است",
+    "error-email-taken": "Email has already been taken",
     "export-board": "انتقال به بیرون تخته",
     "export-board": "انتقال به بیرون تخته",
     "filter": "صافی ـFilterـ",
     "filter": "صافی ـFilterـ",
     "filter-cards": "صافی ـFilterـ کارتها",
     "filter-cards": "صافی ـFilterـ کارتها",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/fi.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "Et voi kutsua itseäsi",
     "error-user-notAllowSelf": "Et voi kutsua itseäsi",
     "error-user-notCreated": "Tätä käyttäjää ei ole luotu",
     "error-user-notCreated": "Tätä käyttäjää ei ole luotu",
     "error-username-taken": "Tämä käyttäjätunnus on jo käytössä",
     "error-username-taken": "Tämä käyttäjätunnus on jo käytössä",
+    "error-email-taken": "Sähköpostiosoite on jo käytössä",
     "export-board": "Vie taulu",
     "export-board": "Vie taulu",
     "filter": "Suodata",
     "filter": "Suodata",
     "filter-cards": "Suodata kortit",
     "filter-cards": "Suodata kortit",
@@ -379,5 +380,9 @@
     "OS_Uptime": "Käyttöjärjestelmä ollut käynnissä",
     "OS_Uptime": "Käyttöjärjestelmä ollut käynnissä",
     "hours": "tuntia",
     "hours": "tuntia",
     "minutes": "minuuttia",
     "minutes": "minuuttia",
-    "seconds": "sekuntia"
+    "seconds": "sekuntia",
+    "yes": "Kyllä",
+    "no": "Ei",
+    "accounts": "Tilit",
+    "accounts-allowEmailChange": "Salli sähköpostiosoitteen muuttaminen"
 }
 }

+ 6 - 1
i18n/fr.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "Vous ne pouvez pas vous inviter vous-même",
     "error-user-notAllowSelf": "Vous ne pouvez pas vous inviter vous-même",
     "error-user-notCreated": "Cet utilisateur n'a pas encore été créé",
     "error-user-notCreated": "Cet utilisateur n'a pas encore été créé",
     "error-username-taken": "Ce nom d'utilisateur est déjà utilisé",
     "error-username-taken": "Ce nom d'utilisateur est déjà utilisé",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Exporter le tableau",
     "export-board": "Exporter le tableau",
     "filter": "Filtrer",
     "filter": "Filtrer",
     "filter-cards": "Filtrer les cartes",
     "filter-cards": "Filtrer les cartes",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/gl.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "Non é posíbel convidarse a un mesmo",
     "error-user-notAllowSelf": "Non é posíbel convidarse a un mesmo",
     "error-user-notCreated": "Este usuario non está creado",
     "error-user-notCreated": "Este usuario non está creado",
     "error-username-taken": "Este nome de usuario xa está collido",
     "error-username-taken": "Este nome de usuario xa está collido",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Exportar taboleiro",
     "export-board": "Exportar taboleiro",
     "filter": "Filtro",
     "filter": "Filtro",
     "filter-cards": "Filtrar tarxetas",
     "filter-cards": "Filtrar tarxetas",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 19 - 14
i18n/he.i18n.json

@@ -139,7 +139,7 @@
     "color-red": "אדום",
     "color-red": "אדום",
     "color-sky": "תכלת",
     "color-sky": "תכלת",
     "color-yellow": "צהוב",
     "color-yellow": "צהוב",
-    "comment": "להגיב",
+    "comment": "לפרסם",
     "comment-placeholder": "כתיבת הערה",
     "comment-placeholder": "כתיבת הערה",
     "comment-only": "הערה בלבד",
     "comment-only": "הערה בלבד",
     "comment-only-desc": "ניתן להעיר על כרטיסים בלבד.",
     "comment-only-desc": "ניתן להעיר על כרטיסים בלבד.",
@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "אינך יכול להזמין את עצמך",
     "error-user-notAllowSelf": "אינך יכול להזמין את עצמך",
     "error-user-notCreated": "משתמש זה לא נוצר",
     "error-user-notCreated": "משתמש זה לא נוצר",
     "error-username-taken": "המשתמש כבר קיים במערכת",
     "error-username-taken": "המשתמש כבר קיים במערכת",
+    "error-email-taken": "Email has already been taken",
     "export-board": "ייצוא לוח",
     "export-board": "ייצוא לוח",
     "filter": "מסנן",
     "filter": "מסנן",
     "filter-cards": "סינון כרטיסים",
     "filter-cards": "סינון כרטיסים",
@@ -221,7 +222,7 @@
     "import-show-user-mapping": "סקירת מיפוי חברים",
     "import-show-user-mapping": "סקירת מיפוי חברים",
     "import-user-select": "נא לבחור את המשתמש ב־Wekan בו ברצונך להשתמש עבור חבר זה",
     "import-user-select": "נא לבחור את המשתמש ב־Wekan בו ברצונך להשתמש עבור חבר זה",
     "importMapMembersAddPopup-title": "בחירת משתמש Wekan",
     "importMapMembersAddPopup-title": "בחירת משתמש Wekan",
-    "info": "Version",
+    "info": "גרסא",
     "initials": "ראשי תיבות",
     "initials": "ראשי תיבות",
     "invalid-date": "תאריך שגוי",
     "invalid-date": "תאריך שגוי",
     "joined": "הצטרף",
     "joined": "הצטרף",
@@ -366,18 +367,22 @@
     "error-notAuthorized": "אין לך הרשאה לצפות בעמוד זה.",
     "error-notAuthorized": "אין לך הרשאה לצפות בעמוד זה.",
     "outgoing-webhooks": "Outgoing Webhooks",
     "outgoing-webhooks": "Outgoing Webhooks",
     "outgoingWebhooksPopup-title": "Outgoing Webhooks",
     "outgoingWebhooksPopup-title": "Outgoing Webhooks",
-    "Wekan_version": "Wekan version",
-    "Node_version": "Node version",
-    "OS_Arch": "OS Arch",
-    "OS_Cpus": "OS CPU Count",
-    "OS_Freemem": "OS Free Memory",
-    "OS_Loadavg": "OS Load Average",
+    "Wekan_version": "גרסת wekan",
+    "Node_version": "גרסת Node",
+    "OS_Arch": "ארכיטקטורת מערכת הפעלה",
+    "OS_Cpus": "מספר מעבדים",
+    "OS_Freemem": "זיכרון (RAM) פנוי",
+    "OS_Loadavg": "עומס ממוצע ",
     "OS_Platform": "OS Platform",
     "OS_Platform": "OS Platform",
     "OS_Release": "OS Release",
     "OS_Release": "OS Release",
-    "OS_Totalmem": "OS Total Memory",
-    "OS_Type": "OS Type",
-    "OS_Uptime": "OS Uptime",
-    "hours": "hours",
-    "minutes": "minutes",
-    "seconds": "seconds"
+    "OS_Totalmem": "סך הכל זיכרון (RAM)",
+    "OS_Type": "סוג מערכת ההפעלה",
+    "OS_Uptime": "זמן שעבר מאז האתחול האחרון",
+    "hours": "שעות",
+    "minutes": "דקות",
+    "seconds": "שניות",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/hu.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notCreated": "Ez a felhasználó nem jött létre",
     "error-user-notCreated": "Ez a felhasználó nem jött létre",
     "error-username-taken": "Ez a felhasználónév már foglalt",
     "error-username-taken": "Ez a felhasználónév már foglalt",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Tábla exportálása",
     "export-board": "Tábla exportálása",
     "filter": "Szűrő",
     "filter": "Szűrő",
     "filter-cards": "Kártyák szűrése",
     "filter-cards": "Kártyák szűrése",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/id.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "Anda tidak bisa mengundang diri sendiri",
     "error-user-notAllowSelf": "Anda tidak bisa mengundang diri sendiri",
     "error-user-notCreated": "Nama pengguna ini tidak dibuat",
     "error-user-notCreated": "Nama pengguna ini tidak dibuat",
     "error-username-taken": "Nama pengguna ini sudah dipakai",
     "error-username-taken": "Nama pengguna ini sudah dipakai",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Exspor Panel",
     "export-board": "Exspor Panel",
     "filter": "Penyaringan",
     "filter": "Penyaringan",
     "filter-cards": "Filter Kartu",
     "filter-cards": "Filter Kartu",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/it.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "Non puoi invitare te stesso",
     "error-user-notAllowSelf": "Non puoi invitare te stesso",
     "error-user-notCreated": "L'utente non è stato creato",
     "error-user-notCreated": "L'utente non è stato creato",
     "error-username-taken": "Questo username è già utilizzato",
     "error-username-taken": "Questo username è già utilizzato",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Esporta bacheca",
     "export-board": "Esporta bacheca",
     "filter": "Filtra",
     "filter": "Filtra",
     "filter-cards": "Filtra schede",
     "filter-cards": "Filtra schede",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/ja.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "自分を招待することはできません。",
     "error-user-notAllowSelf": "自分を招待することはできません。",
     "error-user-notCreated": "ユーザーが作成されていません",
     "error-user-notCreated": "ユーザーが作成されていません",
     "error-username-taken": "このユーザ名は既に使用されています",
     "error-username-taken": "このユーザ名は既に使用されています",
+    "error-email-taken": "Email has already been taken",
     "export-board": "ボードのエクスポート",
     "export-board": "ボードのエクスポート",
     "filter": "フィルター",
     "filter": "フィルター",
     "filter-cards": "カードをフィルターする",
     "filter-cards": "カードをフィルターする",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/ko.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "자기 자신을 초대할 수 없습니다.",
     "error-user-notAllowSelf": "자기 자신을 초대할 수 없습니다.",
     "error-user-notCreated": "유저가 생성되지 않았습니다.",
     "error-user-notCreated": "유저가 생성되지 않았습니다.",
     "error-username-taken": "중복된 아이디 입니다.",
     "error-username-taken": "중복된 아이디 입니다.",
+    "error-email-taken": "Email has already been taken",
     "export-board": "보드 내보내기",
     "export-board": "보드 내보내기",
     "filter": "필터",
     "filter": "필터",
     "filter-cards": "카드 필터",
     "filter-cards": "카드 필터",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/nb.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notCreated": "This user is not created",
     "error-user-notCreated": "This user is not created",
     "error-username-taken": "This username is already taken",
     "error-username-taken": "This username is already taken",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Export board",
     "export-board": "Export board",
     "filter": "Filter",
     "filter": "Filter",
     "filter-cards": "Filter Cards",
     "filter-cards": "Filter Cards",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/nl.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notCreated": "This user is not created",
     "error-user-notCreated": "This user is not created",
     "error-username-taken": "This username is already taken",
     "error-username-taken": "This username is already taken",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Export board",
     "export-board": "Export board",
     "filter": "Filter",
     "filter": "Filter",
     "filter-cards": "Filter Cards",
     "filter-cards": "Filter Cards",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/pl.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notCreated": "Ten użytkownik nie został stworzony",
     "error-user-notCreated": "Ten użytkownik nie został stworzony",
     "error-username-taken": "This username is already taken",
     "error-username-taken": "This username is already taken",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Eksportuj tablicę",
     "export-board": "Eksportuj tablicę",
     "filter": "Filtr",
     "filter": "Filtr",
     "filter-cards": "Odfiltruj karty",
     "filter-cards": "Odfiltruj karty",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/pt-BR.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "Você não pode convidar a si mesmo",
     "error-user-notAllowSelf": "Você não pode convidar a si mesmo",
     "error-user-notCreated": "Este usuário não foi criado",
     "error-user-notCreated": "Este usuário não foi criado",
     "error-username-taken": "Esse username já existe",
     "error-username-taken": "Esse username já existe",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Exportar quadro",
     "export-board": "Exportar quadro",
     "filter": "Filtrar",
     "filter": "Filtrar",
     "filter-cards": "Filtrar Cartões",
     "filter-cards": "Filtrar Cartões",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/ro.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notCreated": "This user is not created",
     "error-user-notCreated": "This user is not created",
     "error-username-taken": "This username is already taken",
     "error-username-taken": "This username is already taken",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Export board",
     "export-board": "Export board",
     "filter": "Filter",
     "filter": "Filter",
     "filter-cards": "Filter Cards",
     "filter-cards": "Filter Cards",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 44 - 39
i18n/ru.i18n.json

@@ -1,7 +1,7 @@
 {
 {
     "accept": "Принять",
     "accept": "Принять",
     "act-activity-notify": "[Wekan] Уведомления о активности",
     "act-activity-notify": "[Wekan] Уведомления о активности",
-    "act-addAttachment": "вложенно __attachment__ в __card__",
+    "act-addAttachment": "вложено __attachment__ в __card__",
     "act-addComment": "прокомментировал __card__: __comment__",
     "act-addComment": "прокомментировал __card__: __comment__",
     "act-createBoard": "создана __board__",
     "act-createBoard": "создана __board__",
     "act-createCard": "добавлена __card__ в __list__",
     "act-createCard": "добавлена __card__ в __list__",
@@ -37,7 +37,7 @@
     "activity-sent": "отправлено %s в %s",
     "activity-sent": "отправлено %s в %s",
     "activity-unjoined": "вышел из %s",
     "activity-unjoined": "вышел из %s",
     "activity-checklist-added": "добавлен список в %s",
     "activity-checklist-added": "добавлен список в %s",
-    "activity-checklist-item-added": "added checklist item to '%s' in %s",
+    "activity-checklist-item-added": "добавлен пункт списка в '%s' в %s",
     "add": "Создать",
     "add": "Создать",
     "add-attachment": "Добавить вложение",
     "add-attachment": "Добавить вложение",
     "add-board": "Добавить доску",
     "add-board": "Добавить доску",
@@ -139,7 +139,7 @@
     "color-red": "красный",
     "color-red": "красный",
     "color-sky": "голубой",
     "color-sky": "голубой",
     "color-yellow": "желтый",
     "color-yellow": "желтый",
-    "comment": "Отправить",
+    "comment": "Добавить коментарий",
     "comment-placeholder": "Написать комментарий",
     "comment-placeholder": "Написать комментарий",
     "comment-only": "Только комментирование",
     "comment-only": "Только комментирование",
     "comment-only-desc": "Может комментировать только карточки.",
     "comment-only-desc": "Может комментировать только карточки.",
@@ -148,56 +148,57 @@
     "createBoardPopup-title": "Создать доску",
     "createBoardPopup-title": "Создать доску",
     "chooseBoardSourcePopup-title": "Импортировать доску",
     "chooseBoardSourcePopup-title": "Импортировать доску",
     "createLabelPopup-title": "Создать метку",
     "createLabelPopup-title": "Создать метку",
-    "current": "Текущий",
+    "current": "текущий",
     "date": "Дата",
     "date": "Дата",
-    "decline": "Понизить",
-    "default-avatar": "Стандартный аватар",
+    "decline": "Отклонить",
+    "default-avatar": "Аватар по умолчанию",
     "delete": "Удалить",
     "delete": "Удалить",
     "deleteLabelPopup-title": "Удалить метку?",
     "deleteLabelPopup-title": "Удалить метку?",
     "description": "Описание",
     "description": "Описание",
     "disambiguateMultiLabelPopup-title": "Разрешить конфликт меток",
     "disambiguateMultiLabelPopup-title": "Разрешить конфликт меток",
     "disambiguateMultiMemberPopup-title": "Разрешить конфликт пользователей",
     "disambiguateMultiMemberPopup-title": "Разрешить конфликт пользователей",
     "discard": "Отказать",
     "discard": "Отказать",
-    "done": "ГОтово",
+    "done": "Готово",
     "download": "Скачать",
     "download": "Скачать",
     "edit": "Редактировать",
     "edit": "Редактировать",
     "edit-avatar": "Изменить аватар",
     "edit-avatar": "Изменить аватар",
-    "edit-profile": "Изменить профиль",
+    "edit-profile": "Изменить Профиль",
     "editCardStartDatePopup-title": "Сменить дату начала",
     "editCardStartDatePopup-title": "Сменить дату начала",
-    "editCardDueDatePopup-title": "Изменить дату До",
+    "editCardDueDatePopup-title": "Изменить дату до",
     "editLabelPopup-title": "Редактирование метки",
     "editLabelPopup-title": "Редактирование метки",
     "editNotificationPopup-title": "Редактировать уведомления",
     "editNotificationPopup-title": "Редактировать уведомления",
     "editProfilePopup-title": "Изменить профиль",
     "editProfilePopup-title": "Изменить профиль",
     "email": "Эл.почта",
     "email": "Эл.почта",
     "email-enrollAccount-subject": "Аккаунт создан для вас здесь __url__",
     "email-enrollAccount-subject": "Аккаунт создан для вас здесь __url__",
-    "email-enrollAccount-text": "Привет __user__,\n\nДля того, чтобы начать использовать сервис, просто нажми на ссылку.\n\n__url__\n\nСпасибо.",
-    "email-fail": "Email не отправлен",
+    "email-enrollAccount-text": "Привет __user__,\n\nДля того, чтобы начать использовать сервис, просто нажми на ссылку ниже.\n\n__url__\n\nСпасибо.",
+    "email-fail": "Отправка письма на EMail не удалась",
     "email-invalid": "Неверный адрес электронной почти",
     "email-invalid": "Неверный адрес электронной почти",
-    "email-invite": "Пригласить через Email",
+    "email-invite": "Пригласить по электронной почте",
     "email-invite-subject": "__inviter__ прислал вам приглашение",
     "email-invite-subject": "__inviter__ прислал вам приглашение",
-    "email-invite-text": "Дорогой __user__,\n\n__inviter__ пригласил вас на доску \"__board__\" для сотрудничества.\n\nПожайлуйста проследуйте по ссылке:\n\n__url__\n\nСпасибо.",
+    "email-invite-text": "Дорогой __user__,\n\n__inviter__ пригласил вас присоединиться к доске \"__board__\" для сотрудничества.\n\nПожайлуйста проследуйте по ссылке ниже:\n\n__url__\n\nСпасибо.",
     "email-resetPassword-subject": "Перейдите по ссылке, чтобы сбросить пароль __url__",
     "email-resetPassword-subject": "Перейдите по ссылке, чтобы сбросить пароль __url__",
-    "email-resetPassword-text": "Привет __user__,\n\nДля сброса пароля перейдите по ссылке.\n\n__url__\n\nThanks.",
-    "email-sent": "Email отправлен",
-    "email-verifyEmail-subject": "Подтвердите Email перейдя по ссылке __url__",
-    "email-verifyEmail-text": "Привет __user__,\n\nДля подтверждения Email перейдите по ссылке.\n\n__url__\n\nСпасибо.",
+    "email-resetPassword-text": "Привет __user__,\n\nДля сброса пароля перейдите по ссылке ниже.\n\n__url__\n\nThanks.",
+    "email-sent": "Письмо отправлено",
+    "email-verifyEmail-subject": "Подтвердите вашу эл.почту перейдя по ссылке __url__",
+    "email-verifyEmail-text": "Привет __user__,\n\nДля подтверждения вашей электронной почты перейдите по ссылке ниже.\n\n__url__\n\nСпасибо.",
     "error-board-doesNotExist": "Доска не найдена",
     "error-board-doesNotExist": "Доска не найдена",
-    "error-board-notAdmin": "Вы должны обладать правами админстратора, чтобы сделать это",
+    "error-board-notAdmin": "Вы должны обладать правами администратора этой доски, чтобы сделать это",
     "error-board-notAMember": "Вы должны быть пользователем доски, чтобы сделать это",
     "error-board-notAMember": "Вы должны быть пользователем доски, чтобы сделать это",
-    "error-json-malformed": "Ваше текст не является JSON",
+    "error-json-malformed": "Ваше текст не является правильным JSON",
     "error-json-schema": "Содержимое вашего JSON не содержит информацию в корректном формате",
     "error-json-schema": "Содержимое вашего JSON не содержит информацию в корректном формате",
     "error-list-doesNotExist": "Список не найден",
     "error-list-doesNotExist": "Список не найден",
     "error-user-doesNotExist": "Пользователь не найден",
     "error-user-doesNotExist": "Пользователь не найден",
     "error-user-notAllowSelf": "Вы не можете пригласить себя",
     "error-user-notAllowSelf": "Вы не можете пригласить себя",
     "error-user-notCreated": "Пользователь не создан",
     "error-user-notCreated": "Пользователь не создан",
-    "error-username-taken": "Этот пользователь уже существует",
+    "error-username-taken": "Это имя пользователя уже занято",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Экспортировать доску",
     "export-board": "Экспортировать доску",
     "filter": "Фильтр",
     "filter": "Фильтр",
     "filter-cards": "Фильтр карточек",
     "filter-cards": "Фильтр карточек",
     "filter-clear": "Очистить фильтр",
     "filter-clear": "Очистить фильтр",
     "filter-no-label": "Нет метки",
     "filter-no-label": "Нет метки",
     "filter-no-member": "Нет пользователей",
     "filter-no-member": "Нет пользователей",
-    "filter-on": "Filter is on",
+    "filter-on": "Включен фильтр",
     "filter-on-desc": "Показываются карточки, соответствующие настройкам фильтра. Нажмите для редактирования.",
     "filter-on-desc": "Показываются карточки, соответствующие настройкам фильтра. Нажмите для редактирования.",
     "filter-to-selection": "Filter to selection",
     "filter-to-selection": "Filter to selection",
     "fullname": "Полное имя",
     "fullname": "Полное имя",
@@ -210,7 +211,7 @@
     "import-board-c": "Импортировать доску",
     "import-board-c": "Импортировать доску",
     "import-board-title-trello": "Импортировать доску из Trello",
     "import-board-title-trello": "Импортировать доску из Trello",
     "import-board-title-wekan": "Импортировать доску с Wekan",
     "import-board-title-wekan": "Импортировать доску с Wekan",
-    "import-sandstorm-warning": "Imported board will delete all existing data on board and replace it with imported board.",
+    "import-sandstorm-warning": "Импортированная доска удалит все существующие данные на доске и заменит ее доской.",
     "from-trello": "Из Trello",
     "from-trello": "Из Trello",
     "from-wekan": "Их Wekan",
     "from-wekan": "Их Wekan",
     "import-board-instruction-trello": "На вашей Trello доске нажмите “Menu” - “More” - “Print and export - “Export JSON” и скопируйте полученный текст",
     "import-board-instruction-trello": "На вашей Trello доске нажмите “Menu” - “More” - “Print and export - “Export JSON” и скопируйте полученный текст",
@@ -218,17 +219,17 @@
     "import-json-placeholder": "Вставьте JSON сюда",
     "import-json-placeholder": "Вставьте JSON сюда",
     "import-map-members": "Карта пользователей",
     "import-map-members": "Карта пользователей",
     "import-members-map": "Вы ипортировали доску с пользователями. Пожалуйста, составьте карту пользователей, которых вы хотите импортировать в Wekan пользователей",
     "import-members-map": "Вы ипортировали доску с пользователями. Пожалуйста, составьте карту пользователей, которых вы хотите импортировать в Wekan пользователей",
-    "import-show-user-mapping": "Пересмотреть карту пользователей",
+    "import-show-user-mapping": "Проверить карту пользователей",
     "import-user-select": "Выберите Wekan-пользователя, которого вы хотите использовать в качестве пользователя",
     "import-user-select": "Выберите Wekan-пользователя, которого вы хотите использовать в качестве пользователя",
     "importMapMembersAddPopup-title": "Выбрать Wekan пользователя",
     "importMapMembersAddPopup-title": "Выбрать Wekan пользователя",
-    "info": "Version",
+    "info": "Версия",
     "initials": "Инициалы",
     "initials": "Инициалы",
     "invalid-date": "Неверная дата",
     "invalid-date": "Неверная дата",
     "joined": "вступил",
     "joined": "вступил",
     "just-invited": "Вы только пригласили на эту доску",
     "just-invited": "Вы только пригласили на эту доску",
     "keyboard-shortcuts": "Сочетания клавиш",
     "keyboard-shortcuts": "Сочетания клавиш",
     "label-create": "Создать метку",
     "label-create": "Создать метку",
-    "label-default": "%s",
+    "label-default": "%sметка (по умолчанию)",
     "label-delete-pop": "Это действие невозможно будет отменить. Метка будет удалена во всех карточках.",
     "label-delete-pop": "Это действие невозможно будет отменить. Метка будет удалена во всех карточках.",
     "labels": "Метки",
     "labels": "Метки",
     "language": "Язык",
     "language": "Язык",
@@ -366,18 +367,22 @@
     "error-notAuthorized": "У вас нет доступа на просмотр этой страницы.",
     "error-notAuthorized": "У вас нет доступа на просмотр этой страницы.",
     "outgoing-webhooks": "Исходящие Веб-хуки",
     "outgoing-webhooks": "Исходящие Веб-хуки",
     "outgoingWebhooksPopup-title": "Исходящие Веб-хуки",
     "outgoingWebhooksPopup-title": "Исходящие Веб-хуки",
-    "Wekan_version": "Wekan version",
-    "Node_version": "Node version",
-    "OS_Arch": "OS Arch",
-    "OS_Cpus": "OS CPU Count",
-    "OS_Freemem": "OS Free Memory",
-    "OS_Loadavg": "OS Load Average",
-    "OS_Platform": "OS Platform",
-    "OS_Release": "OS Release",
-    "OS_Totalmem": "OS Total Memory",
-    "OS_Type": "OS Type",
-    "OS_Uptime": "OS Uptime",
-    "hours": "hours",
-    "minutes": "minutes",
-    "seconds": "seconds"
+    "Wekan_version": "Версия Wekan",
+    "Node_version": "Версия NodeJS",
+    "OS_Arch": "Архитектура",
+    "OS_Cpus": "Количество процессоров",
+    "OS_Freemem": "Свободная память",
+    "OS_Loadavg": "Средняя загрузка",
+    "OS_Platform": "Платформа",
+    "OS_Release": "Релиз",
+    "OS_Totalmem": "Общая память",
+    "OS_Type": "Тип ОС",
+    "OS_Uptime": "Время работы",
+    "hours": "часы",
+    "minutes": "минуты",
+    "seconds": "секунды",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/sr.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notCreated": "This user is not created",
     "error-user-notCreated": "This user is not created",
     "error-username-taken": "Korisničko ime je već zauzeto",
     "error-username-taken": "Korisničko ime je već zauzeto",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Export board",
     "export-board": "Export board",
     "filter": "Filter",
     "filter": "Filter",
     "filter-cards": "Filter Cards",
     "filter-cards": "Filter Cards",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/sv.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "Du kan inte bjuda in dig själv",
     "error-user-notAllowSelf": "Du kan inte bjuda in dig själv",
     "error-user-notCreated": "Den här användaren har inte skapats",
     "error-user-notCreated": "Den här användaren har inte skapats",
     "error-username-taken": "Detta användarnamn är redan taget",
     "error-username-taken": "Detta användarnamn är redan taget",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Exportera anslagstavla",
     "export-board": "Exportera anslagstavla",
     "filter": "Filtrera",
     "filter": "Filtrera",
     "filter-cards": "Filtrera kort",
     "filter-cards": "Filtrera kort",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/ta.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notCreated": "This user is not created",
     "error-user-notCreated": "This user is not created",
     "error-username-taken": "This username is already taken",
     "error-username-taken": "This username is already taken",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Export board",
     "export-board": "Export board",
     "filter": "Filter",
     "filter": "Filter",
     "filter-cards": "Filter Cards",
     "filter-cards": "Filter Cards",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/th.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notCreated": "ผู้ใช้รายนี้ไม่ได้สร้าง",
     "error-user-notCreated": "ผู้ใช้รายนี้ไม่ได้สร้าง",
     "error-username-taken": "ชื่อนี้ถูกใช้งานแล้ว",
     "error-username-taken": "ชื่อนี้ถูกใช้งานแล้ว",
+    "error-email-taken": "Email has already been taken",
     "export-board": "ส่งออกกระดาน",
     "export-board": "ส่งออกกระดาน",
     "filter": "กรอง",
     "filter": "กรอง",
     "filter-cards": "กรองการ์ด",
     "filter-cards": "กรองการ์ด",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/tr.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "Kendi kendini davet edemezsin",
     "error-user-notAllowSelf": "Kendi kendini davet edemezsin",
     "error-user-notCreated": "Bu üye oluşturulmadı",
     "error-user-notCreated": "Bu üye oluşturulmadı",
     "error-username-taken": "Kullanıcı adı zaten alınmış",
     "error-username-taken": "Kullanıcı adı zaten alınmış",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Panoyu dışarı aktar",
     "export-board": "Panoyu dışarı aktar",
     "filter": "Filtre",
     "filter": "Filtre",
     "filter-cards": "Kartları Filtrele",
     "filter-cards": "Kartları Filtrele",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/uk.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notCreated": "This user is not created",
     "error-user-notCreated": "This user is not created",
     "error-username-taken": "This username is already taken",
     "error-username-taken": "This username is already taken",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Export board",
     "export-board": "Export board",
     "filter": "Filter",
     "filter": "Filter",
     "filter-cards": "Filter Cards",
     "filter-cards": "Filter Cards",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/vi.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notAllowSelf": "You can not invite yourself",
     "error-user-notCreated": "This user is not created",
     "error-user-notCreated": "This user is not created",
     "error-username-taken": "This username is already taken",
     "error-username-taken": "This username is already taken",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Export board",
     "export-board": "Export board",
     "filter": "Filter",
     "filter": "Filter",
     "filter-cards": "Filter Cards",
     "filter-cards": "Filter Cards",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/zh-CN.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "无法邀请自己",
     "error-user-notAllowSelf": "无法邀请自己",
     "error-user-notCreated": "该用户未能成功创建",
     "error-user-notCreated": "该用户未能成功创建",
     "error-username-taken": "此用户名已存在",
     "error-username-taken": "此用户名已存在",
+    "error-email-taken": "Email has already been taken",
     "export-board": "导出看板",
     "export-board": "导出看板",
     "filter": "过滤",
     "filter": "过滤",
     "filter-cards": "过滤卡片",
     "filter-cards": "过滤卡片",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 6 - 1
i18n/zh-TW.i18n.json

@@ -191,6 +191,7 @@
     "error-user-notAllowSelf": "不允許對自己執行此操作",
     "error-user-notAllowSelf": "不允許對自己執行此操作",
     "error-user-notCreated": "該使用者未能成功建立",
     "error-user-notCreated": "該使用者未能成功建立",
     "error-username-taken": "這個使用者名稱已被使用",
     "error-username-taken": "這個使用者名稱已被使用",
+    "error-email-taken": "Email has already been taken",
     "export-board": "Export board",
     "export-board": "Export board",
     "filter": "過濾",
     "filter": "過濾",
     "filter-cards": "過濾卡片",
     "filter-cards": "過濾卡片",
@@ -379,5 +380,9 @@
     "OS_Uptime": "OS Uptime",
     "OS_Uptime": "OS Uptime",
     "hours": "hours",
     "hours": "hours",
     "minutes": "minutes",
     "minutes": "minutes",
-    "seconds": "seconds"
+    "seconds": "seconds",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change"
 }
 }

+ 33 - 0
models/accountSettings.js

@@ -0,0 +1,33 @@
+AccountSettings = new Mongo.Collection('accountSettings');
+
+AccountSettings.attachSchema(new SimpleSchema({
+  _id: {
+    type: String,
+  },
+  booleanValue: {
+    type: Boolean,
+    optional: true,
+  },
+  sort: {
+    type: Number,
+    decimal: true,
+  },
+}));
+
+AccountSettings.allow({
+  update(userId) {
+    const user = Users.findOne(userId);
+    return user && user.isAdmin;
+  },
+});
+
+if (Meteor.isServer) {
+  Meteor.startup(() => {
+    AccountSettings.upsert({ _id: 'accounts-allowEmailChange' }, {
+      $setOnInsert: {
+        booleanValue: false,
+        sort: 0,
+      },
+    });
+  });
+}

+ 22 - 0
models/users.js

@@ -334,6 +334,28 @@ Meteor.methods({
     check(limit, Number);
     check(limit, Number);
     Meteor.user().setShowCardsCountAt(limit);
     Meteor.user().setShowCardsCountAt(limit);
   },
   },
+  setEmail(email) {
+    check(email, String);
+    const existingUser = Users.findOne({ 'emails.address': email }, { fields: { _id: 1 } });
+    if (existingUser) {
+      throw new Meteor.Error('email-already-taken');
+    } else {
+      Users.update(this.userId, {
+        $set: {
+          emails: [{
+            address: email,
+            verified: false,
+          }],
+        },
+      });
+    }
+  },
+  setUsernameAndEmail(username, email) {
+    check(username, String);
+    check(email, String);
+    Meteor.call('setUsername', username);
+    Meteor.call('setEmail', email);
+  },
 });
 });
 
 
 if (Meteor.isServer) {
 if (Meteor.isServer) {

+ 3 - 0
server/publications/accountSettings.js

@@ -0,0 +1,3 @@
+Meteor.publish('accountSettings', function() {
+  return AccountSettings.find();
+});