ソースを参照

Merge branch 'master' of https://github.com/wekan/wekan

John Supplee 3 年 前
コミット
506cb696d3
93 ファイル変更1665 行追加105 行削除
  1. 1 1
      .tx/config
  2. 41 0
      CHANGELOG.md
  3. 3 2
      Dockerfile
  4. 1 1
      Stackerfile.yml
  5. 42 6
      client/components/boards/boardsList.js
  6. 29 1
      client/components/cards/cardDetails.js
  7. 32 0
      client/components/cards/checklists.jade
  8. 46 0
      client/components/cards/checklists.js
  9. 2 1
      client/components/cards/checklists.styl
  10. 2 0
      client/components/main/layouts.js
  11. 2 0
      client/components/users/userHeader.js
  12. 40 9
      docker-compose.yml
  13. 1 0
      i18n/ar-EG.i18n.json
  14. 1 0
      i18n/ar.i18n.json
  15. 1 0
      i18n/bg.i18n.json
  16. 1 0
      i18n/br.i18n.json
  17. 1 0
      i18n/ca.i18n.json
  18. 1 0
      i18n/cs.i18n.json
  19. 1 0
      i18n/da.i18n.json
  20. 1 0
      i18n/de-CH.i18n.json
  21. 1 0
      i18n/de.i18n.json
  22. 1 0
      i18n/el.i18n.json
  23. 1 0
      i18n/en-GB.i18n.json
  24. 1063 0
      i18n/en-IT.i18n.json
  25. 1 0
      i18n/en.i18n.json
  26. 1 0
      i18n/eo.i18n.json
  27. 1 0
      i18n/es-AR.i18n.json
  28. 1 0
      i18n/es-CL.i18n.json
  29. 1 0
      i18n/es-LA.i18n.json
  30. 1 0
      i18n/es-MX.i18n.json
  31. 1 0
      i18n/es-PE.i18n.json
  32. 1 0
      i18n/es-PY.i18n.json
  33. 1 0
      i18n/es.i18n.json
  34. 1 0
      i18n/eu.i18n.json
  35. 1 0
      i18n/fa-IR.i18n.json
  36. 1 0
      i18n/fa.i18n.json
  37. 1 0
      i18n/fi.i18n.json
  38. 1 0
      i18n/fr.i18n.json
  39. 1 0
      i18n/gl.i18n.json
  40. 1 0
      i18n/he.i18n.json
  41. 1 0
      i18n/hi.i18n.json
  42. 1 0
      i18n/hr.i18n.json
  43. 1 0
      i18n/hu.i18n.json
  44. 1 0
      i18n/hy.i18n.json
  45. 1 0
      i18n/id.i18n.json
  46. 1 0
      i18n/ig.i18n.json
  47. 4 3
      i18n/it.i18n.json
  48. 1 0
      i18n/ja.i18n.json
  49. 1 0
      i18n/ka.i18n.json
  50. 1 0
      i18n/km.i18n.json
  51. 1 0
      i18n/ko.i18n.json
  52. 1 0
      i18n/lt.i18n.json
  53. 1 0
      i18n/lv.i18n.json
  54. 1 0
      i18n/mk.i18n.json
  55. 1 0
      i18n/mn.i18n.json
  56. 1 0
      i18n/nb.i18n.json
  57. 1 0
      i18n/nl.i18n.json
  58. 1 0
      i18n/oc.i18n.json
  59. 1 0
      i18n/pa.i18n.json
  60. 1 0
      i18n/pl.i18n.json
  61. 1 0
      i18n/pt-BR.i18n.json
  62. 1 0
      i18n/pt.i18n.json
  63. 1 0
      i18n/ro.i18n.json
  64. 1 0
      i18n/ru.i18n.json
  65. 1 0
      i18n/sk.i18n.json
  66. 1 0
      i18n/sl.i18n.json
  67. 1 0
      i18n/sr.i18n.json
  68. 1 0
      i18n/sv.i18n.json
  69. 1 0
      i18n/sw.i18n.json
  70. 1 0
      i18n/ta.i18n.json
  71. 1 0
      i18n/th.i18n.json
  72. 1 0
      i18n/tr.i18n.json
  73. 1 0
      i18n/uk.i18n.json
  74. 1 0
      i18n/vi.i18n.json
  75. 32 31
      i18n/zh-CN.i18n.json
  76. 1 0
      i18n/zh-HK.i18n.json
  77. 1 0
      i18n/zh-TW.i18n.json
  78. 15 11
      models/wekanCreator.js
  79. 1 1
      package-lock.json
  80. 1 1
      package.json
  81. 11 2
      packages/wekan-ldap/server/ldap.js
  82. 3 3
      public/api/wekan.html
  83. 1 1
      public/api/wekan.yml
  84. 3 0
      releases/translations/pull-translations.sh
  85. 2 2
      sandstorm-pkgdef.capnp
  86. 27 3
      server/publications/boards.js
  87. 4 0
      server/publications/users.js
  88. 0 0
      snap-src/bin/config
  89. 14 7
      snap-src/bin/wekan-help
  90. 1 1
      snapcraft.yaml
  91. 38 10
      start-wekan.bat
  92. 107 7
      start-wekan.sh
  93. 35 1
      torodb-postgresql/docker-compose.yml

+ 1 - 1
.tx/config

@@ -39,7 +39,7 @@ host = https://www.transifex.com
 # tap:i18n requires us to use `-` separator in the language identifiers whereas
 # tap:i18n requires us to use `-` separator in the language identifiers whereas
 # Transifex uses a `_` separator, without an option to customize it on one side
 # Transifex uses a `_` separator, without an option to customize it on one side
 # or the other, so we need to do a Manual mapping.
 # or the other, so we need to do a Manual mapping.
-lang_map = ar_EG:ar-EG, bg_BG:bg, de_CH:de-CH, en_GB:en-GB, es_AR:es-AR, es_CL:es-CL, es_419:es-LA, es_PE:es-PE, es_MX:es-MX, es_TX:es-TX, es_PY:es-PY, el_GR:el, fa_IR:fa-IR, fi_FI:fi, hu_HU:hu, id_ID:id, mn_MN:mn, lv_LV:lv, pt_BR:pt-BR, ro_RO:ro, sl_SI:sl, zh_CN:zh-CN, zh_TW:zh-TW, zh_HK:zh-HK
+lang_map = ar_EG:ar-EG, bg_BG:bg, de_CH:de-CH, en_IT:en-IT, en_GB:en-GB, es_AR:es-AR, es_CL:es-CL, es_419:es-LA, es_PE:es-PE, es_MX:es-MX, es_TX:es-TX, es_PY:es-PY, el_GR:el, fa_IR:fa-IR, fi_FI:fi, hu_HU:hu, id_ID:id, mn_MN:mn, lv_LV:lv, pt_BR:pt-BR, ro_RO:ro, sl_SI:sl, zh_CN:zh-CN, zh_TW:zh-TW, zh_HK:zh-HK
 
 
 [wekan.application]
 [wekan.application]
 file_filter = i18n/<lang>.i18n.json
 file_filter = i18n/<lang>.i18n.json

+ 41 - 0
CHANGELOG.md

@@ -3,6 +3,47 @@
 Note: With Docker, please don't use latest tag. Only use release tags.
 Note: With Docker, please don't use latest tag. Only use release tags.
 See https://github.com/wekan/wekan/issues/3874
 See https://github.com/wekan/wekan/issues/3874
 
 
+# Upcoming Wekan release
+
+This release fixes the following bugs:
+
+- [Fixed Wekan JSON import fails](https://github.com/wekan/wekan/commit/0fa8fc8b506831a60649d100ce93c96f8f7b76f5).
+  Thanks to BartoszBroda and xet7.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v5.40 2021-07-25 Wekan release
+
+This release fixes the following bugs:
+
+- [Fixed Delete of Planning Poker doesn't work](https://github.com/wekan/wekan/commit/18b6381d790848062752b211d48c84a2de268bd0).
+  Thanks to xet7.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v5.39 2021-07-24 Wekan release
+
+This release adds the following new features:
+
+- [LDAP AD Simple Auth](https://github.com/wekan/wekan/pull/3909).
+  Thanks to indika-dev.
+- [LDAP AD Simple Auth: Added settings for all remaining Wekan Standalone (non-Sandstorm)
+  platforms](https://github.com/wekan/wekan/commit/fe40f35d6d9b6293f3bdbf5bc0f3e8e708c59518)
+  and Docs to https://github.com/wekan/wekan/wiki/LDAP-AD-Simple-Auth .
+  Thanks to xet7.
+- [Convert Checklist Item to Card](https://github.com/wekan/wekan/pull/3910).
+  Thanks to helioguardabaxo.
+- [Organizations and Teams are taken into account when displaying board at
+  `All Boards` page](https://github.com/wekan/wekan/pull/3912).
+  Thanks to Emile840.
+
+and adds the following new translations:
+
+- [English (Italy)](https://github.com/wekan/wekan/commit/ae73029dda63db361925e378202e6f8c137cf5bd).
+  Thanks to translators.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
 # v5.38 2021-07-18 Wekan release
 # v5.38 2021-07-18 Wekan release
 
 
 This release adds the following new features:
 This release adds the following new features:

+ 3 - 2
Dockerfile

@@ -64,6 +64,9 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-
     LDAP_ENABLE=false \
     LDAP_ENABLE=false \
     LDAP_PORT=389 \
     LDAP_PORT=389 \
     LDAP_HOST="" \
     LDAP_HOST="" \
+    LDAP_AD_SIMPLE_AUTH="" \
+    LDAP_USER_AUTHENTICATION=false \
+    LDAP_USER_AUTHENTICATION_FIELD=uid \
     LDAP_BASEDN="" \
     LDAP_BASEDN="" \
     LDAP_LOGIN_FALLBACK=false \
     LDAP_LOGIN_FALLBACK=false \
     LDAP_RECONNECT=true \
     LDAP_RECONNECT=true \
@@ -81,8 +84,6 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-
     LDAP_ENCRYPTION=false \
     LDAP_ENCRYPTION=false \
     LDAP_CA_CERT="" \
     LDAP_CA_CERT="" \
     LDAP_REJECT_UNAUTHORIZED=false \
     LDAP_REJECT_UNAUTHORIZED=false \
-    LDAP_USER_AUTHENTICATION=false \
-    LDAP_USER_AUTHENTICATION_FIELD=uid \
     LDAP_USER_SEARCH_FILTER="" \
     LDAP_USER_SEARCH_FILTER="" \
     LDAP_USER_SEARCH_SCOPE="" \
     LDAP_USER_SEARCH_SCOPE="" \
     LDAP_USER_SEARCH_FIELD="" \
     LDAP_USER_SEARCH_FIELD="" \

+ 1 - 1
Stackerfile.yml

@@ -1,5 +1,5 @@
 appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
 appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
-appVersion: "v5.38.0"
+appVersion: "v5.40.0"
 files:
 files:
   userUploads:
   userUploads:
     - README.md
     - README.md

+ 42 - 6
client/components/boards/boardsList.js

@@ -87,16 +87,52 @@ BlazeComponent.extendComponent({
 
 
   boards() {
   boards() {
     const query = {
     const query = {
-      archived: false,
-      //type: { $in: ['board','template-container'] },
-      type: 'board',
+      //archived: false,
+      ////type: { $in: ['board','template-container'] },
+      //type: 'board',
+      $and: [
+        { archived: false },
+        { type: 'board' },
+        { $or:[] }
+      ]
     };
     };
-    if (FlowRouter.getRouteName() === 'home')
-      query['members.userId'] = Meteor.userId();
+    if (FlowRouter.getRouteName() === 'home'){
+      query.$and[2].$or.push({'members.userId': Meteor.userId()});
+
+      const currUser = Users.findOne(Meteor.userId());
+
+      // const currUser = Users.findOne(Meteor.userId(), {
+      //   fields: {
+      //     orgs: 1,
+      //     teams: 1,
+      //   },
+      // });
+
+      let orgIdsUserBelongs = currUser.teams !== 'undefined' ? currUser.orgIdsUserBelongs() : '';
+      if(orgIdsUserBelongs && orgIdsUserBelongs != ''){
+        let orgsIds = orgIdsUserBelongs.split(',');
+        // for(let i = 0; i < orgsIds.length; i++){
+        //   query.$and[2].$or.push({'orgs.orgId': orgsIds[i]});
+        // }
+
+        //query.$and[2].$or.push({'orgs': {$elemMatch : {orgId: orgsIds[0]}}});
+        query.$and[2].$or.push({'orgs.orgId': {$in : orgsIds}});
+      }
+
+      let teamIdsUserBelongs = currUser.teams !== 'undefined' ? currUser.teamIdsUserBelongs() : '';
+      if(teamIdsUserBelongs && teamIdsUserBelongs != ''){
+        let teamsIds = teamIdsUserBelongs.split(',');
+        // for(let i = 0; i < teamsIds.length; i++){
+        //   query.$or[2].$or.push({'teams.teamId': teamsIds[i]});
+        // }
+        //query.$and[2].$or.push({'teams': { $elemMatch : {teamId: teamsIds[0]}}});
+        query.$and[2].$or.push({'teams.teamId': {$in : teamsIds}});
+      }
+    }
     else query.permission = 'public';
     else query.permission = 'public';
 
 
     return Boards.find(query, {
     return Boards.find(query, {
-      sort: { sort: 1 /* boards default sorting */ },
+      //sort: { sort: 1 /* boards default sorting */ },
     });
     });
   },
   },
   isStarred() {
   isStarred() {

+ 29 - 1
client/components/cards/cardDetails.js

@@ -627,6 +627,7 @@ Template.cardDetailsActionsPopup.events({
   'click .js-spent-time': Popup.open('editCardSpentTime'),
   'click .js-spent-time': Popup.open('editCardSpentTime'),
   'click .js-move-card': Popup.open('moveCard'),
   'click .js-move-card': Popup.open('moveCard'),
   'click .js-copy-card': Popup.open('copyCard'),
   'click .js-copy-card': Popup.open('copyCard'),
+  'click .js-convert-checklist-item-to-card': Popup.open('convertChecklistItemToCard'),
   'click .js-copy-checklist-cards': Popup.open('copyChecklistToManyCards'),
   'click .js-copy-checklist-cards': Popup.open('copyChecklistToManyCards'),
   'click .js-set-card-color': Popup.open('setCardColor'),
   'click .js-set-card-color': Popup.open('setCardColor'),
   'click .js-move-card-to-top'(event) {
   'click .js-move-card-to-top'(event) {
@@ -791,6 +792,34 @@ Template.copyCardPopup.events({
   },
   },
 });
 });
 
 
+Template.convertChecklistItemToCardPopup.events({
+  'click .js-done'() {
+    const card = Cards.findOne(Session.get('currentCard'));
+    const lSelect = $('.js-select-lists')[0];
+    const listId = lSelect.options[lSelect.selectedIndex].value;
+    const slSelect = $('.js-select-swimlanes')[0];
+    const swimlaneId = slSelect.options[slSelect.selectedIndex].value;
+    const bSelect = $('.js-select-boards')[0];
+    const boardId = bSelect.options[bSelect.selectedIndex].value;
+    const textarea = $('#copy-card-title');
+    const title = textarea.val().trim();
+
+    if (title) {
+      const _id = Cards.insert({
+        title: title,
+        listId: listId,
+        boardId: boardId,
+        swimlaneId: swimlaneId,
+        sort: 0,
+      });
+      Filter.addException(_id);
+
+      Popup.close();
+
+    }
+  },
+});
+
 Template.copyChecklistToManyCardsPopup.events({
 Template.copyChecklistToManyCardsPopup.events({
   'click .js-done'() {
   'click .js-done'() {
     const card = Cards.findOne(Session.get('currentCard'));
     const card = Cards.findOne(Session.get('currentCard'));
@@ -1297,7 +1326,6 @@ BlazeComponent.extendComponent({
           Popup.close();
           Popup.close();
         },
         },
         'click .js-remove-poker': Popup.afterConfirm('deletePoker', (event) => {
         'click .js-remove-poker': Popup.afterConfirm('deletePoker', (event) => {
-          event.preventDefault();
           this.currentCard.unsetPoker();
           this.currentCard.unsetPoker();
           Popup.close();
           Popup.close();
         }),
         }),

+ 32 - 0
client/components/cards/checklists.jade

@@ -80,6 +80,9 @@ template(name="editChecklistItemForm")
     span(title=createdAt) {{ moment createdAt }}
     span(title=createdAt) {{ moment createdAt }}
     if canModifyCard
     if canModifyCard
       a.js-delete-checklist-item {{_ "delete"}}...
       a.js-delete-checklist-item {{_ "delete"}}...
+      a.js-convert-checklist-item-to-card
+        i.fa.fa-copy
+        | {{_ 'convertChecklistItemToCardPopup-title'}}
 
 
 template(name="checklistItems")
 template(name="checklistItems")
   .checklist-items.js-checklist-items
   .checklist-items.js-checklist-items
@@ -110,3 +113,32 @@ template(name='checklistItemDetail')
       .item-title(class="{{#if item.isFinished }}is-checked{{/if}}")
       .item-title(class="{{#if item.isFinished }}is-checked{{/if}}")
         +viewer
         +viewer
           = item.title
           = item.title
+
+template(name="convertChecklistItemToCardPopup")
+  label(for='convert-checklist-item-to-card-title') {{_ 'title'}}:
+  textarea#copy-card-title.minicard-composer-textarea.js-card-title(autofocus)
+    = item.title
+  +boardsSwimlanesAndLists
+
+template(name="boardsSwimlanesAndLists")
+  unless currentUser.isWorker
+    label {{_ 'boards'}}:
+    select.js-select-boards(autofocus)
+      each boards
+        if $eq _id currentBoard._id
+          option(value="{{_id}}" selected) {{_ 'current'}}
+        else
+          option(value="{{_id}}") {{title}}
+
+  label {{_ 'swimlanes'}}:
+  select.js-select-swimlanes
+    each swimlanes
+      option(value="{{_id}}") {{title}}
+
+  label {{_ 'lists'}}:
+  select.js-select-lists
+    each aBoardLists
+      option(value="{{_id}}") {{title}}
+
+  .edit-controls.clearfix
+    button.primary.confirm.js-done {{_ 'done'}}

+ 46 - 0
client/components/cards/checklists.js

@@ -1,3 +1,7 @@
+import Cards from '/models/cards';
+import Boards from '/models/boards';
+
+const subManager = new SubsManager();
 const { calculateIndexData, capitalize } = Utils;
 const { calculateIndexData, capitalize } = Utils;
 
 
 function initSorting(items) {
 function initSorting(items) {
@@ -206,6 +210,7 @@ BlazeComponent.extendComponent({
         'submit .js-edit-checklist-title': this.editChecklist,
         'submit .js-edit-checklist-title': this.editChecklist,
         'submit .js-add-checklist-item': this.addChecklistItem,
         'submit .js-add-checklist-item': this.addChecklistItem,
         'submit .js-edit-checklist-item': this.editChecklistItem,
         'submit .js-edit-checklist-item': this.editChecklistItem,
+        'click .js-convert-checklist-item-to-card': Popup.open('convertChecklistItemToCard'),
         'click .js-delete-checklist-item': this.deleteItem,
         'click .js-delete-checklist-item': this.deleteItem,
         'click .confirm-checklist-delete': this.deleteChecklist,
         'click .confirm-checklist-delete': this.deleteChecklist,
         'focus .js-add-checklist-item': this.focusChecklistItem,
         'focus .js-add-checklist-item': this.focusChecklistItem,
@@ -215,6 +220,47 @@ BlazeComponent.extendComponent({
   },
   },
 }).register('checklists');
 }).register('checklists');
 
 
+BlazeComponent.extendComponent({
+  onCreated() {
+    subManager.subscribe('board', Session.get('currentBoard'), false);
+    this.selectedBoardId = new ReactiveVar(Session.get('currentBoard'));
+  },
+
+  boards() {
+    return Boards.find(
+      {
+        archived: false,
+        'members.userId': Meteor.userId(),
+        _id: { $ne: Meteor.user().getTemplatesBoardId() },
+      },
+      {
+        sort: { sort: 1 /* boards default sorting */ },
+      },
+    );
+  },
+
+  swimlanes() {
+    const board = Boards.findOne(this.selectedBoardId.get());
+    return board.swimlanes();
+  },
+
+  aBoardLists() {
+    const board = Boards.findOne(this.selectedBoardId.get());
+    return board.lists();
+  },
+
+  events() {
+    return [
+      {
+        'change .js-select-boards'(event) {
+          this.selectedBoardId.set($(event.currentTarget).val());
+          subManager.subscribe('board', this.selectedBoardId.get(), false);
+        },
+      },
+    ];
+  },
+}).register('boardsSwimlanesAndLists');
+
 Template.checklists.helpers({
 Template.checklists.helpers({
   hideCheckedItems() {
   hideCheckedItems() {
     const currentUser = Meteor.user();
     const currentUser = Meteor.user();

+ 2 - 1
client/components/cards/checklists.styl

@@ -159,7 +159,8 @@ textarea.js-add-checklist-item, textarea.js-edit-checklist-item
     padding-top: 2px
     padding-top: 2px
     padding-right: 10px;
     padding-right: 10px;
 
 
-.js-delete-checklist-item
+.js-delete-checklist-item,
+.js-convert-checklist-item-to-card
   margin: 0 0 0.5em 1.33em
   margin: 0 0 0.5em 1.33em
   @extends .delete-text
   @extends .delete-text
   padding: 12px 0 0 0
   padding: 12px 0 0 0

+ 2 - 0
client/components/main/layouts.js

@@ -92,6 +92,8 @@ Template.userFormsLayout.helpers({
         name = 'Latviešu';
         name = 'Latviešu';
       } else if (lang.name === 'latviešu valoda') {
       } else if (lang.name === 'latviešu valoda') {
         name = 'Latviešu';
         name = 'Latviešu';
+      } else if (lang.name === 'en-IT') {
+        name = 'English (Italy)';
       } else if (lang.name === 'Español') {
       } else if (lang.name === 'Español') {
         name = 'español';
         name = 'español';
       } else if (lang.name === 'es_419') {
       } else if (lang.name === 'es_419') {

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

@@ -186,6 +186,8 @@ Template.changeLanguagePopup.helpers({
         name = 'Latviešu';
         name = 'Latviešu';
       } else if (lang.name === 'latviešu valoda') {
       } else if (lang.name === 'latviešu valoda') {
         name = 'Latviešu';
         name = 'Latviešu';
+      } else if (lang.name === 'en-IT') {
+        name = 'English (Italy)';
       } else if (lang.name === 'Español') {
       } else if (lang.name === 'Español') {
         name = 'español';
         name = 'español';
       } else if (lang.name === 'es_419') {
       } else if (lang.name === 'es_419') {

+ 40 - 9
docker-compose.yml

@@ -440,9 +440,47 @@ services:
       # The host server for the LDAP server
       # The host server for the LDAP server
       #- LDAP_HOST=localhost
       #- LDAP_HOST=localhost
       #
       #
+      #-----------------------------------------------------------------
+      # ==== LDAP AD Simple Auth ====
+      #
+      # Set to true, if you want to connect with Active Directory by Simple Authentication.
+      # When using AD Simple Auth, LDAP_BASEDN is not needed.
+      #
+      # Example:
+      #- LDAP_AD_SIMPLE_AUTH=true
+      #
+      # === LDAP User Authentication ===
+      #
+      # a) Option to login to the LDAP server with the user's own username and password, instead of
+      #    an administrator key. Default: false (use administrator key).
+      #
+      # b) When using AD Simple Auth, set to true, when login user is used for binding,
+      #    and LDAP_BASEDN is not needed.
+      #
+      # Example:
+      #- LDAP_USER_AUTHENTICATION=true
+      #
+      # Which field is used to find the user for the user authentication. Default: uid.
+      #- LDAP_USER_AUTHENTICATION_FIELD=uid
+      #
+      # === LDAP Default Domain ===
+      #
+      # a) In case AD SimpleAuth is configured, the default domain is appended to the given
+      #    loginname for creating the correct username for the bind request to AD.
+      #
+      # b) The default domain of the ldap it is used to create email if the field is not map
+      #     correctly with the LDAP_SYNC_USER_DATA_FIELDMAP
+      #
+      # Example :
+      #- LDAP_DEFAULT_DOMAIN=mydomain.com
+      #
+      #-----------------------------------------------------------------
+      # ==== LDAP BASEDN Auth ====
+      #
       # The base DN for the LDAP Tree
       # The base DN for the LDAP Tree
       #- LDAP_BASEDN=ou=user,dc=example,dc=org
       #- LDAP_BASEDN=ou=user,dc=example,dc=org
       #
       #
+      #-----------------------------------------------------------------
       # Fallback on the default authentication method
       # Fallback on the default authentication method
       #- LDAP_LOGIN_FALLBACK=false
       #- LDAP_LOGIN_FALLBACK=false
       #
       #
@@ -493,12 +531,6 @@ services:
       # Reject Unauthorized Certificate
       # Reject Unauthorized Certificate
       #- LDAP_REJECT_UNAUTHORIZED=false
       #- LDAP_REJECT_UNAUTHORIZED=false
       #
       #
-      # Option to login to the LDAP server with the user's own username and password, instead of an administrator key. Default: false (use administrator key).
-      #- LDAP_USER_AUTHENTICATION=true
-      #
-      # Which field is used to find the user for the user authentication. Default: uid.
-      #- LDAP_USER_AUTHENTICATION_FIELD=uid
-      #
       # Optional extra LDAP filters. Don't forget the outmost enclosing parentheses if needed
       # Optional extra LDAP filters. Don't forget the outmost enclosing parentheses if needed
       #- LDAP_USER_SEARCH_FILTER=
       #- LDAP_USER_SEARCH_FILTER=
       #
       #
@@ -564,9 +596,8 @@ services:
       #
       #
       #- LDAP_SYNC_GROUP_ROLES=
       #- LDAP_SYNC_GROUP_ROLES=
       #
       #
-      # The default domain of the ldap it is used to create email if the field is not map correctly with the LDAP_SYNC_USER_DATA_FIELDMAP
-      # example :
-      #- LDAP_DEFAULT_DOMAIN=mydomain.com
+      # The default domain of the ldap it is used to create email if the field is not map correctly
+      # with the LDAP_SYNC_USER_DATA_FIELDMAP is defined in setting LDAP_DEFAULT_DOMAIN above.
       #
       #
       # Enable/Disable syncing of admin status based on ldap groups:
       # Enable/Disable syncing of admin status based on ldap groups:
       #- LDAP_SYNC_ADMIN_STATUS=true
       #- LDAP_SYNC_ADMIN_STATUS=true

+ 1 - 0
i18n/ar-EG.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Add Subtask",
     "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-checklist-item": "Add an item to checklist",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Add Cover",
     "add-cover": "Add Cover",
     "add-label": "Add Label",
     "add-label": "Add Label",
     "add-list": "Add List",
     "add-list": "Add List",

+ 1 - 0
i18n/ar.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "إضافة مهمة فرعية",
     "add-subtask": "إضافة مهمة فرعية",
     "add-checklist": "إضافة قائمة تدقيق",
     "add-checklist": "إضافة قائمة تدقيق",
     "add-checklist-item": "إضافة عنصر إلى قائمة التحقق",
     "add-checklist-item": "إضافة عنصر إلى قائمة التحقق",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "إضافة غلاف",
     "add-cover": "إضافة غلاف",
     "add-label": "إضافة ملصق",
     "add-label": "إضافة ملصق",
     "add-list": "إضافة قائمة",
     "add-list": "إضافة قائمة",

+ 1 - 0
i18n/bg.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Добави подзадача",
     "add-subtask": "Добави подзадача",
     "add-checklist": "Добави списък със задачи",
     "add-checklist": "Добави списък със задачи",
     "add-checklist-item": "Добави точка към списъка със задачи",
     "add-checklist-item": "Добави точка към списъка със задачи",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Добави корица",
     "add-cover": "Добави корица",
     "add-label": "Добави етикет",
     "add-label": "Добави етикет",
     "add-list": "Добави списък",
     "add-list": "Добави списък",

+ 1 - 0
i18n/br.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Add Subtask",
     "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-checklist-item": "Add an item to checklist",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Ouzphenn ur golo",
     "add-cover": "Ouzphenn ur golo",
     "add-label": "Add Label",
     "add-label": "Add Label",
     "add-list": "Add List",
     "add-list": "Add List",

+ 1 - 0
i18n/ca.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Afegir Subtasca",
     "add-subtask": "Afegir Subtasca",
     "add-checklist": "Afegeix checklist",
     "add-checklist": "Afegeix checklist",
     "add-checklist-item": "Afegeix un ítem al checklist",
     "add-checklist-item": "Afegeix un ítem al checklist",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Afegeix coberta",
     "add-cover": "Afegeix coberta",
     "add-label": "Afegeix etiqueta",
     "add-label": "Afegeix etiqueta",
     "add-list": "Afegeix llista",
     "add-list": "Afegeix llista",

+ 1 - 0
i18n/cs.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Přidat Podúkol",
     "add-subtask": "Přidat Podúkol",
     "add-checklist": "Přidat zaškrtávací seznam",
     "add-checklist": "Přidat zaškrtávací seznam",
     "add-checklist-item": "Přidat položku do zaškrtávacího seznamu",
     "add-checklist-item": "Přidat položku do zaškrtávacího seznamu",
+    "convertChecklistItemToCardPopup-title": "Převést na kartu",
     "add-cover": "Přidat obal",
     "add-cover": "Přidat obal",
     "add-label": "Přidat štítek",
     "add-label": "Přidat štítek",
     "add-list": "Přidat sloupec",
     "add-list": "Přidat sloupec",

+ 1 - 0
i18n/da.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Tilføj delopgave",
     "add-subtask": "Tilføj delopgave",
     "add-checklist": "Tilføj tjekliste",
     "add-checklist": "Tilføj tjekliste",
     "add-checklist-item": "Tilføj et element til tjeklisten",
     "add-checklist-item": "Tilføj et element til tjeklisten",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Tilføj omslag",
     "add-cover": "Tilføj omslag",
     "add-label": "Tilføj etikette",
     "add-label": "Tilføj etikette",
     "add-list": "Tilføj liste",
     "add-list": "Tilføj liste",

+ 1 - 0
i18n/de-CH.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Teilaufgabe hinzufügen",
     "add-subtask": "Teilaufgabe hinzufügen",
     "add-checklist": "Checkliste hinzufügen",
     "add-checklist": "Checkliste hinzufügen",
     "add-checklist-item": "Element zu Checkliste hinzufügen",
     "add-checklist-item": "Element zu Checkliste hinzufügen",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Cover hinzufügen",
     "add-cover": "Cover hinzufügen",
     "add-label": "Label hinzufügen",
     "add-label": "Label hinzufügen",
     "add-list": "Liste hinzufügen",
     "add-list": "Liste hinzufügen",

+ 1 - 0
i18n/de.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Teilaufgabe hinzufügen",
     "add-subtask": "Teilaufgabe hinzufügen",
     "add-checklist": "Checkliste hinzufügen",
     "add-checklist": "Checkliste hinzufügen",
     "add-checklist-item": "Element zu Checkliste hinzufügen",
     "add-checklist-item": "Element zu Checkliste hinzufügen",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Cover hinzufügen",
     "add-cover": "Cover hinzufügen",
     "add-label": "Label hinzufügen",
     "add-label": "Label hinzufügen",
     "add-list": "Liste hinzufügen",
     "add-list": "Liste hinzufügen",

+ 1 - 0
i18n/el.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Προσθήκη Υποεργασίας",
     "add-subtask": "Προσθήκη Υποεργασίας",
     "add-checklist": "Προσθήκη Λίστας ελέγχου",
     "add-checklist": "Προσθήκη Λίστας ελέγχου",
     "add-checklist-item": "Προσθήκη ενός στοιχείου στη λίστα ελέγχου - checklist",
     "add-checklist-item": "Προσθήκη ενός στοιχείου στη λίστα ελέγχου - checklist",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Add Cover",
     "add-cover": "Add Cover",
     "add-label": "Προσθήκη Ετικέτας",
     "add-label": "Προσθήκη Ετικέτας",
     "add-list": "Προσθήκη Λίστας",
     "add-list": "Προσθήκη Λίστας",

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

@@ -89,6 +89,7 @@
     "add-subtask": "Add Subtask",
     "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-checklist-item": "Add an item to checklist",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Add Cover",
     "add-cover": "Add Cover",
     "add-label": "Add Label",
     "add-label": "Add Label",
     "add-list": "Add List",
     "add-list": "Add List",

+ 1063 - 0
i18n/en-IT.i18n.json

@@ -0,0 +1,1063 @@
+{
+    "accept": "Accept",
+    "act-activity-notify": "Activity Notification",
+    "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "act-createBoard": "created board __board__",
+    "act-createSwimlane": "created swimlane __swimlane__ to board __board__",
+    "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__",
+    "act-createCustomField": "created custom field __customField__ at board __board__",
+    "act-deleteCustomField": "deleted custom field __customField__ at board __board__",
+    "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "act-createList": "added list __list__ to board __board__",
+    "act-addBoardMember": "added member __member__ to board __board__",
+    "act-archivedBoard": "Board __board__ moved to Archive",
+    "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive",
+    "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive",
+    "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive",
+    "act-importBoard": "imported board __board__",
+    "act-importCard": "imported card  __card__ to list __list__ at swimlane __swimlane__ at board __board__",
+    "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__",
+    "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__",
+    "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__",
+    "act-removeBoardMember": "removed member __member__ from board __board__",
+    "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__",
+    "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "act-withBoardTitle": "__board__",
+    "act-withCardTitle": "[__board__] __card__",
+    "actions": "Actions",
+    "activities": "Activities",
+    "activity": "Activity",
+    "activity-added": "added %s to %s",
+    "activity-archived": "%s moved to Archive",
+    "activity-attached": "attached %s to %s",
+    "activity-created": "created %s",
+    "activity-customfield-created": "created custom field %s",
+    "activity-excluded": "excluded %s from %s",
+    "activity-imported": "imported %s into %s from %s",
+    "activity-imported-board": "imported %s from %s",
+    "activity-joined": "joined %s",
+    "activity-moved": "moved %s from %s to %s",
+    "activity-on": "on %s",
+    "activity-removed": "removed %s from %s",
+    "activity-sent": "sent %s to %s",
+    "activity-unjoined": "unjoined %s",
+    "activity-subtask-added": "added subtask to %s",
+    "activity-checked-item": "checked %s in checklist %s of %s",
+    "activity-unchecked-item": "unchecked %s in checklist %s of %s",
+    "activity-checklist-added": "added checklist to %s",
+    "activity-checklist-removed": "removed a checklist from %s",
+    "activity-checklist-completed": "completed checklist %s of %s",
+    "activity-checklist-uncompleted": "uncompleted the checklist %s of %s",
+    "activity-checklist-item-added": "added checklist item to '%s' in %s",
+    "activity-checklist-item-removed": "removed a checklist item from '%s' in %s",
+    "add": "Add",
+    "activity-checked-item-card": "checked %s in checklist %s",
+    "activity-unchecked-item-card": "unchecked %s in checklist %s",
+    "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "activity-checklist-uncompleted-card": "uncompleted the checklist %s",
+    "activity-editComment": "edited comment %s",
+    "activity-deleteComment": "deleted comment %s",
+    "activity-receivedDate": "edited received date to %s of %s",
+    "activity-startDate": "edited start date to %s of %s",
+    "activity-dueDate": "edited due date to %s of %s",
+    "activity-endDate": "edited end date to %s of %s",
+    "add-attachment": "Add Attachment",
+    "add-board": "Add Board",
+    "add-template": "Add Template",
+    "add-card": "Add Card",
+    "add-card-to-top-of-list": "Add Card to Top of List",
+    "add-card-to-bottom-of-list": "Add Card to Bottom of List",
+    "add-swimlane": "Add Swimlane",
+    "add-subtask": "Add Subtask",
+    "add-checklist": "Add Checklist",
+    "add-checklist-item": "Add an item to checklist",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
+    "add-cover": "Add Cover",
+    "add-label": "Add Label",
+    "add-list": "Add List",
+    "add-members": "Add Members",
+    "added": "Added",
+    "addMemberPopup-title": "Members",
+    "admin": "Admin",
+    "admin-desc": "Can view and edit cards, remove members, and change settings for the board.",
+    "admin-announcement": "Announcement",
+    "admin-announcement-active": "Active System-Wide Announcement",
+    "admin-announcement-title": "Announcement from Administrator",
+    "all-boards": "All boards",
+    "and-n-other-card": "And __count__ other card",
+    "and-n-other-card_plural": "And __count__ other cards",
+    "apply": "Apply",
+    "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.",
+    "archive": "Move to Archive",
+    "archive-all": "Move All to Archive",
+    "archive-board": "Move Board to Archive",
+    "archive-card": "Move Card to Archive",
+    "archive-list": "Move List to Archive",
+    "archive-swimlane": "Move Swimlane to Archive",
+    "archive-selection": "Move selection to Archive",
+    "archiveBoardPopup-title": "Move Board to Archive?",
+    "archived-items": "Archive",
+    "archived-boards": "Boards in Archive",
+    "restore-board": "Restore Board",
+    "no-archived-boards": "No Boards in Archive.",
+    "archives": "Archive",
+    "template": "Template",
+    "templates": "Templates",
+    "template-container": "Template Container",
+    "add-template-container": "Add Template Container",
+    "assign-member": "Assign member",
+    "attached": "attached",
+    "attachment": "Attachment",
+    "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.",
+    "attachmentDeletePopup-title": "Delete Attachment?",
+    "attachments": "Attachments",
+    "auto-watch": "Automatically watch boards when they are created",
+    "avatar-too-big": "The avatar is too large (520KB max)",
+    "back": "Back",
+    "board-change-color": "Change color",
+    "board-nb-stars": "%s stars",
+    "board-not-found": "Board not found",
+    "board-private-info": "This board will be <strong>private</strong>.",
+    "board-public-info": "This board will be <strong>public</strong>.",
+    "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.",
+    "boardChangeColorPopup-title": "Change Board Background",
+    "boardChangeTitlePopup-title": "Rename Board",
+    "boardChangeVisibilityPopup-title": "Change Visibility",
+    "boardChangeWatchPopup-title": "Change Watch",
+    "boardMenuPopup-title": "Board Settings",
+    "boardChangeViewPopup-title": "Board View",
+    "boards": "Boards",
+    "board-view": "Board View",
+    "board-view-cal": "Calendar",
+    "board-view-swimlanes": "Swimlanes",
+    "board-view-collapse": "Collapse",
+    "board-view-gantt": "Gantt",
+    "board-view-lists": "Lists",
+    "bucket-example": "Like “Bucket List” for example",
+    "cancel": "Cancel",
+    "card-archived": "This card is moved to Archive.",
+    "board-archived": "This board is moved to Archive.",
+    "card-comments-title": "This card has %s comment.",
+    "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.",
+    "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.",
+    "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.",
+    "card-due": "Due",
+    "card-due-on": "Due on",
+    "card-spent": "Spent Time",
+    "card-edit-attachments": "Edit attachments",
+    "card-edit-custom-fields": "Edit custom fields",
+    "card-edit-labels": "Edit labels",
+    "card-edit-members": "Edit members",
+    "card-labels-title": "Change the labels for the card.",
+    "card-members-title": "Add or remove members of the board from the card.",
+    "card-start": "Start",
+    "card-start-on": "Starts on",
+    "cardAttachmentsPopup-title": "Attach From",
+    "cardCustomField-datePopup-title": "Change date",
+    "cardCustomFieldsPopup-title": "Edit custom fields",
+    "cardStartVotingPopup-title": "Start a vote",
+    "positiveVoteMembersPopup-title": "Proponents",
+    "negativeVoteMembersPopup-title": "Opponents",
+    "card-edit-voting": "Edit voting",
+    "editVoteEndDatePopup-title": "Change vote end date",
+    "allowNonBoardMembers": "Allow all logged in users",
+    "vote-question": "Voting question",
+    "vote-public": "Show who voted what",
+    "vote-for-it": "for it",
+    "vote-against": "against",
+    "deleteVotePopup-title": "Delete vote?",
+    "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.",
+    "cardStartPlanningPokerPopup-title": "Start a Planning Poker",
+    "card-edit-planning-poker": "Edit Planning Poker",
+    "editPokerEndDatePopup-title": "Change Planning Poker vote end date",
+    "poker-question": "Planning Poker",
+    "poker-one": "1",
+    "poker-two": "2",
+    "poker-three": "3",
+    "poker-five": "5",
+    "poker-eight": "8",
+    "poker-thirteen": "13",
+    "poker-twenty": "20",
+    "poker-forty": "40",
+    "poker-oneHundred": "100",
+    "poker-unsure": "?",
+    "poker-finish": "Finish",
+    "poker-result-votes": "Votes",
+    "poker-result-who": "Who",
+    "poker-replay": "Replay",
+    "set-estimation": "Set Estimation",
+    "deletePokerPopup-title": "Delete planning poker?",
+    "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.",
+    "cardDeletePopup-title": "Delete Card?",
+    "cardDetailsActionsPopup-title": "Card Actions",
+    "cardLabelsPopup-title": "Labels",
+    "cardMembersPopup-title": "Members",
+    "cardMorePopup-title": "More",
+    "cardTemplatePopup-title": "Create template",
+    "cards": "Cards",
+    "cards-count": "Cards",
+    "cards-count-one": "Card",
+    "casSignIn": "Sign In with CAS",
+    "cardType-card": "Card",
+    "cardType-linkedCard": "Linked Card",
+    "cardType-linkedBoard": "Linked Board",
+    "change": "Change",
+    "change-avatar": "Change Avatar",
+    "change-password": "Change Password",
+    "change-permissions": "Change permissions",
+    "change-settings": "Change Settings",
+    "changeAvatarPopup-title": "Change Avatar",
+    "changeLanguagePopup-title": "Change Language",
+    "changePasswordPopup-title": "Change Password",
+    "changePermissionsPopup-title": "Change Permissions",
+    "changeSettingsPopup-title": "Change Settings",
+    "subtasks": "Subtasks",
+    "checklists": "Checklists",
+    "click-to-star": "Click to star this board.",
+    "click-to-unstar": "Click to unstar this board.",
+    "clipboard": "Clipboard or drag & drop",
+    "close": "Close",
+    "close-board": "Close Board",
+    "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.",
+    "close-card": "Close Card",
+    "color-black": "black",
+    "color-blue": "blue",
+    "color-crimson": "crimson",
+    "color-darkgreen": "darkgreen",
+    "color-gold": "gold",
+    "color-gray": "gray",
+    "color-green": "green",
+    "color-indigo": "indigo",
+    "color-lime": "lime",
+    "color-magenta": "magenta",
+    "color-mistyrose": "mistyrose",
+    "color-navy": "navy",
+    "color-orange": "orange",
+    "color-paleturquoise": "paleturquoise",
+    "color-peachpuff": "peachpuff",
+    "color-pink": "pink",
+    "color-plum": "plum",
+    "color-purple": "purple",
+    "color-red": "red",
+    "color-saddlebrown": "saddlebrown",
+    "color-silver": "silver",
+    "color-sky": "sky",
+    "color-slateblue": "slateblue",
+    "color-white": "white",
+    "color-yellow": "yellow",
+    "unset-color": "Unset",
+    "comment": "Comment",
+    "comment-placeholder": "Write Comment",
+    "comment-only": "Comment only",
+    "comment-only-desc": "Can comment on cards only.",
+    "no-comments": "No comments",
+    "no-comments-desc": "Can not see comments and activities.",
+    "worker": "Worker",
+    "worker-desc": "Can only move cards, assign itself to card and comment.",
+    "computer": "Computer",
+    "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
+    "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
+    "copy-card-link-to-clipboard": "Copy card link to clipboard",
+    "linkCardPopup-title": "Link Card",
+    "searchElementPopup-title": "Search",
+    "copyCardPopup-title": "Copy Card",
+    "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+    "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+    "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
+    "create": "Create",
+    "createBoardPopup-title": "Create Board",
+    "chooseBoardSourcePopup-title": "Import board",
+    "createLabelPopup-title": "Create Label",
+    "createCustomField": "Create Field",
+    "createCustomFieldPopup-title": "Create Field",
+    "current": "current",
+    "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.",
+    "custom-field-checkbox": "Checkbox",
+    "custom-field-currency": "Currency",
+    "custom-field-currency-option": "Currency Code",
+    "custom-field-date": "Date",
+    "custom-field-dropdown": "Dropdown List",
+    "custom-field-dropdown-none": "(none)",
+    "custom-field-dropdown-options": "List Options",
+    "custom-field-dropdown-options-placeholder": "Press enter to add more options",
+    "custom-field-dropdown-unknown": "(unknown)",
+    "custom-field-number": "Number",
+    "custom-field-text": "Text",
+    "custom-fields": "Custom Fields",
+    "date": "Date",
+    "decline": "Decline",
+    "default-avatar": "Default avatar",
+    "delete": "Delete",
+    "deleteCustomFieldPopup-title": "Delete Custom Field?",
+    "deleteLabelPopup-title": "Delete Label?",
+    "description": "Description",
+    "disambiguateMultiLabelPopup-title": "Disambiguate Label Action",
+    "disambiguateMultiMemberPopup-title": "Disambiguate Member Action",
+    "discard": "Discard",
+    "done": "Done",
+    "download": "Download",
+    "edit": "Edit",
+    "edit-avatar": "Change Avatar",
+    "edit-profile": "Edit Profile",
+    "edit-wip-limit": "Edit WIP Limit",
+    "soft-wip-limit": "Soft WIP Limit",
+    "editCardStartDatePopup-title": "Change start date",
+    "editCardDueDatePopup-title": "Change due date",
+    "editCustomFieldPopup-title": "Edit Field",
+    "editCardSpentTimePopup-title": "Change spent time",
+    "editLabelPopup-title": "Change Label",
+    "editNotificationPopup-title": "Edit Notification",
+    "editProfilePopup-title": "Edit Profile",
+    "email": "Email",
+    "email-enrollAccount-subject": "An account created for you on __siteName__",
+    "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.",
+    "email-fail": "Sending email failed",
+    "email-fail-text": "Error trying to send email",
+    "email-invalid": "Invalid email",
+    "email-invite": "Invite via Email",
+    "email-invite-subject": "__inviter__ sent you an invitation",
+    "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.",
+    "email-resetPassword-subject": "Reset your password on __siteName__",
+    "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.",
+    "email-sent": "Email sent",
+    "email-verifyEmail-subject": "Verify your email address on __siteName__",
+    "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.",
+    "enable-wip-limit": "Enable WIP Limit",
+    "error-board-doesNotExist": "This board does not exist",
+    "error-board-notAdmin": "You need to be admin of this board to do that",
+    "error-board-notAMember": "You need to be a member of this board to do that",
+    "error-json-malformed": "Your text is not valid JSON",
+    "error-json-schema": "Your JSON data does not include the proper information in the correct format",
+    "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format",
+    "error-list-doesNotExist": "This list does not exist",
+    "error-user-doesNotExist": "This user does not exist",
+    "error-user-notAllowSelf": "You can not invite yourself",
+    "error-user-notCreated": "This user is not created",
+    "error-username-taken": "This username is already taken",
+    "error-orgname-taken": "This organization name is already taken",
+    "error-teamname-taken": "This team name is already taken",
+    "error-email-taken": "Email has already been taken",
+    "export-board": "Export board",
+    "export-board-json": "Export board to JSON",
+    "export-board-csv": "Export board to CSV",
+    "export-board-tsv": "Export board to TSV",
+    "export-board-excel": "Export board to Excel",
+    "user-can-not-export-excel": "User can not export Excel",
+    "export-board-html": "Export board to HTML",
+    "export-card": "Export card",
+    "export-card-pdf": "Export card to PDF",
+    "user-can-not-export-card-to-pdf": "User can not export card to PDF",
+    "exportBoardPopup-title": "Export board",
+    "exportCardPopup-title": "Export card",
+    "sort": "Sort",
+    "sort-desc": "Click to Sort List",
+    "list-sort-by": "Sort the List By:",
+    "list-label-modifiedAt": "Last Access Time",
+    "list-label-title": "Name of the List",
+    "list-label-sort": "Your Manual Order",
+    "list-label-short-modifiedAt": "(L)",
+    "list-label-short-title": "(N)",
+    "list-label-short-sort": "(M)",
+    "filter": "Filter",
+    "filter-cards": "Filter Cards or Lists",
+    "filter-dates-label": "Filter by date",
+    "filter-no-due-date": "No due date",
+    "filter-overdue": "Overdue",
+    "filter-due-today": "Due today",
+    "filter-due-this-week": "Due this week",
+    "filter-due-tomorrow": "Due tomorrow",
+    "list-filter-label": "Filter List by Title",
+    "filter-clear": "Clear filter",
+    "filter-labels-label": "Filter by label",
+    "filter-no-label": "No label",
+    "filter-member-label": "Filter by member",
+    "filter-no-member": "No member",
+    "filter-assignee-label": "Filter by assignee",
+    "filter-no-assignee": "No assignee",
+    "filter-custom-fields-label": "Filter by Custom Fields",
+    "filter-no-custom-fields": "No Custom Fields",
+    "filter-show-archive": "Show archived lists",
+    "filter-hide-empty": "Hide empty lists",
+    "filter-on": "Filter is on",
+    "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.",
+    "filter-to-selection": "Filter to selection",
+    "other-filters-label": "Other Filters",
+    "advanced-filter-label": "Advanced Filter",
+    "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i",
+    "fullname": "Full Name",
+    "header-logo-title": "Go back to your boards page.",
+    "hide-system-messages": "Hide system messages",
+    "headerBarCreateBoardPopup-title": "Create Board",
+    "home": "Home",
+    "import": "Import",
+    "impersonate-user": "Impersonate user",
+    "link": "Link",
+    "import-board": "import board",
+    "import-board-c": "Import board",
+    "import-board-title-trello": "Import board from Trello",
+    "import-board-title-wekan": "Import board from previous export",
+    "import-board-title-csv": "Import board from CSV/TSV",
+    "from-trello": "From Trello",
+    "from-wekan": "From previous export",
+    "from-csv": "From CSV/TSV",
+    "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.",
+    "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .",
+    "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.",
+    "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.",
+    "import-json-placeholder": "Paste your valid JSON data here",
+    "import-csv-placeholder": "Paste your valid CSV/TSV data here",
+    "import-map-members": "Map members",
+    "import-members-map": "Your imported board has some members. Please map the members you want to import to your users",
+    "import-members-map-note": "Note: Unmapped members will be assigned to the current user.",
+    "import-show-user-mapping": "Review members mapping",
+    "import-user-select": "Pick your existing user you want to use as this member",
+    "importMapMembersAddPopup-title": "Select member",
+    "info": "Version",
+    "initials": "Initials",
+    "invalid-date": "Invalid date",
+    "invalid-time": "Invalid time",
+    "invalid-user": "Invalid user",
+    "joined": "joined",
+    "just-invited": "You are just invited to this board",
+    "keyboard-shortcuts": "Keyboard shortcuts",
+    "label-create": "Create Label",
+    "label-default": "%s label (default)",
+    "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.",
+    "labels": "Labels",
+    "language": "Language",
+    "last-admin-desc": "You can’t change roles because there must be at least one admin.",
+    "leave-board": "Leave Board",
+    "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+    "leaveBoardPopup-title": "Leave Board ?",
+    "link-card": "Link to this card",
+    "list-archive-cards": "Move all cards in this list to Archive",
+    "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.",
+    "list-move-cards": "Move all cards in this list",
+    "list-select-cards": "Select all cards in this list",
+    "set-color-list": "Set Color",
+    "listActionPopup-title": "List Actions",
+    "settingsUserPopup-title": "User Settings",
+    "settingsTeamPopup-title": "Team Settings",
+    "settingsOrgPopup-title": "Organization Settings",
+    "swimlaneActionPopup-title": "Swimlane Actions",
+    "swimlaneAddPopup-title": "Add a Swimlane below",
+    "listImportCardPopup-title": "Import a Trello card",
+    "listImportCardsTsvPopup-title": "Import Excel CSV/TSV",
+    "listMorePopup-title": "More",
+    "link-list": "Link to this list",
+    "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+    "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.",
+    "lists": "Lists",
+    "swimlanes": "Swimlanes",
+    "log-out": "Log Out",
+    "log-in": "Log In",
+    "loginPopup-title": "Log In",
+    "memberMenuPopup-title": "Member Settings",
+    "members": "Members",
+    "menu": "Menu",
+    "move-selection": "Move selection",
+    "moveCardPopup-title": "Move Card",
+    "moveCardToBottom-title": "Move to Bottom",
+    "moveCardToTop-title": "Move to Top",
+    "moveSelectionPopup-title": "Move selection",
+    "multi-selection": "Multi-Selection",
+    "multi-selection-label": "Set label for selection",
+    "multi-selection-member": "Set member for selection",
+    "multi-selection-on": "Multi-Selection is on",
+    "muted": "Muted",
+    "muted-info": "You will never be notified of any changes in this board",
+    "my-boards": "My Boards",
+    "name": "Name",
+    "no-archived-cards": "No cards in Archive.",
+    "no-archived-lists": "No lists in Archive.",
+    "no-archived-swimlanes": "No swimlanes in Archive.",
+    "no-results": "No results",
+    "normal": "Normal",
+    "normal-desc": "Can view and edit cards. Can't change settings.",
+    "not-accepted-yet": "Invitation not accepted yet",
+    "notify-participate": "Receive updates to any cards you participate as creater or member",
+    "notify-watch": "Receive updates to any boards, lists, or cards you’re watching",
+    "optional": "optional",
+    "or": "or",
+    "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.",
+    "page-not-found": "Page not found.",
+    "password": "Password",
+    "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)",
+    "participating": "Participating",
+    "preview": "Preview",
+    "previewAttachedImagePopup-title": "Preview",
+    "previewClipboardImagePopup-title": "Preview",
+    "private": "Private",
+    "private-desc": "This board is private. Only people added to the board can view and edit it.",
+    "profile": "Profile",
+    "public": "Public",
+    "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.",
+    "quick-access-description": "Star a board to add a shortcut in this bar.",
+    "remove-cover": "Remove Cover",
+    "remove-from-board": "Remove from Board",
+    "remove-label": "Remove Label",
+    "listDeletePopup-title": "Delete List ?",
+    "remove-member": "Remove Member",
+    "remove-member-from-card": "Remove from Card",
+    "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.",
+    "removeMemberPopup-title": "Remove Member?",
+    "rename": "Rename",
+    "rename-board": "Rename Board",
+    "restore": "Restore",
+    "save": "Save",
+    "search": "Search",
+    "rules": "Rules",
+    "search-cards": "Search from card/list titles, descriptions and custom fields on this board",
+    "search-example": "Write text you search and press Enter",
+    "select-color": "Select Color",
+    "select-board": "Select Board",
+    "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+    "setWipLimitPopup-title": "Set WIP Limit",
+    "shortcut-assign-self": "Assign yourself to current card",
+    "shortcut-autocomplete-emoji": "Autocomplete emoji",
+    "shortcut-autocomplete-members": "Autocomplete members",
+    "shortcut-clear-filters": "Clear all filters",
+    "shortcut-close-dialog": "Close Dialog",
+    "shortcut-filter-my-cards": "Filter my cards",
+    "shortcut-show-shortcuts": "Bring up this shortcuts list",
+    "shortcut-toggle-filterbar": "Toggle Filter Sidebar",
+    "shortcut-toggle-searchbar": "Toggle Search Sidebar",
+    "shortcut-toggle-sidebar": "Toggle Board Sidebar",
+    "show-cards-minimum-count": "Show cards count if list contains more than",
+    "sidebar-open": "Open Sidebar",
+    "sidebar-close": "Close Sidebar",
+    "signupPopup-title": "Create an Account",
+    "star-board-title": "Click to star this board. It will show up at top of your boards list.",
+    "starred-boards": "Starred Boards",
+    "starred-boards-description": "Starred boards show up at the top of your boards list.",
+    "subscribe": "Subscribe",
+    "team": "Team",
+    "this-board": "this board",
+    "this-card": "this card",
+    "spent-time-hours": "Spent time (hours)",
+    "overtime-hours": "Overtime (hours)",
+    "overtime": "Overtime",
+    "has-overtime-cards": "Has overtime cards",
+    "has-spenttime-cards": "Has spent time cards",
+    "time": "Time",
+    "title": "Title",
+    "tracking": "Tracking",
+    "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
+    "type": "Type",
+    "unassign-member": "Unassign member",
+    "unsaved-description": "You have an unsaved description.",
+    "unwatch": "Unwatch",
+    "upload": "Upload",
+    "upload-avatar": "Upload an avatar",
+    "uploaded-avatar": "Uploaded an avatar",
+    "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
+    "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
+    "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
+    "custom-login-logo-image-url": "Custom Login Logo Image URL",
+    "custom-login-logo-link-url": "Custom Login Logo Link URL",
+    "text-below-custom-login-logo": "Text below Custom Login Logo",
+    "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line",
+    "username": "Username",
+    "import-usernames": "Import Usernames",
+    "view-it": "View it",
+    "warn-list-archived": "warning: this card is in an list at Archive",
+    "watch": "Watch",
+    "watching": "Watching",
+    "watching-info": "You will be notified of any change in this board",
+    "welcome-board": "Welcome Board",
+    "welcome-swimlane": "Milestone 1",
+    "welcome-list1": "Basics",
+    "welcome-list2": "Advanced",
+    "card-templates-swimlane": "Card Templates",
+    "list-templates-swimlane": "List Templates",
+    "board-templates-swimlane": "Board Templates",
+    "what-to-do": "What do you want to do?",
+    "wipLimitErrorPopup-title": "Invalid WIP Limit",
+    "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+    "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
+    "admin-panel": "Admin Panel",
+    "settings": "Settings",
+    "people": "People",
+    "registration": "Registration",
+    "disable-self-registration": "Disable Self-Registration",
+    "invite": "Invite",
+    "invite-people": "Invite People",
+    "to-boards": "To board(s)",
+    "email-addresses": "Email Addresses",
+    "smtp-host-description": "The address of the SMTP server that handles your emails.",
+    "smtp-port-description": "The port your SMTP server uses for outgoing emails.",
+    "smtp-tls-description": "Enable TLS support for SMTP server",
+    "smtp-host": "SMTP Host",
+    "smtp-port": "SMTP Port",
+    "smtp-username": "Username",
+    "smtp-password": "Password",
+    "smtp-tls": "TLS support",
+    "send-from": "From",
+    "send-smtp-test": "Send a test email to yourself",
+    "invitation-code": "Invitation Code",
+    "email-invite-register-subject": "__inviter__ sent you an invitation",
+    "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.",
+    "email-smtp-test-subject": "SMTP Test Email",
+    "email-smtp-test-text": "You have successfully sent an email",
+    "error-invitation-code-not-exist": "Invitation code doesn't exist",
+    "error-notAuthorized": "You are not authorized to view this page.",
+    "webhook-title": "Webhook Name",
+    "webhook-token": "Token (Optional for Authentication)",
+    "outgoing-webhooks": "Outgoing Webhooks",
+    "bidirectional-webhooks": "Two-Way Webhooks",
+    "outgoingWebhooksPopup-title": "Outgoing Webhooks",
+    "boardCardTitlePopup-title": "Card Title Filter",
+    "disable-webhook": "Disable This Webhook",
+    "global-webhook": "Global Webhooks",
+    "new-outgoing-webhook": "New Outgoing Webhook",
+    "no-name": "(Unknown)",
+    "Node_version": "Node version",
+    "Meteor_version": "Meteor version",
+    "MongoDB_version": "MongoDB version",
+    "MongoDB_storage_engine": "MongoDB storage engine",
+    "MongoDB_Oplog_enabled": "MongoDB Oplog enabled",
+    "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",
+    "days": "days",
+    "hours": "hours",
+    "minutes": "minutes",
+    "seconds": "seconds",
+    "show-field-on-card": "Show this field on card",
+    "automatically-field-on-card": "Add field to new cards",
+    "always-field-on-card": "Add field to all cards",
+    "showLabel-field-on-card": "Show field label on minicard",
+    "yes": "Yes",
+    "no": "No",
+    "accounts": "Accounts",
+    "accounts-allowEmailChange": "Allow Email Change",
+    "accounts-allowUserNameChange": "Allow Username Change",
+    "createdAt": "Created at",
+    "modifiedAt": "Modified at",
+    "verified": "Verified",
+    "active": "Active",
+    "card-received": "Received",
+    "card-received-on": "Received on",
+    "card-end": "End",
+    "card-end-on": "Ends on",
+    "editCardReceivedDatePopup-title": "Change received date",
+    "editCardEndDatePopup-title": "Change end date",
+    "setCardColorPopup-title": "Set color",
+    "setCardActionsColorPopup-title": "Choose a color",
+    "setSwimlaneColorPopup-title": "Choose a color",
+    "setListColorPopup-title": "Choose a color",
+    "assigned-by": "Assigned By",
+    "requested-by": "Requested By",
+    "card-sorting-by-number": "Card sorting by number",
+    "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
+    "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
+    "boardDeletePopup-title": "Delete Board?",
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default",
+    "queue": "Queue",
+    "subtask-settings": "Subtasks Settings",
+    "card-settings": "Card Settings",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "boardCardSettingsPopup-title": "Card Settings",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Parent card",
+    "source-board": "Source board",
+    "no-parent": "Don't show parent",
+    "activity-added-label": "added label '%s' to %s",
+    "activity-removed-label": "removed label '%s' from %s",
+    "activity-delete-attach": "deleted an attachment from %s",
+    "activity-added-label-card": "added label '%s'",
+    "activity-removed-label-card": "removed label '%s'",
+    "activity-delete-attach-card": "deleted an attachment",
+    "activity-set-customfield": "set custom field '%s' to '%s' in %s",
+    "activity-unset-customfield": "unset custom field '%s' in %s",
+    "r-rule": "Rule",
+    "r-add-trigger": "Add trigger",
+    "r-add-action": "Add action",
+    "r-board-rules": "Board rules",
+    "r-add-rule": "Add rule",
+    "r-view-rule": "View rule",
+    "r-delete-rule": "Delete rule",
+    "r-new-rule-name": "New rule title",
+    "r-no-rules": "No rules",
+    "r-trigger": "Trigger",
+    "r-action": "Action",
+    "r-when-a-card": "When a card",
+    "r-is": "is",
+    "r-is-moved": "is moved",
+    "r-added-to": "Added to",
+    "r-removed-from": "Removed from",
+    "r-the-board": "the board",
+    "r-list": "list",
+    "list": "List",
+    "set-filter": "Set Filter",
+    "r-moved-to": "Moved to",
+    "r-moved-from": "Moved from",
+    "r-archived": "Moved to Archive",
+    "r-unarchived": "Restored from Archive",
+    "r-a-card": "a card",
+    "r-when-a-label-is": "When a label is",
+    "r-when-the-label": "When the label",
+    "r-list-name": "list name",
+    "r-when-a-member": "When a member is",
+    "r-when-the-member": "When the member",
+    "r-name": "name",
+    "r-when-a-attach": "When an attachment",
+    "r-when-a-checklist": "When a checklist is",
+    "r-when-the-checklist": "When the checklist",
+    "r-completed": "Completed",
+    "r-made-incomplete": "Made incomplete",
+    "r-when-a-item": "When a checklist item is",
+    "r-when-the-item": "When the checklist item",
+    "r-checked": "Checked",
+    "r-unchecked": "Unchecked",
+    "r-move-card-to": "Move card to",
+    "r-top-of": "Top of",
+    "r-bottom-of": "Bottom of",
+    "r-its-list": "its list",
+    "r-archive": "Move to Archive",
+    "r-unarchive": "Restore from Archive",
+    "r-card": "card",
+    "r-add": "Add",
+    "r-remove": "Remove",
+    "r-label": "label",
+    "r-member": "member",
+    "r-remove-all": "Remove all members from the card",
+    "r-set-color": "Set color to",
+    "r-checklist": "checklist",
+    "r-check-all": "Check all",
+    "r-uncheck-all": "Uncheck all",
+    "r-items-check": "items of checklist",
+    "r-check": "Check",
+    "r-uncheck": "Uncheck",
+    "r-item": "item",
+    "r-of-checklist": "of checklist",
+    "r-send-email": "Send an email",
+    "r-to": "to",
+    "r-of": "of",
+    "r-subject": "subject",
+    "r-rule-details": "Rule details",
+    "r-d-move-to-top-gen": "Move card to top of its list",
+    "r-d-move-to-top-spec": "Move card to top of list",
+    "r-d-move-to-bottom-gen": "Move card to bottom of its list",
+    "r-d-move-to-bottom-spec": "Move card to bottom of list",
+    "r-d-send-email": "Send email",
+    "r-d-send-email-to": "to",
+    "r-d-send-email-subject": "subject",
+    "r-d-send-email-message": "message",
+    "r-d-archive": "Move card to Archive",
+    "r-d-unarchive": "Restore card from Archive",
+    "r-d-add-label": "Add label",
+    "r-d-remove-label": "Remove label",
+    "r-create-card": "Create new card",
+    "r-in-list": "in list",
+    "r-in-swimlane": "in swimlane",
+    "r-d-add-member": "Add member",
+    "r-d-remove-member": "Remove member",
+    "r-d-remove-all-member": "Remove all member",
+    "r-d-check-all": "Check all items of a list",
+    "r-d-uncheck-all": "Uncheck all items of a list",
+    "r-d-check-one": "Check item",
+    "r-d-uncheck-one": "Uncheck item",
+    "r-d-check-of-list": "of checklist",
+    "r-d-add-checklist": "Add checklist",
+    "r-d-remove-checklist": "Remove checklist",
+    "r-by": "by",
+    "r-add-checklist": "Add checklist",
+    "r-with-items": "with items",
+    "r-items-list": "item1,item2,item3",
+    "r-add-swimlane": "Add swimlane",
+    "r-swimlane-name": "swimlane name",
+    "r-board-note": "Note: leave a field empty to match every possible value.",
+    "r-checklist-note": "Note: checklist's items have to be written as comma separated values.",
+    "r-when-a-card-is-moved": "When a card is moved to another list",
+    "r-set": "Set",
+    "r-update": "Update",
+    "r-datefield": "date field",
+    "r-df-start-at": "start",
+    "r-df-due-at": "due",
+    "r-df-end-at": "end",
+    "r-df-received-at": "received",
+    "r-to-current-datetime": "to current date/time",
+    "r-remove-value-from": "Remove value from",
+    "ldap": "LDAP",
+    "oauth2": "OAuth2",
+    "cas": "CAS",
+    "authentication-method": "Authentication method",
+    "authentication-type": "Authentication type",
+    "custom-product-name": "Custom Product Name",
+    "layout": "Layout",
+    "hide-logo": "Hide Logo",
+    "add-custom-html-after-body-start": "Add Custom HTML after <body> start",
+    "add-custom-html-before-body-end": "Add Custom HTML before </body> end",
+    "error-undefined": "Something went wrong",
+    "error-ldap-login": "An error occurred while trying to login",
+    "display-authentication-method": "Display Authentication Method",
+    "default-authentication-method": "Default Authentication Method",
+    "duplicate-board": "Duplicate Board",
+    "org-number": "The number of organizations is:",
+    "team-number": "The number of teams is:",
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all",
+    "loading": "Loading, please wait.",
+    "previous_as": "last time was",
+    "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__",
+    "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)",
+    "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)",
+    "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)",
+    "a-dueAt": "modified due time to be",
+    "a-endAt": "modified ending time to be",
+    "a-startAt": "modified starting time to be",
+    "a-receivedAt": "modified received time to be",
+    "almostdue": "current due time %s is approaching",
+    "pastdue": "current due time %s is past",
+    "duenow": "current due time %s is today",
+    "act-newDue": "__list__/__card__ has 1st due reminder [__board__]",
+    "act-withDue": "__list__/__card__ due reminders [__board__]",
+    "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
+    "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
+    "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
+    "act-atUserComment": "You were mentioned in [__board__] __list__/__card__",
+    "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
+    "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.",
+    "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.",
+    "accounts-allowUserDelete": "Allow users to self delete their account",
+    "hide-minicard-label-text": "Hide minicard label text",
+    "show-desktop-drag-handles": "Show desktop drag handles",
+    "assignee": "Assignee",
+    "cardAssigneesPopup-title": "Assignee",
+    "addmore-detail": "Add a more detailed description",
+    "show-on-card": "Show on Card",
+    "new": "New",
+    "editOrgPopup-title": "Edit Organization",
+    "newOrgPopup-title": "New Organization",
+    "editTeamPopup-title": "Edit Team",
+    "newTeamPopup-title": "New Team",
+    "editUserPopup-title": "Edit User",
+    "newUserPopup-title": "New User",
+    "notifications": "Notifications",
+    "view-all": "View All",
+    "filter-by-unread": "Filter by Unread",
+    "mark-all-as-read": "Mark all as read",
+    "remove-all-read": "Remove all read",
+    "allow-rename": "Allow Rename",
+    "allowRenamePopup-title": "Allow Rename",
+    "start-day-of-week": "Set day of the week start",
+    "monday": "Monday",
+    "tuesday": "Tuesday",
+    "wednesday": "Wednesday",
+    "thursday": "Thursday",
+    "friday": "Friday",
+    "saturday": "Saturday",
+    "sunday": "Sunday",
+    "status": "Status",
+    "swimlane": "Swimlane",
+    "owner": "Owner",
+    "last-modified-at": "Last modified at",
+    "last-activity": "Last activity",
+    "voting": "Voting",
+    "archived": "Archived",
+    "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has",
+    "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list",
+    "hide-checked-items": "Hide checked items",
+    "task": "Task",
+    "create-task": "Create Task",
+    "ok": "OK",
+    "organizations": "Organizations",
+    "teams": "Teams",
+    "displayName": "Display Name",
+    "shortName": "Short Name",
+    "website": "Website",
+    "person": "Person",
+    "my-cards": "My Cards",
+    "card": "Card",
+    "board": "Board",
+    "context-separator": "/",
+    "myCardsSortChange-title": "My Cards Sort",
+    "myCardsSortChangePopup-title": "My Cards Sort",
+    "myCardsSortChange-choice-board": "By Board",
+    "myCardsSortChange-choice-dueat": "By Due Date",
+    "dueCards-title": "Due Cards",
+    "dueCardsViewChange-title": "Due Cards View",
+    "dueCardsViewChangePopup-title": "Due Cards View",
+    "dueCardsViewChange-choice-me": "Me",
+    "dueCardsViewChange-choice-all": "All Users",
+    "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.",
+    "broken-cards": "Broken Cards",
+    "board-title-not-found": "Board '%s' not found.",
+    "swimlane-title-not-found": "Swimlane '%s' not found.",
+    "list-title-not-found": "List '%s' not found.",
+    "label-not-found": "Label '%s' not found.",
+    "label-color-not-found": "Label color %s not found.",
+    "user-username-not-found": "Username '%s' not found.",
+    "comment-not-found": "Card with comment containing text '%s' not found.",
+    "globalSearch-title": "Search All Boards",
+    "no-cards-found": "No Cards Found",
+    "one-card-found": "One Card Found",
+    "n-cards-found": "%s Cards Found",
+    "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found",
+    "operator-board": "board",
+    "operator-board-abbrev": "b",
+    "operator-swimlane": "swimlane",
+    "operator-swimlane-abbrev": "s",
+    "operator-list": "list",
+    "operator-list-abbrev": "l",
+    "operator-label": "label",
+    "operator-label-abbrev": "#",
+    "operator-user": "user",
+    "operator-user-abbrev": "@",
+    "operator-member": "member",
+    "operator-member-abbrev": "m",
+    "operator-assignee": "assignee",
+    "operator-assignee-abbrev": "a",
+    "operator-creator": "creator",
+    "operator-status": "status",
+    "operator-due": "due",
+    "operator-created": "created",
+    "operator-modified": "modified",
+    "operator-sort": "sort",
+    "operator-comment": "comment",
+    "operator-has": "has",
+    "operator-limit": "limit",
+    "predicate-archived": "archived",
+    "predicate-open": "open",
+    "predicate-ended": "ended",
+    "predicate-all": "all",
+    "predicate-overdue": "overdue",
+    "predicate-week": "week",
+    "predicate-month": "month",
+    "predicate-quarter": "quarter",
+    "predicate-year": "year",
+    "predicate-due": "due",
+    "predicate-modified": "modified",
+    "predicate-created": "created",
+    "predicate-attachment": "attachment",
+    "predicate-description": "description",
+    "predicate-checklist": "checklist",
+    "predicate-start": "start",
+    "predicate-end": "end",
+    "predicate-assignee": "assignee",
+    "predicate-member": "member",
+    "predicate-public": "public",
+    "predicate-private": "private",
+    "operator-unknown-error": "%s is not an operator",
+    "operator-number-expected": "operator __operator__ expected a number, got '__value__'",
+    "operator-sort-invalid": "sort of '%s' is invalid",
+    "operator-status-invalid": "'%s' is not a valid status",
+    "operator-has-invalid": "%s is not a valid existence check",
+    "operator-limit-invalid": "%s is not a valid limit.  Limit should be a positive integer.",
+    "next-page": "Next Page",
+    "previous-page": "Previous Page",
+    "heading-notes": "Notes",
+    "globalSearch-instructions-heading": "Search Instructions",
+    "globalSearch-instructions-description": "Searches can include operators to refine the search.  Operators are specified by writing the operator name and value separated by a colon.  For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*.  If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).",
+    "globalSearch-instructions-operators": "Available operators:",
+    "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*",
+    "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*",
+    "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*",
+    "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.",
+    "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>",
+    "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`",
+    "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*",
+    "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`",
+    "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*",
+    "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*",
+    "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator",
+    "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now.  `__operator_due__:__predicate_overdue__ lists all cards past their due date.",
+    "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less",
+    "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less",
+    "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:",
+    "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards",
+    "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards",
+    "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date",
+    "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards",
+    "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards",
+    "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`.  Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).",
+    "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`.  For a descending sort, place a `-` in front of the sort name.",
+    "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.",
+    "globalSearch-instructions-notes-1": "Multiple operators may be specified.",
+    "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together.  Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.",
+    "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together.  Only cards that match all of the differing operators are returned.  `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.",
+    "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.",
+    "globalSearch-instructions-notes-4": "Text searches are case insensitive.",
+    "globalSearch-instructions-notes-5": "By default archived cards are not searched.",
+    "link-to-search": "Link to this search",
+    "excel-font": "Arial",
+    "number": "Number",
+    "label-colors": "Label Colors",
+    "label-names": "Label Names",
+    "archived-at": "archived at",
+    "sort-cards": "Sort Cards",
+    "cardsSortPopup-title": "Sort Cards",
+    "due-date": "Due Date",
+    "server-error": "Server Error",
+    "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`",
+    "title-alphabetically": "Title (Alphabetically)",
+    "created-at-newest-first": "Created At (Newest First)",
+    "created-at-oldest-first": "Created At (Oldest First)",
+    "links-heading": "Links",
+    "hide-system-messages-of-all-users": "Hide system messages of all users",
+    "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden",
+    "move-swimlane": "Move Swimlane",
+    "moveSwimlanePopup-title": "Move Swimlane",
+    "custom-field-stringtemplate": "String Template",
+    "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)",
+    "custom-field-stringtemplate-separator": "Separator (use &#32; or &nbsp; for a space)",
+    "custom-field-stringtemplate-item-placeholder": "Press enter to add more items",
+    "creator": "Creator",
+    "filesReportTitle": "Files Report",
+    "orphanedFilesReportTitle": "Orphaned Files Report",
+    "reports": "Reports",
+    "rulesReportTitle": "Rules Report",
+    "copy-swimlane": "Copy Swimlane",
+    "copySwimlanePopup-title": "Copy Swimlane",
+    "display-card-creator": "Display Card Creator",
+    "wait-spinner": "Wait Spinner",
+    "Bounce": "Bounce Wait Spinner",
+    "Cube": "Cube Wait Spinner",
+    "Cube-Grid": "Cube-Grid Wait Spinner",
+    "Dot": "Dot Wait Spinner",
+    "Double-Bounce": "Double Bounce Wait Spinner",
+    "Rotateplane": "Rotateplane Wait Spinner",
+    "Scaleout": "Scaleout Wait Spinner",
+    "Wave": "Wave Wait Spinner",
+    "maximize-card": "Maximize Card",
+    "minimize-card": "Minimize Card",
+    "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
+    "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
+}

+ 1 - 0
i18n/en.i18n.json

@@ -89,6 +89,7 @@
   "add-subtask": "Add Subtask",
   "add-subtask": "Add Subtask",
   "add-checklist": "Add Checklist",
   "add-checklist": "Add Checklist",
   "add-checklist-item": "Add an item to checklist",
   "add-checklist-item": "Add an item to checklist",
+  "convertChecklistItemToCardPopup-title": "Convert to Card",
   "add-cover": "Add Cover",
   "add-cover": "Add Cover",
   "add-label": "Add Label",
   "add-label": "Add Label",
   "add-list": "Add List",
   "add-list": "Add List",

+ 1 - 0
i18n/eo.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Add Subtask",
     "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-checklist-item": "Add an item to checklist",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Add Cover",
     "add-cover": "Add Cover",
     "add-label": "Add Label",
     "add-label": "Add Label",
     "add-list": "Add List",
     "add-list": "Add List",

+ 1 - 0
i18n/es-AR.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Agregar Subtarea",
     "add-subtask": "Agregar Subtarea",
     "add-checklist": "Agregar Lista de Tareas",
     "add-checklist": "Agregar Lista de Tareas",
     "add-checklist-item": "Agregar ítem a lista de tareas",
     "add-checklist-item": "Agregar ítem a lista de tareas",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Agregar Portadas",
     "add-cover": "Agregar Portadas",
     "add-label": "Agregar Etiqueta",
     "add-label": "Agregar Etiqueta",
     "add-list": "Agregar Lista",
     "add-list": "Agregar Lista",

+ 1 - 0
i18n/es-CL.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Añadir subtarea",
     "add-subtask": "Añadir subtarea",
     "add-checklist": "Añadir una lista de verificación",
     "add-checklist": "Añadir una lista de verificación",
     "add-checklist-item": "Añadir un elemento a la lista de verificación",
     "add-checklist-item": "Añadir un elemento a la lista de verificación",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Añadir portada",
     "add-cover": "Añadir portada",
     "add-label": "Añadir una etiqueta",
     "add-label": "Añadir una etiqueta",
     "add-list": "Añadir una lista",
     "add-list": "Añadir una lista",

+ 1 - 0
i18n/es-LA.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Add Subtask",
     "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-checklist-item": "Add an item to checklist",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Add Cover",
     "add-cover": "Add Cover",
     "add-label": "Add Label",
     "add-label": "Add Label",
     "add-list": "Add List",
     "add-list": "Add List",

+ 1 - 0
i18n/es-MX.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Add Subtask",
     "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-checklist-item": "Add an item to checklist",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Add Cover",
     "add-cover": "Add Cover",
     "add-label": "Add Label",
     "add-label": "Add Label",
     "add-list": "Add List",
     "add-list": "Add List",

+ 1 - 0
i18n/es-PE.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Agregar subtarea",
     "add-subtask": "Agregar subtarea",
     "add-checklist": "Agregar lista de comprobación",
     "add-checklist": "Agregar lista de comprobación",
     "add-checklist-item": "Agregar un elemento a la lista de comprobación",
     "add-checklist-item": "Agregar un elemento a la lista de comprobación",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Agregar portada",
     "add-cover": "Agregar portada",
     "add-label": "Agregar una etiqueta",
     "add-label": "Agregar una etiqueta",
     "add-list": "Agregar una lista",
     "add-list": "Agregar una lista",

+ 1 - 0
i18n/es-PY.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Add Subtask",
     "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-checklist-item": "Add an item to checklist",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Add Cover",
     "add-cover": "Add Cover",
     "add-label": "Add Label",
     "add-label": "Add Label",
     "add-list": "Add List",
     "add-list": "Add List",

+ 1 - 0
i18n/es.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Añadir subtarea",
     "add-subtask": "Añadir subtarea",
     "add-checklist": "Añadir una lista de verificación",
     "add-checklist": "Añadir una lista de verificación",
     "add-checklist-item": "Añadir un elemento a la lista de verificación",
     "add-checklist-item": "Añadir un elemento a la lista de verificación",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Añadir portada",
     "add-cover": "Añadir portada",
     "add-label": "Añadir una etiqueta",
     "add-label": "Añadir una etiqueta",
     "add-list": "Añadir una lista",
     "add-list": "Añadir una lista",

+ 1 - 0
i18n/eu.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Add Subtask",
     "add-subtask": "Add Subtask",
     "add-checklist": "Gehitu egiaztaketa zerrenda",
     "add-checklist": "Gehitu egiaztaketa zerrenda",
     "add-checklist-item": "Gehitu elementu bat egiaztaketa zerrendara",
     "add-checklist-item": "Gehitu elementu bat egiaztaketa zerrendara",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Gehitu azala",
     "add-cover": "Gehitu azala",
     "add-label": "Gehitu etiketa",
     "add-label": "Gehitu etiketa",
     "add-list": "Gehitu zerrenda",
     "add-list": "Gehitu zerrenda",

+ 1 - 0
i18n/fa-IR.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Add Subtask",
     "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-checklist-item": "Add an item to checklist",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Add Cover",
     "add-cover": "Add Cover",
     "add-label": "Add Label",
     "add-label": "Add Label",
     "add-list": "Add List",
     "add-list": "Add List",

+ 1 - 0
i18n/fa.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "افزودن زیر وظیفه",
     "add-subtask": "افزودن زیر وظیفه",
     "add-checklist": "افزودن چک‌لیست",
     "add-checklist": "افزودن چک‌لیست",
     "add-checklist-item": "افزودن مورد به چک‌لیست",
     "add-checklist-item": "افزودن مورد به چک‌لیست",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "افزودن کاور",
     "add-cover": "افزودن کاور",
     "add-label": "افزودن لیبل",
     "add-label": "افزودن لیبل",
     "add-list": "افزودن لیست",
     "add-list": "افزودن لیست",

+ 1 - 0
i18n/fi.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Lisää alitehtävä",
     "add-subtask": "Lisää alitehtävä",
     "add-checklist": "Lisää tarkistuslista",
     "add-checklist": "Lisää tarkistuslista",
     "add-checklist-item": "Lisää kohta tarkistuslistaan",
     "add-checklist-item": "Lisää kohta tarkistuslistaan",
+    "convertChecklistItemToCardPopup-title": "Muuta kortiksi",
     "add-cover": "Lisää kansi",
     "add-cover": "Lisää kansi",
     "add-label": "Lisää nimilappu",
     "add-label": "Lisää nimilappu",
     "add-list": "Lisää lista",
     "add-list": "Lisää lista",

+ 1 - 0
i18n/fr.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Ajouter une sous-tâche",
     "add-subtask": "Ajouter une sous-tâche",
     "add-checklist": "Ajouter une checklist",
     "add-checklist": "Ajouter une checklist",
     "add-checklist-item": "Ajouter un élément à la checklist",
     "add-checklist-item": "Ajouter un élément à la checklist",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Ajouter la couverture",
     "add-cover": "Ajouter la couverture",
     "add-label": "Ajouter une étiquette",
     "add-label": "Ajouter une étiquette",
     "add-list": "Ajouter une liste",
     "add-list": "Ajouter une liste",

+ 1 - 0
i18n/gl.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Add Subtask",
     "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-checklist-item": "Add an item to checklist",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Add Cover",
     "add-cover": "Add Cover",
     "add-label": "Engadir etiqueta",
     "add-label": "Engadir etiqueta",
     "add-list": "Engadir lista",
     "add-list": "Engadir lista",

+ 1 - 0
i18n/he.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "הוסף תת משימה",
     "add-subtask": "הוסף תת משימה",
     "add-checklist": "הוספת רשימת מטלות",
     "add-checklist": "הוספת רשימת מטלות",
     "add-checklist-item": "הוספת פריט לרשימת משימות",
     "add-checklist-item": "הוספת פריט לרשימת משימות",
+    "convertChecklistItemToCardPopup-title": "המרה לכרטיס",
     "add-cover": "הוספת כיסוי",
     "add-cover": "הוספת כיסוי",
     "add-label": "הוספת תווית",
     "add-label": "הוספת תווית",
     "add-list": "הוספת רשימה",
     "add-list": "הוספת רשימה",

+ 1 - 0
i18n/hi.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "उप कार्य जोड़ें",
     "add-subtask": "उप कार्य जोड़ें",
     "add-checklist": "चिह्नांकन-सूची जोड़ें",
     "add-checklist": "चिह्नांकन-सूची जोड़ें",
     "add-checklist-item": "चिह्नांकन-सूची विषय कोई तक जोड़ें",
     "add-checklist-item": "चिह्नांकन-सूची विषय कोई तक जोड़ें",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "आवरण जोड़ें",
     "add-cover": "आवरण जोड़ें",
     "add-label": "नामपत्र जोड़ें",
     "add-label": "नामपत्र जोड़ें",
     "add-list": "सूची जोड़ें",
     "add-list": "सूची जोड़ें",

+ 1 - 0
i18n/hr.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Dodaj podzadatak",
     "add-subtask": "Dodaj podzadatak",
     "add-checklist": "Dodaj listu provjere",
     "add-checklist": "Dodaj listu provjere",
     "add-checklist-item": "Dodaj stavku listi provjere",
     "add-checklist-item": "Dodaj stavku listi provjere",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Dodaj naslovnicu",
     "add-cover": "Dodaj naslovnicu",
     "add-label": "Dodaj oznaku",
     "add-label": "Dodaj oznaku",
     "add-list": "Dodaj listu",
     "add-list": "Dodaj listu",

+ 1 - 0
i18n/hu.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Alfeladat hozzáadása",
     "add-subtask": "Alfeladat hozzáadása",
     "add-checklist": "Ellenőrzőlista hozzáadása",
     "add-checklist": "Ellenőrzőlista hozzáadása",
     "add-checklist-item": "Elem hozzáadása az ellenőrzőlistához",
     "add-checklist-item": "Elem hozzáadása az ellenőrzőlistához",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Borító hozzáadása",
     "add-cover": "Borító hozzáadása",
     "add-label": "Címke hozzáadása",
     "add-label": "Címke hozzáadása",
     "add-list": "Lista hozzáadása",
     "add-list": "Lista hozzáadása",

+ 1 - 0
i18n/hy.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Add Subtask",
     "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-checklist-item": "Add an item to checklist",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Add Cover",
     "add-cover": "Add Cover",
     "add-label": "Add Label",
     "add-label": "Add Label",
     "add-list": "Add List",
     "add-list": "Add List",

+ 1 - 0
i18n/id.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Add Subtask",
     "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Tambahkan hal ke daftar periksa",
     "add-checklist-item": "Tambahkan hal ke daftar periksa",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Tambahkan Sampul",
     "add-cover": "Tambahkan Sampul",
     "add-label": "Add Label",
     "add-label": "Add Label",
     "add-list": "Add List",
     "add-list": "Add List",

+ 1 - 0
i18n/ig.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Add Subtask",
     "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-checklist-item": "Add an item to checklist",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Add Cover",
     "add-cover": "Add Cover",
     "add-label": "Add Label",
     "add-label": "Add Label",
     "add-list": "Add List",
     "add-list": "Add List",

+ 4 - 3
i18n/it.i18n.json

@@ -81,7 +81,7 @@
     "activity-endDate": "ha modificato la data di fine a %s di %s ",
     "activity-endDate": "ha modificato la data di fine a %s di %s ",
     "add-attachment": "Aggiungi allegato",
     "add-attachment": "Aggiungi allegato",
     "add-board": "Aggiungi bacheca",
     "add-board": "Aggiungi bacheca",
-    "add-template": "Add Template",
+    "add-template": "Aggiungi Template",
     "add-card": "Aggiungi scheda",
     "add-card": "Aggiungi scheda",
     "add-card-to-top-of-list": "Aggiungi Scheda in cima alla Lista",
     "add-card-to-top-of-list": "Aggiungi Scheda in cima alla Lista",
     "add-card-to-bottom-of-list": "Aggiungi Scheda in fondo alla Lista",
     "add-card-to-bottom-of-list": "Aggiungi Scheda in fondo alla Lista",
@@ -89,6 +89,7 @@
     "add-subtask": "Aggiungi sotto-compito",
     "add-subtask": "Aggiungi sotto-compito",
     "add-checklist": "Aggiungi Checklist",
     "add-checklist": "Aggiungi Checklist",
     "add-checklist-item": "Aggiungi un elemento alla checklist",
     "add-checklist-item": "Aggiungi un elemento alla checklist",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Aggiungi copertina",
     "add-cover": "Aggiungi copertina",
     "add-label": "Aggiungi etichetta",
     "add-label": "Aggiungi etichetta",
     "add-list": "Aggiungi lista",
     "add-list": "Aggiungi lista",
@@ -120,8 +121,8 @@
     "archives": "Archivio",
     "archives": "Archivio",
     "template": "Template",
     "template": "Template",
     "templates": "Template",
     "templates": "Template",
-    "template-container": "Template Container",
-    "add-template-container": "Add Template Container",
+    "template-container": "Contenitore dei Template",
+    "add-template-container": "Aggiungi contenitore di Template",
     "assign-member": "Assegna a un membro",
     "assign-member": "Assegna a un membro",
     "attached": "allegato",
     "attached": "allegato",
     "attachment": "Allegato",
     "attachment": "Allegato",

+ 1 - 0
i18n/ja.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "サブタスクを追加",
     "add-subtask": "サブタスクを追加",
     "add-checklist": "チェックリストを追加",
     "add-checklist": "チェックリストを追加",
     "add-checklist-item": "チェックリストに項目を追加",
     "add-checklist-item": "チェックリストに項目を追加",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "カバーの追加",
     "add-cover": "カバーの追加",
     "add-label": "ラベルを追加",
     "add-label": "ラベルを追加",
     "add-list": "リストを追加",
     "add-list": "リストを追加",

+ 1 - 0
i18n/ka.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "ქვესაქმიანობის დამატება",
     "add-subtask": "ქვესაქმიანობის დამატება",
     "add-checklist": "კატალოგის დამატება",
     "add-checklist": "კატალოგის დამატება",
     "add-checklist-item": "დაამატეთ საგანი ჩამონათვალს",
     "add-checklist-item": "დაამატეთ საგანი ჩამონათვალს",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "გარეკანის დამატება",
     "add-cover": "გარეკანის დამატება",
     "add-label": "ნიშნის დამატება",
     "add-label": "ნიშნის დამატება",
     "add-list": "ჩამონათვალის დამატება",
     "add-list": "ჩამონათვალის დამატება",

+ 1 - 0
i18n/km.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Add Subtask",
     "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-checklist-item": "Add an item to checklist",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Add Cover",
     "add-cover": "Add Cover",
     "add-label": "Add Label",
     "add-label": "Add Label",
     "add-list": "Add List",
     "add-list": "Add List",

+ 1 - 0
i18n/ko.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Add Subtask",
     "add-subtask": "Add Subtask",
     "add-checklist": "체크리스트 추가",
     "add-checklist": "체크리스트 추가",
     "add-checklist-item": "체크리스트에 항목 추가",
     "add-checklist-item": "체크리스트에 항목 추가",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "커버 추가",
     "add-cover": "커버 추가",
     "add-label": "라벨 추가",
     "add-label": "라벨 추가",
     "add-list": "리스트 추가",
     "add-list": "리스트 추가",

+ 1 - 0
i18n/lt.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Add Subtask",
     "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-checklist-item": "Add an item to checklist",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Add Cover",
     "add-cover": "Add Cover",
     "add-label": "Add Label",
     "add-label": "Add Label",
     "add-list": "Add List",
     "add-list": "Add List",

+ 1 - 0
i18n/lv.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Pievienot apakšuzdevumu",
     "add-subtask": "Pievienot apakšuzdevumu",
     "add-checklist": "Pievienot kontrolsarakstu",
     "add-checklist": "Pievienot kontrolsarakstu",
     "add-checklist-item": "Pievienot elementu",
     "add-checklist-item": "Pievienot elementu",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Pievienot vāku",
     "add-cover": "Pievienot vāku",
     "add-label": "Pievienot birku",
     "add-label": "Pievienot birku",
     "add-list": "Pievienot sarakstu",
     "add-list": "Pievienot sarakstu",

+ 1 - 0
i18n/mk.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Додади подзадача",
     "add-subtask": "Додади подзадача",
     "add-checklist": "Додади список на задачи",
     "add-checklist": "Додади список на задачи",
     "add-checklist-item": "Додади точка во списокот со задачи",
     "add-checklist-item": "Додади точка во списокот со задачи",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Додади корица",
     "add-cover": "Додади корица",
     "add-label": "Додади етикета",
     "add-label": "Додади етикета",
     "add-list": "Додади листа",
     "add-list": "Додади листа",

+ 1 - 0
i18n/mn.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Add Subtask",
     "add-subtask": "Add Subtask",
     "add-checklist": "Чеклист нэмэх",
     "add-checklist": "Чеклист нэмэх",
     "add-checklist-item": "Add an item to checklist",
     "add-checklist-item": "Add an item to checklist",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Add Cover",
     "add-cover": "Add Cover",
     "add-label": "Шошго нэмэх",
     "add-label": "Шошго нэмэх",
     "add-list": "Жагсаалт нэмэх",
     "add-list": "Жагсаалт нэмэх",

+ 1 - 0
i18n/nb.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Legg til Underoppgave",
     "add-subtask": "Legg til Underoppgave",
     "add-checklist": "Legg til Sjekkliste",
     "add-checklist": "Legg til Sjekkliste",
     "add-checklist-item": "Nytt punkt på sjekklisten",
     "add-checklist-item": "Nytt punkt på sjekklisten",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Nytt omslag",
     "add-cover": "Nytt omslag",
     "add-label": "Legg til Etikett",
     "add-label": "Legg til Etikett",
     "add-list": "Legg til Liste",
     "add-list": "Legg til Liste",

+ 1 - 0
i18n/nl.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Subtaak Toevoegen",
     "add-subtask": "Subtaak Toevoegen",
     "add-checklist": "Checklist toevoegen",
     "add-checklist": "Checklist toevoegen",
     "add-checklist-item": "Voeg item toe aan checklist",
     "add-checklist-item": "Voeg item toe aan checklist",
+    "convertChecklistItemToCardPopup-title": "Converteer naar Kaart",
     "add-cover": "Cover Toevoegen",
     "add-cover": "Cover Toevoegen",
     "add-label": "Label Toevoegen",
     "add-label": "Label Toevoegen",
     "add-list": "Lijst Toevoegen",
     "add-list": "Lijst Toevoegen",

+ 1 - 0
i18n/oc.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Apondre una jos-tasca",
     "add-subtask": "Apondre una jos-tasca",
     "add-checklist": "Apondre una checklist",
     "add-checklist": "Apondre una checklist",
     "add-checklist-item": "Apondre un element a la checklist",
     "add-checklist-item": "Apondre un element a la checklist",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Apondre una cobèrta",
     "add-cover": "Apondre una cobèrta",
     "add-label": "Apondre una etiqueta",
     "add-label": "Apondre una etiqueta",
     "add-list": "Apondre una tièra",
     "add-list": "Apondre una tièra",

+ 1 - 0
i18n/pa.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Add Subtask",
     "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-checklist-item": "Add an item to checklist",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Add Cover",
     "add-cover": "Add Cover",
     "add-label": "Add Label",
     "add-label": "Add Label",
     "add-list": "Add List",
     "add-list": "Add List",

+ 1 - 0
i18n/pl.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Dodaj podzadanie",
     "add-subtask": "Dodaj podzadanie",
     "add-checklist": "Dodaj czeklistę",
     "add-checklist": "Dodaj czeklistę",
     "add-checklist-item": "Dodaj element do czeklisty",
     "add-checklist-item": "Dodaj element do czeklisty",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Dodaj okładkę",
     "add-cover": "Dodaj okładkę",
     "add-label": "Dodaj etykietę",
     "add-label": "Dodaj etykietę",
     "add-list": "Dodaj listę",
     "add-list": "Dodaj listę",

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

@@ -89,6 +89,7 @@
     "add-subtask": "Adicionar subtarefa",
     "add-subtask": "Adicionar subtarefa",
     "add-checklist": "Adicionar lista de verificação",
     "add-checklist": "Adicionar lista de verificação",
     "add-checklist-item": "Adicionar um item à lista de verificação",
     "add-checklist-item": "Adicionar um item à lista de verificação",
+    "convertChecklistItemToCardPopup-title": "Converter para Cartão",
     "add-cover": "Adicionar Capa",
     "add-cover": "Adicionar Capa",
     "add-label": "Adicionar Etiqueta",
     "add-label": "Adicionar Etiqueta",
     "add-list": "Adicionar Lista",
     "add-list": "Adicionar Lista",

+ 1 - 0
i18n/pt.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Adicionar Sub-tarefa",
     "add-subtask": "Adicionar Sub-tarefa",
     "add-checklist": "Adicionar Lista de Verificação",
     "add-checklist": "Adicionar Lista de Verificação",
     "add-checklist-item": "Adicionar um item à lista de verificação",
     "add-checklist-item": "Adicionar um item à lista de verificação",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Adicionar Capa",
     "add-cover": "Adicionar Capa",
     "add-label": "Adicionar Etiqueta",
     "add-label": "Adicionar Etiqueta",
     "add-list": "Adicionar Lista",
     "add-list": "Adicionar Lista",

+ 1 - 0
i18n/ro.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Add Subtask",
     "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-checklist-item": "Add an item to checklist",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Adaugă Decor",
     "add-cover": "Adaugă Decor",
     "add-label": "Add Label",
     "add-label": "Add Label",
     "add-list": "Add List",
     "add-list": "Add List",

+ 1 - 0
i18n/ru.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Добавить подзадачу",
     "add-subtask": "Добавить подзадачу",
     "add-checklist": "Добавить контрольный список",
     "add-checklist": "Добавить контрольный список",
     "add-checklist-item": "Добавить пункт в контрольный список",
     "add-checklist-item": "Добавить пункт в контрольный список",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Прикрепить",
     "add-cover": "Прикрепить",
     "add-label": "Добавить метку",
     "add-label": "Добавить метку",
     "add-list": "Добавить простой список",
     "add-list": "Добавить простой список",

+ 1 - 0
i18n/sk.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Pridať Podúlohu",
     "add-subtask": "Pridať Podúlohu",
     "add-checklist": "Pridať Checklist",
     "add-checklist": "Pridať Checklist",
     "add-checklist-item": "Pridať novú položku do Checklistu",
     "add-checklist-item": "Pridať novú položku do Checklistu",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Pridať obal",
     "add-cover": "Pridať obal",
     "add-label": "Pridať značku",
     "add-label": "Pridať značku",
     "add-list": "Pridať zoznam",
     "add-list": "Pridať zoznam",

+ 1 - 0
i18n/sl.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Dodaj podopravilo",
     "add-subtask": "Dodaj podopravilo",
     "add-checklist": "Dodaj kontrolni seznam",
     "add-checklist": "Dodaj kontrolni seznam",
     "add-checklist-item": "Dodaj postavko na kontrolni seznam",
     "add-checklist-item": "Dodaj postavko na kontrolni seznam",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Dodaj ovitek",
     "add-cover": "Dodaj ovitek",
     "add-label": "Dodaj oznako",
     "add-label": "Dodaj oznako",
     "add-list": "Dodaj seznam",
     "add-list": "Dodaj seznam",

+ 1 - 0
i18n/sr.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Dodaj podzadatak",
     "add-subtask": "Dodaj podzadatak",
     "add-checklist": "Add Checklist",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Dodaj novu stavku u listu",
     "add-checklist-item": "Dodaj novu stavku u listu",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Dodaj zaglavlje",
     "add-cover": "Dodaj zaglavlje",
     "add-label": "Dodaj oznaku",
     "add-label": "Dodaj oznaku",
     "add-list": "Dodaj Listu",
     "add-list": "Dodaj Listu",

+ 1 - 0
i18n/sv.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Lägg till deluppgift",
     "add-subtask": "Lägg till deluppgift",
     "add-checklist": "Lägg till checklista",
     "add-checklist": "Lägg till checklista",
     "add-checklist-item": "Lägg till objekt i checklista",
     "add-checklist-item": "Lägg till objekt i checklista",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Lägg till omslag",
     "add-cover": "Lägg till omslag",
     "add-label": "Lägg till etikett",
     "add-label": "Lägg till etikett",
     "add-list": "Lägg till lista",
     "add-list": "Lägg till lista",

+ 1 - 0
i18n/sw.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Add Subtask",
     "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-checklist-item": "Add an item to checklist",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Add Cover",
     "add-cover": "Add Cover",
     "add-label": "Add Label",
     "add-label": "Add Label",
     "add-list": "Add List",
     "add-list": "Add List",

+ 1 - 0
i18n/ta.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Add Subtask",
     "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-checklist-item": "Add an item to checklist",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Add Cover",
     "add-cover": "Add Cover",
     "add-label": "Add Label",
     "add-label": "Add Label",
     "add-list": "Add List",
     "add-list": "Add List",

+ 1 - 0
i18n/th.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Add Subtask",
     "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "เพิ่มรายการตรวจสอบ",
     "add-checklist-item": "เพิ่มรายการตรวจสอบ",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "เพิ่มหน้าปก",
     "add-cover": "เพิ่มหน้าปก",
     "add-label": "Add Label",
     "add-label": "Add Label",
     "add-list": "Add List",
     "add-list": "Add List",

+ 1 - 0
i18n/tr.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Alt Görev Ekle",
     "add-subtask": "Alt Görev Ekle",
     "add-checklist": "Yapılacak Listesi Ekle",
     "add-checklist": "Yapılacak Listesi Ekle",
     "add-checklist-item": "Yapılacak listesine yeni bir öğe ekle",
     "add-checklist-item": "Yapılacak listesine yeni bir öğe ekle",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Kapak resmi ekle",
     "add-cover": "Kapak resmi ekle",
     "add-label": "Etiket Ekle",
     "add-label": "Etiket Ekle",
     "add-list": "Liste Ekle",
     "add-list": "Liste Ekle",

+ 1 - 0
i18n/uk.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Додати підзадачу",
     "add-subtask": "Додати підзадачу",
     "add-checklist": "Add Checklist",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Додати елемент в список",
     "add-checklist-item": "Додати елемент в список",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Додати обкладинку",
     "add-cover": "Додати обкладинку",
     "add-label": "Додати мітку",
     "add-label": "Додати мітку",
     "add-list": "Додати список",
     "add-list": "Додати список",

+ 1 - 0
i18n/vi.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Thêm Nhiệm vụ phụ",
     "add-subtask": "Thêm Nhiệm vụ phụ",
     "add-checklist": "Thêm Danh Sách Kiểm Tra",
     "add-checklist": "Thêm Danh Sách Kiểm Tra",
     "add-checklist-item": "Thêm Một Mục Vào Danh Sách Kiểm Tra",
     "add-checklist-item": "Thêm Một Mục Vào Danh Sách Kiểm Tra",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Thêm Bìa",
     "add-cover": "Thêm Bìa",
     "add-label": "Thêm Nhãn",
     "add-label": "Thêm Nhãn",
     "add-list": "Thêm Danh Sách",
     "add-list": "Thêm Danh Sách",

+ 32 - 31
i18n/zh-CN.i18n.json

@@ -81,14 +81,15 @@
     "activity-endDate": "已将结束日期从 %s 修改为 %s",
     "activity-endDate": "已将结束日期从 %s 修改为 %s",
     "add-attachment": "添加附件",
     "add-attachment": "添加附件",
     "add-board": "添加看板",
     "add-board": "添加看板",
-    "add-template": "Add Template",
+    "add-template": "新增模板",
     "add-card": "添加卡片",
     "add-card": "添加卡片",
-    "add-card-to-top-of-list": "Add Card to Top of List",
-    "add-card-to-bottom-of-list": "Add Card to Bottom of List",
+    "add-card-to-top-of-list": "新增卡片到列表顶部",
+    "add-card-to-bottom-of-list": "新增卡片到列表底部",
     "add-swimlane": "添加泳道图",
     "add-swimlane": "添加泳道图",
     "add-subtask": "添加子任务",
     "add-subtask": "添加子任务",
     "add-checklist": "添加待办清单",
     "add-checklist": "添加待办清单",
     "add-checklist-item": "扩充清单",
     "add-checklist-item": "扩充清单",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "添加封面",
     "add-cover": "添加封面",
     "add-label": "添加标签",
     "add-label": "添加标签",
     "add-list": "添加列表",
     "add-list": "添加列表",
@@ -120,8 +121,8 @@
     "archives": "归档",
     "archives": "归档",
     "template": "模板",
     "template": "模板",
     "templates": "模板",
     "templates": "模板",
-    "template-container": "Template Container",
-    "add-template-container": "Add Template Container",
+    "template-container": "模板容器",
+    "add-template-container": "新增模板容器",
     "assign-member": "指派成员",
     "assign-member": "指派成员",
     "attached": "附加",
     "attached": "附加",
     "attachment": "附件",
     "attachment": "附件",
@@ -136,7 +137,7 @@
     "board-not-found": "看板不存在",
     "board-not-found": "看板不存在",
     "board-private-info": "该看板将被设为 <strong>私有</strong>.",
     "board-private-info": "该看板将被设为 <strong>私有</strong>.",
     "board-public-info": "该看板将被设为 <strong>公开</strong>.",
     "board-public-info": "该看板将被设为 <strong>公开</strong>.",
-    "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.",
+    "board-drag-drop-reorder-or-click-open": "对看板图标进行拖拽排序。点击看板图标打开看板。",
     "boardChangeColorPopup-title": "修改看板背景",
     "boardChangeColorPopup-title": "修改看板背景",
     "boardChangeTitlePopup-title": "重命名看板",
     "boardChangeTitlePopup-title": "重命名看板",
     "boardChangeVisibilityPopup-title": "更改可视级别",
     "boardChangeVisibilityPopup-title": "更改可视级别",
@@ -184,10 +185,10 @@
     "vote-against": "反对",
     "vote-against": "反对",
     "deleteVotePopup-title": "删除投票?",
     "deleteVotePopup-title": "删除投票?",
     "vote-delete-pop": "永久删除。此操作会将所有数据删除掉。",
     "vote-delete-pop": "永久删除。此操作会将所有数据删除掉。",
-    "cardStartPlanningPokerPopup-title": "Start a Planning Poker",
-    "card-edit-planning-poker": "Edit Planning Poker",
-    "editPokerEndDatePopup-title": "Change Planning Poker vote end date",
-    "poker-question": "Planning Poker",
+    "cardStartPlanningPokerPopup-title": "开始一次计划扑克",
+    "card-edit-planning-poker": "编辑计划扑克",
+    "editPokerEndDatePopup-title": "更改计划扑克投票截止日期",
+    "poker-question": "计划扑克",
     "poker-one": "1",
     "poker-one": "1",
     "poker-two": "2",
     "poker-two": "2",
     "poker-three": "3",
     "poker-three": "3",
@@ -197,14 +198,14 @@
     "poker-twenty": "20",
     "poker-twenty": "20",
     "poker-forty": "40",
     "poker-forty": "40",
     "poker-oneHundred": "100",
     "poker-oneHundred": "100",
-    "poker-unsure": "?",
-    "poker-finish": "Finish",
-    "poker-result-votes": "Votes",
-    "poker-result-who": "Who",
+    "poker-unsure": "",
+    "poker-finish": "完成",
+    "poker-result-votes": "投票",
+    "poker-result-who": "何人",
     "poker-replay": "Replay",
     "poker-replay": "Replay",
     "set-estimation": "Set Estimation",
     "set-estimation": "Set Estimation",
-    "deletePokerPopup-title": "Delete planning poker?",
-    "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.",
+    "deletePokerPopup-title": "删除计划扑克?",
+    "poker-delete-pop": "永久删除。对该计划扑克的所有操作记录将会丢失。",
     "cardDeletePopup-title": "彻底删除卡片?",
     "cardDeletePopup-title": "彻底删除卡片?",
     "cardDetailsActionsPopup-title": "卡片操作",
     "cardDetailsActionsPopup-title": "卡片操作",
     "cardLabelsPopup-title": "标签",
     "cardLabelsPopup-title": "标签",
@@ -236,7 +237,7 @@
     "close": "关闭",
     "close": "关闭",
     "close-board": "关闭看板",
     "close-board": "关闭看板",
     "close-board-pop": "您可以通过主页头部的“归档”按钮,来恢复看板。",
     "close-board-pop": "您可以通过主页头部的“归档”按钮,来恢复看板。",
-    "close-card": "Close Card",
+    "close-card": "关闭卡片",
     "color-black": "黑色",
     "color-black": "黑色",
     "color-blue": "蓝色",
     "color-blue": "蓝色",
     "color-crimson": "深红",
     "color-crimson": "深红",
@@ -361,11 +362,11 @@
     "export-board-excel": "看板导出为Excel",
     "export-board-excel": "看板导出为Excel",
     "user-can-not-export-excel": "用户无法导出Excel",
     "user-can-not-export-excel": "用户无法导出Excel",
     "export-board-html": "看板导出为HTML",
     "export-board-html": "看板导出为HTML",
-    "export-card": "Export card",
-    "export-card-pdf": "Export card to PDF",
-    "user-can-not-export-card-to-pdf": "User can not export card to PDF",
+    "export-card": "导出卡片",
+    "export-card-pdf": "卡片导出为PDF",
+    "user-can-not-export-card-to-pdf": "用户无法将卡片导出为PDF",
     "exportBoardPopup-title": "导出看板",
     "exportBoardPopup-title": "导出看板",
-    "exportCardPopup-title": "Export card",
+    "exportCardPopup-title": "导出卡片",
     "sort": "排序",
     "sort": "排序",
     "sort-desc": "点此来将列表排序",
     "sort-desc": "点此来将列表排序",
     "list-sort-by": "按此来将列表排序:",
     "list-sort-by": "按此来将列表排序:",
@@ -454,8 +455,8 @@
     "set-color-list": "设置颜色",
     "set-color-list": "设置颜色",
     "listActionPopup-title": "列表操作",
     "listActionPopup-title": "列表操作",
     "settingsUserPopup-title": "用户设置",
     "settingsUserPopup-title": "用户设置",
-    "settingsTeamPopup-title": "Team Settings",
-    "settingsOrgPopup-title": "Organization Settings",
+    "settingsTeamPopup-title": "团队设置",
+    "settingsOrgPopup-title": "组织设置",
     "swimlaneActionPopup-title": "泳道图操作",
     "swimlaneActionPopup-title": "泳道图操作",
     "swimlaneAddPopup-title": "在下面添加一个泳道",
     "swimlaneAddPopup-title": "在下面添加一个泳道",
     "listImportCardPopup-title": "导入 Trello 卡片",
     "listImportCardPopup-title": "导入 Trello 卡片",
@@ -671,7 +672,7 @@
     "setListColorPopup-title": "选择一种颜色",
     "setListColorPopup-title": "选择一种颜色",
     "assigned-by": "指派人",
     "assigned-by": "指派人",
     "requested-by": "需求人",
     "requested-by": "需求人",
-    "card-sorting-by-number": "Card sorting by number",
+    "card-sorting-by-number": "根据编号对卡片排序",
     "board-delete-notice": "删除时永久操作,将会丢失此看板上的所有列表、卡片和动作。",
     "board-delete-notice": "删除时永久操作,将会丢失此看板上的所有列表、卡片和动作。",
     "delete-board-confirm-popup": "所有列表、卡片、标签和活动都回被删除,将无法恢复看板内容。不支持撤销。",
     "delete-board-confirm-popup": "所有列表、卡片、标签和活动都回被删除,将无法恢复看板内容。不支持撤销。",
     "boardDeletePopup-title": "删除看板?",
     "boardDeletePopup-title": "删除看板?",
@@ -853,8 +854,8 @@
     "act-duenow": "__card__ 的当前到期提醒(__timeValue__) 现在到期",
     "act-duenow": "__card__ 的当前到期提醒(__timeValue__) 现在到期",
     "act-atUserComment": "[__board__] __list__/__card__ 提到了您",
     "act-atUserComment": "[__board__] __list__/__card__ 提到了您",
     "delete-user-confirm-popup": "确实要删除此帐户吗?此操作无法撤销。",
     "delete-user-confirm-popup": "确实要删除此帐户吗?此操作无法撤销。",
-    "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.",
-    "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.",
+    "delete-team-confirm-popup": "请确认是否删除此团队?此操作无法撤销。",
+    "delete-org-confirm-popup": "请确认是否删除此组织?此操作无法撤销。",
     "accounts-allowUserDelete": "允许用户自行删除其帐户",
     "accounts-allowUserDelete": "允许用户自行删除其帐户",
     "hide-minicard-label-text": "隐藏迷你卡片标签文本",
     "hide-minicard-label-text": "隐藏迷你卡片标签文本",
     "show-desktop-drag-handles": "显示桌面拖放手柄",
     "show-desktop-drag-handles": "显示桌面拖放手柄",
@@ -1045,7 +1046,7 @@
     "rulesReportTitle": "规则报告",
     "rulesReportTitle": "规则报告",
     "copy-swimlane": "复制泳道",
     "copy-swimlane": "复制泳道",
     "copySwimlanePopup-title": "复制泳道",
     "copySwimlanePopup-title": "复制泳道",
-    "display-card-creator": "Display Card Creator",
+    "display-card-creator": "显示卡片创建者",
     "wait-spinner": "Wait Spinner",
     "wait-spinner": "Wait Spinner",
     "Bounce": "Bounce Wait Spinner",
     "Bounce": "Bounce Wait Spinner",
     "Cube": "Cube Wait Spinner",
     "Cube": "Cube Wait Spinner",
@@ -1055,8 +1056,8 @@
     "Rotateplane": "Rotateplane Wait Spinner",
     "Rotateplane": "Rotateplane Wait Spinner",
     "Scaleout": "Scaleout Wait Spinner",
     "Scaleout": "Scaleout Wait Spinner",
     "Wave": "Wave Wait Spinner",
     "Wave": "Wave Wait Spinner",
-    "maximize-card": "Maximize Card",
-    "minimize-card": "Minimize Card",
-    "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
-    "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
+    "maximize-card": "最大化卡片",
+    "minimize-card": "最小化卡片",
+    "delete-org-warning-message": "无法删除该组织,至少还有一个用户属于该组织。",
+    "delete-team-warning-message": "无法删除该团队,至少还有一个用户属于该团队。"
 }
 }

+ 1 - 0
i18n/zh-HK.i18n.json

@@ -89,6 +89,7 @@
     "add-subtask": "Add Subtask",
     "add-subtask": "Add Subtask",
     "add-checklist": "Add Checklist",
     "add-checklist": "Add Checklist",
     "add-checklist-item": "Add an item to checklist",
     "add-checklist-item": "Add an item to checklist",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "Add Cover",
     "add-cover": "Add Cover",
     "add-label": "Add Label",
     "add-label": "Add Label",
     "add-list": "Add List",
     "add-list": "Add List",

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

@@ -89,6 +89,7 @@
     "add-subtask": "新增子任務",
     "add-subtask": "新增子任務",
     "add-checklist": "新增待辦清單",
     "add-checklist": "新增待辦清單",
     "add-checklist-item": "新增項目",
     "add-checklist-item": "新增項目",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
     "add-cover": "新增封面",
     "add-cover": "新增封面",
     "add-label": "新增標籤",
     "add-label": "新增標籤",
     "add-list": "新增清單",
     "add-list": "新增清單",

+ 15 - 11
models/wekanCreator.js

@@ -271,17 +271,21 @@ export class WekanCreator {
           });
           });
       });
       });
     }
     }
-    boardToImport.labels.forEach(label => {
-      const labelToCreate = {
-        _id: Random.id(6),
-        color: label.color,
-        name: label.name,
-      };
-      // We need to remember them by Wekan ID, as this is the only ref we have
-      // when importing cards.
-      this.labels[label._id] = labelToCreate._id;
-      boardToCreate.labels.push(labelToCreate);
-    });
+
+    if (boardToImport.labels) {
+      boardToImport.labels.forEach(label => {
+        const labelToCreate = {
+          _id: Random.id(6),
+          color: label.color,
+          name: label.name,
+        };
+        // We need to remember them by Wekan ID, as this is the only ref we have
+        // when importing cards.
+        this.labels[label._id] = labelToCreate._id;
+        boardToCreate.labels.push(labelToCreate);
+      });
+    }
+
     const boardId = Boards.direct.insert(boardToCreate);
     const boardId = Boards.direct.insert(boardToCreate);
     Boards.direct.update(boardId, {
     Boards.direct.update(boardId, {
       $set: {
       $set: {

+ 1 - 1
package-lock.json

@@ -1,6 +1,6 @@
 {
 {
   "name": "wekan",
   "name": "wekan",
-  "version": "v5.38.0",
+  "version": "v5.40.0",
   "lockfileVersion": 1,
   "lockfileVersion": 1,
   "requires": true,
   "requires": true,
   "dependencies": {
   "dependencies": {

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
 {
   "name": "wekan",
   "name": "wekan",
-  "version": "v5.38.0",
+  "version": "v5.40.0",
   "description": "Open-Source kanban",
   "description": "Open-Source kanban",
   "private": true,
   "private": true,
   "repository": {
   "repository": {

+ 11 - 2
packages/wekan-ldap/server/ldap.js

@@ -40,6 +40,8 @@ export default class LDAP {
       group_filter_group_member_attribute: this.constructor.settings_get('LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE'),
       group_filter_group_member_attribute: this.constructor.settings_get('LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE'),
       group_filter_group_member_format   : this.constructor.settings_get('LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT'),
       group_filter_group_member_format   : this.constructor.settings_get('LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT'),
       group_filter_group_name            : this.constructor.settings_get('LDAP_GROUP_FILTER_GROUP_NAME'),
       group_filter_group_name            : this.constructor.settings_get('LDAP_GROUP_FILTER_GROUP_NAME'),
+      AD_Simple_Auth                     : this.constructor.settings_get('LDAP_AD_SIMPLE_AUTH'),
+      Default_Domain                     : this.constructor.settings_get('LDAP_DEFAULT_DOMAIN'),
     };
     };
   }
   }
 
 
@@ -224,10 +226,17 @@ export default class LDAP {
       return;
       return;
     }
     }
 
 
+    /* if SimpleAuth is configured, the BaseDN is not needed */
+    if (!this.options.BaseDN && !this.options.AD_Simple_Auth) throw new Error('BaseDN is not provided');
 
 
-    if (!this.options.BaseDN) throw new Error('BaseDN is not provided');
+    var userDn = "";
+    if (this.options.AD_Simple_Auth === true || this.options.AD_Simple_Auth === 'true') {
+      userDn = `${username}@${this.options.Default_Domain}`;
+    } else {
+      userDn = `${this.options.User_Authentication_Field}=${username},${this.options.BaseDN}`;
+    }
 
 
-    const userDn = `${this.options.User_Authentication_Field}=${username},${this.options.BaseDN}`;
+    log_info('Binding with User', userDn);
 
 
     this.bindSync(userDn, password);
     this.bindSync(userDn, password);
     this.domainBinded = true;
     this.domainBinded = true;

+ 3 - 3
public/api/wekan.html

@@ -7,7 +7,7 @@
     <meta charset="utf-8">
     <meta charset="utf-8">
     <meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
     <meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
-    <title>Wekan REST API v5.38</title>
+    <title>Wekan REST API v5.40</title>
 
 
     <style>
     <style>
     </style>
     </style>
@@ -1555,7 +1555,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
 	  	<ul class="toc-list-h1">
 	  	<ul class="toc-list-h1">
         
         
           <li>
           <li>
-            <a href="#wekan-rest-api" class="toc-h1 toc-link" data-title="Wekan REST API v5.38">Wekan REST API v5.38</a>
+            <a href="#wekan-rest-api" class="toc-h1 toc-link" data-title="Wekan REST API v5.40">Wekan REST API v5.40</a>
             
             
           </li>
           </li>
         
         
@@ -2128,7 +2128,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
     <div class="page-wrapper">
     <div class="page-wrapper">
       <div class="dark-box"></div>
       <div class="dark-box"></div>
       <div class="content">
       <div class="content">
-        <h1 id="wekan-rest-api">Wekan REST API v5.38</h1>
+        <h1 id="wekan-rest-api">Wekan REST API v5.40</h1>
 <blockquote>
 <blockquote>
 <p>Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.</p>
 <p>Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.</p>
 </blockquote>
 </blockquote>

+ 1 - 1
public/api/wekan.yml

@@ -1,7 +1,7 @@
 swagger: '2.0'
 swagger: '2.0'
 info:
 info:
   title: Wekan REST API
   title: Wekan REST API
-  version: v5.38
+  version: v5.40
   description: |
   description: |
     The REST API allows you to control and extend Wekan with ease.
     The REST API allows you to control and extend Wekan with ease.
 
 

+ 3 - 0
releases/translations/pull-translations.sh

@@ -45,6 +45,9 @@ tx pull -f -l nl
 echo "Esperanto:"
 echo "Esperanto:"
 tx pull -f -l eo
 tx pull -f -l eo
 
 
+echo "English (Italy):"
+tx pull -f -l en_IT
+
 echo "English (United Kingdom):"
 echo "English (United Kingdom):"
 tx pull -f -l en_GB
 tx pull -f -l en_GB
 
 

+ 2 - 2
sandstorm-pkgdef.capnp

@@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = (
     appTitle = (defaultText = "Wekan"),
     appTitle = (defaultText = "Wekan"),
     # The name of the app as it is displayed to the user.
     # The name of the app as it is displayed to the user.
 
 
-    appVersion = 538,
+    appVersion = 540,
     # Increment this for every release.
     # Increment this for every release.
 
 
-    appMarketingVersion = (defaultText = "5.38.0~2021-07-18"),
+    appMarketingVersion = (defaultText = "5.40.0~2021-07-25"),
     # Human-readable presentation of the app version.
     # Human-readable presentation of the app version.
 
 
     minUpgradableAppVersion = 0,
     minUpgradableAppVersion = 0,

+ 27 - 3
server/publications/boards.js

@@ -13,6 +13,17 @@ Meteor.publish('boards', function() {
   const { starredBoards = [] } = (Users.findOne(userId) || {}).profile || {};
   const { starredBoards = [] } = (Users.findOne(userId) || {}).profile || {};
   check(starredBoards, [String]);
   check(starredBoards, [String]);
 
 
+  let currUser = Users.findOne(userId);
+  let orgIdsUserBelongs = currUser!== 'undefined' && currUser.teams !== 'undefined' ? currUser.orgIdsUserBelongs() : '';
+  let teamIdsUserBelongs = currUser!== 'undefined' && currUser.teams !== 'undefined' ? currUser.teamIdsUserBelongs() : '';
+  let orgsIds = [];
+  let teamsIds = [];
+  if(orgIdsUserBelongs && orgIdsUserBelongs != ''){
+    orgsIds = orgIdsUserBelongs.split(',');
+  }
+  if(teamIdsUserBelongs && teamIdsUserBelongs != ''){
+    teamsIds = teamIdsUserBelongs.split(',');
+  }
   return Boards.find(
   return Boards.find(
     {
     {
       archived: false,
       archived: false,
@@ -22,6 +33,8 @@ Meteor.publish('boards', function() {
           permission: 'public',
           permission: 'public',
         },
         },
         { members: { $elemMatch: { userId, isActive: true } } },
         { members: { $elemMatch: { userId, isActive: true } } },
+        {'orgs.orgId': {$in : orgsIds}},
+        {'teams.teamId': {$in : teamsIds}},
       ],
       ],
     },
     },
     {
     {
@@ -82,11 +95,22 @@ Meteor.publishRelations('board', function(boardId, isArchived) {
   check(isArchived, Boolean);
   check(isArchived, Boolean);
   const thisUserId = this.userId;
   const thisUserId = this.userId;
   const $or = [{ permission: 'public' }];
   const $or = [{ permission: 'public' }];
+  let currUser =  (!Match.test(thisUserId, String) || !thisUserId) ? 'undefined' : Users.findOne(thisUserId);
+  let orgIdsUserBelongs = currUser!== 'undefined' && currUser.teams !== 'undefined' ? currUser.orgIdsUserBelongs() : '';
+  let teamIdsUserBelongs = currUser!== 'undefined' && currUser.teams !== 'undefined' ? currUser.teamIdsUserBelongs() : '';
+  let orgsIds = [];
+  let teamsIds = [];
+  if(orgIdsUserBelongs && orgIdsUserBelongs != ''){
+    orgsIds = orgIdsUserBelongs.split(',');
+  }
+  if(teamIdsUserBelongs && teamIdsUserBelongs != ''){
+    teamsIds = teamIdsUserBelongs.split(',');
+  }
 
 
   if (thisUserId) {
   if (thisUserId) {
-    $or.push({
-      members: { $elemMatch: { userId: thisUserId, isActive: true } },
-    });
+    $or.push({members: { $elemMatch: { userId: thisUserId, isActive: true } }});
+    $or.push({'orgs.orgId': {$in : orgsIds}});
+    $or.push({'teams.teamId': {$in : teamsIds}});
   }
   }
 
 
   this.cursor(
   this.cursor(

+ 4 - 0
server/publications/users.js

@@ -23,6 +23,8 @@ Meteor.publish('user-admin', function() {
   return Meteor.users.find(this.userId, {
   return Meteor.users.find(this.userId, {
     fields: {
     fields: {
       isAdmin: 1,
       isAdmin: 1,
+      teams: 1,
+      orgs: 1,
     },
     },
   });
   });
 });
 });
@@ -34,6 +36,8 @@ Meteor.publish('user-authenticationMethod', function(match) {
     {
     {
       fields: {
       fields: {
         authenticationMethod: 1,
         authenticationMethod: 1,
+        teams: 1,
+        orgs: 1,
       },
       },
     },
     },
   );
   );

ファイルの差分が大きいため隠しています
+ 0 - 0
snap-src/bin/config


+ 14 - 7
snap-src/bin/wekan-help

@@ -297,6 +297,18 @@ echo -e "Ldap Port."
 echo -e "The port of the ldap server:"
 echo -e "The port of the ldap server:"
 echo -e "\t$ snap set $SNAP_NAME ldap-port='12345'"
 echo -e "\t$ snap set $SNAP_NAME ldap-port='12345'"
 echo -e "\n"
 echo -e "\n"
+echo -e "LDAP AD Simple Auth. When enabled, ldap-basedn is not needed, and also do set ldap-user-autentication='true'. Example: true. Enable:"
+echo -e "\t$ snap set $SNAP_NAME ldap-ad-simple-auth='true'"
+echo -e "\t-Disable the LDAP AD Simple Auth of Wekan:"
+echo -e "\t$ snap unset $SNAP_NAME ldap-ad-simple-auth"
+echo -e "\n"
+echo -e "a) Option to login to the LDAP server with the user's own username and password, instead of an administrator key. Default: false (use administrator key)."
+echo -e "b) For LDAP AD Simple Auth, set to true."
+echo -e "\t$ snap set $SNAP_NAME ldap-user-authentication='true'"
+echo -e "\n"
+echo -e "Which field is used to find the user for the user authentication. Default: uid."
+echo -e "\t$ snap set $SNAP_NAME ldap-user-authentication-field='uid'"
+echo -e "\n"
 echo -e "Ldap Host."
 echo -e "Ldap Host."
 echo -e "The host server for the LDAP server:"
 echo -e "The host server for the LDAP server:"
 echo -e "\t$ snap set $SNAP_NAME ldap-host='localhost'"
 echo -e "\t$ snap set $SNAP_NAME ldap-host='localhost'"
@@ -370,12 +382,6 @@ echo -e "Ldap Reject Unauthorized."
 echo -e "Reject Unauthorized Certificate:"
 echo -e "Reject Unauthorized Certificate:"
 echo -e "\t$ snap set $SNAP_NAME ldap-reject-unauthorized='true'"
 echo -e "\t$ snap set $SNAP_NAME ldap-reject-unauthorized='true'"
 echo -e "\n"
 echo -e "\n"
-echo -e "Option to login to the LDAP server with the user's own username and password, instead of an administrator key. Default: false (use administrator key)."
-echo -e "\t$ snap set $SNAP_NAME ldap-user-authentication='true'"
-echo -e "\n"
-echo -e "Which field is used to find the user for the user authentication. Default: uid."
-echo -e "\t$ snap set $SNAP_NAME ldap-user-authentication-field='uid'"
-echo -e "\n"
 echo -e "Ldap User Search Filter."
 echo -e "Ldap User Search Filter."
 echo -e "Optional extra LDAP filters. Don't forget the outmost enclosing parentheses if needed:"
 echo -e "Optional extra LDAP filters. Don't forget the outmost enclosing parentheses if needed:"
 echo -e "\t$ snap set $SNAP_NAME ldap-user-search-filter=''"
 echo -e "\t$ snap set $SNAP_NAME ldap-user-search-filter=''"
@@ -460,7 +466,8 @@ echo -e "Ldap Sync Group Roles."
 echo -e "\t$ snap set $SNAP_NAME ldap-sync-group-roles=''"
 echo -e "\t$ snap set $SNAP_NAME ldap-sync-group-roles=''"
 echo -e "\n"
 echo -e "\n"
 echo -e "Ldap Default Domain."
 echo -e "Ldap Default Domain."
-echo -e "The default domain of the ldap it is used to create email if the field is not map correctly with the LDAP_SYNC_USER_DATA_FIELDMAP:"
+echo -e "a) In case AD SimpleAuth is configured, the default domain is appended to the given loginname for creating the correct username for the bind request to AD."
+echo -e "b) The default domain of the ldap it is used to create email if the field is not map correctly with the ldap-sync-user-data-fieldmap."
 echo -e "\t$ snap set $SNAP_NAME ldap-default-domain=''"
 echo -e "\t$ snap set $SNAP_NAME ldap-default-domain=''"
 echo -e "\n"
 echo -e "\n"
 echo -e "Enable/Disable syncing of admin status based on LDAP groups."
 echo -e "Enable/Disable syncing of admin status based on LDAP groups."

+ 1 - 1
snapcraft.yaml

@@ -1,5 +1,5 @@
 name: wekan
 name: wekan
-version: '5.38'
+version: '5.40'
 summary: The open-source kanban
 summary: The open-source kanban
 description: |
 description: |
    Wekan is an open-source and collaborative kanban board application.
    Wekan is an open-source and collaborative kanban board application.

+ 38 - 10
start-wekan.bat

@@ -190,10 +190,45 @@ REM # LDAP_HOST : The host server for the LDAP server
 REM # example : LDAP_HOST=localhost
 REM # example : LDAP_HOST=localhost
 REM SET LDAP_HOST=
 REM SET LDAP_HOST=
 
 
+REM #-----------------------------------------------------------------
+REM # ==== LDAP AD Simple Auth ====
+REM # Set to true, if you want to connect with Active Directory by Simple Authentication.
+REM # When using AD Simple Auth, LDAP_BASEDN is not needed.
+REM SET LDAP_AD_SIMPLE_AUTH=true
+
+REM #-----------------------------------------------------------------
+REM # === LDAP User Authentication ===
+REM #
+REM # a) Option to login to the LDAP server with the user's own username and password, instead of
+REM #    an administrator key. Default: false (use administrator key).
+REM #
+REM # b) When using AD Simple Auth, set to true, when login user is used for binding,
+REM #    and LDAP_BASEDN is not needed.
+REM #
+REM # Example:
+REM SET LDAP_USER_AUTHENTICATION=true
+
+REM # Which field is used to find the user for the user authentication. Default: uid.
+REM SET LDAP_USER_AUTHENTICATION_FIELD=uid
+
+REM # === LDAP Default Domain ===
+REM #
+REM # a) In case AD SimpleAuth is configured, the default domain is appended to the given
+REM #    loginname for creating the correct username for the bind request to AD.
+REM #
+REM # b) The default domain of the ldap it is used to create email if the field is not map
+REM #     correctly with the LDAP_SYNC_USER_DATA_FIELDMAP
+REM #
+REM # Example :
+REM SET LDAP_DEFAULT_DOMAIN=mydomain.com
+
+REM #-----------------------------------------------------------------
+REM # ==== LDAP BASEDN Auth ====
 REM # LDAP_BASEDN : The base DN for the LDAP Tree
 REM # LDAP_BASEDN : The base DN for the LDAP Tree
 REM # example : LDAP_BASEDN=ou=user,dc=example,dc=org
 REM # example : LDAP_BASEDN=ou=user,dc=example,dc=org
 REM SET LDAP_BASEDN=
 REM SET LDAP_BASEDN=
 
 
+REM #-----------------------------------------------------------------
 REM # LDAP_LOGIN_FALLBACK : Fallback on the default authentication method
 REM # LDAP_LOGIN_FALLBACK : Fallback on the default authentication method
 REM # example : LDAP_LOGIN_FALLBACK=true
 REM # example : LDAP_LOGIN_FALLBACK=true
 REM SET LDAP_LOGIN_FALLBACK=false
 REM SET LDAP_LOGIN_FALLBACK=false
@@ -265,12 +300,6 @@ REM # LDAP_REJECT_UNAUTHORIZED : Reject Unauthorized Certificate
 REM # example : LDAP_REJECT_UNAUTHORIZED=true
 REM # example : LDAP_REJECT_UNAUTHORIZED=true
 REM SET LDAP_REJECT_UNAUTHORIZED=false
 REM SET LDAP_REJECT_UNAUTHORIZED=false
 
 
-REM # Option to login to the LDAP server with the user's own username and password, instead of an administrator key. Default: false (use administrator key).
-REM SET LDAP_USER_AUTHENTICATION=true
-
-REM # Which field is used to find the user for the user authentication. Default: uid.
-REM SET LDAP_USER_AUTHENTICATION_FIELD=uid
-
 REM # LDAP_USER_SEARCH_FILTER : Optional extra LDAP filters. Don't forget the outmost enclosing parentheses if needed
 REM # LDAP_USER_SEARCH_FILTER : Optional extra LDAP filters. Don't forget the outmost enclosing parentheses if needed
 REM # example : LDAP_USER_SEARCH_FILTER=
 REM # example : LDAP_USER_SEARCH_FILTER=
 REM SET LDAP_USER_SEARCH_FILTER=
 REM SET LDAP_USER_SEARCH_FILTER=
@@ -355,14 +384,13 @@ REM # LDAP_SYNC_USER_DATA_FIELDMAP :
 REM # example : LDAP_SYNC_USER_DATA_FIELDMAP={"cn":"name", "mail":"email"}
 REM # example : LDAP_SYNC_USER_DATA_FIELDMAP={"cn":"name", "mail":"email"}
 REM SET LDAP_SYNC_USER_DATA_FIELDMAP=
 REM SET LDAP_SYNC_USER_DATA_FIELDMAP=
 
 
+REM # The default domain of the ldap it is used to create email if the field is not map correctly
+REM # with the LDAP_SYNC_USER_DATA_FIELDMAP is defined in setting LDAP_DEFAULT_DOMAIN above.
+
 REM # LDAP_SYNC_GROUP_ROLES :
 REM # LDAP_SYNC_GROUP_ROLES :
 REM # example :
 REM # example :
 REM # SET LDAP_SYNC_GROUP_ROLES=
 REM # SET LDAP_SYNC_GROUP_ROLES=
 
 
-REM # LDAP_DEFAULT_DOMAIN : The default domain of the ldap it is used to create email if the field is not map correctly with the LDAP_SYNC_USER_DATA_FIELDMAP
-REM # example :
-REM SET LDAP_DEFAULT_DOMAIN=
-
 REM # Enable/Disable syncing of admin status based on ldap groups:
 REM # Enable/Disable syncing of admin status based on ldap groups:
 REM SET LDAP_SYNC_ADMIN_STATUS=true
 REM SET LDAP_SYNC_ADMIN_STATUS=true
 
 

+ 107 - 7
start-wekan.sh

@@ -111,6 +111,7 @@
       ## The option that allows matomo to retrieve the username:
       ## The option that allows matomo to retrieve the username:
       # Example: export MATOMO_WITH_USERNAME=true
       # Example: export MATOMO_WITH_USERNAME=true
       #export MATOMO_WITH_USERNAME='false'
       #export MATOMO_WITH_USERNAME='false'
+      #---------------------------------------------
       # Enable browser policy and allow one trusted URL that can have iframe that has Wekan embedded inside.
       # Enable browser policy and allow one trusted URL that can have iframe that has Wekan embedded inside.
       # Setting this to false is not recommended, it also disables all other browser policy protections
       # Setting this to false is not recommended, it also disables all other browser policy protections
       # and allows all iframing etc. See wekan/server/policy.js
       # and allows all iframing etc. See wekan/server/policy.js
@@ -133,27 +134,36 @@
       # 2) Configure the environment variables. This differs slightly
       # 2) Configure the environment variables. This differs slightly
       #     by installation type, but make sure you have the following:
       #     by installation type, but make sure you have the following:
       #export OAUTH2_ENABLED=true
       #export OAUTH2_ENABLED=true
+      #
       # Optional OAuth2 CA Cert, see https://github.com/wekan/wekan/issues/3299
       # Optional OAuth2 CA Cert, see https://github.com/wekan/wekan/issues/3299
       #export OAUTH2_CA_CERT=ABCD1234
       #export OAUTH2_CA_CERT=ABCD1234
+      #
       # Use OAuth2 ADFS additional changes. Also needs OAUTH2_ENABLED=true setting.
       # Use OAuth2 ADFS additional changes. Also needs OAUTH2_ENABLED=true setting.
       #export OAUTH2_ADFS_ENABLED=false
       #export OAUTH2_ADFS_ENABLED=false
+      #
       # OAuth2 docs: https://github.com/wekan/wekan/wiki/OAuth2
       # OAuth2 docs: https://github.com/wekan/wekan/wiki/OAuth2
       # OAuth2 login style: popup or redirect.
       # OAuth2 login style: popup or redirect.
       #export OAUTH2_LOGIN_STYLE=redirect
       #export OAUTH2_LOGIN_STYLE=redirect
+      #
       # Application GUID captured during app registration:
       # Application GUID captured during app registration:
       #export OAUTH2_CLIENT_ID=xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
       #export OAUTH2_CLIENT_ID=xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
+      #
       # Secret key generated during app registration:
       # Secret key generated during app registration:
       #export OAUTH2_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
       #export OAUTH2_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
       #export OAUTH2_SERVER_URL=https://login.microsoftonline.com/
       #export OAUTH2_SERVER_URL=https://login.microsoftonline.com/
       #export OAUTH2_AUTH_ENDPOINT=/oauth2/v2.0/authorize
       #export OAUTH2_AUTH_ENDPOINT=/oauth2/v2.0/authorize
       #export OAUTH2_USERINFO_ENDPOINT=https://graph.microsoft.com/oidc/userinfo
       #export OAUTH2_USERINFO_ENDPOINT=https://graph.microsoft.com/oidc/userinfo
       #export OAUTH2_TOKEN_ENDPOINT=/oauth2/v2.0/token
       #export OAUTH2_TOKEN_ENDPOINT=/oauth2/v2.0/token
+      #
       # The claim name you want to map to the unique ID field:
       # The claim name you want to map to the unique ID field:
       #export OAUTH2_ID_MAP=email
       #export OAUTH2_ID_MAP=email
+      #
       # The claim name you want to map to the username field:
       # The claim name you want to map to the username field:
       #export OAUTH2_USERNAME_MAP=email
       #export OAUTH2_USERNAME_MAP=email
+      #
       # The claim name you want to map to the full name field:
       # The claim name you want to map to the full name field:
       #export OAUTH2_FULLNAME_MAP=name
       #export OAUTH2_FULLNAME_MAP=name
+      #
       # The claim name you want to map to the email field:
       # The claim name you want to map to the email field:
       #export OAUTH2_EMAIL_MAP=email
       #export OAUTH2_EMAIL_MAP=email
       #-----------------------------------------------------------------
       #-----------------------------------------------------------------
@@ -175,63 +185,124 @@
       # https://github.com/wekan/wekan/wiki/OAuth2
       # https://github.com/wekan/wekan/wiki/OAuth2
       # Enable the OAuth2 connection
       # Enable the OAuth2 connection
       #export OAUTH2_ENABLED=true
       #export OAUTH2_ENABLED=true
+      #
       # OAuth2 login style: popup or redirect.
       # OAuth2 login style: popup or redirect.
       #export OAUTH2_LOGIN_STYLE=redirect
       #export OAUTH2_LOGIN_STYLE=redirect
+      #
       # OAuth2 Client ID.
       # OAuth2 Client ID.
       #export OAUTH2_CLIENT_ID=abcde12345
       #export OAUTH2_CLIENT_ID=abcde12345
+      #
       # OAuth2 Secret.
       # OAuth2 Secret.
       #export OAUTH2_SECRET=54321abcde
       #export OAUTH2_SECRET=54321abcde
+      #
       # OAuth2 Server URL.
       # OAuth2 Server URL.
       #export OAUTH2_SERVER_URL=https://chat.example.com
       #export OAUTH2_SERVER_URL=https://chat.example.com
+      #
       # OAuth2 Authorization Endpoint.
       # OAuth2 Authorization Endpoint.
       #export OAUTH2_AUTH_ENDPOINT=/oauth/authorize
       #export OAUTH2_AUTH_ENDPOINT=/oauth/authorize
+      #
       # OAuth2 Userinfo Endpoint.
       # OAuth2 Userinfo Endpoint.
       #export OAUTH2_USERINFO_ENDPOINT=/oauth/userinfo
       #export OAUTH2_USERINFO_ENDPOINT=/oauth/userinfo
+      #
       # OAuth2 Token Endpoint.
       # OAuth2 Token Endpoint.
       #export OAUTH2_TOKEN_ENDPOINT=/oauth/token
       #export OAUTH2_TOKEN_ENDPOINT=/oauth/token
+      #
       # OAUTH2 ID Token Whitelist Fields.
       # OAUTH2 ID Token Whitelist Fields.
       #export OAUTH2_ID_TOKEN_WHITELIST_FIELDS=[]
       #export OAUTH2_ID_TOKEN_WHITELIST_FIELDS=[]
+      #
       # OAUTH2 Request Permissions.
       # OAUTH2 Request Permissions.
       #export OAUTH2_REQUEST_PERMISSIONS='openid profile email'
       #export OAUTH2_REQUEST_PERMISSIONS='openid profile email'
+      #
       # OAuth2 ID Mapping
       # OAuth2 ID Mapping
       #export OAUTH2_ID_MAP=
       #export OAUTH2_ID_MAP=
+      #
       # OAuth2 Username Mapping
       # OAuth2 Username Mapping
       #export OAUTH2_USERNAME_MAP=
       #export OAUTH2_USERNAME_MAP=
+      #
       # OAuth2 Fullname Mapping
       # OAuth2 Fullname Mapping
       #export OAUTH2_FULLNAME_MAP=
       #export OAUTH2_FULLNAME_MAP=
+      #
       # OAuth2 Email Mapping
       # OAuth2 Email Mapping
       #export OAUTH2_EMAIL_MAP=
       #export OAUTH2_EMAIL_MAP=
       #---------------------------------------------
       #---------------------------------------------
       # LDAP_ENABLE : Enable or not the connection by the LDAP
       # LDAP_ENABLE : Enable or not the connection by the LDAP
       # example :  export LDAP_ENABLE=true
       # example :  export LDAP_ENABLE=true
       #export LDAP_ENABLE=false
       #export LDAP_ENABLE=false
+      #
       # LDAP_PORT : The port of the LDAP server
       # LDAP_PORT : The port of the LDAP server
       # example :  export LDAP_PORT=389
       # example :  export LDAP_PORT=389
       #export LDAP_PORT=389
       #export LDAP_PORT=389
+      #
       # LDAP_HOST : The host server for the LDAP server
       # LDAP_HOST : The host server for the LDAP server
       # example :  export LDAP_HOST=localhost
       # example :  export LDAP_HOST=localhost
       #export LDAP_HOST=
       #export LDAP_HOST=
+      #
+      #-----------------------------------------------------------------
+      # ==== LDAP AD Simple Auth ====
+      #
+      # Set to true, if you want to connect with Active Directory by Simple Authentication.
+      # When using AD Simple Auth, LDAP_BASEDN is not needed.
+      #
+      # Example:
+      #export LDAP_AD_SIMPLE_AUTH=true
+      #
+      # === LDAP User Authentication ===
+      #
+      # a) Option to login to the LDAP server with the user's own username and password, instead of
+      #    an administrator key. Default: false (use administrator key).
+      #
+      # b) When using AD Simple Auth, set to true, when login user is used for binding,
+      #    and LDAP_BASEDN is not needed.
+      #
+      # Example:
+      #export LDAP_USER_AUTHENTICATION=true
+      #
+      # Which field is used to find the user for the user authentication. Default: uid.
+      #export LDAP_USER_AUTHENTICATION_FIELD=uid
+      #
+      # === LDAP Default Domain ===
+      #
+      # a) In case AD SimpleAuth is configured, the default domain is appended to the given
+      #    loginname for creating the correct username for the bind request to AD.
+      #
+      # b) The default domain of the ldap it is used to create email if the field is not map
+      #     correctly with the LDAP_SYNC_USER_DATA_FIELDMAP
+      #
+      # Example :
+      #export LDAP_DEFAULT_DOMAIN=mydomain.com
+      #
+      #-----------------------------------------------------------------
+      # ==== LDAP BASEDN Auth ====
+      #
       # LDAP_BASEDN : The base DN for the LDAP Tree
       # LDAP_BASEDN : The base DN for the LDAP Tree
       # example :  export LDAP_BASEDN=ou=user,dc=example,dc=org
       # example :  export LDAP_BASEDN=ou=user,dc=example,dc=org
       #export LDAP_BASEDN=
       #export LDAP_BASEDN=
+      #
+      #---------------------------------------------
       # LDAP_LOGIN_FALLBACK : Fallback on the default authentication method
       # LDAP_LOGIN_FALLBACK : Fallback on the default authentication method
       # example :  export LDAP_LOGIN_FALLBACK=true
       # example :  export LDAP_LOGIN_FALLBACK=true
       #export LDAP_LOGIN_FALLBACK=false
       #export LDAP_LOGIN_FALLBACK=false
+      #
       # LDAP_RECONNECT : Reconnect to the server if the connection is lost
       # LDAP_RECONNECT : Reconnect to the server if the connection is lost
       # example :  export LDAP_RECONNECT=false
       # example :  export LDAP_RECONNECT=false
       #export LDAP_RECONNECT=true
       #export LDAP_RECONNECT=true
+      #
       # LDAP_TIMEOUT : Overall timeout, in milliseconds
       # LDAP_TIMEOUT : Overall timeout, in milliseconds
       # example :  export LDAP_TIMEOUT=12345
       # example :  export LDAP_TIMEOUT=12345
       #export LDAP_TIMEOUT=10000
       #export LDAP_TIMEOUT=10000
+      #
       # LDAP_IDLE_TIMEOUT : Specifies the timeout for idle LDAP connections in milliseconds
       # LDAP_IDLE_TIMEOUT : Specifies the timeout for idle LDAP connections in milliseconds
       # example :  export LDAP_IDLE_TIMEOUT=12345
       # example :  export LDAP_IDLE_TIMEOUT=12345
       #export LDAP_IDLE_TIMEOUT=10000
       #export LDAP_IDLE_TIMEOUT=10000
+      #
       # LDAP_CONNECT_TIMEOUT : Connection timeout, in milliseconds
       # LDAP_CONNECT_TIMEOUT : Connection timeout, in milliseconds
       # example :  export LDAP_CONNECT_TIMEOUT=12345
       # example :  export LDAP_CONNECT_TIMEOUT=12345
       #export LDAP_CONNECT_TIMEOUT=10000
       #export LDAP_CONNECT_TIMEOUT=10000
+      #
       # LDAP_AUTHENTIFICATION : If the LDAP needs a user account to search
       # LDAP_AUTHENTIFICATION : If the LDAP needs a user account to search
       # example :  export LDAP_AUTHENTIFICATION=true
       # example :  export LDAP_AUTHENTIFICATION=true
       #export LDAP_AUTHENTIFICATION=false
       #export LDAP_AUTHENTIFICATION=false
+      #
       # LDAP_AUTHENTIFICATION_USERDN : The search user DN
       # LDAP_AUTHENTIFICATION_USERDN : The search user DN
       # example :  export LDAP_AUTHENTIFICATION_USERDN=cn=admin,dc=example,dc=org
       # example :  export LDAP_AUTHENTIFICATION_USERDN=cn=admin,dc=example,dc=org
       #----------------------------------------------------------------------------
       #----------------------------------------------------------------------------
@@ -243,110 +314,139 @@
       # LDAP_AUTHENTIFICATION_PASSWORD : The password for the search user
       # LDAP_AUTHENTIFICATION_PASSWORD : The password for the search user
       # example : AUTHENTIFICATION_PASSWORD=admin
       # example : AUTHENTIFICATION_PASSWORD=admin
       #export LDAP_AUTHENTIFICATION_PASSWORD=
       #export LDAP_AUTHENTIFICATION_PASSWORD=
+      #
       # LDAP_LOG_ENABLED : Enable logs for the module
       # LDAP_LOG_ENABLED : Enable logs for the module
       # example :  export LDAP_LOG_ENABLED=true
       # example :  export LDAP_LOG_ENABLED=true
       #export LDAP_LOG_ENABLED=false
       #export LDAP_LOG_ENABLED=false
+      #
       # LDAP_BACKGROUND_SYNC : If the sync of the users should be done in the background
       # LDAP_BACKGROUND_SYNC : If the sync of the users should be done in the background
       # example :  export LDAP_BACKGROUND_SYNC=true
       # example :  export LDAP_BACKGROUND_SYNC=true
       #export LDAP_BACKGROUND_SYNC=false
       #export LDAP_BACKGROUND_SYNC=false
+      #
       # LDAP_BACKGROUND_SYNC_INTERVAL : At which interval does the background task sync in milliseconds
       # LDAP_BACKGROUND_SYNC_INTERVAL : At which interval does the background task sync in milliseconds
       # At which interval does the background task sync in milliseconds.
       # At which interval does the background task sync in milliseconds.
       # Leave this unset, so it uses default, and does not crash.
       # Leave this unset, so it uses default, and does not crash.
       # https://github.com/wekan/wekan/issues/2354#issuecomment-515305722
       # https://github.com/wekan/wekan/issues/2354#issuecomment-515305722
       export LDAP_BACKGROUND_SYNC_INTERVAL=''
       export LDAP_BACKGROUND_SYNC_INTERVAL=''
+      #
       # LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED :
       # LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED :
       # example :  export LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED=true
       # example :  export LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED=true
       #export LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED=false
       #export LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED=false
+      #
       # LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS :
       # LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS :
       # example :  export LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS=true
       # example :  export LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS=true
       #export LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS=false
       #export LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS=false
+      #
       # LDAP_ENCRYPTION : If using LDAPS
       # LDAP_ENCRYPTION : If using LDAPS
       # example :  export LDAP_ENCRYPTION=ssl
       # example :  export LDAP_ENCRYPTION=ssl
       #export LDAP_ENCRYPTION=false
       #export LDAP_ENCRYPTION=false
+      #
       # LDAP_CA_CERT : The certification for the LDAPS server. Certificate needs to be included in this docker-compose.yml file.
       # LDAP_CA_CERT : The certification for the LDAPS server. Certificate needs to be included in this docker-compose.yml file.
       # example :  export LDAP_CA_CERT=-----BEGIN CERTIFICATE-----MIIE+zCCA+OgAwIBAgIkAhwR/6TVLmdRY6hHxvUFWc0+Enmu/Hu6cj+G2FIdAgIC...-----END CERTIFICATE-----
       # example :  export LDAP_CA_CERT=-----BEGIN CERTIFICATE-----MIIE+zCCA+OgAwIBAgIkAhwR/6TVLmdRY6hHxvUFWc0+Enmu/Hu6cj+G2FIdAgIC...-----END CERTIFICATE-----
       #export LDAP_CA_CERT=
       #export LDAP_CA_CERT=
+      #
       # LDAP_REJECT_UNAUTHORIZED : Reject Unauthorized Certificate
       # LDAP_REJECT_UNAUTHORIZED : Reject Unauthorized Certificate
       # example :  export LDAP_REJECT_UNAUTHORIZED=true
       # example :  export LDAP_REJECT_UNAUTHORIZED=true
       #export LDAP_REJECT_UNAUTHORIZED=false
       #export LDAP_REJECT_UNAUTHORIZED=false
-      # Option to login to the LDAP server with the user's own username and password, instead of an administrator key. Default: false (use administrator key).
-      #export LDAP_USER_AUTHENTICATION=true
-      # Which field is used to find the user for the user authentication. Default: uid.
-      #export LDAP_USER_AUTHENTICATION_FIELD=uid
+      #
       # LDAP_USER_SEARCH_FILTER : Optional extra LDAP filters. Don't forget the outmost enclosing parentheses if needed
       # LDAP_USER_SEARCH_FILTER : Optional extra LDAP filters. Don't forget the outmost enclosing parentheses if needed
       # example :  export LDAP_USER_SEARCH_FILTER=
       # example :  export LDAP_USER_SEARCH_FILTER=
       #export LDAP_USER_SEARCH_FILTER=
       #export LDAP_USER_SEARCH_FILTER=
+      #
       # LDAP_USER_SEARCH_SCOPE : base (search only in the provided DN), one (search only in the provided DN and one level deep), or sub (search the whole subtree)
       # LDAP_USER_SEARCH_SCOPE : base (search only in the provided DN), one (search only in the provided DN and one level deep), or sub (search the whole subtree)
       # example :  export LDAP_USER_SEARCH_SCOPE=one
       # example :  export LDAP_USER_SEARCH_SCOPE=one
       #export LDAP_USER_SEARCH_SCOPE=
       #export LDAP_USER_SEARCH_SCOPE=
+      #
       # LDAP_USER_SEARCH_FIELD : Which field is used to find the user
       # LDAP_USER_SEARCH_FIELD : Which field is used to find the user
       # example :  export LDAP_USER_SEARCH_FIELD=uid
       # example :  export LDAP_USER_SEARCH_FIELD=uid
       #export LDAP_USER_SEARCH_FIELD=
       #export LDAP_USER_SEARCH_FIELD=
+      #
       # LDAP_SEARCH_PAGE_SIZE : Used for pagination (0=unlimited)
       # LDAP_SEARCH_PAGE_SIZE : Used for pagination (0=unlimited)
       # example :  export LDAP_SEARCH_PAGE_SIZE=12345
       # example :  export LDAP_SEARCH_PAGE_SIZE=12345
       #export LDAP_SEARCH_PAGE_SIZE=0
       #export LDAP_SEARCH_PAGE_SIZE=0
+      #
       # LDAP_SEARCH_SIZE_LIMIT : The limit number of entries (0=unlimited)
       # LDAP_SEARCH_SIZE_LIMIT : The limit number of entries (0=unlimited)
       # example :  export LDAP_SEARCH_SIZE_LIMIT=12345
       # example :  export LDAP_SEARCH_SIZE_LIMIT=12345
       #export LDAP_SEARCH_SIZE_LIMIT=0
       #export LDAP_SEARCH_SIZE_LIMIT=0
+      #
       # LDAP_GROUP_FILTER_ENABLE : Enable group filtering
       # LDAP_GROUP_FILTER_ENABLE : Enable group filtering
       # example :  export LDAP_GROUP_FILTER_ENABLE=true
       # example :  export LDAP_GROUP_FILTER_ENABLE=true
       #export LDAP_GROUP_FILTER_ENABLE=false
       #export LDAP_GROUP_FILTER_ENABLE=false
+      #
       # LDAP_GROUP_FILTER_OBJECTCLASS : The object class for filtering
       # LDAP_GROUP_FILTER_OBJECTCLASS : The object class for filtering
       # example :  export LDAP_GROUP_FILTER_OBJECTCLASS=group
       # example :  export LDAP_GROUP_FILTER_OBJECTCLASS=group
       #export LDAP_GROUP_FILTER_OBJECTCLASS=
       #export LDAP_GROUP_FILTER_OBJECTCLASS=
+      #
       # LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE :
       # LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE :
       # example :
       # example :
       #export LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE=
       #export LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE=
+      #
       # LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE :
       # LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE :
       # example :
       # example :
       #export LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE=
       #export LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE=
+      #
       # LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT :
       # LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT :
       # example :
       # example :
       #export LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT=
       #export LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT=
+      #
       # LDAP_GROUP_FILTER_GROUP_NAME :
       # LDAP_GROUP_FILTER_GROUP_NAME :
       # example :
       # example :
       #export LDAP_GROUP_FILTER_GROUP_NAME=
       #export LDAP_GROUP_FILTER_GROUP_NAME=
+      #
       # LDAP_UNIQUE_IDENTIFIER_FIELD : This field is sometimes class GUID (Globally Unique Identifier)
       # LDAP_UNIQUE_IDENTIFIER_FIELD : This field is sometimes class GUID (Globally Unique Identifier)
       # example :  export LDAP_UNIQUE_IDENTIFIER_FIELD=guid
       # example :  export LDAP_UNIQUE_IDENTIFIER_FIELD=guid
       #export LDAP_UNIQUE_IDENTIFIER_FIELD=
       #export LDAP_UNIQUE_IDENTIFIER_FIELD=
+      #
       # LDAP_UTF8_NAMES_SLUGIFY : Convert the username to utf8
       # LDAP_UTF8_NAMES_SLUGIFY : Convert the username to utf8
       # example :  export LDAP_UTF8_NAMES_SLUGIFY=false
       # example :  export LDAP_UTF8_NAMES_SLUGIFY=false
       #export LDAP_UTF8_NAMES_SLUGIFY=true
       #export LDAP_UTF8_NAMES_SLUGIFY=true
+      #
       # LDAP_USERNAME_FIELD : Which field contains the ldap username
       # LDAP_USERNAME_FIELD : Which field contains the ldap username
       # example :  export LDAP_USERNAME_FIELD=username
       # example :  export LDAP_USERNAME_FIELD=username
       #export LDAP_USERNAME_FIELD=
       #export LDAP_USERNAME_FIELD=
+      #
       # LDAP_FULLNAME_FIELD : Which field contains the ldap fullname
       # LDAP_FULLNAME_FIELD : Which field contains the ldap fullname
       # example :  export LDAP_FULLNAME_FIELD=fullname
       # example :  export LDAP_FULLNAME_FIELD=fullname
       #export LDAP_FULLNAME_FIELD=
       #export LDAP_FULLNAME_FIELD=
+      #
       # LDAP_MERGE_EXISTING_USERS :
       # LDAP_MERGE_EXISTING_USERS :
       # example :  export LDAP_MERGE_EXISTING_USERS=true
       # example :  export LDAP_MERGE_EXISTING_USERS=true
       #export LDAP_MERGE_EXISTING_USERS=false
       #export LDAP_MERGE_EXISTING_USERS=false
+      #
       # LDAP_EMAIL_MATCH_ENABLE : allow existing account matching by e-mail address when username does not match
       # LDAP_EMAIL_MATCH_ENABLE : allow existing account matching by e-mail address when username does not match
       # example: LDAP_EMAIL_MATCH_ENABLE=true
       # example: LDAP_EMAIL_MATCH_ENABLE=true
       #export LDAP_EMAIL_MATCH_ENABLE=false
       #export LDAP_EMAIL_MATCH_ENABLE=false
+      #
       # LDAP_EMAIL_MATCH_REQUIRE : require existing account matching by e-mail address when username does match
       # LDAP_EMAIL_MATCH_REQUIRE : require existing account matching by e-mail address when username does match
       # example: LDAP_EMAIL_MATCH_REQUIRE=true
       # example: LDAP_EMAIL_MATCH_REQUIRE=true
       #export LDAP_EMAIL_MATCH_REQUIRE=false
       #export LDAP_EMAIL_MATCH_REQUIRE=false
+      #
       # LDAP_EMAIL_MATCH_VERIFIED : require existing account email address to be verified for matching
       # LDAP_EMAIL_MATCH_VERIFIED : require existing account email address to be verified for matching
       # example: LDAP_EMAIL_MATCH_VERIFIED=true
       # example: LDAP_EMAIL_MATCH_VERIFIED=true
       #export LDAP_EMAIL_MATCH_VERIFIED=false
       #export LDAP_EMAIL_MATCH_VERIFIED=false
+      #
       # LDAP_EMAIL_FIELD : which field contains the LDAP e-mail address
       # LDAP_EMAIL_FIELD : which field contains the LDAP e-mail address
       # example: LDAP_EMAIL_FIELD=mail
       # example: LDAP_EMAIL_FIELD=mail
       #export LDAP_EMAIL_FIELD=
       #export LDAP_EMAIL_FIELD=
+      #
       # LDAP_SYNC_USER_DATA :
       # LDAP_SYNC_USER_DATA :
       # example :  export LDAP_SYNC_USER_DATA=true
       # example :  export LDAP_SYNC_USER_DATA=true
       #export LDAP_SYNC_USER_DATA=false
       #export LDAP_SYNC_USER_DATA=false
+      #
       # LDAP_SYNC_USER_DATA_FIELDMAP :
       # LDAP_SYNC_USER_DATA_FIELDMAP :
       # example :  export LDAP_SYNC_USER_DATA_FIELDMAP={"cn":"name", "mail":"email"}
       # example :  export LDAP_SYNC_USER_DATA_FIELDMAP={"cn":"name", "mail":"email"}
       #export LDAP_SYNC_USER_DATA_FIELDMAP=
       #export LDAP_SYNC_USER_DATA_FIELDMAP=
+      #
+      # The default domain of the ldap it is used to create email if the field is not map correctly
+      # with the LDAP_SYNC_USER_DATA_FIELDMAP is defined in setting LDAP_DEFAULT_DOMAIN above.
+      #
       # LDAP_SYNC_GROUP_ROLES :
       # LDAP_SYNC_GROUP_ROLES :
       # example :
       # example :
       #export LDAP_SYNC_GROUP_ROLES=
       #export LDAP_SYNC_GROUP_ROLES=
-      # LDAP_DEFAULT_DOMAIN : The default domain of the ldap it is used to create email if the field is not map correctly with the LDAP_SYNC_USER_DATA_FIELDMAP
-      # example :
-      #export LDAP_DEFAULT_DOMAIN=
+      #
       # Enable/Disable syncing of admin status based on ldap groups:
       # Enable/Disable syncing of admin status based on ldap groups:
       #export LDAP_SYNC_ADMIN_STATUS=true
       #export LDAP_SYNC_ADMIN_STATUS=true
+      #
       # Comma separated list of admin group names to sync.
       # Comma separated list of admin group names to sync.
       #export LDAP_SYNC_ADMIN_GROUPS=group1,group2
       #export LDAP_SYNC_ADMIN_GROUPS=group1,group2
       #---------------------------------------------------------------------
       #---------------------------------------------------------------------

+ 35 - 1
torodb-postgresql/docker-compose.yml

@@ -372,10 +372,43 @@ services:
       # example : LDAP_HOST=localhost
       # example : LDAP_HOST=localhost
       #- LDAP_HOST=
       #- LDAP_HOST=
       #
       #
+      #-----------------------------------------------------------------
+      # ==== LDAP AD Simple Auth ====
+      #
+      # Set to true, if you want to connect with Active Directory by Simple Authentication.
+      # When using AD Simple Auth, LDAP_BASEDN is not needed.
+      #- LDAP_AD_SIMPLE_AUTH=true
+      #
+      # === Related settings ELSEWHERE IN THIS FILE, NOT HERE ===
+      #
+      # Option to login to the LDAP server with the user's own username and password, instead of
+      # an administrator key. Default: false (use administrator key). When using AD Simple Auth, set to true.
+      # Set to true, if the login user is used for binding. Used with AD Simple Auth.
+      # When using AD Simple Auth, LDAP_BASEDN is not needed.
+      ##ELSEWHERE IN THIS SETTINGS FILE, NOT HERE: #- LDAP_USER_AUTHENTICATION=true
+      #
+      # Which field is used to find the user for the user authentication. Default: uid.
+      ##ELSEWHERE IN THIS SETTINGS FILE, NOT HERE:#- LDAP_USER_AUTHENTICATION_FIELD=uid
+      #
+      # === LDAP Default Domain: 2 different use cases, a/b ===
+      #
+      # a) The default domain of the ldap it is used to create email if the field is not map
+      #     correctly with the LDAP_SYNC_USER_DATA_FIELDMAP
+      #
+      # b) In case AD SimpleAuth is configured, the default domain is appended to the given
+      #    loginname for creating the correct username for the bind request to AD.
+      #
+      # Example :
+      ##ELSEWHERE IN THIS SETTINGS FILE, NOT HERE:- LDAP_DEFAULT_DOMAIN=mydomain.com
+      #
+      #-----------------------------------------------------------------
+      # ==== LDAP BASEDN Auth ====
+      #
       # LDAP_BASEDN : The base DN for the LDAP Tree
       # LDAP_BASEDN : The base DN for the LDAP Tree
       # example : LDAP_BASEDN=ou=user,dc=example,dc=org
       # example : LDAP_BASEDN=ou=user,dc=example,dc=org
       #- LDAP_BASEDN=
       #- LDAP_BASEDN=
       #
       #
+      #-----------------------------------------------------------------
       # LDAP_LOGIN_FALLBACK : Fallback on the default authentication method
       # LDAP_LOGIN_FALLBACK : Fallback on the default authentication method
       # example : LDAP_LOGIN_FALLBACK=true
       # example : LDAP_LOGIN_FALLBACK=true
       #- LDAP_LOGIN_FALLBACK=false
       #- LDAP_LOGIN_FALLBACK=false
@@ -504,7 +537,7 @@ services:
       # LDAP_MERGE_EXISTING_USERS :
       # LDAP_MERGE_EXISTING_USERS :
       # example : LDAP_MERGE_EXISTING_USERS=true
       # example : LDAP_MERGE_EXISTING_USERS=true
       #- LDAP_MERGE_EXISTING_USERS=false
       #- LDAP_MERGE_EXISTING_USERS=false
-      #-----------------------------------------------------------------
+      #
       # LDAP_SYNC_USER_DATA :
       # LDAP_SYNC_USER_DATA :
       # example : LDAP_SYNC_USER_DATA=true
       # example : LDAP_SYNC_USER_DATA=true
       #- LDAP_SYNC_USER_DATA=false
       #- LDAP_SYNC_USER_DATA=false
@@ -520,6 +553,7 @@ services:
       # LDAP_DEFAULT_DOMAIN : The default domain of the ldap it is used to create email if the field is not map correctly with the LDAP_SYNC_USER_DATA_FIELDMAP
       # LDAP_DEFAULT_DOMAIN : The default domain of the ldap it is used to create email if the field is not map correctly with the LDAP_SYNC_USER_DATA_FIELDMAP
       # example :
       # example :
       #- LDAP_DEFAULT_DOMAIN=
       #- LDAP_DEFAULT_DOMAIN=
+      #
       #---------------------------------------------------------------------
       #---------------------------------------------------------------------
       # ==== LOGOUT TIMER, probably does not work yet ====
       # ==== LOGOUT TIMER, probably does not work yet ====
       # LOGOUT_WITH_TIMER : Enables or not the option logout with timer
       # LOGOUT_WITH_TIMER : Enables or not the option logout with timer

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません