瀏覽代碼

Merge pull request #1 from wekan/master

Update master
蔡仲明 (Romulus Urakagi Tsai) 5 年之前
父節點
當前提交
3e0bedd8c7
共有 100 個文件被更改,包括 3856 次插入1073 次删除
  1. 162 0
      .devcontainer/Dockerfile
  2. 12 0
      .devcontainer/build.sh
  3. 17 0
      .devcontainer/devcontainer.json
  4. 50 0
      .devcontainer/docker-compose.yml
  5. 3 0
      .gitattributes
  6. 3 0
      .github/FUNDING.yml
  7. 4 4
      .github/ISSUE_TEMPLATE.md
  8. 1 1
      .gitignore
  9. 5 4
      .meteor/packages
  10. 1 1
      .meteor/release
  11. 22 21
      .meteor/versions
  12. 4 4
      .travis.yml
  13. 1 1
      .tx/config
  14. 28 0
      .vscode/launch.json
  15. 440 0
      CHANGELOG.md
  16. 3 3
      Dockerfile
  17. 8 28
      README.md
  18. 1 1
      Stackerfile.yml
  19. 1 1
      client/components/activities/activities.js
  20. 106 35
      client/components/boards/boardBody.js
  21. 78 0
      client/components/boards/boardBody.styl
  22. 77 11
      client/components/boards/boardHeader.jade
  23. 144 22
      client/components/boards/boardHeader.js
  24. 2 0
      client/components/cards/attachments.js
  25. 8 8
      client/components/cards/cardDate.js
  26. 66 3
      client/components/cards/cardDetails.jade
  27. 163 11
      client/components/cards/cardDetails.js
  28. 89 1
      client/components/cards/cardDetails.styl
  29. 15 2
      client/components/cards/minicard.jade
  30. 33 2
      client/components/cards/minicard.js
  31. 12 4
      client/components/cards/minicard.styl
  32. 50 16
      client/components/lists/list.js
  33. 21 5
      client/components/lists/list.styl
  34. 27 19
      client/components/lists/listBody.js
  35. 7 0
      client/components/lists/listHeader.jade
  36. 51 12
      client/components/lists/listHeader.js
  37. 39 11
      client/components/main/editor.js
  38. 4 0
      client/components/main/layouts.styl
  39. 4 2
      client/components/main/popup.styl
  40. 2 2
      client/components/settings/peopleBody.js
  41. 8 0
      client/components/settings/settingBody.jade
  42. 3 0
      client/components/settings/settingBody.js
  43. 22 14
      client/components/sidebar/sidebar.jade
  44. 80 32
      client/components/sidebar/sidebar.js
  45. 4 0
      client/components/sidebar/sidebarFilters.jade
  46. 4 0
      client/components/sidebar/sidebarFilters.js
  47. 4 0
      client/components/sidebar/sidebarSearches.jade
  48. 5 0
      client/components/sidebar/sidebarSearches.js
  49. 5 0
      client/components/swimlanes/swimlaneHeader.jade
  50. 17 0
      client/components/swimlanes/swimlaneHeader.js
  51. 38 15
      client/components/swimlanes/swimlanes.jade
  52. 109 29
      client/components/swimlanes/swimlanes.js
  53. 65 13
      client/components/swimlanes/swimlanes.styl
  54. 5 0
      client/components/users/userHeader.jade
  55. 82 6
      client/components/users/userHeader.js
  56. 11 2
      client/lib/datepicker.js
  57. 13 1
      client/lib/filter.js
  58. 1 0
      client/lib/textComplete.js
  59. 60 12
      client/lib/utils.js
  60. 10 8
      docker-compose.yml
  61. 26 5
      i18n/ar.i18n.json
  62. 26 5
      i18n/bg.i18n.json
  63. 26 5
      i18n/br.i18n.json
  64. 26 5
      i18n/ca.i18n.json
  65. 30 9
      i18n/cs.i18n.json
  66. 26 5
      i18n/da.i18n.json
  67. 26 5
      i18n/de.i18n.json
  68. 26 5
      i18n/el.i18n.json
  69. 26 5
      i18n/en-GB.i18n.json
  70. 26 5
      i18n/en.i18n.json
  71. 26 5
      i18n/eo.i18n.json
  72. 26 5
      i18n/es-AR.i18n.json
  73. 25 4
      i18n/es.i18n.json
  74. 26 5
      i18n/eu.i18n.json
  75. 26 5
      i18n/fa.i18n.json
  76. 26 5
      i18n/fi.i18n.json
  77. 26 5
      i18n/fr.i18n.json
  78. 26 5
      i18n/gl.i18n.json
  79. 26 5
      i18n/he.i18n.json
  80. 26 5
      i18n/hi.i18n.json
  81. 26 5
      i18n/hu.i18n.json
  82. 26 5
      i18n/hy.i18n.json
  83. 26 5
      i18n/id.i18n.json
  84. 26 5
      i18n/ig.i18n.json
  85. 41 20
      i18n/it.i18n.json
  86. 40 19
      i18n/ja.i18n.json
  87. 26 5
      i18n/ka.i18n.json
  88. 26 5
      i18n/km.i18n.json
  89. 29 8
      i18n/ko.i18n.json
  90. 26 5
      i18n/lv.i18n.json
  91. 26 5
      i18n/mk.i18n.json
  92. 37 16
      i18n/mn.i18n.json
  93. 89 68
      i18n/nb.i18n.json
  94. 417 396
      i18n/nl.i18n.json
  95. 29 8
      i18n/oc.i18n.json
  96. 26 5
      i18n/pl.i18n.json
  97. 26 5
      i18n/pt-BR.i18n.json
  98. 26 5
      i18n/pt.i18n.json
  99. 26 5
      i18n/ro.i18n.json
  100. 29 8
      i18n/ru.i18n.json

+ 162 - 0
.devcontainer/Dockerfile

@@ -0,0 +1,162 @@
+FROM ubuntu:disco
+LABEL maintainer="sgr"
+
+ENV BUILD_DEPS="gnupg gosu bsdtar wget curl bzip2 g++ build-essential python git ca-certificates iproute2"
+ENV DEBIAN_FRONTEND=noninteractive
+
+ENV \
+    DEBUG=false \
+    NODE_VERSION=8.16.2 \
+    METEOR_RELEASE=1.8.1 \
+    USE_EDGE=false \
+    METEOR_EDGE=1.5-beta.17 \
+    NPM_VERSION=latest \
+    FIBERS_VERSION=4.0.1 \
+    ARCHITECTURE=linux-x64 \
+    SRC_PATH=./ \
+    WITH_API=true \
+    ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE=3 \
+    ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD=60 \
+    ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW=15 \
+    ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE=3 \
+    ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD=60 \
+    ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW=15 \
+    RICHER_CARD_COMMENT_EDITOR=true \
+    MAX_IMAGE_PIXEL="" \
+    IMAGE_COMPRESS_RATIO="" \
+    BIGEVENTS_PATTERN="" \
+    NOTIFY_DUE_DAYS_BEFORE_AND_AFTER="" \
+    NOTIFY_DUE_AT_HOUR_OF_DAY="" \
+    EMAIL_NOTIFICATION_TIMEOUT=30000 \
+    MATOMO_ADDRESS="" \
+    MATOMO_SITE_ID="" \
+    MATOMO_DO_NOT_TRACK=true \
+    MATOMO_WITH_USERNAME=false \
+    BROWSER_POLICY_ENABLED=true \
+    TRUSTED_URL="" \
+    WEBHOOKS_ATTRIBUTES="" \
+    OAUTH2_ENABLED=false \
+    OAUTH2_LOGIN_STYLE=redirect \
+    OAUTH2_CLIENT_ID="" \
+    OAUTH2_SECRET="" \
+    OAUTH2_SERVER_URL="" \
+    OAUTH2_AUTH_ENDPOINT="" \
+    OAUTH2_USERINFO_ENDPOINT="" \
+    OAUTH2_TOKEN_ENDPOINT="" \
+    OAUTH2_ID_MAP="" \
+    OAUTH2_USERNAME_MAP="" \
+    OAUTH2_FULLNAME_MAP="" \
+    OAUTH2_ID_TOKEN_WHITELIST_FIELDS="" \
+    OAUTH2_REQUEST_PERMISSIONS='openid profile email' \
+    OAUTH2_EMAIL_MAP="" \
+    LDAP_ENABLE=false \
+    LDAP_PORT=389 \
+    LDAP_HOST="" \
+    LDAP_BASEDN="" \
+    LDAP_LOGIN_FALLBACK=false \
+    LDAP_RECONNECT=true \
+    LDAP_TIMEOUT=10000 \
+    LDAP_IDLE_TIMEOUT=10000 \
+    LDAP_CONNECT_TIMEOUT=10000 \
+    LDAP_AUTHENTIFICATION=false \
+    LDAP_AUTHENTIFICATION_USERDN="" \
+    LDAP_AUTHENTIFICATION_PASSWORD="" \
+    LDAP_LOG_ENABLED=false \
+    LDAP_BACKGROUND_SYNC=false \
+    LDAP_BACKGROUND_SYNC_INTERVAL="" \
+    LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED=false \
+    LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS=false \
+    LDAP_ENCRYPTION=false \
+    LDAP_CA_CERT="" \
+    LDAP_REJECT_UNAUTHORIZED=false \
+    LDAP_USER_AUTHENTICATION=false \
+    LDAP_USER_AUTHENTICATION_FIELD=uid \
+    LDAP_USER_SEARCH_FILTER="" \
+    LDAP_USER_SEARCH_SCOPE="" \
+    LDAP_USER_SEARCH_FIELD="" \
+    LDAP_SEARCH_PAGE_SIZE=0 \
+    LDAP_SEARCH_SIZE_LIMIT=0 \
+    LDAP_GROUP_FILTER_ENABLE=false \
+    LDAP_GROUP_FILTER_OBJECTCLASS="" \
+    LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE="" \
+    LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE="" \
+    LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT="" \
+    LDAP_GROUP_FILTER_GROUP_NAME="" \
+    LDAP_UNIQUE_IDENTIFIER_FIELD="" \
+    LDAP_UTF8_NAMES_SLUGIFY=true \
+    LDAP_USERNAME_FIELD="" \
+    LDAP_FULLNAME_FIELD="" \
+    LDAP_MERGE_EXISTING_USERS=false \
+    LDAP_EMAIL_FIELD="" \
+    LDAP_EMAIL_MATCH_ENABLE=false \
+    LDAP_EMAIL_MATCH_REQUIRE=false \
+    LDAP_EMAIL_MATCH_VERIFIED=false \
+    LDAP_SYNC_USER_DATA=false \
+    LDAP_SYNC_USER_DATA_FIELDMAP="" \
+    LDAP_SYNC_GROUP_ROLES="" \
+    LDAP_DEFAULT_DOMAIN="" \
+    LDAP_SYNC_ADMIN_STATUS="" \
+    LDAP_SYNC_ADMIN_GROUPS="" \
+    HEADER_LOGIN_ID="" \
+    HEADER_LOGIN_FIRSTNAME="" \
+    HEADER_LOGIN_LASTNAME="" \
+    HEADER_LOGIN_EMAIL="" \
+    LOGOUT_WITH_TIMER=false \
+    LOGOUT_IN="" \
+    LOGOUT_ON_HOURS="" \
+    LOGOUT_ON_MINUTES="" \
+    CORS="" \
+    CORS_ALLOW_HEADERS="" \
+    CORS_EXPOSE_HEADERS="" \
+    DEFAULT_AUTHENTICATION_METHOD=""
+
+# Install OS
+RUN set -o xtrace \
+  && useradd --user-group -m --system --home-dir /home/wekan wekan \
+  && apt-get update \
+	&& apt-get install --assume-yes --no-install-recommends apt-utils apt-transport-https ca-certificates 2>&1 \
+	&& apt-get install --assume-yes --no-install-recommends ${BUILD_DEPS}
+
+# Install NodeJS
+RUN set -o xtrace \
+  && cd /tmp \
+  && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-$ARCHITECTURE.tar.xz" \
+  && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \
+  && grep " node-v$NODE_VERSION-$ARCHITECTURE.tar.xz\$" SHASUMS256.txt.asc | sha256sum -c - \
+  && tar -xJf "node-v$NODE_VERSION-$ARCHITECTURE.tar.xz" -C /usr/local --strip-components=1 --no-same-owner \
+  && rm "node-v$NODE_VERSION-$ARCHITECTURE.tar.xz" SHASUMS256.txt.asc \
+  && ln -s /usr/local/bin/node /usr/local/bin/nodejs \
+  && mkdir -p /usr/local/lib/node_modules/fibers/.node-gyp /root/.node-gyp/${NODE_VERSION} /home/wekan/.config \
+  && npm install -g npm@${NPM_VERSION} \
+  && chown wekan:wekan --recursive /home/wekan/.config
+
+ENV DEBIAN_FRONTEND=dialog
+
+USER wekan
+
+# Install Meteor
+RUN set -o xtrace \
+  && cd /home/wekan \
+  && curl https://install.meteor.com/?release=$METEOR_VERSION --output /home/wekan/install-meteor.sh \
+  # Replace tar with bsdtar in the install script; https://github.com/jshimko/meteor-launchpad/issues/39
+  && sed --in-place "s/tar -xzf.*/bsdtar -xf \"\$TARBALL_FILE\" -C \"\$INSTALL_TMPDIR\"/g" /home/wekan/install-meteor.sh \
+  && sed --in-place 's/VERBOSITY="--silent"/VERBOSITY="--progress-bar"/' /home/wekan/install-meteor.sh \
+  && printf "\n[-] Installing Meteor $METEOR_VERSION...\n\n" \
+  && sh /home/wekan/install-meteor.sh
+
+ENV PATH=$PATH:/home/wekan/.meteor/
+
+# Copy source dir
+USER root
+
+RUN echo "export PATH=$PATH" >> /etc/environment
+
+RUN set -o xtrace \
+  && mkdir /home/wekan/app
+
+COPY ${SRC_PATH} /home/wekan/app/
+
+RUN set -o xtrace \
+  && chown -R wekan:wekan /home/wekan/app /home/wekan/.meteor
+
+USER wekan

+ 12 - 0
.devcontainer/build.sh

@@ -0,0 +1,12 @@
+#!/bin/bash
+
+cd /home/wekan/app
+rm -rf node_modules
+/home/wekan/.meteor/meteor npm install
+rm -rf .build
+/home/wekan/.meteor/meteor build .build --directory
+cp -f fix-download-unicode/cfs_access-point.txt .build/bundle/programs/server/packages/cfs_access-point.js
+cd .build/bundle/programs/server
+rm -rf node_modules
+/home/wekan/.meteor/meteor npm install
+cd /home/wekan/app

+ 17 - 0
.devcontainer/devcontainer.json

@@ -0,0 +1,17 @@
+// See https://aka.ms/vscode-remote/devcontainer.json for format details.
+{
+  "dockerComposeFile": ["docker-compose.yml", "docker-compose.extend.yml"],
+  "service": "wekan-dev",
+  "workspaceFolder": "/home/wekan/app",
+  "extensions": [
+    "mutantdino.resourcemonitor",
+    "editorconfig.editorconfig",
+    "dbaeumer.vscode-eslint",
+    "codezombiech.gitignore",
+    "eamodio.gitlens",
+    "gruntfuggly.todo-tree",
+    "dotjoshjohnson.xml",
+    "redhat.vscode-yaml",
+    "vuhrmeister.vscode-meteor"
+  ]
+}

+ 50 - 0
.devcontainer/docker-compose.yml

@@ -0,0 +1,50 @@
+version: '3.7'
+
+services:
+
+  wekandb-dev:
+    image: mongo:4.0.12
+    container_name: wekan-dev-db
+    restart: unless-stopped
+    command: mongod --smallfiles --oplogSize 128
+    networks:
+      - wekan-dev-tier
+    expose:
+      - 27017
+    volumes:
+      - wekan-dev-db:/data/db
+      - wekan-dev-db-dump:/dump
+
+  wekan-dev:
+    container_name: wekan-dev-app
+    restart: always
+    networks:
+      - wekan-dev-tier
+    build:
+      context: ..
+      dockerfile: .devcontainer/Dockerfile
+    ports:
+      - 3000:3000
+      - 9229:9229
+    environment:
+      - MONGO_URL=mongodb://wekandb-dev:27017/wekan
+      - ROOT_URL=http://localhost:3000
+      - WITH_API=true
+      - RICHER_CARD_COMMENT_EDITOR=true
+      - BROWSER_POLICY_ENABLED=true
+    depends_on:
+      - wekandb-dev
+    volumes:
+      - ..:/app:delegated
+    command:
+      sleep infinity
+
+volumes:
+  wekan-dev-db:
+    driver: local
+  wekan-dev-db-dump:
+    driver: local
+
+networks:
+  wekan-dev-tier:
+    driver: bridge

+ 3 - 0
.gitattributes

@@ -0,0 +1,3 @@
+* text=auto eol=lf
+*.{cmd,[cC][mM][dD]} text eol=crlf
+*.{bat,[bB][aA][tT]} text eol=crlf

+ 3 - 0
.github/FUNDING.yml

@@ -0,0 +1,3 @@
+# These are supported funding model platforms
+
+custom: ['https://wekan.team/commercial-support/']

+ 4 - 4
.github/ISSUE_TEMPLATE.md

@@ -7,8 +7,9 @@ Other Wekan issues can be added here.
 
 
 **Server Setup Information**:
 **Server Setup Information**:
 
 
+* Note: Please anonymize info, and do not add to this public issue any of your Wekan board URLs, passwords, API tokens etc, do you understand?:
 * Did you test in newest Wekan?:
 * Did you test in newest Wekan?:
-* For new Wekan install, did you configure root-url correctly https://github.com/wekan/wekan/wiki/Settings ?
+* For new Wekan install, did you configure root-url correctly so Wekan cards open correctly https://github.com/wekan/wekan/wiki/Settings ?
 * Wekan version:
 * Wekan version:
 * If this is about old version of Wekan, what upgrade problem you have?:
 * If this is about old version of Wekan, what upgrade problem you have?:
 * Operating System:
 * Operating System:
@@ -16,13 +17,12 @@ Other Wekan issues can be added here.
 * Http frontend if any (Caddy, Nginx, Apache, see config examples from Wekan GitHub wiki first):
 * Http frontend if any (Caddy, Nginx, Apache, see config examples from Wekan GitHub wiki first):
 * Node Version:
 * Node Version:
 * MongoDB Version:
 * MongoDB Version:
-* ROOT_URL environment variable http(s)://(subdomain).example.com(/suburl):
 * Wekan only works on newest desktop Firefox/Chromium/Chrome/Edge/Chromium Edge and mobile Chrome. What webbrowser version are you using?
 * Wekan only works on newest desktop Firefox/Chromium/Chrome/Edge/Chromium Edge and mobile Chrome. What webbrowser version are you using?
 
 
 **Problem description**:
 **Problem description**:
 - *REQUIRED: Add recorded animated gif about how it works currently, and screenshot mockups how it should work. Use peek to record animgif in Linux https://github.com/phw/peek*
 - *REQUIRED: Add recorded animated gif about how it works currently, and screenshot mockups how it should work. Use peek to record animgif in Linux https://github.com/phw/peek*
 - *Explain steps how to reproduce*
 - *Explain steps how to reproduce*
 - *In webbrowser, what does show Right Click / Inspect / Console ? Chrome shows more detailed info than Firefox.*
 - *In webbrowser, what does show Right Click / Inspect / Console ? Chrome shows more detailed info than Firefox.*
-- *If using Snap, what does show command `sudo snap logs wekan.wekan` ?*
-- *If using Docker, what does show command `sudo docker logs wekan-app` ?*
+- *If using Snap, what does show command `sudo snap logs wekan.wekan` ? Please anonymize logs.* 
+- *If using Docker, what does show command `sudo docker logs wekan-app` ? Please anonymize logs.*
 - *If logs are very long, attach them in .zip file*
 - *If logs are very long, attach them in .zip file*

+ 1 - 1
.gitignore

@@ -29,6 +29,6 @@ versions.json
 Thumbs.db
 Thumbs.db
 ehthumbs.db
 ehthumbs.db
 .eslintcache
 .eslintcache
-package-lock.json
 .meteor/local
 .meteor/local
 .meteor-1.6-snap/.meteor/local
 .meteor-1.6-snap/.meteor/local
+.devcontainer/docker-compose.extend.yml

+ 5 - 4
.meteor/packages

@@ -6,9 +6,9 @@
 meteor-base@1.4.0
 meteor-base@1.4.0
 
 
 # Build system
 # Build system
-ecmascript@0.12.4
-standard-minifier-css@1.5.3
-standard-minifier-js@2.4.1
+ecmascript@0.13.0
+standard-minifier-css@1.5.4
+standard-minifier-js@2.5.0
 mquandalle:jade
 mquandalle:jade
 
 
 # Polyfills
 # Polyfills
@@ -22,7 +22,7 @@ dburles:collection-helpers
 idmontie:migrations
 idmontie:migrations
 matb33:collection-hooks
 matb33:collection-hooks
 matteodem:easy-search
 matteodem:easy-search
-mongo@1.6.2
+mongo@1.7.0
 mquandalle:collection-mutations
 mquandalle:collection-mutations
 
 
 # Account system
 # Account system
@@ -96,3 +96,4 @@ konecty:mongo-counter
 percolate:synced-cron
 percolate:synced-cron
 easylogic:summernote
 easylogic:summernote
 cfs:filesystem
 cfs:filesystem
+ostrio:cookies

+ 1 - 1
.meteor/release

@@ -1 +1 @@
-METEOR@1.8.1
+METEOR@1.8.2

+ 22 - 21
.meteor/versions

@@ -1,5 +1,5 @@
 3stack:presence@1.1.2
 3stack:presence@1.1.2
-accounts-base@1.4.4
+accounts-base@1.4.5
 accounts-oauth@1.1.16
 accounts-oauth@1.1.16
 accounts-password@1.5.1
 accounts-password@1.5.1
 aldeed:collection2@2.10.0
 aldeed:collection2@2.10.0
@@ -12,8 +12,8 @@ allow-deny@1.1.0
 arillo:flow-router-helpers@0.5.2
 arillo:flow-router-helpers@0.5.2
 audit-argument-checks@1.0.7
 audit-argument-checks@1.0.7
 autoupdate@1.6.0
 autoupdate@1.6.0
-babel-compiler@7.3.4
-babel-runtime@1.3.0
+babel-compiler@7.4.0
+babel-runtime@1.4.0
 base64@1.0.12
 base64@1.0.12
 binary-heap@1.0.11
 binary-heap@1.0.11
 blaze@2.3.3
 blaze@2.3.3
@@ -23,7 +23,7 @@ browser-policy-common@1.0.11
 browser-policy-framing@1.1.0
 browser-policy-framing@1.1.0
 caching-compiler@1.2.1
 caching-compiler@1.2.1
 caching-html-compiler@1.1.3
 caching-html-compiler@1.1.3
-callback-hook@1.1.0
+callback-hook@1.2.0
 cfs:access-point@0.1.49
 cfs:access-point@0.1.49
 cfs:base-package@0.0.30
 cfs:base-package@0.0.30
 cfs:collection@0.5.5
 cfs:collection@0.5.5
@@ -57,10 +57,10 @@ deps@1.0.12
 diff-sequence@1.1.1
 diff-sequence@1.1.1
 dynamic-import@0.5.1
 dynamic-import@0.5.1
 easylogic:summernote@0.8.8
 easylogic:summernote@0.8.8
-ecmascript@0.12.7
+ecmascript@0.13.0
 ecmascript-runtime@0.7.0
 ecmascript-runtime@0.7.0
-ecmascript-runtime-client@0.8.0
-ecmascript-runtime-server@0.7.1
+ecmascript-runtime-client@0.9.0
+ecmascript-runtime-server@0.8.0
 ejson@1.1.0
 ejson@1.1.0
 email@1.2.3
 email@1.2.3
 es5-shim@4.8.0
 es5-shim@4.8.0
@@ -82,14 +82,14 @@ kadira:dochead@1.5.0
 kadira:flow-router@2.12.1
 kadira:flow-router@2.12.1
 kenton:accounts-sandstorm@0.7.0
 kenton:accounts-sandstorm@0.7.0
 konecty:mongo-counter@0.0.5_3
 konecty:mongo-counter@0.0.5_3
-lamhieu:meteorx@2.0.1
+lamhieu:meteorx@2.1.1
 lamhieu:unblock@1.0.0
 lamhieu:unblock@1.0.0
 launch-screen@1.1.1
 launch-screen@1.1.1
 livedata@1.0.18
 livedata@1.0.18
 localstorage@1.2.0
 localstorage@1.2.0
 logging@1.1.20
 logging@1.1.20
 lucasantoniassi:accounts-lockout@1.0.0
 lucasantoniassi:accounts-lockout@1.0.0
-matb33:collection-hooks@0.8.4
+matb33:collection-hooks@0.9.1
 matteodem:easy-search@1.6.4
 matteodem:easy-search@1.6.4
 mdg:meteor-apm-agent@3.2.3
 mdg:meteor-apm-agent@3.2.3
 mdg:validation-error@0.5.1
 mdg:validation-error@0.5.1
@@ -101,16 +101,16 @@ meteorhacks:collection-utils@1.2.0
 meteorhacks:picker@1.0.3
 meteorhacks:picker@1.0.3
 meteorhacks:subs-manager@1.6.4
 meteorhacks:subs-manager@1.6.4
 meteorspark:util@0.2.0
 meteorspark:util@0.2.0
-minifier-css@1.4.2
-minifier-js@2.4.1
+minifier-css@1.4.3
+minifier-js@2.5.0
 minifiers@1.1.8-faster-rebuild.0
 minifiers@1.1.8-faster-rebuild.0
 minimongo@1.4.5
 minimongo@1.4.5
 mobile-status-bar@1.0.14
 mobile-status-bar@1.0.14
 modern-browsers@0.1.4
 modern-browsers@0.1.4
-modules@0.13.0
-modules-runtime@0.10.3
+modules@0.14.0
+modules-runtime@0.11.0
 momentjs:moment@2.24.0
 momentjs:moment@2.24.0
-mongo@1.6.3
+mongo@1.7.0
 mongo-decimal@0.1.1
 mongo-decimal@0.1.1
 mongo-dev-server@1.1.0
 mongo-dev-server@1.1.0
 mongo-id@1.0.7
 mongo-id@1.0.7
@@ -127,17 +127,18 @@ mquandalle:mousetrap-bindglobal@0.0.1
 mquandalle:perfect-scrollbar@0.6.5_2
 mquandalle:perfect-scrollbar@0.6.5_2
 msavin:usercache@1.8.0
 msavin:usercache@1.8.0
 npm-bcrypt@0.9.3
 npm-bcrypt@0.9.3
-npm-mongo@3.1.2
+npm-mongo@3.2.0
 oauth@1.2.8
 oauth@1.2.8
 oauth2@1.2.1
 oauth2@1.2.1
 observe-sequence@1.0.16
 observe-sequence@1.0.16
 ongoworks:speakingurl@1.1.0
 ongoworks:speakingurl@1.1.0
 ordered-dict@1.1.0
 ordered-dict@1.1.0
-peerlibrary:assert@0.2.5
+ostrio:cookies@2.5.0
+peerlibrary:assert@0.3.0
 peerlibrary:base-component@0.16.0
 peerlibrary:base-component@0.16.0
 peerlibrary:blaze-components@0.15.1
 peerlibrary:blaze-components@0.15.1
-peerlibrary:computed-field@0.9.0
-peerlibrary:reactive-field@0.5.0
+peerlibrary:computed-field@0.10.0
+peerlibrary:reactive-field@0.6.0
 percolate:synced-cron@1.3.2
 percolate:synced-cron@1.3.2
 promise@0.11.2
 promise@0.11.2
 raix:eventemitter@0.1.3
 raix:eventemitter@0.1.3
@@ -166,8 +167,8 @@ softwarerero:accounts-t9n@1.3.11
 spacebars@1.0.15
 spacebars@1.0.15
 spacebars-compiler@1.1.3
 spacebars-compiler@1.1.3
 srp@1.0.12
 srp@1.0.12
-standard-minifier-css@1.5.3
-standard-minifier-js@2.4.1
+standard-minifier-css@1.5.4
+standard-minifier-js@2.5.0
 staringatlights:fast-render@3.2.0
 staringatlights:fast-render@3.2.0
 staringatlights:inject-data@2.3.0
 staringatlights:inject-data@2.3.0
 tap:i18n@1.8.2
 tap:i18n@1.8.2
@@ -185,7 +186,7 @@ useraccounts:core@1.14.2
 useraccounts:flow-routing@1.14.2
 useraccounts:flow-routing@1.14.2
 useraccounts:unstyled@1.14.2
 useraccounts:unstyled@1.14.2
 verron:autosize@3.0.8
 verron:autosize@3.0.8
-webapp@1.7.4
+webapp@1.7.5
 webapp-hashing@1.0.9
 webapp-hashing@1.0.9
 wekan-accounts-cas@0.1.0
 wekan-accounts-cas@0.1.0
 wekan-accounts-oidc@1.0.10
 wekan-accounts-oidc@1.0.10

+ 4 - 4
.travis.yml

@@ -1,10 +1,10 @@
-dist: trusty
+dist: disco
 sudo: required
 sudo: required
 
 
 env:
 env:
-  TRAVIS_DOCKER_COMPOSE_VERSION: 1.17.0
-  TRAVIS_NODE_VERSION: 8.9.3
-  TRAVIS_NPM_VERSION: 5.5.1
+  TRAVIS_DOCKER_COMPOSE_VERSION: 1.24.0
+  TRAVIS_NODE_VERSION: 8.16.2
+  TRAVIS_NPM_VERSION: latest
 
 
 before_install:
 before_install:
   - sudo apt-get update -y
   - sudo apt-get update -y

+ 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 = bg_BG:bg, en_GB:en-GB, es_AR:es-AR, el_GR:el, fi_FI:fi, hu_HU:hu, id_ID:id, mn_MN:mn, no:nb, lv_LV:lv, pt_BR:pt-BR, ro_RO:ro, zh_CN:zh-CN, zh_TW:zh-TW, zh_HK:zh-HK
+lang_map = bg_BG:bg, en_GB:en-GB, es_AR:es-AR, el_GR:el, fi_FI:fi, hu_HU:hu, id_ID:id, mn_MN:mn, no:nb, 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

+ 28 - 0
.vscode/launch.json

@@ -0,0 +1,28 @@
+{
+  "version": "0.2.0",
+  "configurations": [
+      {
+          "type": "chrome",
+          "request": "launch",
+          "name": "Meteor: Chrome",
+          "url": "http://localhost:3000",
+          "webRoot": "${workspaceFolder}"
+      },
+      {
+          "type": "node",
+          "request": "launch",
+          "name": "Meteor: Node",
+          "runtimeExecutable": "/home/wekan/.meteor/meteor",
+          "runtimeArgs": ["run", "--inspect-brk=9229"],
+          "outputCapture": "std",
+          "port": 9229,
+          "timeout": 60000
+      }
+  ],
+  "compounds": [
+      {
+          "name": "Meteor: All",
+          "configurations": ["Meteor: Node", "Meteor: Chrome"]
+      }
+  ]
+}

+ 440 - 0
CHANGELOG.md

@@ -1,3 +1,443 @@
+# Upcoming Wekan release
+
+This release adds the following updates:
+
+- [Update to Meteor 1.8.2. Update dependencies](https://github.com/wekan/wekan/commit/38dfe0b9a71a083adc2de1a81170fea0e4a8e53f).
+  Thanks to xet7.
+- [Fix lint errors and update travis NPM version](https://github.com/wekan/wekan/commit/b0f345ba21830b033c9edcc8ee5252b280111ae7).
+  Thanks to xet7.
+
+and fixes the following bugs:
+
+- Fix slow scroll on card detail by setting scrollInertia to 0](https://github.com/wekan/wekan/commit/599ace1db7918df41d9708d14b0351acb0f8688e).
+  Thanks to cafeoh.
+- [Fix lint errors](https://github.com/wekan/wekan/commit/788dd0a81a06efee165007a92780f9e8c2c754ac).
+  Thanks to xet7.
+- [Remove eslint option that does not work](https://github.com/wekan/wekan/commit/a06daff92e5f7cca55d1698252e3aa6526877c8b).
+  Thanks to xet7.
+- [Try to fix lint errors](https://github.com/wekan/wekan/commit/58e505f79a0617011576bdded9427b0d448d6107).
+  Thanks to xet7.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.55 2019-11-19 Wekan release
+
+This release fixes the following bugs:
+
+- [When logged in, use database for setting, so that changes are immediate. Only on public board use cookies.
+  Comment out Collapse CSS that is not in use](https://github.com/wekan/wekan/commit/351d4767d7e93c90ac798769d6071da8730d834f).
+  Thanks to xet7.
+- [Use database when logged in. Part 2](https://github.com/wekan/wekan/commit/4786b0c18ddeb8f48525216eabebdced7159467d).
+  Thanks to xet7.
+- [Use database when logged in. Part 3](https://github.com/wekan/wekan/commit/115d23f9293cad8a93f18f75a47a8a65756f71ce).
+  Thanks to xet7.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.54 2019-11-18 Wekan release
+
+This release adds the following new features:
+
+- [New feature: Now there is popup selection of Lists/Swimlanes/Calendar/Roles](https://github.com/wekan/wekan/commit/96abe3c6914ce37d9fb44da8fda375e40ad65c9e).
+  Thanks to xet7.
+- [New feature, not set visible yet, because switching to it does not
+  work properly yet: Collapsible Swimlanes](https://github.com/wekan/wekan/issues/2804).
+  Thanks to xet7.
+
+and fixes the following bugs:
+
+- [Fix: Public board now loads correctly. When you select one of Lists/Swimlanes/Calendar view and
+  reload webbrowser page, it can change view](https://github.com/wekan/wekan/issues/2311).
+  Thanks to xet7.
+- [Fix: List sorting commented out](https://github.com/wekan/wekan/issues/2800).
+  Thanks to xet7.
+- [Fix: Errors hasHiddenMinicardText, hasShowDragHandles, showSort, hasSortBy, profile,
+  FirefoxAndroid/IE11/Vivaldi/Chromium browsers not working by using cookies instead of
+  database](https://github.com/wekan/wekan/issues/2643#issuecomment-554907955).
+  Note: Cookie changes are not always immediate, if there is no effect, you may need to
+  reload webbrowser page. This could be improved later.
+  Thanks to xet7.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.53 2019-11-14 Wekan release
+
+This release fixes the following bugs:
+
+- [Revert list sorting change of Wekan v3.51 because it reversed alphabetical sorting of
+  lists](https://github.com/wekan/wekan/commit/ab2a721a1443b903cdbbbe275f41ffd3269012c6).
+  Thanks to Dalisay and xet7.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.52 2019-11-14 Wekan release
+
+This release fixes the following bugs:
+
+- [Add database migration for assignee](https://github.com/wekan/wekan/commit/5b41d72e8de93833e1788962427422cff62c09a2).
+  Thanks to ocdtrekkie and xet7.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.51 2019-11-14 Wekan release
+
+This release fixes the following bugs:
+
+- [Change sorting lists to work on desktop drag handle page instead,
+  where it seems to work better](https://github.com/wekan/wekan/commit/bbc3ab3f994c5a61a4414bc64b05f5a03d259e46).
+  Thanks to xet7.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.50 2019-11-13 Wekan release
+
+This release adds the following new features:
+
+- [Allowing lists to be sorted by modifiedAt when not in draggable
+  mode](https://github.com/wekan/wekan/commits/77f8b76d4e13c35ea3451622176bbb69a4d39a32).
+  Thanks to whowillcare.
+- Allow user to sort Lists in Board by his own preference boardadmin can star
+  list [1](https://github.com/wekan/wekan/commit/bc2a20f04e32607f8488a9cecd815647fb43e40e), 
+  [2](https://github.com/wekan/wekan/commit/bc2a20f04e32607f8488a9cecd815647fb43e40e).
+  Thanks to whowillcare.
+- [Allowing user to filter list in Filter function not just cards
+  commit](https://github.com/wekan/wekan/commit/d2d4840758b0f5aed7feb4f6a459bb2b2d1a3f0b).
+  Thanks to whowillcare.
+- [Allow user to search Lists in Board](https://github.com/wekan/wekan/commit/32f50e16586696ec7d100ce0438d1030ae1f606e).
+  Thanks to whowillcare.
+- Enhancement: [Set card times more sensible using the 'Today' button in
+  datepicker](https://github.com/wekan/wekan/pull/2747).
+  Thanks to liske.
+- [At card, added Assignee field like Jira, and REST API for it](https://github.com/wekan/wekan/issues/2452).
+  Parts:
+  [Add assignee](https://github.com/wekan/wekan/commit/9e1aaf163f3bd0b3c2d2aee8225d111f83b3d421),
+  [Remove Assignee. Avatar icon is at card and assignee details](https://github.com/wekan/wekan/commit/3e8f9ef1a5275a5e9b691c7e74dc73b97a43689a),
+  [When selecting new assignee (+) icon, list shows names who to add](https://github.com/wekan/wekan/commit/32ce2b51d8bff5e8851732394a8bae3c56f8b0b6),
+  [More progress](https://github.com/wekan/wekan/commit/ea823ab68fd5243c8485177e44a074be836836b8),
+  [In add assignee popup, avatars are now visible](https://github.com/wekan/wekan/commit/56efb5c41075151eeb259d99990a7e86695b2b69),
+  [Add assignee popup title](https://github.com/wekan/wekan/commit/31dbdc835d5a092b8360a4dbe93e9fbcce068855),
+  [Prevent more than one assignee](https://github.com/wekan/wekan/commit/1728298659521ee8e6fc94fedad3160030b9a2c3),
+  [When there is one selected assignee on card, don't show + button for adding more assignees, because there can only be one
+  assignee](https://github.com/wekan/wekan/commit/3cf09efb13438d66db6cf739591c679ea538d812),
+  [Now assignee is visible also at minicard](https://github.com/wekan/wekan/commit/9fd14f7ecb593d3debf5adff8f6c61adb0c3feca),
+  [Update REST API docs, there can only be one assignee in array](https://github.com/wekan/wekan/commit/de7509dc60257667192054e320b381f9dd0f0a31).
+  Thanks to xet7.
+- [More mobile drag handles, and optional desktop drag handles](https://github.com/wekan/wekan/issues/2081): In Progress.
+  Parts:
+  [Some drag handle fixes](https://github.com/wekan/wekan/commit/6a8960547729148bd3085cb469f9e93d510ed66c),
+  [Fix desktop swimlane drag handle position](https://github.com/wekan/wekan/commit/2ec15602d284122fce1a45bed352d0d4050162e2),
+  [Fix card, list and swimlane move. Allow moving cards in multiselect mode](https://github.com/wekan/wekan/commit/537a48bede250155b30ec264904ba320625bab73).
+  Thanks to xet7.
+
+and adds the following updates:
+
+- [Update Node.js to v8.16.2](https://github.com/wekan/wekan/commit/1eb3d25b40797fdab41d7dd59405cfcea81dcc61).
+  Thanks to xet7.
+
+and fixes the following bugs:
+
+- Bug Fix [#2093](https://github.com/wekan/wekan/issues/2093), need to [clean up the
+  temporary file](https://github.com/wekan/wekan/commit/2737d6b23f3a0fd2314236a85fbdee536df745a2).
+  Thanks to whowillcare.
+- Bug Fix [#2093](https://github.com/wekan/wekan/issues/2093): the broken [should be prior to file attachment feature introduced](https://github.com/wekan/wekan/commit/f53c624b0f6c6ebcc20c378a153e5cda8d73463c).
+  Thanks to whowillcare.
+- [Fix typo on exporting subtasks](https://github.com/wekan/wekan/commit/00d581245c1fe6a01ef372ca87d8a25bc7b937e4).
+  Thanks to xiorcala.
+- [Change the radom to random typo in export.js](https://github.com/wekan/wekan/commit/e195c731de88aba4026c239f4552ae821d522ec7).
+  Thanks to whowillcare.
+- Fix: [List last modify time will be affected by cards dueAt, endAt](https://github.com/wekan/wekan/commit/3308d90a3a6a1ddeed33966767937cd2c2c90cb5).
+  Thanks to whowillcare.
+- Revert creating new list to left, now creates again to right. Thanks to whowillcare.
+  Revert New List item moved from right to left. Thanks to derbolle and xet7.
+  [1](https://github.com/wekan/wekan/commit/806df30ba3499cef193eaf1b437cdef65282510f).
+- REST API: [Fix deletion of a single board card](https://github.com/wekan/wekan/pull/2778).
+  Thanks to liske.
+- [cardDate: endDate coloring change](https://github.com/wekan/wekan/pull/2779).
+  If no due-date timestamp is set => Gray.
+  If end-date timestamp is younger than due-date timestamp => Green.
+  If end-date timestamp is older than due-date timestamp => Red.
+  Thanks to bandresen.
+- [Fixed Card Open Webhook Error](https://github.com/wekan/wekan/issues/2780).
+  Thanks to jymcheong.
+- [Fixed OpenAPI docs generation](https://github.com/wekan/wekan/pull/2783).
+  Thanks to bentiss.
+- [Fixed close card button not visible on mobile web](https://github.com/wekan/wekan/36b5965dd07e3f0fd90069353310739c394c220f).
+  Thanks to xet7.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.49 2019-10-09 Wekan release
+
+This release fixes the following bugs:
+
+- [Fix prettier errors](https://github.com/wekan/wekan/commits/36e006fa4e78fe94e627625d1cc589654668f22a).
+  Thanks to xet7.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.48 2019-10-09 Wekan release
+
+This release fixes the following bugs:
+
+- [Make possible to upload attachments using drag-and-drop or Ctrl+V without setting the environmental-variable MAX_IMAGE_PIXEL](https://github.com/wekan/wekan/pull/2754).
+  Thanks to moserben16.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.47 2019-10-09 Wekan release
+
+This release fixes the following bugs:
+
+- [REST API: fix handling of members property on card creation](https://github.com/wekan/wekan/pull/2751).
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.46 2019-10-07 Wekan release
+
+This release fixes the following bugs:
+
+- [More black minicard badges](https://github.com/wekan/wekan/commit/68be12d166b21a41b4e2c4021b0966807e5ed1e6).
+  Thanks to sfahrenholz and xet7.
+- [REST API: fix creation of Checklists](https://github.com/wekan/wekan/pull/2747).
+  Thanks to liske.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.45 2019-10-03 Wekan release
+
+This release adds the following new features:
+
+- [Cards due timeline will be shown in Calendar view](https://github.com/wekan/wekan/pull/2738).
+  Thanks to whowillcare.
+- [Modified due day reminders in cards.js, so wekan server admin can control the reminder more flexibly](https://github.com/wekan/wekan/pull/2738).
+  i.e. NOTIFY_DUE_DAYS_BEFORE_AND_AFTER = 0 notification will be sent on due day only.
+  NOTIFY_DUE_DAYS_BEFORE_AND_AFTER = 2,0 it means notification will be sent on both due day and two days before.
+  Thanks to whowillcare.
+- [Added modifications the help files, related to NOTIFY_DUE_DAYS_BEFORE_AND_AFTER](https://github.com/wekan/wekan/pull/2740).
+  Thanks to whowillcare. 
+
+and fixes the following bugs:
+
+- [Modified list.style regarding .list-header-name when in mobile mode. It was too close to left arrow](https://github.com/wekan/wekan/pull/2740).
+  Thanks to whowillcare.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.44 2019-09-17 Wekan release
+
+This release adds the following languages:
+
+- [Add language: Slovenian](https://github.com/wekan/wekan/commit/125231beff0fb84a18a46fe246fa12e098246985).
+  Thanks to translators.
+
+and fixes the following bugs:
+
+- [Fix: in richer editor @ autocomplete doesn't really insert the username properly](https://github.com/wekan/wekan/pull/2717).
+  Thanks to whowillcare.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.43 2019-09-17 Wekan release
+
+This release fixes the following bugs:
+
+- [In richer editor, @user might not get pickup correctly, if it's formated](https://github.com/wekan/wekan/pull/2715).
+  Thanks to whowillcare.
+- [Table content should have word-wrap](https://github.com/wekan/wekan/pull/2715).
+  Thanks to whowillcare.
+- [Two-way hooks locking mechanism will fail sometime, therefore, change all comment insert or update to direct, which means it won't invoke any hook](https://github.com/wekan/wekan/pull/2715).
+  Thanks to whowillcare.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.42 2019-09-14 Wekan release
+
+This release removed the following new features:
+
+- [Revert drag handle changes of Wekan v3.41](https://github.com/wekan/wekan/commit/57119868bbb49f47c7d0b51b9952df9bd83d46f5).
+  Thanks to Keelan.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.41 2019-09-13 Wekan release
+
+This release adds the following new features:
+
+- [More Mobile and Desktop drag handles for Swimlanes/Lists/Cards. Part 1](https://github.com/wekan/wekan/commit/ff550e91103115e7b731dd80c4588b93b2d4c64f).
+  Thanks to xet7.
+    
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.40 2019-09-11 Wekan release
+
+This release fixes the following bugs:
+
+- [Fix subcard selector](https://github.com/wekan/wekan/pull/2697).
+  Thanks to justinr1234.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.39 2019-09-11 Wekan release
+
+This release fixes the following bugs:
+
+- [To load all boards, revert Wekan v3.37 Fix Linked cards make load all cards of database](https://github.com/wekan/wekan/commit/6ce8eeee6c477cd39b684c47bf122b5872818ada).
+  Thanks to xet7.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.38 2019-09-11 Wekan release
+
+- Update translations. Thanks to translators.
+
+# v3.37 2019-09-07 Wekan release
+
+This release fixes the following bugs:
+
+- LDAP: [Fix USERDN example, when parameters contain spaces](https://github.com/wekan/wekan/commit/6cbd4cabc716c755e547abb798f657fe5476ed04).
+  LDAP_AUTHENTIFICATION_USERDN="CN=ldap admin,CN=users,DC=domainmatter,DC=lan" .
+  Thanks to compumatter.
+- [Fix: Linked cards make load all cards of database](https://github.com/wekan/wekan/commit/a56988c487745b2879cebe1943e7a987016e8bef).
+  Thanks to Akuket.
+- [Fix Unable to drag select text without closing card details](https://github.com/wekan/wekan/pull/2690).
+  Thanks to justinr1234.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.36 2019-09-05 Wekan release
+
+This release adds the following new features:
+
+- [Complete the original author's webhook functions and add two-way webhook type](https://github.com/wekan/wekan/pull/2665):
+  1. Make webhook function more complete by allowing user to specify name and token of
+  a webhook to increase security.
+  1. Allow wekan admin to sepcify a global webhook.
+  3. Add new type of two-way webhook that can act on the JSON webhook return payload:
+  3.1. If the payload data contains cardId, boardId, and comment key words,
+  3.2. If it has commentId, an existing comment will be modified
+  3.3. If it doesn't have commentId, then a new comment will be added, otherwise, does nothing.
+  Thanks to whowillcare.
+- [Patch admin search feature to Search in all users, not just "loaded" users
+  in the client](https://github.com/wekan/wekan/pull/2667).
+  Thanks to Akuket.
+- [Devcontainer: Moved MAIL-Vars to not-committed file, and added PATH with meteor to
+  Environment](https://github.com/wekan/wekan/pull/2672).
+  Thanks to road42.
+
+and fixes the following bugs:
+
+- [Fix incorrect date types for created and updated, so now newest card comments are at top](https://github.com/wekan/wekan/pull/2679).
+  Thanks to justinr1234.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.35 2019-08-29 Wekan release
+
+This release fixes the following bugs:
+
+- [Try to fix Snap](https://github.com/wekan/wekan/commit/71d32c6bc8e6affd345026797ff31e94a0a10d77).
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.34 2019-08-29 Wekan release
+
+This release fixes the following bugs:
+
+- [Snap: Delete all .swp files](https://github.com/wekan/wekan/commit/d5403bbfc53390aeaaf68eb452bc24d88f1e0942).
+  Thanks to xet7.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.33 2019-08-29 Wekan release
+
+This release adds the following new features:
+
+- [Add card color to calendar event. The color of the calendar event will match the card
+  color](https://github.com/wekan/wekan/pull/2664).
+  Thanks to grmpfhmbl.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.32 2019-08-29 Wekan release
+
+This release fixes the following bugs:
+
+- [Fix Snap adopt-info](https://github.com/wekan/wekan/commit/79d4cd83b1fa83bb814230683b7449ed7f3e1ede).
+  Thanks to [popey at Snapcraft forum](https://forum.snapcraft.io/t/dirty-snap-release/12975/12).
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.31 2019-08-29 Wekan release
+
+This release fixes the following bugs:
+
+- [Try](https://github.com/wekan/wekan/commit/be5f435bc5f500b24bc838ac1dc8bf3bb9a33a22) to
+  [fix adopt-info](https://forum.snapcraft.io/t/dirty-snap-release/12975/8).
+  Thanks to ogra at Snapcraft forum.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.30 2019-08-29 Wekan release
+
+This release fixes the following bugs:
+
+- Snap: [Change version-script to adopt-info](https://github.com/wekan/wekan/commit/0ff5ce8fde6cc9a05a3c8b93e18ebce7282d3a67)
+  to [fix dirty](https://forum.snapcraft.io/t/dirty-snap-release/12975/4).
+  Thanks to popey and daniel at Snapcraft forum.
+- [Delete another phantomjs binary from Snap](https://github.com/wekan/wekan/commit/5084102e6e17fa2cb3bc8c1180745e15379fab5f).
+  Thanks to xet7.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.29 2019-08-29 Wekan release
+
+This release fixes the following bugs:
+
+- [Fix Snap](https://github.com/wekan/wekan/commit/7761a22bb4e88ad9a5a39ed84e1ff244015c3a58).
+  Thanks to xet7.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.28 2019-08-29 Wekan release
+
+This release fixes the following bugs:
+
+- Fix broken Sandstorm release by reverting upgrading MongoDB.
+  Thanks to xet7
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.27 2019-08-29 Wekan release
+
+This release adds the following upgrades:
+
+- [Upgrade Node, Mongo, fibers and qs](https://github.com/wekan/wekan/commit/e21c47d3cfe0f228ce5ab394142c6ec6ee090d65).
+  Thanks to xet7.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v3.26 2019-08-28 Wekan release
+
+This release adds the following new features:
+
+- [Add devcontainer](https://github.com/wekan/wekan/pull/2659) and some [related fixes](https://github.com/wekan/wekan/pull/2660).
+  Thanks to road42.
+
+and fixes the following bugs:
+
+- [Add missing modules](https://github.com/wekan/wekan/pull/2653).
+  Thanks to GhassenRjab.
+- [Add package-lock.json](https://github.com/wekan/wekan/commit/ad01526124216abcc8b3c8230599c4eda331a86d).
+  Thanks to GhassenRjab and xet7.
+- [Fix last label undefined](https://github.com/wekan/wekan/pull/2657).
+  Thanks to justinr1234.
+- [Default to BIGEVENTS_PATTERN=NONE so that Wekan sends less email notifications](https://github.com/wekan/wekan/commit/0083215ea3955a950d345d44a8663e5b05e8f00f).
+  Thanks to rinnaz and xet7.
+- [Fix app hang when Meteor.user() is null and list spinner is loaded bug](https://github.com/wekan/wekan/pull/2654).
+  Thanks to urakagi.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
 # v3.25 2019-08-23 Wekan release
 # v3.25 2019-08-23 Wekan release
 
 
 This release adds the following new features:
 This release adds the following new features:

+ 3 - 3
Dockerfile

@@ -6,7 +6,7 @@ LABEL maintainer="wekan"
 # ENV BUILD_DEPS="paxctl"
 # ENV BUILD_DEPS="paxctl"
 ENV BUILD_DEPS="apt-utils bsdtar gnupg gosu wget curl bzip2 g++ build-essential git ca-certificates" \
 ENV BUILD_DEPS="apt-utils bsdtar gnupg gosu wget curl bzip2 g++ build-essential git ca-certificates" \
     DEBUG=false \
     DEBUG=false \
-    NODE_VERSION=v8.16.0 \
+    NODE_VERSION=v8.16.2 \
     METEOR_RELEASE=1.8.1 \
     METEOR_RELEASE=1.8.1 \
     USE_EDGE=false \
     USE_EDGE=false \
     METEOR_EDGE=1.5-beta.17 \
     METEOR_EDGE=1.5-beta.17 \
@@ -26,7 +26,7 @@ ENV BUILD_DEPS="apt-utils bsdtar gnupg gosu wget curl bzip2 g++ build-essential
     ATTACHMENTS_STORE_PATH="" \
     ATTACHMENTS_STORE_PATH="" \
     MAX_IMAGE_PIXEL="" \
     MAX_IMAGE_PIXEL="" \
     IMAGE_COMPRESS_RATIO="" \
     IMAGE_COMPRESS_RATIO="" \
-    BIGEVENTS_PATTERN="" \
+    BIGEVENTS_PATTERN=NONE \
     NOTIFY_DUE_DAYS_BEFORE_AND_AFTER="" \
     NOTIFY_DUE_DAYS_BEFORE_AND_AFTER="" \
     NOTIFY_DUE_AT_HOUR_OF_DAY="" \
     NOTIFY_DUE_AT_HOUR_OF_DAY="" \
     EMAIL_NOTIFICATION_TIMEOUT=30000 \
     EMAIL_NOTIFICATION_TIMEOUT=30000 \
@@ -178,7 +178,7 @@ RUN \
     mv node-${NODE_VERSION}-${ARCHITECTURE} /opt/nodejs && \
     mv node-${NODE_VERSION}-${ARCHITECTURE} /opt/nodejs && \
     ln -s /opt/nodejs/bin/node /usr/bin/node && \
     ln -s /opt/nodejs/bin/node /usr/bin/node && \
     ln -s /opt/nodejs/bin/npm /usr/bin/npm && \
     ln -s /opt/nodejs/bin/npm /usr/bin/npm && \
-    mkdir -p /opt/nodejs/lib/node_modules/fibers/.node-gyp /root/.node-gyp/8.16.0 /home/wekan/.config && \
+    mkdir -p /opt/nodejs/lib/node_modules/fibers/.node-gyp /root/.node-gyp/8.16.1 /home/wekan/.config && \
     chown wekan --recursive /home/wekan/.config && \
     chown wekan --recursive /home/wekan/.config && \
     \
     \
     #DOES NOT WORK: paxctl fix for alpine linux: https://github.com/wekan/wekan/issues/1303
     #DOES NOT WORK: paxctl fix for alpine linux: https://github.com/wekan/wekan/issues/1303

+ 8 - 28
README.md

@@ -54,13 +54,12 @@ that by providing one-click installation on various platforms.
 - [Features][features]: Wekan has real-time user interface.
 - [Features][features]: Wekan has real-time user interface.
 - [Platforms][platforms]: Wekan supports many platforms.
 - [Platforms][platforms]: Wekan supports many platforms.
   Wekan is critical part of new platforms Wekan is currently being integrated to.
   Wekan is critical part of new platforms Wekan is currently being integrated to.
-- [Integrations][integrations]: Current possible integrations and future plans.
 
 
 ## Requirements
 ## Requirements
 
 
 - 64bit: Linux [Snap](https://github.com/wekan/wekan-snap/wiki/Install) or [Sandstorm](https://sandstorm.io) /
 - 64bit: Linux [Snap](https://github.com/wekan/wekan-snap/wiki/Install) or [Sandstorm](https://sandstorm.io) /
   [Mac](https://github.com/wekan/wekan/wiki/Mac) / [Windows](https://github.com/wekan/wekan/wiki/Install-Wekan-from-source-on-Windows).
   [Mac](https://github.com/wekan/wekan/wiki/Mac) / [Windows](https://github.com/wekan/wekan/wiki/Install-Wekan-from-source-on-Windows).
-  [More Platforms](https://github.com/wekan/wekan/wiki/Platforms). [ARM progress](https://github.com/wekan/wekan/issues/1053#issuecomment-410919264).
+  [More Platforms](https://github.com/wekan/wekan/wiki/Platforms), bundle for RasPi3 ARM and other CPUs where Node.js and MongoDB exists.
 - 1 GB RAM minimum free for Wekan. Production server should have minimum total 4 GB RAM.
 - 1 GB RAM minimum free for Wekan. Production server should have minimum total 4 GB RAM.
   For thousands of users, for example with [Docker](https://github.com/wekan/wekan/blob/devel/docker-compose.yml): 3 frontend servers,
   For thousands of users, for example with [Docker](https://github.com/wekan/wekan/blob/devel/docker-compose.yml): 3 frontend servers,
   each having 2 CPU and 2 wekan-app containers. One backend wekan-db server with many CPUs.  
   each having 2 CPU and 2 wekan-app containers. One backend wekan-db server with many CPUs.  
@@ -74,41 +73,25 @@ that by providing one-click installation on various platforms.
   Bugs, updates, users deleting list or card, harddrive full, harddrive crash etc can eat your data. There is no undo yet.
   Bugs, updates, users deleting list or card, harddrive full, harddrive crash etc can eat your data. There is no undo yet.
   Some bug can cause Wekan board to not load at all, requiring manual fixing of database content.
   Some bug can cause Wekan board to not load at all, requiring manual fixing of database content.
 
 
-## Roadmap
+## Roadmap and Demo
 
 
-[Roadmap Milestones](https://github.com/wekan/wekan/milestones)
+[Roadmap][roadmap_wekan] - Public read-only board at Wekan demo.
 
 
 [Developer Documentation][dev_docs]
 [Developer Documentation][dev_docs]
 
 
 - There is many companies and individuals contributing code to Wekan, to add features and bugfixes
 - There is many companies and individuals contributing code to Wekan, to add features and bugfixes
   [many times a day](https://github.com/wekan/wekan/blob/devel/CHANGELOG.md).
   [many times a day](https://github.com/wekan/wekan/blob/devel/CHANGELOG.md).
 - [Please add Add new Feature Requests and Bug Reports immediately](https://github.com/wekan/wekan/issues).
 - [Please add Add new Feature Requests and Bug Reports immediately](https://github.com/wekan/wekan/issues).
-- [Commercial Support](https://wekan.team).
-- [Bounties](https://wekan.team/bounties/index.html).
+- [Commercial Support](https://wekan.team/commercial-support/).
 
 
 We also welcome sponsors for features and bugfixes.
 We also welcome sponsors for features and bugfixes.
 By working directly with Wekan you get the benefit of active maintenance and new features added by growing Wekan developer community.
 By working directly with Wekan you get the benefit of active maintenance and new features added by growing Wekan developer community.
 
 
-## Demo
-
-[Wekan demo][roadmap_wefork]
-
 ## Screenshot
 ## Screenshot
 
 
 [More screenshots at Features page](https://github.com/wekan/wekan/wiki/Features)
 [More screenshots at Features page](https://github.com/wekan/wekan/wiki/Features)
 
 
-[![Screenshot of Wekan][screenshot_wefork]][roadmap_wefork]
-
-## Stable
-
-- master+devel branch. At release, devel is merged to master.
-- Receives fixes and features that have been tested at edge that they work.
-- If you want automatic updates, [use Snap](https://github.com/wekan/wekan-snap/wiki/Install).
-- If you want to test before update, [use Docker quay.io release tags](https://github.com/wekan/wekan/wiki/Docker).
-
-## Edge
-
-- edge branch. All new fixes and features are added to here first. [Testing Edge](https://github.com/wekan/wekan-snap/wiki/Snap-Developer-Docs).
+[![Screenshot of Wekan][screenshot_wekan]][roadmap_wekan]
 
 
 ## License
 ## License
 
 
@@ -117,14 +100,11 @@ with [Meteor](https://www.meteor.com).
 
 
 [platforms]: https://github.com/wekan/wekan/wiki/Platforms
 [platforms]: https://github.com/wekan/wekan/wiki/Platforms
 [dev_docs]: https://github.com/wekan/wekan/wiki/Developer-Documentation
 [dev_docs]: https://github.com/wekan/wekan/wiki/Developer-Documentation
-[screenshot_wekan]: http://i.imgur.com/cI4jW2h.png
-[screenshot_wefork]: https://wekan.github.io/wekan-markdown.png
+[screenshot_wekan]: https://wekan.github.io/wekan-markdown.png
 [features]: https://github.com/wekan/wekan/wiki/Features
 [features]: https://github.com/wekan/wekan/wiki/Features
-[integrations]: https://github.com/wekan/wekan/wiki/Integrations
-[roadmap_wekan]: http://try.wekan.io/b/MeSsFJaSqeuo9M6bs/wekan-roadmap
-[roadmap_wefork]: https://wekan.indie.host/b/t2YaGmyXgNkppcFBq/wekan-fork-roadmap
+[roadmap_wekan]: https://boards.wekan.team/b/D2SzJKZDS4Z48yeQH/wekan-open-source-kanban-board-with-mit-license
+[wekan_issues]: https://github.com/wekan/wekan/issues
 [wekan_issues]: https://github.com/wekan/wekan/issues
 [wekan_issues]: https://github.com/wekan/wekan/issues
-[wefork_issues]: https://github.com/wefork/wekan/issues
 [docker_image]: https://hub.docker.com/r/wekanteam/wekan/
 [docker_image]: https://hub.docker.com/r/wekanteam/wekan/
 [travis_badge]: https://travis-ci.org/wekan/wekan.svg?branch=devel
 [travis_badge]: https://travis-ci.org/wekan/wekan.svg?branch=devel
 [travis_status]: https://travis-ci.org/wekan/wekan
 [travis_status]: https://travis-ci.org/wekan/wekan

+ 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: "v3.25.0"
+appVersion: "v3.55.0"
 files:
 files:
   userUploads:
   userUploads:
     - README.md
     - README.md

+ 1 - 1
client/components/activities/activities.js

@@ -85,7 +85,7 @@ BlazeComponent.extendComponent({
     const lastLabel = Boards.findOne(Session.get('currentBoard')).getLabelById(
     const lastLabel = Boards.findOne(Session.get('currentBoard')).getLabelById(
       lastLabelId,
       lastLabelId,
     );
     );
-    if (lastLabel.name === undefined || lastLabel.name === '') {
+    if (lastLabel && (lastLabel.name === undefined || lastLabel.name === '')) {
       return lastLabel.color;
       return lastLabel.color;
     } else {
     } else {
       return lastLabel.name;
       return lastLabel.name;

+ 106 - 35
client/components/boards/boardBody.js

@@ -89,7 +89,6 @@ BlazeComponent.extendComponent({
         helper.append(list.clone());
         helper.append(list.clone());
         return helper;
         return helper;
       },
       },
-      handle: '.js-swimlane-header',
       items: '.swimlane:not(.placeholder)',
       items: '.swimlane:not(.placeholder)',
       placeholder: 'swimlane placeholder',
       placeholder: 'swimlane placeholder',
       distance: 7,
       distance: 7,
@@ -193,11 +192,42 @@ BlazeComponent.extendComponent({
     // ugly touch event hotfix
     // ugly touch event hotfix
     enableClickOnTouch('.js-swimlane:not(.placeholder)');
     enableClickOnTouch('.js-swimlane:not(.placeholder)');
 
 
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+
+    this.autorun(() => {
+      let showDesktopDragHandles = false;
+      currentUser = Meteor.user();
+      if (currentUser) {
+        showDesktopDragHandles = (currentUser.profile || {})
+          .showDesktopDragHandles;
+      } else if (cookies.has('showDesktopDragHandles')) {
+        showDesktopDragHandles = true;
+      } else {
+        showDesktopDragHandles = false;
+      }
+      if (
+        Utils.isMiniScreen()
+        || (!Utils.isMiniScreen() && showDesktopDragHandles)
+      ) {
+        $swimlanesDom.sortable({
+          handle: '.js-swimlane-header-handle',
+        });
+      } else {
+        $swimlanesDom.sortable({
+          handle: '.swimlane-header',
+        });
+      }
+
+      // Disable drag-dropping if the current user is not a board member or is comment only
+      $swimlanesDom.sortable('option', 'disabled', !userIsMember());
+    });
+
     function userIsMember() {
     function userIsMember() {
       return (
       return (
-        Meteor.user() &&
-        Meteor.user().isBoardMember() &&
-        !Meteor.user().isCommentOnly()
+        Meteor.user()
+        && Meteor.user().isBoardMember()
+        && !Meteor.user().isCommentOnly()
       );
       );
     }
     }
 
 
@@ -210,21 +240,36 @@ BlazeComponent.extendComponent({
   },
   },
 
 
   isViewSwimlanes() {
   isViewSwimlanes() {
-    const currentUser = Meteor.user();
-    if (!currentUser) return false;
-    return (currentUser.profile || {}).boardView === 'board-view-swimlanes';
+    currentUser = Meteor.user();
+    if (currentUser) {
+      return (currentUser.profile || {}).boardView === 'board-view-swimlanes';
+    } else {
+      import { Cookies } from 'meteor/ostrio:cookies';
+      const cookies = new Cookies();
+      return cookies.get('boardView') === 'board-view-swimlanes';
+    }
   },
   },
 
 
   isViewLists() {
   isViewLists() {
-    const currentUser = Meteor.user();
-    if (!currentUser) return true;
-    return (currentUser.profile || {}).boardView === 'board-view-lists';
+    currentUser = Meteor.user();
+    if (currentUser) {
+      return (currentUser.profile || {}).boardView === 'board-view-lists';
+    } else {
+      import { Cookies } from 'meteor/ostrio:cookies';
+      const cookies = new Cookies();
+      return cookies.get('boardView') === 'board-view-lists';
+    }
   },
   },
 
 
   isViewCalendar() {
   isViewCalendar() {
-    const currentUser = Meteor.user();
-    if (!currentUser) return false;
-    return (currentUser.profile || {}).boardView === 'board-view-cal';
+    currentUser = Meteor.user();
+    if (currentUser) {
+      return (currentUser.profile || {}).boardView === 'board-view-cal';
+    } else {
+      import { Cookies } from 'meteor/ostrio:cookies';
+      const cookies = new Cookies();
+      return cookies.get('boardView') === 'board-view-cal';
+    }
   },
   },
 
 
   openNewListForm() {
   openNewListForm() {
@@ -261,16 +306,16 @@ BlazeComponent.extendComponent({
 
 
   scrollLeft(position = 0) {
   scrollLeft(position = 0) {
     const swimlanes = this.$('.js-swimlanes');
     const swimlanes = this.$('.js-swimlanes');
-    swimlanes &&
-      swimlanes.animate({
+    swimlanes
+      && swimlanes.animate({
         scrollLeft: position,
         scrollLeft: position,
       });
       });
   },
   },
 
 
   scrollTop(position = 0) {
   scrollTop(position = 0) {
     const swimlanes = this.$('.js-swimlanes');
     const swimlanes = this.$('.js-swimlanes');
-    swimlanes &&
-      swimlanes.animate({
+    swimlanes
+      && swimlanes.animate({
         scrollTop: position,
         scrollTop: position,
       });
       });
   },
   },
@@ -309,25 +354,46 @@ BlazeComponent.extendComponent({
       events(start, end, timezone, callback) {
       events(start, end, timezone, callback) {
         const currentBoard = Boards.findOne(Session.get('currentBoard'));
         const currentBoard = Boards.findOne(Session.get('currentBoard'));
         const events = [];
         const events = [];
+        const pushEvent = function(card, title, start, end, extraCls) {
+          start = start || card.startAt;
+          end = end || card.endAt;
+          title = title || card.title;
+          const className =
+            (extraCls ? `${extraCls} ` : '')
+            + (card.color ? `calendar-event-${card.color}` : '');
+          events.push({
+            id: card._id,
+            title,
+            start,
+            end: end || card.endAt,
+            allDay:
+              Math.abs(end.getTime() - start.getTime()) / 1000 === 24 * 3600,
+            url: FlowRouter.url('card', {
+              boardId: currentBoard._id,
+              slug: currentBoard.slug,
+              cardId: card._id,
+            }),
+            className,
+          });
+        };
         currentBoard
         currentBoard
           .cardsInInterval(start.toDate(), end.toDate())
           .cardsInInterval(start.toDate(), end.toDate())
           .forEach(function(card) {
           .forEach(function(card) {
-            events.push({
-              id: card._id,
-              title: card.title,
-              start: card.startAt,
-              end: card.endAt,
-              allDay:
-                Math.abs(card.endAt.getTime() - card.startAt.getTime()) /
-                  1000 ===
-                24 * 3600,
-              url: FlowRouter.url('card', {
-                boardId: currentBoard._id,
-                slug: currentBoard.slug,
-                cardId: card._id,
-              }),
-            });
+            pushEvent(card);
+          });
+        currentBoard
+          .cardsDueInBetween(start.toDate(), end.toDate())
+          .forEach(function(card) {
+            pushEvent(
+              card,
+              `${card.title} ${TAPi18n.__('card-due')}`,
+              card.dueAt,
+              new Date(card.dueAt.getTime() + 36e5),
+            );
           });
           });
+        events.sort(function(first, second) {
+          return first.id > second.id ? 1 : -1;
+        });
         callback(events);
         callback(events);
       },
       },
       eventResize(event, delta, revertFunc) {
       eventResize(event, delta, revertFunc) {
@@ -360,8 +426,13 @@ BlazeComponent.extendComponent({
     };
     };
   },
   },
   isViewCalendar() {
   isViewCalendar() {
-    const currentUser = Meteor.user();
-    if (!currentUser) return false;
-    return (currentUser.profile || {}).boardView === 'board-view-cal';
+    currentUser = Meteor.user();
+    if (currentUser) {
+      return (currentUser.profile || {}).boardView === 'board-view-cal';
+    } else {
+      import { Cookies } from 'meteor/ostrio:cookies';
+      const cookies = new Cookies();
+      return cookies.get('boardView') === 'board-view-cal';
+    }
   },
   },
 }).register('calendarView');
 }).register('calendarView');

+ 78 - 0
client/components/boards/boardBody.styl

@@ -53,3 +53,81 @@ position()
         padding: 0 0px 0px 0
         padding: 0 0px 0px 0
         overflow-x: hidden
         overflow-x: hidden
         overflow-y: auto
         overflow-y: auto
+
+calendar-event-color(background, borderColor, color...)
+  background: background !important
+  border-color: borderColor
+  if color
+    color: color !important //overwrite text for better visibility
+
+.calendar-event-green
+  calendar-event-color(#3cb500, #2a8000, #ffffff) //White text for better visibility
+
+.calendar-event-yellow
+  calendar-event-color(#fad900, #c7ac00, #000) //Black text for better visibility
+
+.calendar-event-orange
+  calendar-event-color(#ff9f19, #cc7c14, #000) //Black text for better visibility
+
+.calendar-event-red
+  calendar-event-color(#eb4646, #b83737, #ffffff) //White text for better visibility
+
+.calendar-event-purple
+  calendar-event-color(#a632db, #7d26a6, #ffffff) //White text for better visibility
+
+.calendar-event-blue
+  calendar-event-color(#0079bf, #005a8a, #ffffff) //White text for better visibility
+
+.calendar-event-pink
+  calendar-event-color(#ff78cb, #cc62a3, #000) //Black text for better visibility
+
+.calendar-event-sky
+  calendar-event-color(#00c2e0, #0094ab, #ffffff) //White text for better visibility
+
+.calendar-event-black
+  calendar-event-color(#4d4d4d, #1a1a1a, #ffffff) //White text for better visibility
+
+.calendar-event-lime
+  calendar-event-color(#51e898, #3eb375, #000) //Black text for better visibility
+
+.calendar-event-silver
+  calendar-event-color(#c0c0c0, #8c8c8c, #000) //Black text for better visibility
+
+.calendar-event-peachpuff
+  calendar-event-color(#ffdab9, #ccaf95, #000) //Black text for better visibility
+
+.calendar-event-crimson
+  calendar-event-color(#dc143c, #a8112f, #ffffff) //White text for better visibility
+
+.calendar-event-plum
+  calendar-event-color(#dda0dd, #a87ba8, #000) //Black text for better visibility
+
+.calendar-event-darkgreen
+  calendar-event-color(#006400, #003000, #ffffff) //White text for better visibility
+
+.calendar-event-slateblue
+  calendar-event-color(#6a5acd, #4f4399, #ffffff) //White text for better visibility
+
+.calendar-event-magenta
+  calendar-event-color(#ff00ff, #cc00cc, #ffffff) //White text for better visibility
+
+.calendar-event-gold
+  calendar-event-color(#ffd700, #ccaa00, #000) //Black text for better visibility
+
+.calendar-event-navy
+  calendar-event-color(#000080, #000033, #ffffff) //White text for better visibility
+
+.calendar-event-gray
+  calendar-event-color(#808080, #333333, #ffffff) //White text for better visibility
+
+.calendar-event-saddlebrown
+  calendar-event-color(#8b4513, #572b0c, #ffffff) //White text for better visibility
+
+.calendar-event-paleturquoise
+  calendar-event-color(#afeeee, #8ababa, #000) //Black text for better visibility
+
+.calendar-event-mistyrose
+  calendar-event-color(#ffe4e1, #ccb8b6, #000) //Black text for better visibility
+
+.calendar-event-indigo
+  calendar-event-color(#4b0082, #2b004d, #ffffff) //White text for better visibility

+ 77 - 11
client/components/boards/boardHeader.jade

@@ -77,6 +77,11 @@ template(name="boardHeaderBar")
             i.fa.fa-archive
             i.fa.fa-archive
             span {{_ 'archives'}}
             span {{_ 'archives'}}
 
 
+      //if showSort
+      //  a.board-header-btn.js-open-sort-view(title="{{_ 'sort-desc'}}")
+      //    i.fa(class="{{directionClass}}")
+      //    span {{_ 'sort'}}{{_ listSortShortDesc}}
+
       a.board-header-btn.js-open-filter-view(
       a.board-header-btn.js-open-filter-view(
           title="{{#if Filter.isActive}}{{_ 'filter-on-desc'}}{{else}}{{_ 'filter'}}{{/if}}"
           title="{{#if Filter.isActive}}{{_ 'filter-on-desc'}}{{else}}{{_ 'filter'}}{{/if}}"
           class="{{#if Filter.isActive}}emphasis{{/if}}")
           class="{{#if Filter.isActive}}emphasis{{/if}}")
@@ -85,15 +90,6 @@ template(name="boardHeaderBar")
         if Filter.isActive
         if Filter.isActive
           a.board-header-btn-close.js-filter-reset(title="{{_ 'filter-clear'}}")
           a.board-header-btn-close.js-filter-reset(title="{{_ 'filter-clear'}}")
             i.fa.fa-times-thin
             i.fa.fa-times-thin
-            
-      if currentUser.isAdmin
-        a.board-header-btn.js-open-rules-view(title="{{_ 'rules'}}")
-          i.fa.fa-magic
-          span {{_ 'rules'}}
-      else if currentUser.isBoardAdmin
-        a.board-header-btn.js-open-rules-view(title="{{_ 'rules'}}")
-          i.fa.fa-magic
-          span {{_ 'rules'}}
 
 
       a.board-header-btn.js-open-search-view(title="{{_ 'search'}}")
       a.board-header-btn.js-open-search-view(title="{{_ 'search'}}")
         i.fa.fa-search
         i.fa.fa-search
@@ -102,8 +98,19 @@ template(name="boardHeaderBar")
       unless currentBoard.isTemplatesBoard
       unless currentBoard.isTemplatesBoard
         a.board-header-btn.js-toggle-board-view(
         a.board-header-btn.js-toggle-board-view(
           title="{{_ 'board-view'}}")
           title="{{_ 'board-view'}}")
-          i.fa.fa-th-large
-          span {{#if currentUser.profile.boardView}}{{_ currentUser.profile.boardView}}{{else}}{{_ 'board-view-lists'}}{{/if}}
+          i.fa.fa-caret-down
+          if $eq boardView 'board-view-lists'
+            i.fa.fa-trello
+          if $eq boardView 'board-view-swimlanes'
+            i.fa.fa-th-large
+          //  unless collapseSwimlane
+          //    i.fa.fa-th-large
+          //  if collapseSwimlane
+          //    i.fa.fa-play
+          if $eq boardView 'board-view-cal'
+            i.fa.fa-calendar
+          span {{#if boardView}}{{_ boardView}}{{else}}{{_ 'board-view-lists'}}{{/if}}
+          //span {{#if collapseSwimlane}}{{_ 'board-view-collapse'}}{{else}}{{#if boardView}}{{_ boardView}}{{else}}{{_ 'board-view-lists'}}{{/if}}{{/if}}
 
 
       if canModifyBoard
       if canModifyBoard
         a.board-header-btn.js-multiselection-activate(
         a.board-header-btn.js-multiselection-activate(
@@ -168,6 +175,51 @@ template(name="boardChangeWatchPopup")
             i.fa.fa-check
             i.fa.fa-check
           span.sub-name {{_ 'muted-info'}}
           span.sub-name {{_ 'muted-info'}}
 
 
+template(name="boardChangeViewPopup")
+  ul.pop-over-list
+    li
+      with "board-view-lists"
+        a.js-open-lists-view
+          i.fa.fa-trello.colorful
+          | {{_ 'board-view-lists'}}
+          if $eq Utils.boardView "board-view-lists"
+            i.fa.fa-check
+    li
+      with "board-view-swimlanes"
+        a.js-open-swimlanes-view
+          i.fa.fa-th-large.colorful
+          | {{_ 'board-view-swimlanes'}}
+          if $eq Utils.boardView "board-view-swimlanes"
+            i.fa.fa-check
+    //li
+    //  with "board-view-collapse"
+    //    a.js-open-collapse-view
+    //      i.fa.fa-play.colorful
+    //      | {{_ 'board-view-collapse'}}
+    //      if $eq Utils.boardView "board-view-collapse"
+    //        i.fa.fa-check
+    li
+      with "board-view-cal"
+        a.js-open-cal-view
+          i.fa.fa-calendar.colorful
+          | {{_ 'board-view-cal'}}
+          if $eq Utils.boardView "board-view-cal"
+            i.fa.fa-check
+    if currentUser.isAdmin
+      hr
+      li
+        with "board-view-rules"
+          a.js-open-rules-view(title="{{_ 'rules'}}")
+            i.fa.fa-magic
+            | {{_ 'rules'}}
+    else if currentUser.isBoardAdmin
+      hr
+      li
+        with "board-view-rules"
+          a.js-open-rules-view(title="{{_ 'rules'}}")
+            i.fa.fa-magic
+            | {{_ 'rules'}}
+
 template(name="createBoard")
 template(name="createBoard")
   form
   form
     label
     label
@@ -194,6 +246,20 @@ template(name="createBoard")
       | /
       | /
       a.js-board-template {{_ 'template'}}
       a.js-board-template {{_ 'template'}}
 
 
+//template(name="listsortPopup")
+//  h2
+//   | {{_ 'list-sort-by'}}
+//  hr
+//  ul.pop-over-list
+//    each value in allowedSortValues
+//     li
+//      a.js-sort-by(name="{{value.name}}")
+//        if $eq sortby value.name
+//           i(class="fa {{Direction}}")
+//        | {{_ value.label }}{{_ value.shortLabel}}
+//        if $eq sortby value.name
+//           i(class="fa fa-check")
+
 template(name="boardChangeTitlePopup")
 template(name="boardChangeTitlePopup")
   form
   form
     label
     label

+ 144 - 22
client/components/boards/boardHeader.js

@@ -1,3 +1,7 @@
+/*
+const DOWNCLS = 'fa-sort-down';
+const UPCLS = 'fa-sort-up';
+*/
 Template.boardMenuPopup.events({
 Template.boardMenuPopup.events({
   'click .js-rename-board': Popup.open('boardChangeTitle'),
   'click .js-rename-board': Popup.open('boardChangeTitle'),
   'click .js-custom-fields'() {
   'click .js-custom-fields'() {
@@ -80,7 +84,27 @@ BlazeComponent.extendComponent({
     const currentBoard = Boards.findOne(Session.get('currentBoard'));
     const currentBoard = Boards.findOne(Session.get('currentBoard'));
     return currentBoard && currentBoard.stars >= 2;
     return currentBoard && currentBoard.stars >= 2;
   },
   },
-
+  /*
+  showSort() {
+    return Meteor.user().hasSortBy();
+  },
+  directionClass() {
+    return this.currentDirection() === -1 ? DOWNCLS : UPCLS;
+  },
+  changeDirection() {
+    const direction = 0 - this.currentDirection() === -1 ? '-' : '';
+    Meteor.call('setListSortBy', direction + this.currentListSortBy());
+  },
+  currentDirection() {
+    return Meteor.user().getListSortByDirection();
+  },
+  currentListSortBy() {
+    return Meteor.user().getListSortBy();
+  },
+  listSortShortDesc() {
+    return `list-label-short-${this.currentListSortBy()}`;
+  },
+  */
   events() {
   events() {
     return [
     return [
       {
       {
@@ -94,30 +118,25 @@ BlazeComponent.extendComponent({
         'click .js-open-archived-board'() {
         'click .js-open-archived-board'() {
           Modal.open('archivedBoards');
           Modal.open('archivedBoards');
         },
         },
-        'click .js-toggle-board-view'() {
-          const currentUser = Meteor.user();
-          if (
-            (currentUser.profile || {}).boardView === 'board-view-swimlanes'
-          ) {
-            currentUser.setBoardView('board-view-cal');
-          } else if (
-            (currentUser.profile || {}).boardView === 'board-view-lists'
-          ) {
-            currentUser.setBoardView('board-view-swimlanes');
-          } else if (
-            (currentUser.profile || {}).boardView === 'board-view-cal'
-          ) {
-            currentUser.setBoardView('board-view-lists');
-          } else {
-            currentUser.setBoardView('board-view-swimlanes');
-          }
-        },
+        'click .js-toggle-board-view': Popup.open('boardChangeView'),
         'click .js-toggle-sidebar'() {
         'click .js-toggle-sidebar'() {
           Sidebar.toggle();
           Sidebar.toggle();
         },
         },
         'click .js-open-filter-view'() {
         'click .js-open-filter-view'() {
           Sidebar.setView('filter');
           Sidebar.setView('filter');
         },
         },
+        /*
+        'click .js-open-sort-view'(evt) {
+          const target = evt.target;
+          if (target.tagName === 'I') {
+            // click on the text, popup choices
+            this.changeDirection();
+          } else {
+            // change the sort order
+            Popup.open('listsort')(evt);
+          }
+        },
+        */
         'click .js-filter-reset'(event) {
         'click .js-filter-reset'(event) {
           event.stopPropagation();
           event.stopPropagation();
           Sidebar.setView();
           Sidebar.setView();
@@ -126,9 +145,6 @@ BlazeComponent.extendComponent({
         'click .js-open-search-view'() {
         'click .js-open-search-view'() {
           Sidebar.setView('search');
           Sidebar.setView('search');
         },
         },
-        'click .js-open-rules-view'() {
-          Modal.openWide('rulesMain');
-        },
         'click .js-multiselection-activate'() {
         'click .js-multiselection-activate'() {
           const currentCard = Session.get('currentCard');
           const currentCard = Session.get('currentCard');
           MultiSelection.activate();
           MultiSelection.activate();
@@ -156,6 +172,40 @@ Template.boardHeaderBar.helpers({
       !Meteor.user().isCommentOnly()
       !Meteor.user().isCommentOnly()
     );
     );
   },
   },
+  boardView() {
+    return Utils.boardView();
+  },
+  //collapseSwimlane() {
+  //  import { Cookies } from 'meteor/ostrio:cookies';
+  //  const cookies = new Cookies();
+  //  if (cookies.has('collapseSwimlane')) {
+  //    return true;
+  //  } else {
+  //    return false;
+  //  }
+  //},
+});
+
+Template.boardChangeViewPopup.events({
+  'click .js-open-lists-view'() {
+    Utils.setBoardView('board-view-lists');
+    Popup.close();
+  },
+  'click .js-open-swimlanes-view'() {
+    Utils.setBoardView('board-view-swimlanes');
+    Popup.close();
+  },
+  //'click .js-open-collapse-view'() {
+  //  Utils.setBoardView('board-view-collapse');
+  //Popup.close();
+  'click .js-open-cal-view'() {
+    Utils.setBoardView('board-view-cal');
+    Popup.close();
+  },
+  'click .js-open-rules-view'() {
+    Modal.openWide('rulesMain');
+    Popup.close();
+  },
 });
 });
 
 
 const CreateBoard = BlazeComponent.extendComponent({
 const CreateBoard = BlazeComponent.extendComponent({
@@ -277,3 +327,75 @@ BlazeComponent.extendComponent({
     ];
     ];
   },
   },
 }).register('boardChangeWatchPopup');
 }).register('boardChangeWatchPopup');
+
+/*
+BlazeComponent.extendComponent({
+  onCreated() {
+    //this.sortBy = new ReactiveVar();
+    ////this.sortDirection = new ReactiveVar();
+    //this.setSortBy();
+    this.downClass = DOWNCLS;
+    this.upClass = UPCLS;
+  },
+  allowedSortValues() {
+    const types = [];
+    const pushed = {};
+    Meteor.user()
+      .getListSortTypes()
+      .forEach(type => {
+        const key = type.replace(/^-/, '');
+        if (pushed[key] === undefined) {
+          types.push({
+            name: key,
+            label: `list-label-${key}`,
+            shortLabel: `list-label-short-${key}`,
+          });
+          pushed[key] = 1;
+        }
+      });
+    return types;
+  },
+  Direction() {
+    return Meteor.user().getListSortByDirection() === -1
+      ? this.downClass
+      : this.upClass;
+  },
+  sortby() {
+    return Meteor.user().getListSortBy();
+  },
+
+  setSortBy(type = null) {
+    const user = Meteor.user();
+    if (type === null) {
+      type = user._getListSortBy();
+    } else {
+      let value = '';
+      if (type.map) {
+        // is an array
+        value = (type[1] === -1 ? '-' : '') + type[0];
+      }
+      Meteor.call('setListSortBy', value);
+    }
+    //this.sortBy.set(type[0]);
+    //this.sortDirection.set(type[1]);
+  },
+
+  events() {
+    return [
+      {
+        'click .js-sort-by'(evt) {
+          evt.preventDefault();
+          const target = evt.target;
+          const sortby = target.getAttribute('name');
+          const down = !!target.querySelector(`.${this.upClass}`);
+          const direction = down ? -1 : 1;
+          this.setSortBy([sortby, direction]);
+          if (Utils.isMiniScreen) {
+            Popup.close();
+          }
+        },
+      },
+    ];
+  },
+}).register('listsortPopup');
+*/

+ 2 - 0
client/components/cards/attachments.js

@@ -131,6 +131,8 @@ Template.previewClipboardImagePopup.onRendered(() => {
             direct(results);
             direct(results);
           },
           },
         });
         });
+      } else {
+        direct(results);
       }
       }
     }
     }
   };
   };

+ 8 - 8
client/components/cards/cardDate.js

@@ -105,7 +105,7 @@ Template.dateBadge.helpers({
 // editCardReceivedDatePopup
 // editCardReceivedDatePopup
 (class extends DatePicker {
 (class extends DatePicker {
   onCreated() {
   onCreated() {
-    super.onCreated();
+    super.onCreated(moment().format('YYYY-MM-DD HH:mm'));
     this.data().getReceived() &&
     this.data().getReceived() &&
       this.date.set(moment(this.data().getReceived()));
       this.date.set(moment(this.data().getReceived()));
   }
   }
@@ -122,7 +122,7 @@ Template.dateBadge.helpers({
 // editCardStartDatePopup
 // editCardStartDatePopup
 (class extends DatePicker {
 (class extends DatePicker {
   onCreated() {
   onCreated() {
-    super.onCreated();
+    super.onCreated(moment().format('YYYY-MM-DD HH:mm'));
     this.data().getStart() && this.date.set(moment(this.data().getStart()));
     this.data().getStart() && this.date.set(moment(this.data().getStart()));
   }
   }
 
 
@@ -148,7 +148,7 @@ Template.dateBadge.helpers({
 // editCardDueDatePopup
 // editCardDueDatePopup
 (class extends DatePicker {
 (class extends DatePicker {
   onCreated() {
   onCreated() {
-    super.onCreated();
+    super.onCreated('1970-01-01 17:00:00');
     this.data().getDue() && this.date.set(moment(this.data().getDue()));
     this.data().getDue() && this.date.set(moment(this.data().getDue()));
   }
   }
 
 
@@ -171,7 +171,7 @@ Template.dateBadge.helpers({
 // editCardEndDatePopup
 // editCardEndDatePopup
 (class extends DatePicker {
 (class extends DatePicker {
   onCreated() {
   onCreated() {
-    super.onCreated();
+    super.onCreated(moment().format('YYYY-MM-DD HH:mm'));
     this.data().getEnd() && this.date.set(moment(this.data().getEnd()));
     this.data().getEnd() && this.date.set(moment(this.data().getEnd()));
   }
   }
 
 
@@ -237,7 +237,7 @@ class CardReceivedDate extends CardDate {
     const theDate = this.date.get();
     const theDate = this.date.get();
     // if dueAt, endAt and startAt exist & are > receivedAt, receivedAt doesn't need to be flagged
     // if dueAt, endAt and startAt exist & are > receivedAt, receivedAt doesn't need to be flagged
     if (
     if (
-      (startAt && theDate.isAfter(dueAt)) ||
+      (startAt && theDate.isAfter(startAt)) ||
       (endAt && theDate.isAfter(endAt)) ||
       (endAt && theDate.isAfter(endAt)) ||
       (dueAt && theDate.isAfter(dueAt))
       (dueAt && theDate.isAfter(dueAt))
     )
     )
@@ -344,9 +344,9 @@ class CardEndDate extends CardDate {
     let classes = 'end-date' + ' ';
     let classes = 'end-date' + ' ';
     const dueAt = this.data().getDue();
     const dueAt = this.data().getDue();
     const theDate = this.date.get();
     const theDate = this.date.get();
-    if (theDate.diff(dueAt, 'days') >= 2) classes += 'long-overdue';
-    else if (theDate.diff(dueAt, 'days') >= 0) classes += 'due';
-    else if (theDate.diff(dueAt, 'days') >= -2) classes += 'almost-due';
+    if (!dueAt) classes += '';
+    else if (theDate.isBefore(dueAt)) classes += 'current';
+    else if (theDate.isAfter(dueAt)) classes += 'due';
     return classes;
     return classes;
   }
   }
 
 

+ 66 - 3
client/components/cards/cardDetails.jade

@@ -4,9 +4,14 @@ template(name="cardDetails")
       +inlinedForm(classNames="js-card-details-title")
       +inlinedForm(classNames="js-card-details-title")
         +editCardTitleForm
         +editCardTitleForm
       else
       else
-        a.fa.fa-times-thin.close-card-details.js-close-card-details
-        if currentUser.isBoardMember
-          a.fa.fa-navicon.card-details-menu.js-open-card-details-menu
+        unless isMiniScreen
+          a.fa.fa-times-thin.close-card-details.js-close-card-details
+          if currentUser.isBoardMember
+            a.fa.fa-navicon.card-details-menu.js-open-card-details-menu
+        if isMiniScreen
+          a.fa.fa-times-thin.close-card-details-mobile-web.js-close-card-details
+          if currentUser.isBoardMember
+            a.fa.fa-navicon.card-details-menu-mobile-web.js-open-card-details-menu
         h2.card-details-title.js-card-title(
         h2.card-details-title.js-card-title(
           class="{{#if canModifyCard}}js-open-inlined-form is-editable{{/if}}")
           class="{{#if canModifyCard}}js-open-inlined-form is-editable{{/if}}")
             +viewer
             +viewer
@@ -73,6 +78,16 @@ template(name="cardDetails")
           a.member.add-member.card-details-item-add-button.js-add-members(title="{{_ 'card-members-title'}}")
           a.member.add-member.card-details-item-add-button.js-add-members(title="{{_ 'card-members-title'}}")
             i.fa.fa-plus
             i.fa.fa-plus
 
 
+      .card-details-item.card-details-item-assignees
+        h3.card-details-item-title {{_ 'assignee'}}
+        each getAssignees
+          +userAvatarAssignee(userId=this cardId=../_id)
+          | {{! XXX Hack to hide syntaxic coloration /// }}
+        if canModifyCard
+          unless assigneeSelected
+            a.assignee.add-assignee.card-details-item-add-button.js-add-assignees(title="{{_ 'assignee'}}")
+              i.fa.fa-plus
+
       .card-details-item.card-details-item-labels
       .card-details-item.card-details-item-labels
         h3.card-details-item-title {{_ 'labels'}}
         h3.card-details-item-title {{_ 'labels'}}
         a(class="{{#if canModifyCard}}js-add-labels{{else}}is-disabled{{/if}}" title="{{_ 'card-labels-title'}}")
         a(class="{{#if canModifyCard}}js-add-labels{{else}}is-disabled{{/if}}" title="{{_ 'card-labels-title'}}")
@@ -296,6 +311,54 @@ template(name="cardMembersPopup")
           if isCardMember
           if isCardMember
             i.fa.fa-check
             i.fa.fa-check
 
 
+template(name="cardAssigneesPopup")
+  ul.pop-over-list.js-card-assignee-list
+    each board.activeMembers
+      li.item(class="{{#if isCardAssignee}}active{{/if}}")
+        a.name.js-select-assignee(href="#")
+          +userAvatar(userId=user._id)
+          span.full-name
+            = user.profile.fullname
+            | (<span class="username">{{ user.username }}</span>)
+          if isCardAssignee
+            i.fa.fa-check
+
+template(name="userAvatarAssignee")
+  a.assignee.js-assignee(title="{{userData.profile.fullname}} ({{userData.username}})")
+    if userData.profile.avatarUrl
+      img.avatar.avatar-image(src="{{userData.profile.avatarUrl}}")
+    else
+      +userAvatarAssigneeInitials(userId=userData._id)
+
+    if showStatus
+      span.assignee-presence-status(class=presenceStatusClassName)
+      span.member-type(class=memberType)
+
+    unless isSandstorm
+      if showEdit
+        if $eq currentUser._id userData._id
+          a.edit-avatar.js-change-avatar
+            i.fa.fa-pencil
+
+template(name="cardAssigneePopup")
+  .board-assignee-menu
+    .mini-profile-info
+      +userAvatar(userId=user._id showEdit=true)
+      .info
+        h3= user.profile.fullname
+        p.quiet @{{ user.username }}
+    ul.pop-over-list
+      if currentUser.isNotCommentOnly
+          li: a.js-remove-assignee {{_ 'remove-member-from-card'}}
+
+      if $eq currentUser._id user._id
+        with currentUser
+          li: a.js-edit-profile {{_ 'edit-profile'}}
+
+template(name="userAvatarAssigneeInitials")
+  svg.avatar.avatar-assignee-initials(viewBox="0 0 {{viewPortWidth}} 15")
+    text(x="50%" y="13" text-anchor="middle")= initials
+
 template(name="cardMorePopup")
 template(name="cardMorePopup")
   p.quiet
   p.quiet
     span.clearfix
     span.clearfix

+ 163 - 11
client/components/cards/cardDetails.js

@@ -121,11 +121,6 @@ BlazeComponent.extendComponent({
       // Send Webhook but not create Activities records ---
       // Send Webhook but not create Activities records ---
       const card = this.currentData();
       const card = this.currentData();
       const userId = Meteor.userId();
       const userId = Meteor.userId();
-      //console.log(`userId: ${userId}`);
-      //console.log(`cardId: ${card._id}`);
-      //console.log(`boardId: ${card.boardId}`);
-      //console.log(`listId: ${card.listId}`);
-      //console.log(`swimlaneId: ${card.swimlaneId}`);
       const params = {
       const params = {
         userId,
         userId,
         cardId: card._id,
         cardId: card._id,
@@ -134,16 +129,25 @@ BlazeComponent.extendComponent({
         user: Meteor.user().username,
         user: Meteor.user().username,
         url: '',
         url: '',
       };
       };
-      //console.log('looking for integrations...');
+
       const integrations = Integrations.find({
       const integrations = Integrations.find({
-        boardId: card.boardId,
-        type: 'outgoing-webhooks',
+        boardId: { $in: [card.boardId, Integrations.Const.GLOBAL_WEBHOOK_ID] },
         enabled: true,
         enabled: true,
         activities: { $in: ['CardDetailsRendered', 'all'] },
         activities: { $in: ['CardDetailsRendered', 'all'] },
       }).fetch();
       }).fetch();
-      //console.log(`Investigation length: ${integrations.length}`);
+
       if (integrations.length > 0) {
       if (integrations.length > 0) {
-        Meteor.call('outgoingWebhooks', integrations, 'CardSelected', params);
+        integrations.forEach(integration => {
+          Meteor.call(
+            'outgoingWebhooks',
+            integration,
+            'CardSelected',
+            params,
+            () => {
+              return;
+            },
+          );
+        });
       }
       }
       //-------------
       //-------------
     }
     }
@@ -309,6 +313,8 @@ BlazeComponent.extendComponent({
         },
         },
         'click .js-member': Popup.open('cardMember'),
         'click .js-member': Popup.open('cardMember'),
         'click .js-add-members': Popup.open('cardMembers'),
         'click .js-add-members': Popup.open('cardMembers'),
+        'click .js-assignee': Popup.open('cardAssignee'),
+        'click .js-add-assignees': Popup.open('cardAssignees'),
         'click .js-add-labels': Popup.open('cardLabels'),
         'click .js-add-labels': Popup.open('cardLabels'),
         'click .js-received-date': Popup.open('editCardReceivedDate'),
         'click .js-received-date': Popup.open('editCardReceivedDate'),
         'click .js-start-date': Popup.open('editCardStartDate'),
         'click .js-start-date': Popup.open('editCardStartDate'),
@@ -321,6 +327,19 @@ BlazeComponent.extendComponent({
           parentComponent.showOverlay.set(true);
           parentComponent.showOverlay.set(true);
           parentComponent.mouseHasEnterCardDetails = true;
           parentComponent.mouseHasEnterCardDetails = true;
         },
         },
+        'mousedown .js-card-details'() {
+          Session.set('cardDetailsIsDragging', false);
+          Session.set('cardDetailsIsMouseDown', true);
+        },
+        'mousemove .js-card-details'() {
+          if (Session.get('cardDetailsIsMouseDown')) {
+            Session.set('cardDetailsIsDragging', true);
+          }
+        },
+        'mouseup .js-card-details'() {
+          Session.set('cardDetailsIsDragging', false);
+          Session.set('cardDetailsIsMouseDown', false);
+        },
         'click #toggleButton'() {
         'click #toggleButton'() {
           Meteor.call('toggleSystemMessages');
           Meteor.call('toggleSystemMessages');
         },
         },
@@ -329,6 +348,58 @@ BlazeComponent.extendComponent({
   },
   },
 }).register('cardDetails');
 }).register('cardDetails');
 
 
+Template.cardDetails.helpers({
+  userData() {
+    // We need to handle a special case for the search results provided by the
+    // `matteodem:easy-search` package. Since these results gets published in a
+    // separate collection, and not in the standard Meteor.Users collection as
+    // expected, we use a component parameter ("property") to distinguish the
+    // two cases.
+    const userCollection = this.esSearch ? ESSearchResults : Users;
+    return userCollection.findOne(this.userId, {
+      fields: {
+        profile: 1,
+        username: 1,
+      },
+    });
+  },
+
+  assigneeSelected() {
+    if (this.getAssignees().length === 0) {
+      return false;
+    } else {
+      return true;
+    }
+  },
+
+  memberType() {
+    const user = Users.findOne(this.userId);
+    return user && user.isBoardAdmin() ? 'admin' : 'normal';
+  },
+
+  presenceStatusClassName() {
+    const user = Users.findOne(this.userId);
+    const userPresence = presences.findOne({ userId: this.userId });
+    if (user && user.isInvitedTo(Session.get('currentBoard'))) return 'pending';
+    else if (!userPresence) return 'disconnected';
+    else if (Session.equals('currentBoard', userPresence.state.currentBoardId))
+      return 'active';
+    else return 'idle';
+  },
+});
+
+Template.userAvatarAssigneeInitials.helpers({
+  initials() {
+    const user = Users.findOne(this.userId);
+    return user && user.getInitials();
+  },
+
+  viewPortWidth() {
+    const user = Users.findOne(this.userId);
+    return ((user && user.getInitials().length) || 1) * 12;
+  },
+});
+
 // We extends the normal InlinedForm component to support UnsavedEdits draft
 // We extends the normal InlinedForm component to support UnsavedEdits draft
 // feature.
 // feature.
 (class extends InlinedForm {
 (class extends InlinedForm {
@@ -386,6 +457,7 @@ Template.cardDetailsActionsPopup.helpers({
 
 
 Template.cardDetailsActionsPopup.events({
 Template.cardDetailsActionsPopup.events({
   'click .js-members': Popup.open('cardMembers'),
   'click .js-members': Popup.open('cardMembers'),
+  'click .js-assignees': Popup.open('cardAssignees'),
   'click .js-labels': Popup.open('cardLabels'),
   'click .js-labels': Popup.open('cardLabels'),
   'click .js-attachments': Popup.open('cardAttachments'),
   'click .js-attachments': Popup.open('cardAttachments'),
   'click .js-custom-fields': Popup.open('cardCustomFields'),
   'click .js-custom-fields': Popup.open('cardCustomFields'),
@@ -777,7 +849,14 @@ BlazeComponent.extendComponent({
 EscapeActions.register(
 EscapeActions.register(
   'detailsPane',
   'detailsPane',
   () => {
   () => {
-    Utils.goBoardId(Session.get('currentBoard'));
+    if (Session.get('cardDetailsIsDragging')) {
+      // Reset dragging status as the mouse landed outside the cardDetails template area and this will prevent a mousedown event from firing
+      Session.set('cardDetailsIsDragging', false);
+      Session.set('cardDetailsIsMouseDown', false);
+    } else {
+      // Prevent close card when the user is selecting text and moves the mouse cursor outside the card detail area
+      Utils.goBoardId(Session.get('currentBoard'));
+    }
   },
   },
   () => {
   () => {
     return !Session.equals('currentCard', null);
     return !Session.equals('currentCard', null);
@@ -786,3 +865,76 @@ EscapeActions.register(
     noClickEscapeOn: '.js-card-details,.board-sidebar,#header',
     noClickEscapeOn: '.js-card-details,.board-sidebar,#header',
   },
   },
 );
 );
+
+Template.cardAssigneesPopup.events({
+  'click .js-select-assignee'(event) {
+    const card = Cards.findOne(Session.get('currentCard'));
+    const assigneeId = this.userId;
+    card.toggleAssignee(assigneeId);
+    event.preventDefault();
+  },
+});
+
+Template.cardAssigneesPopup.helpers({
+  isCardAssignee() {
+    const card = Template.parentData();
+    const cardAssignees = card.getAssignees();
+
+    return _.contains(cardAssignees, this.userId);
+  },
+
+  user() {
+    return Users.findOne(this.userId);
+  },
+});
+
+Template.cardAssigneePopup.helpers({
+  userData() {
+    // We need to handle a special case for the search results provided by the
+    // `matteodem:easy-search` package. Since these results gets published in a
+    // separate collection, and not in the standard Meteor.Users collection as
+    // expected, we use a component parameter ("property") to distinguish the
+    // two cases.
+    const userCollection = this.esSearch ? ESSearchResults : Users;
+    return userCollection.findOne(this.userId, {
+      fields: {
+        profile: 1,
+        username: 1,
+      },
+    });
+  },
+
+  memberType() {
+    const user = Users.findOne(this.userId);
+    return user && user.isBoardAdmin() ? 'admin' : 'normal';
+  },
+
+  presenceStatusClassName() {
+    const user = Users.findOne(this.userId);
+    const userPresence = presences.findOne({ userId: this.userId });
+    if (user && user.isInvitedTo(Session.get('currentBoard'))) return 'pending';
+    else if (!userPresence) return 'disconnected';
+    else if (Session.equals('currentBoard', userPresence.state.currentBoardId))
+      return 'active';
+    else return 'idle';
+  },
+
+  isCardAssignee() {
+    const card = Template.parentData();
+    const cardAssignees = card.getAssignees();
+
+    return _.contains(cardAssignees, this.userId);
+  },
+
+  user() {
+    return Users.findOne(this.userId);
+  },
+});
+
+Template.cardAssigneePopup.events({
+  'click .js-remove-assignee'() {
+    Cards.findOne(this.cardId).unassignAssignee(this.userId);
+    Popup.close();
+  },
+  'click .js-edit-profile': Popup.open('editProfile'),
+});

+ 89 - 1
client/components/cards/cardDetails.styl

@@ -1,5 +1,80 @@
 @import 'nib'
 @import 'nib'
 
 
+// Assignee, code copied from wekan/client/users/userAvatar.styl
+
+avatar-radius = 50%
+
+.assignee
+  border-radius: 3px
+  display: block
+  position: relative
+  float: left
+  height: 30px
+  width: @height
+  margin: 0 4px 4px 0
+  cursor: pointer
+  user-select: none
+  z-index: 1
+  text-decoration: none
+  border-radius: avatar-radius
+
+  .avatar
+    overflow: hidden
+    border-radius: avatar-radius
+
+    &.avatar-assignee-initials
+      height: 70%
+      width: @height
+      padding: 15%
+      background-color: #dbdbdb
+      color: #444444
+      position: absolute
+
+    &.avatar-image
+      height: 100%
+      width: @height
+
+  .assignee-presence-status
+    background-color: #b3b3b3
+    border: 1px solid #fff
+    border-radius: 50%
+    height: 7px
+    width: @height
+    position: absolute
+    right: -1px
+    bottom: -1px
+    border: 1px solid white
+    z-index: 15
+
+    &.active
+      background: #64c464
+      border-color: #daf1da
+
+    &.idle
+      background: #e4e467
+      border-color: #f7f7d4
+
+    &.disconnected
+      background: #bdbdbd
+      border-color: #ededed
+
+    &.pending
+      background: #e44242
+      border-color: #f1dada
+
+
+
+  &.add-assignee
+    display: flex
+    align-items: center
+    justify-content: center
+    box-shadow: 0 0 0 2px darken(white, 25%) inset
+
+    &:hover, &.is-active
+      box-shadow: 0 0 0 2px darken(white, 60%) inset
+
+// Other card details
+
 .card-details
 .card-details
   padding: 0
   padding: 0
   flex-shrink: 0
   flex-shrink: 0
@@ -32,7 +107,9 @@
     border-bottom: 1px solid darken(white, 14%)
     border-bottom: 1px solid darken(white, 14%)
 
 
     .close-card-details,
     .close-card-details,
-    .card-details-menu
+    .card-details-menu,
+    .close-card-details-mobile-web,
+    .card-details-menu-mobile-web
       float: right
       float: right
 
 
     .close-card-details
     .close-card-details
@@ -40,10 +117,20 @@
       padding: 5px
       padding: 5px
       margin-right: -8px
       margin-right: -8px
 
 
+    .close-card-details-mobile-web
+      font-size: 24px
+      padding: 5px
+      margin-right: 40px
+
     .card-details-menu
     .card-details-menu
       font-size: 17px
       font-size: 17px
       padding: 10px
       padding: 10px
 
 
+    .card-details-menu-mobile-web
+      font-size: 17px
+      padding: 10px
+      margin-right: 30px
+
     .card-details-watch
     .card-details-watch
       font-size: 17px
       font-size: 17px
       padding-left: 7px
       padding-left: 7px
@@ -93,6 +180,7 @@
         margin-right: 0
         margin-right: 0
       &.card-details-item-labels,
       &.card-details-item-labels,
       &.card-details-item-members,
       &.card-details-item-members,
+      &.card-details-item-assignees,
       &.card-details-item-received,
       &.card-details-item-received,
       &.card-details-item-start,
       &.card-details-item-start,
       &.card-details-item-due,
       &.card-details-item-due,

+ 15 - 2
client/components/cards/minicard.jade

@@ -3,6 +3,13 @@ template(name="minicard")
     class="{{#if isLinkedCard}}linked-card{{/if}}"
     class="{{#if isLinkedCard}}linked-card{{/if}}"
     class="{{#if isLinkedBoard}}linked-board{{/if}}"
     class="{{#if isLinkedBoard}}linked-board{{/if}}"
     class="minicard-{{colorClass}}")
     class="minicard-{{colorClass}}")
+    if isMiniScreen
+      .handle
+        .fa.fa-arrows
+    unless isMiniScreen
+      if showDesktopDragHandles
+        .handle
+          .fa.fa-arrows
     if cover
     if cover
       .minicard-cover(style="background-image: url('{{cover.url}}');")
       .minicard-cover(style="background-image: url('{{cover.url}}');")
     if labels
     if labels
@@ -15,8 +22,6 @@ template(name="minicard")
           if hiddenMinicardLabelText
           if hiddenMinicardLabelText
             .minicard-label(class="card-label-{{color}}" title="{{name}}")
             .minicard-label(class="card-label-{{color}}" title="{{name}}")
     .minicard-title
     .minicard-title
-      .handle
-        .fa.fa-arrows
       if $eq 'prefix-with-full-path' currentBoard.presentParentTask
       if $eq 'prefix-with-full-path' currentBoard.presentParentTask
         .parent-prefix
         .parent-prefix
           | {{ parentString ' > ' }}
           | {{ parentString ' > ' }}
@@ -53,6 +58,8 @@ template(name="minicard")
       if getDue
       if getDue
         .date
         .date
           +minicardDueDate
           +minicardDueDate
+      if getEnd
+         +minicardEndDate
       if getSpentTime
       if getSpentTime
         .date
         .date
           +cardSpentTime
           +cardSpentTime
@@ -69,6 +76,12 @@ template(name="minicard")
               +viewer
               +viewer
                 = trueValue
                 = trueValue
 
 
+    if getAssignees
+      .minicard-assignees.js-minicard-assignees
+        each getAssignees
+          +userAvatar(userId=this)
+        hr
+
     if getMembers
     if getMembers
       .minicard-members.js-minicard-members
       .minicard-members.js-minicard-members
         each getMembers
         each getMembers

+ 33 - 2
client/components/cards/minicard.js

@@ -18,7 +18,13 @@ BlazeComponent.extendComponent({
       },
       },
       {
       {
         'click .js-toggle-minicard-label-text'() {
         'click .js-toggle-minicard-label-text'() {
-          Meteor.call('toggleMinicardLabelText');
+          import { Cookies } from 'meteor/ostrio:cookies';
+          const cookies = new Cookies();
+          if (cookies.has('hiddenMinicardLabelText')) {
+            cookies.remove('hiddenMinicardLabelText'); //true
+          } else {
+            cookies.set('hiddenMinicardLabelText', 'true'); //true
+          }
         },
         },
       },
       },
     ];
     ];
@@ -26,7 +32,32 @@ BlazeComponent.extendComponent({
 }).register('minicard');
 }).register('minicard');
 
 
 Template.minicard.helpers({
 Template.minicard.helpers({
+  showDesktopDragHandles() {
+    currentUser = Meteor.user();
+    if (currentUser) {
+      return (currentUser.profile || {}).showDesktopDragHandles;
+    } else {
+      import { Cookies } from 'meteor/ostrio:cookies';
+      const cookies = new Cookies();
+      if (cookies.has('showDesktopDragHandles')) {
+        return true;
+      } else {
+        return false;
+      }
+    }
+  },
   hiddenMinicardLabelText() {
   hiddenMinicardLabelText() {
-    return Meteor.user().hasHiddenMinicardLabelText();
+    currentUser = Meteor.user();
+    if (currentUser) {
+      return (currentUser.profile || {}).hiddenMinicardLabelText;
+    } else {
+      import { Cookies } from 'meteor/ostrio:cookies';
+      const cookies = new Cookies();
+      if (cookies.has('hiddenMinicardLabelText')) {
+        return true;
+      } else {
+        return false;
+      }
+    }
   },
   },
 });
 });

+ 12 - 4
client/components/cards/minicard.styl

@@ -105,7 +105,7 @@
     right: 5px;
     right: 5px;
     top: 5px;
     top: 5px;
     display:none;
     display:none;
-    @media only screen and (max-width: 1199px) {
+    @media only screen {
       display:block;
       display:block;
     }
     }
     .fa-arrows
     .fa-arrows
@@ -160,9 +160,10 @@
         padding-left: 0px
         padding-left: 0px
         line-height: 12px
         line-height: 12px
 
 
-  .minicard-members
+  .minicard-members,
+  .minicard-assignees
     float: right
     float: right
-    margin: 2px -8px -2px 0
+    margin: 2px -8px 12px 0
 
 
     .member
     .member
       float: right
       float: right
@@ -170,10 +171,17 @@
       height: 28px
       height: 28px
       width: @height
       width: @height
 
 
+    .assignee
+      float: right
+      border-radius: 50%
+      height: 28px
+      width: @height
+
     + .badges
     + .badges
       margin-top: 10px
       margin-top: 10px
 
 
-  .minicard-members:empty
+  .minicard-members:empty,
+  .minicard-assignees:empty
     display: none
     display: none
 
 
   &.minicard-composer
   &.minicard-composer

+ 50 - 16
client/components/lists/list.js

@@ -22,21 +22,15 @@ BlazeComponent.extendComponent({
 
 
     function userIsMember() {
     function userIsMember() {
       return (
       return (
-        Meteor.user() &&
-        Meteor.user().isBoardMember() &&
-        !Meteor.user().isCommentOnly()
+        Meteor.user()
+        && Meteor.user().isBoardMember()
+        && !Meteor.user().isCommentOnly()
       );
       );
     }
     }
 
 
     const itemsSelector = '.js-minicard:not(.placeholder, .js-card-composer)';
     const itemsSelector = '.js-minicard:not(.placeholder, .js-card-composer)';
     const $cards = this.$('.js-minicards');
     const $cards = this.$('.js-minicards');
 
 
-    if (window.matchMedia('(max-width: 1199px)').matches) {
-      $('.js-minicards').sortable({
-        handle: '.handle',
-      });
-    }
-
     $cards.sortable({
     $cards.sortable({
       connectWith: '.js-minicards:not(.js-list-full)',
       connectWith: '.js-minicards:not(.js-list-full)',
       tolerance: 'pointer',
       tolerance: 'pointer',
@@ -79,16 +73,15 @@ BlazeComponent.extendComponent({
         const listId = Blaze.getData(ui.item.parents('.list').get(0))._id;
         const listId = Blaze.getData(ui.item.parents('.list').get(0))._id;
         const currentBoard = Boards.findOne(Session.get('currentBoard'));
         const currentBoard = Boards.findOne(Session.get('currentBoard'));
         let swimlaneId = '';
         let swimlaneId = '';
-        const boardView = (Meteor.user().profile || {}).boardView;
         if (
         if (
-          boardView === 'board-view-swimlanes' ||
-          currentBoard.isTemplatesBoard()
+          Utils.boardView() === 'board-view-swimlanes'
+          || currentBoard.isTemplatesBoard()
         )
         )
           swimlaneId = Blaze.getData(ui.item.parents('.swimlane').get(0))._id;
           swimlaneId = Blaze.getData(ui.item.parents('.swimlane').get(0))._id;
         else if (
         else if (
-          boardView === 'board-view-lists' ||
-          boardView === 'board-view-cal' ||
-          !boardView
+          Utils.boardView() === 'board-view-lists'
+          || Utils.boardView() === 'board-view-cal'
+          || !Utils.boardView
         )
         )
           swimlaneId = currentBoard.getDefaultSwimline()._id;
           swimlaneId = currentBoard.getDefaultSwimline()._id;
 
 
@@ -122,8 +115,32 @@ BlazeComponent.extendComponent({
     // ugly touch event hotfix
     // ugly touch event hotfix
     enableClickOnTouch(itemsSelector);
     enableClickOnTouch(itemsSelector);
 
 
-    // Disable drag-dropping if the current user is not a board member or is comment only
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+
     this.autorun(() => {
     this.autorun(() => {
+      let showDesktopDragHandles = false;
+      currentUser = Meteor.user();
+      if (currentUser) {
+        showDesktopDragHandles = (currentUser.profile || {})
+          .showDesktopDragHandles;
+      } else if (cookies.has('showDesktopDragHandles')) {
+        showDesktopDragHandles = true;
+      } else {
+        showDesktopDragHandles = false;
+      }
+
+      if (!Utils.isMiniScreen() && showDesktopDragHandles) {
+        $cards.sortable({
+          handle: '.handle',
+        });
+      } else {
+        $cards.sortable({
+          handle: '.minicard',
+        });
+      }
+
+      // Disable drag-dropping if the current user is not a board member or is comment only
       $cards.sortable('option', 'disabled', !userIsMember());
       $cards.sortable('option', 'disabled', !userIsMember());
     });
     });
 
 
@@ -155,6 +172,23 @@ BlazeComponent.extendComponent({
   },
   },
 }).register('list');
 }).register('list');
 
 
+Template.list.helpers({
+  showDesktopDragHandles() {
+    currentUser = Meteor.user();
+    if (currentUser) {
+      return (currentUser.profile || {}).showDesktopDragHandles;
+    } else {
+      import { Cookies } from 'meteor/ostrio:cookies';
+      const cookies = new Cookies();
+      if (cookies.has('showDesktopDragHandles')) {
+        return true;
+      } else {
+        return false;
+      }
+    }
+  },
+});
+
 Template.miniList.events({
 Template.miniList.events({
   'click .js-select-list'() {
   'click .js-select-list'() {
     const listId = this._id;
     const listId = this._id;

+ 21 - 5
client/components/lists/list.styl

@@ -84,17 +84,16 @@
     padding-left: 10px
     padding-left: 10px
     color: #a6a6a6
     color: #a6a6a6
 
 
-
   .list-header-menu
   .list-header-menu
     position: absolute
     position: absolute
     padding: 27px 19px
     padding: 27px 19px
     margin-top: 1px
     margin-top: 1px
     top: -7px
     top: -7px
-    right: -7px
+    right: 3px
 
 
   .list-header-plus-icon
   .list-header-plus-icon
     color: #a6a6a6
     color: #a6a6a6
-    margin-right: 10px
+    margin-right: 15px
 
 
   .highlight
   .highlight
     color: #ce1414
     color: #ce1414
@@ -165,7 +164,16 @@
 
 
 @media screen and (max-width: 800px)
 @media screen and (max-width: 800px)
   .list-header-menu
   .list-header-menu
-    margin-right: 30px
+    position: absolute
+    padding: 27px 19px
+    margin-top: 1px
+    top: -7px
+    margin-right: 7px
+    right: -3px
+
+  .list-header
+    .list-header-name
+      margin-left: 1.4rem
 
 
   .mini-list
   .mini-list
     flex: 0 0 60px
     flex: 0 0 60px
@@ -221,9 +229,17 @@
       padding: 7px
       padding: 7px
       top: 50%
       top: 50%
       transform: translateY(-50%)
       transform: translateY(-50%)
-      right: 17px
+      right: 47px
       font-size: 20px
       font-size: 20px
 
 
+    .list-header-handle
+      position: absolute
+      padding: 7px
+      top: 50%
+      transform: translateY(-50%)
+      right: 10px
+      font-size: 24px
+
 .link-board-wrapper
 .link-board-wrapper
   display: flex
   display: flex
   align-items: baseline
   align-items: baseline

+ 27 - 19
client/components/lists/listBody.js

@@ -48,7 +48,6 @@ BlazeComponent.extendComponent({
     const board = this.data().board();
     const board = this.data().board();
     let linkedId = '';
     let linkedId = '';
     let swimlaneId = '';
     let swimlaneId = '';
-    const boardView = (Meteor.user().profile || {}).boardView;
     let cardType = 'cardType-card';
     let cardType = 'cardType-card';
     if (title) {
     if (title) {
       if (board.isTemplatesBoard()) {
       if (board.isTemplatesBoard()) {
@@ -71,14 +70,14 @@ BlazeComponent.extendComponent({
           });
           });
           cardType = 'cardType-linkedBoard';
           cardType = 'cardType-linkedBoard';
         }
         }
-      } else if (boardView === 'board-view-swimlanes')
+      } else if (Utils.boardView() === 'board-view-swimlanes')
         swimlaneId = this.parentComponent()
         swimlaneId = this.parentComponent()
           .parentComponent()
           .parentComponent()
           .data()._id;
           .data()._id;
       else if (
       else if (
-        boardView === 'board-view-lists' ||
-        boardView === 'board-view-cal' ||
-        !boardView
+        Utils.boardView() === 'board-view-lists' ||
+        Utils.boardView() === 'board-view-cal' ||
+        !Utils.boardView
       )
       )
         swimlaneId = board.getDefaultSwimline()._id;
         swimlaneId = board.getDefaultSwimline()._id;
 
 
@@ -157,9 +156,8 @@ BlazeComponent.extendComponent({
   },
   },
 
 
   idOrNull(swimlaneId) {
   idOrNull(swimlaneId) {
-    const currentUser = Meteor.user();
     if (
     if (
-      (currentUser.profile || {}).boardView === 'board-view-swimlanes' ||
+      Utils.boardView() === 'board-view-swimlanes' ||
       this.data()
       this.data()
         .board()
         .board()
         .isTemplatesBoard()
         .isTemplatesBoard()
@@ -397,10 +395,9 @@ BlazeComponent.extendComponent({
       '.js-swimlane',
       '.js-swimlane',
     );
     );
     this.swimlaneId = '';
     this.swimlaneId = '';
-    const boardView = (Meteor.user().profile || {}).boardView;
-    if (boardView === 'board-view-swimlanes')
+    if (Utils.boardView() === 'board-view-swimlanes')
       this.swimlaneId = Blaze.getData(swimlane[0])._id;
       this.swimlaneId = Blaze.getData(swimlane[0])._id;
-    else if (boardView === 'board-view-lists' || !boardView)
+    else if (Utils.boardView() === 'board-view-lists' || !Utils.boardView)
       this.swimlaneId = Swimlanes.findOne({ boardId: this.boardId })._id;
       this.swimlaneId = Swimlanes.findOne({ boardId: this.boardId })._id;
   },
   },
 
 
@@ -580,7 +577,7 @@ BlazeComponent.extendComponent({
       const swimlane = $(Popup._getTopStack().openerElement).parents(
       const swimlane = $(Popup._getTopStack().openerElement).parents(
         '.js-swimlane',
         '.js-swimlane',
       );
       );
-      if ((Meteor.user().profile || {}).boardView === 'board-view-swimlanes')
+      if (Utils.boardView() === 'board-view-swimlanes')
         this.swimlaneId = Blaze.getData(swimlane[0])._id;
         this.swimlaneId = Blaze.getData(swimlane[0])._id;
       else this.swimlaneId = Swimlanes.findOne({ boardId: this.boardId })._id;
       else this.swimlaneId = Swimlanes.findOne({ boardId: this.boardId })._id;
       // List where to insert card
       // List where to insert card
@@ -701,15 +698,26 @@ BlazeComponent.extendComponent({
     this.listId = this.parentComponent().data()._id;
     this.listId = this.parentComponent().data()._id;
     this.swimlaneId = '';
     this.swimlaneId = '';
 
 
-    let user = Meteor.user();
-    if (user) {
-      const boardView = (Meteor.user().profile || {}).boardView;
-      if (boardView === 'board-view-swimlanes') {
-        this.swimlaneId = this.parentComponent()
-          .parentComponent()
-          .parentComponent()
-          .data()._id;
+    const isSandstorm =
+      Meteor.settings &&
+      Meteor.settings.public &&
+      Meteor.settings.public.sandstorm;
+
+    if (isSandstorm) {
+      const user = Meteor.user();
+      if (user) {
+        if (Utils.boardView() === 'board-view-swimlanes') {
+          this.swimlaneId = this.parentComponent()
+            .parentComponent()
+            .parentComponent()
+            .data()._id;
+        }
       }
       }
+    } else if (Utils.boardView() === 'board-view-swimlanes') {
+      this.swimlaneId = this.parentComponent()
+        .parentComponent()
+        .parentComponent()
+        .data()._id;
     }
     }
   },
   },
 
 

+ 7 - 0
client/components/lists/listHeader.jade

@@ -9,6 +9,7 @@ template(name="listHeader")
         if currentList
         if currentList
           a.list-header-left-icon.fa.fa-angle-left.js-unselect-list
           a.list-header-left-icon.fa.fa-angle-left.js-unselect-list
       h2.list-header-name(
       h2.list-header-name(
+        title="{{ moment modifiedAt 'LLL' }}"
         class="{{#if currentUser.isBoardMember}}{{#unless currentUser.isCommentOnly}}js-open-inlined-form is-editable{{/unless}}{{/if}}")
         class="{{#if currentUser.isBoardMember}}{{#unless currentUser.isCommentOnly}}js-open-inlined-form is-editable{{/unless}}{{/if}}")
         +viewer
         +viewer
           = title
           = title
@@ -29,16 +30,22 @@ template(name="listHeader")
               if canSeeAddCard
               if canSeeAddCard
                 a.js-add-card.fa.fa-plus.list-header-plus-icon
                 a.js-add-card.fa.fa-plus.list-header-plus-icon
               a.fa.fa-navicon.js-open-list-menu
               a.fa.fa-navicon.js-open-list-menu
+          a.list-header-handle.handle.fa.fa-arrows.js-list-handle
         else
         else
           a.list-header-menu-icon.fa.fa-angle-right.js-select-list
           a.list-header-menu-icon.fa.fa-angle-right.js-select-list
+          a.list-header-handle.handle.fa.fa-arrows.js-list-handle
       else if currentUser.isBoardMember
       else if currentUser.isBoardMember
         if isWatching
         if isWatching
           i.list-header-watch-icon.fa.fa-eye
           i.list-header-watch-icon.fa.fa-eye
         div.list-header-menu
         div.list-header-menu
           unless currentUser.isCommentOnly
           unless currentUser.isCommentOnly
+            //if isBoardAdmin
+            //  a.fa.js-list-star.list-header-plus-icon(class="fa-star{{#unless starred}}-o{{/unless}}")
             if canSeeAddCard
             if canSeeAddCard
               a.js-add-card.fa.fa-plus.list-header-plus-icon
               a.js-add-card.fa.fa-plus.list-header-plus-icon
             a.fa.fa-navicon.js-open-list-menu
             a.fa.fa-navicon.js-open-list-menu
+          if showDesktopDragHandles
+            a.list-header-handle.handle.fa.fa-arrows.js-list-handle
 
 
 template(name="editListTitleForm")
 template(name="editListTitleForm")
   .list-composer
   .list-composer

+ 51 - 12
client/components/lists/listHeader.js

@@ -7,12 +7,26 @@ BlazeComponent.extendComponent({
   canSeeAddCard() {
   canSeeAddCard() {
     const list = Template.currentData();
     const list = Template.currentData();
     return (
     return (
-      !list.getWipLimit('enabled') ||
-      list.getWipLimit('soft') ||
-      !this.reachedWipLimit()
+      !list.getWipLimit('enabled')
+      || list.getWipLimit('soft')
+      || !this.reachedWipLimit()
     );
     );
   },
   },
 
 
+  isBoardAdmin() {
+    return Meteor.user().isBoardAdmin();
+  },
+  starred(check = undefined) {
+    const list = Template.currentData();
+    const status = list.isStarred();
+    if (check === undefined) {
+      // just check
+      return status;
+    } else {
+      list.star(!status);
+      return !status;
+    }
+  },
   editTitle(event) {
   editTitle(event) {
     event.preventDefault();
     event.preventDefault();
     const newTitle = this.childComponents('inlinedForm')[0]
     const newTitle = this.childComponents('inlinedForm')[0]
@@ -30,14 +44,18 @@ BlazeComponent.extendComponent({
   },
   },
 
 
   limitToShowCardsCount() {
   limitToShowCardsCount() {
-    return Meteor.user().getLimitToShowCardsCount();
+    const currentUser = Meteor.user();
+    if (currentUser) {
+      return Meteor.user().getLimitToShowCardsCount();
+    } else {
+      return false;
+    }
   },
   },
 
 
   cardsCount() {
   cardsCount() {
     const list = Template.currentData();
     const list = Template.currentData();
     let swimlaneId = '';
     let swimlaneId = '';
-    const boardView = (Meteor.user().profile || {}).boardView;
-    if (boardView === 'board-view-swimlanes')
+    if (Utils.boardView() === 'board-view-swimlanes')
       swimlaneId = this.parentComponent()
       swimlaneId = this.parentComponent()
         .parentComponent()
         .parentComponent()
         .data()._id;
         .data()._id;
@@ -48,8 +66,8 @@ BlazeComponent.extendComponent({
   reachedWipLimit() {
   reachedWipLimit() {
     const list = Template.currentData();
     const list = Template.currentData();
     return (
     return (
-      list.getWipLimit('enabled') &&
-      list.getWipLimit('value') <= list.cards().count()
+      list.getWipLimit('enabled')
+      && list.getWipLimit('value') <= list.cards().count()
     );
     );
   },
   },
 
 
@@ -61,6 +79,10 @@ BlazeComponent.extendComponent({
   events() {
   events() {
     return [
     return [
       {
       {
+        'click .js-list-star'(event) {
+          event.preventDefault();
+          this.starred(!this.starred());
+        },
         'click .js-open-list-menu': Popup.open('listAction'),
         'click .js-open-list-menu': Popup.open('listAction'),
         'click .js-add-card'(event) {
         'click .js-add-card'(event) {
           const listDom = $(event.target).parents(
           const listDom = $(event.target).parents(
@@ -80,6 +102,23 @@ BlazeComponent.extendComponent({
   },
   },
 }).register('listHeader');
 }).register('listHeader');
 
 
+Template.listHeader.helpers({
+  showDesktopDragHandles() {
+    currentUser = Meteor.user();
+    if (currentUser) {
+      return (currentUser.profile || {}).showDesktopDragHandles;
+    } else {
+      import { Cookies } from 'meteor/ostrio:cookies';
+      const cookies = new Cookies();
+      if (cookies.has('showDesktopDragHandles')) {
+        return true;
+      } else {
+        return false;
+      }
+    }
+  },
+});
+
 Template.listActionPopup.helpers({
 Template.listActionPopup.helpers({
   isWipLimitEnabled() {
   isWipLimitEnabled() {
     return Template.currentData().getWipLimit('enabled');
     return Template.currentData().getWipLimit('enabled');
@@ -138,8 +177,8 @@ BlazeComponent.extendComponent({
     const list = Template.currentData();
     const list = Template.currentData();
 
 
     if (
     if (
-      list.getWipLimit('soft') &&
-      list.getWipLimit('value') < list.cards().count()
+      list.getWipLimit('soft')
+      && list.getWipLimit('value') < list.cards().count()
     ) {
     ) {
       list.setWipLimit(list.cards().count());
       list.setWipLimit(list.cards().count());
     }
     }
@@ -150,8 +189,8 @@ BlazeComponent.extendComponent({
     const list = Template.currentData();
     const list = Template.currentData();
     // Prevent user from using previously stored wipLimit.value if it is less than the current number of cards in the list
     // Prevent user from using previously stored wipLimit.value if it is less than the current number of cards in the list
     if (
     if (
-      !list.getWipLimit('enabled') &&
-      list.getWipLimit('value') < list.cards().count()
+      !list.getWipLimit('enabled')
+      && list.getWipLimit('value') < list.cards().count()
     ) {
     ) {
       list.setWipLimit(list.cards().count());
       list.setWipLimit(list.cards().count());
     }
     }

+ 39 - 11
client/components/main/editor.js

@@ -94,7 +94,13 @@ Template.editor.onRendered(() => {
           currentBoard
           currentBoard
             .activeMembers()
             .activeMembers()
             .map(member => {
             .map(member => {
-              const username = Users.findOne(member.userId).username;
+              const user = Users.findOne(member.userId);
+              if (user._id === Meteor.userId()) {
+                return null;
+              }
+              const value = user.username;
+              const username =
+                value && value.match(/\s+/) ? `"${value}"` : value;
               return username.includes(term) ? username : null;
               return username.includes(term) ? username : null;
             })
             })
             .filter(Boolean),
             .filter(Boolean),
@@ -120,9 +126,10 @@ Template.editor.onRendered(() => {
       ? [
       ? [
           ['view', ['fullscreen']],
           ['view', ['fullscreen']],
           ['table', ['table']],
           ['table', ['table']],
-          ['font', ['bold', 'underline']],
-          //['fontsize', ['fontsize']],
+          ['font', ['bold']],
           ['color', ['color']],
           ['color', ['color']],
+          ['insert', ['video']], // iframe tag will be sanitized TODO if iframe[class=note-video-clip] can be added into safe list, insert video can be enabled
+          //['fontsize', ['fontsize']],
         ]
         ]
       : [
       : [
           ['style', ['style']],
           ['style', ['style']],
@@ -156,25 +163,45 @@ Template.editor.onRendered(() => {
         }
         }
         return undefined;
         return undefined;
       };
       };
+      let popupShown = false;
       inputs.each(function(idx, input) {
       inputs.each(function(idx, input) {
         mSummernotes[idx] = $(input).summernote({
         mSummernotes[idx] = $(input).summernote({
           placeholder,
           placeholder,
           callbacks: {
           callbacks: {
+            onKeydown(e) {
+              if (popupShown) {
+                e.preventDefault();
+              }
+            },
+            onKeyup(e) {
+              if (popupShown) {
+                e.preventDefault();
+              }
+            },
             onInit(object) {
             onInit(object) {
               const originalInput = this;
               const originalInput = this;
+              const setAutocomplete = function(jEditor) {
+                if (jEditor !== undefined) {
+                  jEditor.escapeableTextComplete(mentions).on({
+                    'textComplete:show'() {
+                      popupShown = true;
+                    },
+                    'textComplete:hide'() {
+                      popupShown = false;
+                    },
+                  });
+                }
+              };
               $(originalInput).on('submitted', function() {
               $(originalInput).on('submitted', function() {
                 // resetCommentInput has been called
                 // resetCommentInput has been called
                 if (!this.value) {
                 if (!this.value) {
                   const sn = getSummernote(this);
                   const sn = getSummernote(this);
-                  sn && sn.summernote('reset');
-                  object && object.editingArea.find('.note-placeholder').show();
+                  sn && sn.summernote('code', '');
                 }
                 }
               });
               });
               const jEditor = object && object.editable;
               const jEditor = object && object.editable;
               const toolbar = object && object.toolbar;
               const toolbar = object && object.toolbar;
-              if (jEditor !== undefined) {
-                jEditor.escapeableTextComplete(mentions);
-              }
+              setAutocomplete(jEditor);
               if (toolbar !== undefined) {
               if (toolbar !== undefined) {
                 const fBtn = toolbar.find('.btn-fullscreen');
                 const fBtn = toolbar.find('.btn-fullscreen');
                 fBtn.on('click', function() {
                 fBtn.on('click', function() {
@@ -264,7 +291,7 @@ Template.editor.onRendered(() => {
                 const someNote = getSummernote(object);
                 const someNote = getSummernote(object);
                 const original = someNote.summernote('code');
                 const original = someNote.summernote('code');
                 const cleaned = cleanPastedHTML(original); //this is where to call whatever clean function you want. I have mine in a different file, called CleanPastedHTML.
                 const cleaned = cleanPastedHTML(original); //this is where to call whatever clean function you want. I have mine in a different file, called CleanPastedHTML.
-                someNote.summernote('reset'); //clear original
+                someNote.summernote('code', ''); //clear original
                 someNote.summernote('pasteHTML', cleaned); //this sets the displayed content editor to the cleaned pasted code.
                 someNote.summernote('pasteHTML', cleaned); //this sets the displayed content editor to the cleaned pasted code.
               };
               };
               setTimeout(function() {
               setTimeout(function() {
@@ -325,11 +352,12 @@ Blaze.Template.registerHelper(
       }
       }
       return member;
       return member;
     });
     });
-    const mentionRegex = /\B@([\w.]*)/gi;
+    const mentionRegex = /\B@(?:(?:"([\w.\s]*)")|([\w.]+))/gi; // including space in username
 
 
     let currentMention;
     let currentMention;
     while ((currentMention = mentionRegex.exec(content)) !== null) {
     while ((currentMention = mentionRegex.exec(content)) !== null) {
-      const [fullMention, username] = currentMention;
+      const [fullMention, quoteduser, simple] = currentMention;
+      const username = quoteduser || simple;
       const knowedUser = _.findWhere(knowedUsers, { username });
       const knowedUser = _.findWhere(knowedUsers, { username });
       if (!knowedUser) {
       if (!knowedUser) {
         continue;
         continue;

+ 4 - 0
client/components/main/layouts.styl

@@ -381,6 +381,10 @@ a
   display: block
   display: block
   word-wrap: break-word
   word-wrap: break-word
 
 
+  table
+    word-wrap: normal
+    word-break: normal
+
   ol
   ol
     list-style-type: decimal
     list-style-type: decimal
     padding-left: 20px
     padding-left: 20px

+ 4 - 2
client/components/main/popup.styl

@@ -130,7 +130,8 @@ $popupWidth = 300px
     .popup-container-depth-{depth}
     .popup-container-depth-{depth}
       transform: translateX(- depth * $popupWidth)
       transform: translateX(- depth * $popupWidth)
 
 
-.select-members-list
+.select-members-list,
+.select-avatars-list
   margin-bottom: 8px
   margin-bottom: 8px
 
 
 .pop-over-list
 .pop-over-list
@@ -230,7 +231,8 @@ $popupWidth = 300px
     min-height: 56px
     min-height: 56px
     position: relative
     position: relative
 
 
-    .member
+    .member,
+    .avatar
       position: absolute
       position: absolute
       top: 2px
       top: 2px
       left: 2px
       left: 2px

+ 2 - 2
client/components/settings/peopleBody.js

@@ -17,7 +17,7 @@ BlazeComponent.extendComponent({
     this.autorun(() => {
     this.autorun(() => {
       const limit = this.page.get() * usersPerPage;
       const limit = this.page.get() * usersPerPage;
 
 
-      this.subscribe('people', limit, () => {
+      this.subscribe('people', this.findUsersOptions.get(), limit, () => {
         this.loadNextPageLocked = false;
         this.loadNextPageLocked = false;
         const nextPeakBefore = this.callFirstWith(null, 'getNextPeak');
         const nextPeakBefore = this.callFirstWith(null, 'getNextPeak');
         this.calculateNextPeak();
         this.calculateNextPeak();
@@ -85,7 +85,7 @@ BlazeComponent.extendComponent({
     const users = Users.find(this.findUsersOptions.get(), {
     const users = Users.find(this.findUsersOptions.get(), {
       fields: { _id: true },
       fields: { _id: true },
     });
     });
-    this.number.set(users.count());
+    this.number.set(users.count(false));
     return users;
     return users;
   },
   },
   peopleNumber() {
   peopleNumber() {

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

@@ -18,6 +18,8 @@ template(name="setting")
               a.js-setting-menu(data-id="announcement-setting") {{_ 'admin-announcement'}}
               a.js-setting-menu(data-id="announcement-setting") {{_ 'admin-announcement'}}
             li
             li
               a.js-setting-menu(data-id="layout-setting") {{_ 'layout'}}
               a.js-setting-menu(data-id="layout-setting") {{_ 'layout'}}
+            li
+              a.js-setting-menu(data-id="webhook-setting") {{_ 'global-webhook'}}
         .main-body
         .main-body
           if loading.get
           if loading.get
             +spinner
             +spinner
@@ -31,6 +33,12 @@ template(name="setting")
             +announcementSettings
             +announcementSettings
           else if layoutSetting.get
           else if layoutSetting.get
             +layoutSettings
             +layoutSettings
+          else if webhookSetting.get
+            +webhookSettings
+
+template(name="webhookSettings")
+  span
+     +outgoingWebhooksPopup
 
 
 template(name="general")
 template(name="general")
   ul#registration-setting.setting-detail
   ul#registration-setting.setting-detail

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

@@ -7,11 +7,13 @@ BlazeComponent.extendComponent({
     this.accountSetting = new ReactiveVar(false);
     this.accountSetting = new ReactiveVar(false);
     this.announcementSetting = new ReactiveVar(false);
     this.announcementSetting = new ReactiveVar(false);
     this.layoutSetting = new ReactiveVar(false);
     this.layoutSetting = new ReactiveVar(false);
+    this.webhookSetting = new ReactiveVar(false);
 
 
     Meteor.subscribe('setting');
     Meteor.subscribe('setting');
     Meteor.subscribe('mailServer');
     Meteor.subscribe('mailServer');
     Meteor.subscribe('accountSettings');
     Meteor.subscribe('accountSettings');
     Meteor.subscribe('announcements');
     Meteor.subscribe('announcements');
+    Meteor.subscribe('globalwebhooks');
   },
   },
 
 
   setError(error) {
   setError(error) {
@@ -83,6 +85,7 @@ BlazeComponent.extendComponent({
       this.accountSetting.set('account-setting' === targetID);
       this.accountSetting.set('account-setting' === targetID);
       this.announcementSetting.set('announcement-setting' === targetID);
       this.announcementSetting.set('announcement-setting' === targetID);
       this.layoutSetting.set('layout-setting' === targetID);
       this.layoutSetting.set('layout-setting' === targetID);
+      this.webhookSetting.set('webhook-setting' === targetID);
     }
     }
   },
   },
 
 

+ 22 - 14
client/components/sidebar/sidebar.jade

@@ -135,22 +135,30 @@ template(name="archiveBoardPopup")
 template(name="outgoingWebhooksPopup")
 template(name="outgoingWebhooksPopup")
   each integrations
   each integrations
     form.integration-form
     form.integration-form
-      if title
-        h4 {{title}}
-      else
-        h4 {{_ 'no-name'}}
-      label
-        | URL
-        input.js-outgoing-webhooks-url(type="text" name="url" value=url)
-        input(type="hidden" value=_id name="id")
+      a.flex
+        span {{_ 'disable-webhook'}}
+        b &nbsp;
+        .materialCheckBox(class="{{#unless enabled}}is-checked{{/unless}}")
+      input.js-outgoing-webhooks-title(placeholder="{{_ 'webhook-title'}}" type="text" name="title" value=title)
+      input.js-outgoing-webhooks-url(type="text" name="url" value=url autofocus)
+      input.js-outgoing-webhooks-token(placeholder="{{_ 'webhook-token' }}" type="text" value=token name="token")
+      select.js-outgoing-webhooks-type(name="type")
+          each _type in types
+              if($eq _type this.type)
+                  option(value=_type selected="selected") {{_ _type}}
+              else
+                  option(value=_type) {{_ _type}}
+      input(type="hidden" value=this.type name="_type")
+      input(type="hidden" value=_id name="id")
       input.primary.wide(type="submit" value="{{_ 'save'}}")
       input.primary.wide(type="submit" value="{{_ 'save'}}")
   form.integration-form
   form.integration-form
-    h4
-      | {{_ 'new-outgoing-webhook'}}
-    label
-      | URL
-      input.js-outgoing-webhooks-url(type="text" name="url" autofocus)
-    input.primary.wide(type="submit" value="{{_ 'save'}}")
+    input.js-outgoing-webhooks-title(placeholder="{{_ 'webhook-title'}}" type="text" name="title" autofocus)
+    input.js-outgoing-webhooks-url(placeholder="{{_ 'URL' }}" type="text" name="url")
+    input.js-outgoing-webhooks-token(placeholder="{{_ 'webhook-token' }}" type="text" name="token")
+    select.js-outgoing-webhooks-type(name="type")
+        each _type in types
+            option(value=_type) {{_ _type}}
+    input.primary.wide(type="submit" value="{{_ 'create'}}")
 
 
 template(name="boardMenuPopup")
 template(name="boardMenuPopup")
   ul.pop-over-list
   ul.pop-over-list

+ 80 - 32
client/components/sidebar/sidebar.js

@@ -1,6 +1,8 @@
 Sidebar = null;
 Sidebar = null;
 
 
 const defaultView = 'home';
 const defaultView = 'home';
+const MCB = '.materialCheckBox';
+const CKCLS = 'is-checked';
 
 
 const viewTitles = {
 const viewTitles = {
   filter: 'filter-cards',
   filter: 'filter-cards',
@@ -105,7 +107,18 @@ BlazeComponent.extendComponent({
         'click .js-toggle-sidebar': this.toggle,
         'click .js-toggle-sidebar': this.toggle,
         'click .js-back-home': this.setView,
         'click .js-back-home': this.setView,
         'click .js-toggle-minicard-label-text'() {
         'click .js-toggle-minicard-label-text'() {
-          Meteor.call('toggleMinicardLabelText');
+          currentUser = Meteor.user();
+          if (currentUser) {
+            Meteor.call('toggleMinicardLabelText');
+          } else {
+            import { Cookies } from 'meteor/ostrio:cookies';
+            const cookies = new Cookies();
+            if (cookies.has('hiddenMinicardLabelText')) {
+              cookies.remove('hiddenMinicardLabelText');
+            } else {
+              cookies.set('hiddenMinicardLabelText', 'true');
+            }
+          }
         },
         },
         'click .js-shortcuts'() {
         'click .js-shortcuts'() {
           FlowRouter.go('shortcuts');
           FlowRouter.go('shortcuts');
@@ -119,7 +132,18 @@ Blaze.registerHelper('Sidebar', () => Sidebar);
 
 
 Template.homeSidebar.helpers({
 Template.homeSidebar.helpers({
   hiddenMinicardLabelText() {
   hiddenMinicardLabelText() {
-    return Meteor.user().hasHiddenMinicardLabelText();
+    currentUser = Meteor.user();
+    if (currentUser) {
+      return (currentUser.profile || {}).hiddenMinicardLabelText;
+    } else {
+      import { Cookies } from 'meteor/ostrio:cookies';
+      const cookies = new Cookies();
+      if (cookies.has('hiddenMinicardLabelText')) {
+        return true;
+      } else {
+        return false;
+      }
+    }
   },
   },
 });
 });
 
 
@@ -280,44 +304,71 @@ Template.membersWidget.events({
 });
 });
 
 
 BlazeComponent.extendComponent({
 BlazeComponent.extendComponent({
+  boardId() {
+    return Session.get('currentBoard') || Integrations.Const.GLOBAL_WEBHOOK_ID;
+  },
   integrations() {
   integrations() {
-    const boardId = Session.get('currentBoard');
+    const boardId = this.boardId();
     return Integrations.find({ boardId: `${boardId}` }).fetch();
     return Integrations.find({ boardId: `${boardId}` }).fetch();
   },
   },
-
-  integration(id) {
-    const boardId = Session.get('currentBoard');
-    return Integrations.findOne({ _id: id, boardId: `${boardId}` });
+  types() {
+    return Integrations.Const.WEBHOOK_TYPES;
+  },
+  integration(cond) {
+    const boardId = this.boardId();
+    const condition = { boardId, ...cond };
+    for (const k in condition) {
+      if (!condition[k]) delete condition[k];
+    }
+    return Integrations.findOne(condition);
+  },
+  onCreated() {
+    this.disabled = new ReactiveVar(false);
   },
   },
-
   events() {
   events() {
     return [
     return [
       {
       {
+        'click a.flex'(evt) {
+          this.disabled.set(!this.disabled.get());
+          $(evt.target).toggleClass(CKCLS, this.disabled.get());
+        },
         submit(evt) {
         submit(evt) {
           evt.preventDefault();
           evt.preventDefault();
           const url = evt.target.url.value;
           const url = evt.target.url.value;
-          const boardId = Session.get('currentBoard');
+          const boardId = this.boardId();
           let id = null;
           let id = null;
           let integration = null;
           let integration = null;
+          const title = evt.target.title.value;
+          const token = evt.target.token.value;
+          const type = evt.target.type.value;
+          const enabled = !this.disabled.get();
+          let remove = false;
+          const values = {
+            url,
+            type,
+            token,
+            title,
+            enabled,
+          };
           if (evt.target.id) {
           if (evt.target.id) {
             id = evt.target.id.value;
             id = evt.target.id.value;
-            integration = this.integration(id);
-            if (url) {
-              Integrations.update(integration._id, {
-                $set: {
-                  url: `${url}`,
-                },
-              });
-            } else {
-              Integrations.remove(integration._id);
-            }
+            integration = this.integration({ _id: id });
+            remove = !url;
+          } else if (url) {
+            integration = this.integration({ url, token });
+          }
+          if (remove) {
+            Integrations.remove(integration._id);
+          } else if (integration && integration._id) {
+            Integrations.update(integration._id, {
+              $set: values,
+            });
           } else if (url) {
           } else if (url) {
             Integrations.insert({
             Integrations.insert({
+              ...values,
               userId: Meteor.userId(),
               userId: Meteor.userId(),
               enabled: true,
               enabled: true,
-              type: 'outgoing-webhooks',
-              url: `${url}`,
-              boardId: `${boardId}`,
+              boardId,
               activities: ['all'],
               activities: ['all'],
             });
             });
           }
           }
@@ -474,12 +525,12 @@ BlazeComponent.extendComponent({
           evt.preventDefault();
           evt.preventDefault();
           this.currentBoard.allowsSubtasks = !this.currentBoard.allowsSubtasks;
           this.currentBoard.allowsSubtasks = !this.currentBoard.allowsSubtasks;
           this.currentBoard.setAllowsSubtasks(this.currentBoard.allowsSubtasks);
           this.currentBoard.setAllowsSubtasks(this.currentBoard.allowsSubtasks);
-          $('.js-field-has-subtasks .materialCheckBox').toggleClass(
-            'is-checked',
+          $(`.js-field-has-subtasks ${MCB}`).toggleClass(
+            CKCLS,
             this.currentBoard.allowsSubtasks,
             this.currentBoard.allowsSubtasks,
           );
           );
           $('.js-field-has-subtasks').toggleClass(
           $('.js-field-has-subtasks').toggleClass(
-            'is-checked',
+            CKCLS,
             this.currentBoard.allowsSubtasks,
             this.currentBoard.allowsSubtasks,
           );
           );
           $('.js-field-deposit-board').prop(
           $('.js-field-deposit-board').prop(
@@ -515,15 +566,12 @@ BlazeComponent.extendComponent({
           ];
           ];
           options.forEach(function(element) {
           options.forEach(function(element) {
             if (element !== value) {
             if (element !== value) {
-              $(`#${element} .materialCheckBox`).toggleClass(
-                'is-checked',
-                false,
-              );
-              $(`#${element}`).toggleClass('is-checked', false);
+              $(`#${element} ${MCB}`).toggleClass(CKCLS, false);
+              $(`#${element}`).toggleClass(CKCLS, false);
             }
             }
           });
           });
-          $(`#${value} .materialCheckBox`).toggleClass('is-checked', true);
-          $(`#${value}`).toggleClass('is-checked', true);
+          $(`#${value} ${MCB}`).toggleClass(CKCLS, true);
+          $(`#${value}`).toggleClass(CKCLS, true);
           this.currentBoard.setPresentParentTask(value);
           this.currentBoard.setPresentParentTask(value);
           evt.preventDefault();
           evt.preventDefault();
         },
         },

+ 4 - 0
client/components/sidebar/sidebarFilters.jade

@@ -4,6 +4,10 @@
   and #each x in y constructors to fix this.
   and #each x in y constructors to fix this.
 
 
 template(name="filterSidebar")
 template(name="filterSidebar")
+  ul.sidebar-list
+    span {{_ 'list-filter-label'}}
+    form.js-list-filter
+      input(type="text")
   ul.sidebar-list
   ul.sidebar-list
     li(class="{{#if Filter.labelIds.isSelected undefined}}active{{/if}}")
     li(class="{{#if Filter.labelIds.isSelected undefined}}active{{/if}}")
           a.name.js-toggle-label-filter
           a.name.js-toggle-label-filter

+ 4 - 0
client/components/sidebar/sidebarFilters.js

@@ -4,6 +4,10 @@ BlazeComponent.extendComponent({
   events() {
   events() {
     return [
     return [
       {
       {
+        'submit .js-list-filter'(evt) {
+          evt.preventDefault();
+          Filter.lists.set(this.find('.js-list-filter input').value.trim());
+        },
         'click .js-toggle-label-filter'(evt) {
         'click .js-toggle-label-filter'(evt) {
           evt.preventDefault();
           evt.preventDefault();
           Filter.labelIds.toggle(this.currentData()._id);
           Filter.labelIds.toggle(this.currentData()._id);

+ 4 - 0
client/components/sidebar/sidebarSearches.jade

@@ -2,6 +2,10 @@ template(name="searchSidebar")
   form.js-search-term-form
   form.js-search-term-form
     input(type="text" name="searchTerm" placeholder="{{_ 'search-example'}}" autofocus dir="auto")
     input(type="text" name="searchTerm" placeholder="{{_ 'search-example'}}" autofocus dir="auto")
   .list-body.js-perfect-scrollbar
   .list-body.js-perfect-scrollbar
+    .minilists.clearfix.js-minilists
+      each (lists)
+        a.minilist-wrapper.js-minilist(href=absoluteUrl)
+          +minilist(this)
     .minicards.clearfix.js-minicards
     .minicards.clearfix.js-minicards
       each (results)
       each (results)
         a.minicard-wrapper.js-minicard(href=absoluteUrl)
         a.minicard-wrapper.js-minicard(href=absoluteUrl)

+ 5 - 0
client/components/sidebar/sidebarSearches.js

@@ -8,6 +8,11 @@ BlazeComponent.extendComponent({
     return currentBoard.searchCards(this.term.get());
     return currentBoard.searchCards(this.term.get());
   },
   },
 
 
+  lists() {
+    const currentBoard = Boards.findOne(Session.get('currentBoard'));
+    return currentBoard.searchLists(this.term.get());
+  },
+
   events() {
   events() {
     return [
     return [
       {
       {

+ 5 - 0
client/components/swimlanes/swimlaneHeader.jade

@@ -16,6 +16,11 @@ template(name="swimlaneFixedHeader")
     unless currentUser.isCommentOnly
     unless currentUser.isCommentOnly
       a.fa.fa-plus.js-open-add-swimlane-menu.swimlane-header-plus-icon
       a.fa.fa-plus.js-open-add-swimlane-menu.swimlane-header-plus-icon
       a.fa.fa-navicon.js-open-swimlane-menu
       a.fa.fa-navicon.js-open-swimlane-menu
+      unless isMiniScreen
+        if showDesktopDragHandles
+          a.swimlane-header-handle.handle.fa.fa-arrows.js-swimlane-header-handle
+      if isMiniScreen
+        a.swimlane-header-miniscreen-handle.handle.fa.fa-arrows.js-swimlane-header-handle
 
 
 template(name="editSwimlaneTitleForm")
 template(name="editSwimlaneTitleForm")
   .list-composer
   .list-composer

+ 17 - 0
client/components/swimlanes/swimlaneHeader.js

@@ -28,6 +28,23 @@ BlazeComponent.extendComponent({
   },
   },
 }).register('swimlaneHeader');
 }).register('swimlaneHeader');
 
 
+Template.swimlaneHeader.helpers({
+  showDesktopDragHandles() {
+    currentUser = Meteor.user();
+    if (currentUser) {
+      return (currentUser.profile || {}).showDesktopDragHandles;
+    } else {
+      import { Cookies } from 'meteor/ostrio:cookies';
+      const cookies = new Cookies();
+      if (cookies.has('showDesktopDragHandles')) {
+        return true;
+      } else {
+        return false;
+      }
+    }
+  },
+});
+
 Template.swimlaneActionPopup.events({
 Template.swimlaneActionPopup.events({
   'click .js-set-swimlane-color': Popup.open('setSwimlaneColor'),
   'click .js-set-swimlane-color': Popup.open('setSwimlaneColor'),
   'click .js-close-swimlane'(event) {
   'click .js-close-swimlane'(event) {

+ 38 - 15
client/components/swimlanes/swimlanes.jade

@@ -1,24 +1,47 @@
 template(name="swimlane")
 template(name="swimlane")
   .swimlane
   .swimlane
     +swimlaneHeader
     +swimlaneHeader
-  .swimlane.js-lists.js-swimlane
-    if isMiniScreen
-      if currentListIsInThisSwimlane _id
-        +list(currentList)
-      unless currentList
+  unless collapseSwimlane
+    .swimlane.js-lists.js-swimlane
+      if isMiniScreen
+        if currentListIsInThisSwimlane _id
+          +list(currentList)
+        unless currentList
+          each lists
+            +miniList(this)
+          if currentUser.isBoardMember
+            unless currentUser.isCommentOnly
+              +addListForm
+      else
         each lists
         each lists
-          +miniList(this)
+          +list(this)
+          if currentCardIsInThisList _id ../_id
+            +cardDetails(currentCard)
         if currentUser.isBoardMember
         if currentUser.isBoardMember
           unless currentUser.isCommentOnly
           unless currentUser.isCommentOnly
             +addListForm
             +addListForm
-    else
-      each lists
-        +list(this)
-        if currentCardIsInThisList _id ../_id
-          +cardDetails(currentCard)
-      if currentUser.isBoardMember
-        unless currentUser.isCommentOnly
-          +addListForm
+  //if collapseSwimlane
+  //  // Minimize swimlanes next 2 lines below https://www.w3schools.com/howto/howto_js_accordion.asp
+  //  button(class="accordion")
+  //  div(class="panel")
+  //    .swimlane.js-lists.js-swimlane
+  //      if isMiniScreen
+  //        if currentListIsInThisSwimlane _id
+  //          +list(currentList)
+  //        unless currentList
+  //          each lists
+  //            +miniList(this)
+  //          if currentUser.isBoardMember
+  //            unless currentUser.isCommentOnly
+  //              +addListForm
+  //      else
+  //        each lists
+  //          +list(this)
+  //          if currentCardIsInThisList _id ../_id
+  //            +cardDetails(currentCard)
+  //        if currentUser.isBoardMember
+  //          unless currentUser.isCommentOnly
+  //            +addListForm
 
 
 template(name="listsGroup")
 template(name="listsGroup")
   .swimlane.list-group.js-lists
   .swimlane.list-group.js-lists
@@ -42,7 +65,7 @@ template(name="listsGroup")
           +addListForm
           +addListForm
 
 
 template(name="addListForm")
 template(name="addListForm")
-  .list.list-composer.js-list-composer
+  .list.list-composer.js-list-composer(class="{{#if isMiniScreen}}mini-list{{/if}}")
     .list-header-add
     .list-header-add
       +inlinedForm(autoclose=false)
       +inlinedForm(autoclose=false)
         input.list-name-input.full-line(type="text" placeholder="{{_ 'add-list'}}"
         input.list-name-input.full-line(type="text" placeholder="{{_ 'add-list'}}"

+ 109 - 29
client/components/swimlanes/swimlanes.js

@@ -3,8 +3,8 @@ const { calculateIndex, enableClickOnTouch } = Utils;
 function currentListIsInThisSwimlane(swimlaneId) {
 function currentListIsInThisSwimlane(swimlaneId) {
   const currentList = Lists.findOne(Session.get('currentList'));
   const currentList = Lists.findOne(Session.get('currentList'));
   return (
   return (
-    currentList &&
-    (currentList.swimlaneId === swimlaneId || currentList.swimlaneId === '')
+    currentList
+    && (currentList.swimlaneId === swimlaneId || currentList.swimlaneId === '')
   );
   );
 }
 }
 
 
@@ -12,14 +12,14 @@ function currentCardIsInThisList(listId, swimlaneId) {
   const currentCard = Cards.findOne(Session.get('currentCard'));
   const currentCard = Cards.findOne(Session.get('currentCard'));
   const currentUser = Meteor.user();
   const currentUser = Meteor.user();
   if (
   if (
-    currentUser &&
-    currentUser.profile &&
-    currentUser.profile.boardView === 'board-view-swimlanes'
+    currentUser
+    && currentUser.profile
+    && Utils.boardView() === 'board-view-swimlanes'
   )
   )
     return (
     return (
-      currentCard &&
-      currentCard.listId === listId &&
-      currentCard.swimlaneId === swimlaneId
+      currentCard
+      && currentCard.listId === listId
+      && currentCard.swimlaneId === swimlaneId
     );
     );
   // Default view: board-view-lists
   // Default view: board-view-lists
   else return currentCard && currentCard.listId === listId;
   else return currentCard && currentCard.listId === listId;
@@ -56,7 +56,6 @@ function initSortable(boardComponent, $listsDom) {
   $listsDom.sortable({
   $listsDom.sortable({
     tolerance: 'pointer',
     tolerance: 'pointer',
     helper: 'clone',
     helper: 'clone',
-    handle: '.js-list-header',
     items: '.js-list:not(.js-list-composer)',
     items: '.js-list:not(.js-list-composer)',
     placeholder: 'list placeholder',
     placeholder: 'list placeholder',
     distance: 7,
     distance: 7,
@@ -91,21 +90,47 @@ function initSortable(boardComponent, $listsDom) {
 
 
   function userIsMember() {
   function userIsMember() {
     return (
     return (
-      Meteor.user() &&
-      Meteor.user().isBoardMember() &&
-      !Meteor.user().isCommentOnly()
+      Meteor.user()
+      && Meteor.user().isBoardMember()
+      && !Meteor.user().isCommentOnly()
     );
     );
   }
   }
 
 
-  // Disable drag-dropping while in multi-selection mode, or if the current user
-  // is not a board member
   boardComponent.autorun(() => {
   boardComponent.autorun(() => {
+    let showDesktopDragHandles = false;
+    currentUser = Meteor.user();
+    if (currentUser) {
+      showDesktopDragHandles = (currentUser.profile || {})
+        .showDesktopDragHandles;
+    } else {
+      import { Cookies } from 'meteor/ostrio:cookies';
+      const cookies = new Cookies();
+      if (cookies.has('showDesktopDragHandles')) {
+        showDesktopDragHandles = true;
+      } else {
+        showDesktopDragHandles = false;
+      }
+    }
+
+    if (!Utils.isMiniScreen() && showDesktopDragHandles) {
+      $listsDom.sortable({
+        handle: '.js-list-handle',
+      });
+    } else {
+      $listsDom.sortable({
+        handle: '.js-list-header',
+      });
+    }
+
     const $listDom = $listsDom;
     const $listDom = $listsDom;
     if ($listDom.data('sortable')) {
     if ($listDom.data('sortable')) {
       $listsDom.sortable(
       $listsDom.sortable(
         'option',
         'option',
         'disabled',
         'disabled',
-        MultiSelection.isActive() || !userIsMember(),
+        // Disable drag-dropping when user is not member
+        !userIsMember(),
+        // Not disable drag-dropping while in multi-selection mode
+        // MultiSelection.isActive() || !userIsMember(),
       );
       );
     }
     }
   });
   });
@@ -121,6 +146,26 @@ BlazeComponent.extendComponent({
     }
     }
 
 
     initSortable(boardComponent, $listsDom);
     initSortable(boardComponent, $listsDom);
+
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+    if (cookies.has('collapseSwimlane')) {
+      // Minimize swimlanes start https://www.w3schools.com/howto/howto_js_accordion.asp
+      const acc = document.getElementsByClassName('accordion');
+      let i;
+      for (i = 0; i < acc.length; i++) {
+        acc[i].addEventListener('click', function() {
+          this.classList.toggle('active');
+          const panel = this.nextElementSibling;
+          if (panel.style.maxHeight) {
+            panel.style.maxHeight = null;
+          } else {
+            panel.style.maxHeight = `${panel.scrollHeight}px`;
+          }
+        });
+      }
+      // Minimize swimlanes end https://www.w3schools.com/howto/howto_js_accordion.asp
+    }
   },
   },
   onCreated() {
   onCreated() {
     this.draggingActive = new ReactiveVar(false);
     this.draggingActive = new ReactiveVar(false);
@@ -151,16 +196,32 @@ BlazeComponent.extendComponent({
           // define a list of elements in which we disable the dragging because
           // define a list of elements in which we disable the dragging because
           // the user will legitimately expect to be able to select some text with
           // the user will legitimately expect to be able to select some text with
           // his mouse.
           // his mouse.
-          const noDragInside = [
-            'a',
-            'input',
-            'textarea',
-            'p',
-            '.js-list-header',
-          ];
+
+          let showDesktopDragHandles = false;
+          currentUser = Meteor.user();
+          if (currentUser) {
+            showDesktopDragHandles = (currentUser.profile || {})
+              .showDesktopDragHandles;
+          } else {
+            import { Cookies } from 'meteor/ostrio:cookies';
+            const cookies = new Cookies();
+            if (cookies.has('showDesktopDragHandles')) {
+              showDesktopDragHandles = true;
+            } else {
+              showDesktopDragHandles = false;
+            }
+          }
+
+          const noDragInside = ['a', 'input', 'textarea', 'p'].concat(
+            Utils.isMiniScreen()
+              || (!Utils.isMiniScreen() && showDesktopDragHandles)
+              ? ['.js-list-handle', '.js-swimlane-header-handle']
+              : ['.js-list-header'],
+          );
+
           if (
           if (
-            $(evt.target).closest(noDragInside.join(',')).length === 0 &&
-            this.$('.swimlane').prop('clientHeight') > evt.offsetY
+            $(evt.target).closest(noDragInside.join(',')).length === 0
+            && this.$('.swimlane').prop('clientHeight') > evt.offsetY
           ) {
           ) {
             this._isDragging = true;
             this._isDragging = true;
             this._lastDragPositionX = evt.clientX;
             this._lastDragPositionX = evt.clientX;
@@ -194,8 +255,8 @@ BlazeComponent.extendComponent({
   onCreated() {
   onCreated() {
     this.currentBoard = Boards.findOne(Session.get('currentBoard'));
     this.currentBoard = Boards.findOne(Session.get('currentBoard'));
     this.isListTemplatesSwimlane =
     this.isListTemplatesSwimlane =
-      this.currentBoard.isTemplatesBoard() &&
-      this.currentData().isListTemplatesSwimlane();
+      this.currentBoard.isTemplatesBoard()
+      && this.currentData().isListTemplatesSwimlane();
     this.currentSwimlane = this.currentData();
     this.currentSwimlane = this.currentData();
   },
   },
 
 
@@ -233,11 +294,25 @@ BlazeComponent.extendComponent({
 }).register('addListForm');
 }).register('addListForm');
 
 
 Template.swimlane.helpers({
 Template.swimlane.helpers({
+  showDesktopDragHandles() {
+    currentUser = Meteor.user();
+    if (currentUser) {
+      return (currentUser.profile || {}).showDesktopDragHandles;
+    } else {
+      import { Cookies } from 'meteor/ostrio:cookies';
+      const cookies = new Cookies();
+      if (cookies.has('showDesktopDragHandles')) {
+        return true;
+      } else {
+        return false;
+      }
+    }
+  },
   canSeeAddList() {
   canSeeAddList() {
     return (
     return (
-      Meteor.user() &&
-      Meteor.user().isBoardMember() &&
-      !Meteor.user().isCommentOnly()
+      Meteor.user()
+      && Meteor.user().isBoardMember()
+      && !Meteor.user().isCommentOnly()
     );
     );
   },
   },
 });
 });
@@ -253,6 +328,11 @@ BlazeComponent.extendComponent({
         return false;
         return false;
       }
       }
     }
     }
+    if (Filter.lists._isActive()) {
+      if (!list.title.match(Filter.lists.getRegexSelector())) {
+        return false;
+      }
+    }
     if (Filter.hideEmpty.isSelected()) {
     if (Filter.hideEmpty.isSelected()) {
       const swimlaneId = this.parentComponent()
       const swimlaneId = this.parentComponent()
         .parentComponent()
         .parentComponent()

+ 65 - 13
client/components/swimlanes/swimlanes.styl

@@ -1,5 +1,41 @@
 @import 'nib'
 @import 'nib'
 
 
+/*
+// Minimize swimlanes start https://www.w3schools.com/howto/howto_js_accordion.asp
+
+.accordion
+  cursor: pointer
+  width: 30px
+  height: 20px
+  border: none
+  outline: none
+  font-size: 18px
+  transition: 0.4s
+  padding-top: 0px
+  margin-top: 0px
+
+.accordion:after
+  // Unicode triagle right:
+  content: '\25B6'
+  color: #777
+  font-weight: bold
+  float: left
+
+.active:after
+  // Unicode triangle down:
+  content: '\25BC'
+
+.panel
+  width: 100%
+  max-height: 0
+  overflow: hidden
+  transition: max-height 0.2s ease-out
+  margin: 0px
+  padding: 0px
+
+// Minimize swimlanes end https://www.w3schools.com/howto/howto_js_accordion.asp
+*/
+
 .swimlane
 .swimlane
   // Even if this background color is the same as the body we can't leave it
   // Even if this background color is the same as the body we can't leave it
   // transparent, because that won't work during a swimlane drag.
   // transparent, because that won't work during a swimlane drag.
@@ -25,22 +61,22 @@
       cursor: grabbing
       cursor: grabbing
 
 
   .swimlane-header-wrap
   .swimlane-header-wrap
-    display: flex;
-    flex-direction: row;
-    flex: 1 0 100%;
-    background-color: #ccc;
+    display: flex
+    flex-direction: row
+    flex: 1 0 100%
+    background-color: #ccc
 
 
     .swimlane-header
     .swimlane-header
-      font-size: 14px;
+      font-size: 14px
       padding: 5px 5px
       padding: 5px 5px
-      font-weight: bold;
-      min-height: 9px;
-      width: 100%;
-      overflow: hidden;
-      -o-text-overflow: ellipsis;
-      text-overflow: ellipsis;
-      word-wrap: break-word;
-      text-align: center;
+      font-weight: bold
+      min-height: 9px
+      width: 100%
+      overflow: hidden
+      -o-text-overflow: ellipsis
+      text-overflow: ellipsis
+      word-wrap: break-word
+      text-align: center
 
 
     .swimlane-header-menu
     .swimlane-header-menu
       position: absolute
       position: absolute
@@ -50,6 +86,22 @@
       margin-left: 5px
       margin-left: 5px
       margin-right: 10px
       margin-right: 10px
 
 
+    .swimlane-header-handle
+      position: absolute
+      padding: 7px
+      top: 50%
+      transform: translateY(-50%)
+      left: 230px
+      font-size: 18px
+
+    .swimlane-header-miniscreen-handle
+      position: absolute
+      padding: 7px
+      top: 50%
+      transform: translateY(-50%)
+      left: 87vw
+      font-size: 24px
+
 .list-group
 .list-group
   height: 100%
   height: 100%
 
 

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

@@ -78,6 +78,11 @@ template(name="changeSettingsPopup")
         | {{_ 'hide-system-messages'}}
         | {{_ 'hide-system-messages'}}
         if hiddenSystemMessages
         if hiddenSystemMessages
           i.fa.fa-check
           i.fa.fa-check
+    li
+      a.js-toggle-desktop-drag-handles
+        | {{_ 'show-desktop-drag-handles'}}
+        if showDesktopDragHandles
+          i.fa.fa-check
     li
     li
       label.bold
       label.bold
         | {{_ 'show-cards-minimum-count'}}
         | {{_ 'show-cards-minimum-count'}}

+ 82 - 6
client/components/users/userHeader.js

@@ -5,10 +5,22 @@ Template.headerUserBar.events({
 
 
 Template.memberMenuPopup.helpers({
 Template.memberMenuPopup.helpers({
   templatesBoardId() {
   templatesBoardId() {
-    return Meteor.user().getTemplatesBoardId();
+    currentUser = Meteor.user();
+    if (currentUser) {
+      return Meteor.user().getTemplatesBoardId();
+    } else {
+      // No need to getTemplatesBoardId on public board
+      return false;
+    }
   },
   },
   templatesBoardSlug() {
   templatesBoardSlug() {
-    return Meteor.user().getTemplatesBoardSlug();
+    currentUser = Meteor.user();
+    if (currentUser) {
+      return Meteor.user().getTemplatesBoardSlug();
+    } else {
+      // No need to getTemplatesBoardSlug() on public board
+      return false;
+    }
   },
   },
 });
 });
 
 
@@ -161,17 +173,74 @@ Template.changeLanguagePopup.events({
 });
 });
 
 
 Template.changeSettingsPopup.helpers({
 Template.changeSettingsPopup.helpers({
+  showDesktopDragHandles() {
+    currentUser = Meteor.user();
+    if (currentUser) {
+      return (currentUser.profile || {}).showDesktopDragHandles;
+    } else {
+      import { Cookies } from 'meteor/ostrio:cookies';
+      const cookies = new Cookies();
+      if (cookies.has('showDesktopDragHandles')) {
+        return true;
+      } else {
+        return false;
+      }
+    }
+  },
   hiddenSystemMessages() {
   hiddenSystemMessages() {
-    return Meteor.user().hasHiddenSystemMessages();
+    currentUser = Meteor.user();
+    if (currentUser) {
+      return (currentUser.profile || {}).hasHiddenSystemMessages;
+    } else {
+      import { Cookies } from 'meteor/ostrio:cookies';
+      const cookies = new Cookies();
+      if (cookies.has('hasHiddenSystemMessages')) {
+        return true;
+      } else {
+        return false;
+      }
+    }
   },
   },
   showCardsCountAt() {
   showCardsCountAt() {
-    return Meteor.user().getLimitToShowCardsCount();
+    currentUser = Meteor.user();
+    if (currentUser) {
+      return Meteor.user().getLimitToShowCardsCount();
+    } else {
+      import { Cookies } from 'meteor/ostrio:cookies';
+      const cookies = new Cookies();
+      return cookies.get('limitToShowCardsCount');
+    }
   },
   },
 });
 });
 
 
 Template.changeSettingsPopup.events({
 Template.changeSettingsPopup.events({
+  'click .js-toggle-desktop-drag-handles'() {
+    currentUser = Meteor.user();
+    if (currentUser) {
+      Meteor.call('toggleDesktopDragHandles');
+    } else {
+      import { Cookies } from 'meteor/ostrio:cookies';
+      const cookies = new Cookies();
+      if (cookies.has('showDesktopDragHandles')) {
+        cookies.remove('showDesktopDragHandles');
+      } else {
+        cookies.set('showDesktopDragHandles', 'true');
+      }
+    }
+  },
   'click .js-toggle-system-messages'() {
   'click .js-toggle-system-messages'() {
-    Meteor.call('toggleSystemMessages');
+    currentUser = Meteor.user();
+    if (currentUser) {
+      Meteor.call('toggleSystemMessages');
+    } else {
+      import { Cookies } from 'meteor/ostrio:cookies';
+      const cookies = new Cookies();
+      if (cookies.has('hasHiddenSystemMessages')) {
+        cookies.remove('hasHiddenSystemMessages');
+      } else {
+        cookies.set('hasHiddenSystemMessages', 'true');
+      }
+    }
   },
   },
   'click .js-apply-show-cards-at'(event, templateInstance) {
   'click .js-apply-show-cards-at'(event, templateInstance) {
     event.preventDefault();
     event.preventDefault();
@@ -180,7 +249,14 @@ Template.changeSettingsPopup.events({
       10,
       10,
     );
     );
     if (!isNaN(minLimit)) {
     if (!isNaN(minLimit)) {
-      Meteor.call('changeLimitToShowCardsCount', minLimit);
+      currentUser = Meteor.user();
+      if (currentUser) {
+        Meteor.call('changeLimitToShowCardsCount', minLimit);
+      } else {
+        import { Cookies } from 'meteor/ostrio:cookies';
+        const cookies = new Cookies();
+        cookies.set('limitToShowCardsCount', minLimit);
+      }
       Popup.back();
       Popup.back();
     }
     }
   },
   },

+ 11 - 2
client/lib/datepicker.js

@@ -3,10 +3,11 @@ DatePicker = BlazeComponent.extendComponent({
     return 'datepicker';
     return 'datepicker';
   },
   },
 
 
-  onCreated() {
+  onCreated(defaultTime = '1970-01-01 08:00:00') {
     this.error = new ReactiveVar('');
     this.error = new ReactiveVar('');
     this.card = this.data();
     this.card = this.data();
     this.date = new ReactiveVar(moment.invalid());
     this.date = new ReactiveVar(moment.invalid());
+    this.defaultTime = defaultTime;
   },
   },
 
 
   onRendered() {
   onRendered() {
@@ -21,7 +22,15 @@ DatePicker = BlazeComponent.extendComponent({
         function(evt) {
         function(evt) {
           this.find('#date').value = moment(evt.date).format('L');
           this.find('#date').value = moment(evt.date).format('L');
           this.error.set('');
           this.error.set('');
-          this.find('#time').focus();
+          const timeInput = this.find('#time');
+          timeInput.focus();
+          if (!timeInput.value) {
+            const currentHour = evt.date.getHours();
+            const defaultMoment = moment(
+              currentHour > 0 ? evt.date : this.defaultTime,
+            ); // default to 8:00 am local time
+            timeInput.value = defaultMoment.format('LT');
+          }
         }.bind(this),
         }.bind(this),
       );
       );
 
 

+ 13 - 1
client/lib/filter.js

@@ -439,6 +439,14 @@ class AdvancedFilter {
     const commands = this._filterToCommands();
     const commands = this._filterToCommands();
     return this._arrayToSelector(commands);
     return this._arrayToSelector(commands);
   }
   }
+  getRegexSelector() {
+    // generate a regex for filter list
+    this._dep.depend();
+    return new RegExp(
+      `^.*${this._filter.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}.*$`,
+      'i',
+    );
+  }
 }
 }
 
 
 // The global Filter object.
 // The global Filter object.
@@ -455,6 +463,7 @@ Filter = {
   hideEmpty: new SetFilter(),
   hideEmpty: new SetFilter(),
   customFields: new SetFilter('_id'),
   customFields: new SetFilter('_id'),
   advanced: new AdvancedFilter(),
   advanced: new AdvancedFilter(),
+  lists: new AdvancedFilter(), // we need the ability to filter list by name as well
 
 
   _fields: ['labelIds', 'members', 'archive', 'hideEmpty', 'customFields'],
   _fields: ['labelIds', 'members', 'archive', 'hideEmpty', 'customFields'],
 
 
@@ -468,7 +477,9 @@ Filter = {
     return (
     return (
       _.any(this._fields, fieldName => {
       _.any(this._fields, fieldName => {
         return this[fieldName]._isActive();
         return this[fieldName]._isActive();
-      }) || this.advanced._isActive()
+      }) ||
+      this.advanced._isActive() ||
+      this.lists._isActive()
     );
     );
   },
   },
 
 
@@ -533,6 +544,7 @@ Filter = {
       const filter = this[fieldName];
       const filter = this[fieldName];
       filter.reset();
       filter.reset();
     });
     });
+    this.lists.reset();
     this.advanced.reset();
     this.advanced.reset();
     this.resetExceptions();
     this.resetExceptions();
   },
   },

+ 1 - 0
client/lib/textComplete.js

@@ -45,6 +45,7 @@ $.fn.escapeableTextComplete = function(strategies, options, ...otherArgs) {
       });
       });
     },
     },
   });
   });
+  return this;
 };
 };
 
 
 EscapeActions.register('textcomplete', () => {}, () => dropdownMenuIsOpened, {
 EscapeActions.register('textcomplete', () => {}, () => dropdownMenuIsOpened, {

+ 60 - 12
client/lib/utils.js

@@ -1,10 +1,59 @@
 Utils = {
 Utils = {
+  setBoardView(view) {
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+    currentUser = Meteor.user();
+    if (currentUser) {
+      Meteor.user().setBoardView(view);
+    } else if (view === 'board-view-lists') {
+      cookies.set('boardView', 'board-view-lists'); //true
+    } else if (view === 'board-view-swimlanes') {
+      cookies.set('boardView', 'board-view-swimlanes'); //true
+      //} else if (view === 'board-view-collapse') {
+      //  cookies.set('boardView', 'board-view-swimlane'); //true
+      //  cookies.set('collapseSwimlane', 'true'); //true
+    } else if (view === 'board-view-cal') {
+      cookies.set('boardView', 'board-view-cal'); //true
+    }
+  },
+
+  unsetBoardView() {
+    import { Cookies } from 'meteor/ostrio:cookies';
+    const cookies = new Cookies();
+    cookies.remove('boardView');
+    cookies.remove('collapseSwimlane');
+  },
+
+  boardView() {
+    currentUser = Meteor.user();
+    if (currentUser) {
+      return (currentUser.profile || {}).boardView;
+    } else {
+      import { Cookies } from 'meteor/ostrio:cookies';
+      const cookies = new Cookies();
+      if (cookies.get('boardView') === 'board-view-lists') {
+        return 'board-view-lists';
+      } else if (
+        cookies.get('boardView') === 'board-view-swimlanes'
+        //&& !cookies.has('collapseSwimlane')
+      ) {
+        return 'board-view-swimlanes';
+        //} else if (cookies.has('collapseSwimlane')) {
+        //  return 'board-view-swimlanes';
+      } else if (cookies.get('boardView') === 'board-view-cal') {
+        return 'board-view-cal';
+      } else {
+        return false;
+      }
+    }
+  },
+
   // XXX We should remove these two methods
   // XXX We should remove these two methods
   goBoardId(_id) {
   goBoardId(_id) {
     const board = Boards.findOne(_id);
     const board = Boards.findOne(_id);
     return (
     return (
-      board &&
-      FlowRouter.go('board', {
+      board
+      && FlowRouter.go('board', {
         id: board._id,
         id: board._id,
         slug: board.slug,
         slug: board.slug,
       })
       })
@@ -15,15 +64,14 @@ Utils = {
     const card = Cards.findOne(_id);
     const card = Cards.findOne(_id);
     const board = Boards.findOne(card.boardId);
     const board = Boards.findOne(card.boardId);
     return (
     return (
-      board &&
-      FlowRouter.go('card', {
+      board
+      && FlowRouter.go('card', {
         cardId: card._id,
         cardId: card._id,
         boardId: board._id,
         boardId: board._id,
         slug: board.slug,
         slug: board.slug,
       })
       })
     );
     );
   },
   },
-
   MAX_IMAGE_PIXEL: Meteor.settings.public.MAX_IMAGE_PIXEL,
   MAX_IMAGE_PIXEL: Meteor.settings.public.MAX_IMAGE_PIXEL,
   COMPRESS_RATIO: Meteor.settings.public.IMAGE_COMPRESS_RATIO,
   COMPRESS_RATIO: Meteor.settings.public.IMAGE_COMPRESS_RATIO,
   processUploadedAttachment(card, fileObj, callback) {
   processUploadedAttachment(card, fileObj, callback) {
@@ -188,8 +236,8 @@ Utils = {
       };
       };
 
 
       if (
       if (
-        'ontouchstart' in window ||
-        (window.DocumentTouch && document instanceof window.DocumentTouch)
+        'ontouchstart' in window
+        || (window.DocumentTouch && document instanceof window.DocumentTouch)
       ) {
       ) {
         return true;
         return true;
       }
       }
@@ -210,8 +258,8 @@ Utils = {
 
 
   calculateTouchDistance(touchA, touchB) {
   calculateTouchDistance(touchA, touchB) {
     return Math.sqrt(
     return Math.sqrt(
-      Math.pow(touchA.screenX - touchB.screenX, 2) +
-        Math.pow(touchA.screenY - touchB.screenY, 2),
+      Math.pow(touchA.screenX - touchB.screenX, 2)
+        + Math.pow(touchA.screenY - touchB.screenY, 2),
     );
     );
   },
   },
 
 
@@ -228,9 +276,9 @@ Utils = {
     });
     });
     $(document).on('touchend', selector, function(e) {
     $(document).on('touchend', selector, function(e) {
       if (
       if (
-        touchStart &&
-        lastTouch &&
-        Utils.calculateTouchDistance(touchStart, lastTouch) <= 20
+        touchStart
+        && lastTouch
+        && Utils.calculateTouchDistance(touchStart, lastTouch) <= 20
       ) {
       ) {
         e.preventDefault();
         e.preventDefault();
         const clickEvent = document.createEvent('MouseEvents');
         const clickEvent = document.createEvent('MouseEvents');

+ 10 - 8
docker-compose.yml

@@ -93,7 +93,7 @@ services:
     #-------------------------------------------------------------------------------------
     #-------------------------------------------------------------------------------------
     # ==== MONGODB AND METEOR VERSION ====
     # ==== MONGODB AND METEOR VERSION ====
     # a) For Wekan Meteor 1.8.x version at master branch, use mongo 4.x
     # a) For Wekan Meteor 1.8.x version at master branch, use mongo 4.x
-    image: mongo:4.0.11
+    image: mongo:4.0.12
     # b) For Wekan Meteor 1.6.x version at devel branch.
     # b) For Wekan Meteor 1.6.x version at devel branch.
     # Only for Snap and Sandstorm while they are not upgraded yet to Meteor 1.8.x
     # Only for Snap and Sandstorm while they are not upgraded yet to Meteor 1.8.x
     #image: mongo:3.2.21
     #image: mongo:3.2.21
@@ -251,19 +251,19 @@ services:
       #---------------------------------------------------------------
       #---------------------------------------------------------------
       # ==== BIGEVENTS DUE ETC NOTIFICATIONS =====
       # ==== BIGEVENTS DUE ETC NOTIFICATIONS =====
       # https://github.com/wekan/wekan/pull/2541
       # https://github.com/wekan/wekan/pull/2541
-      # Introduced a system env var BIGEVENTS_PATTERN default as "due",
+      # Introduced a system env var BIGEVENTS_PATTERN default as "NONE",
       # so any activityType matches the pattern, system will send out
       # so any activityType matches the pattern, system will send out
       # notifications to all board members no matter they are watching
       # notifications to all board members no matter they are watching
       # or tracking the board or not. Owner of the wekan server can
       # or tracking the board or not. Owner of the wekan server can
       # disable the feature by setting this variable to "NONE" or
       # disable the feature by setting this variable to "NONE" or
       # change the pattern to any valid regex. i.e. '|' delimited
       # change the pattern to any valid regex. i.e. '|' delimited
       # activityType names.
       # activityType names.
-      # a) Default
+      # a) Example
       #- BIGEVENTS_PATTERN=due
       #- BIGEVENTS_PATTERN=due
       # b) All
       # b) All
       #- BIGEVENTS_PATTERN=received|start|due|end
       #- BIGEVENTS_PATTERN=received|start|due|end
       # c) Disabled
       # c) Disabled
-      #- BIGEVENTS_PATTERN=NONE
+      - BIGEVENTS_PATTERN=NONE
       #---------------------------------------------------------------
       #---------------------------------------------------------------
       # ==== EMAIL DUE DATE NOTIFICATION =====
       # ==== EMAIL DUE DATE NOTIFICATION =====
       # https://github.com/wekan/wekan/pull/2536
       # https://github.com/wekan/wekan/pull/2536
@@ -271,8 +271,8 @@ services:
       # dueat startat endat receivedat, also notification to
       # dueat startat endat receivedat, also notification to
       # the watchers and if any card is due, about due or past due.
       # the watchers and if any card is due, about due or past due.
       #
       #
-      # Notify due days, default 2 days before and after. 0 = due notifications disabled. Default: 2
-      #- NOTIFY_DUE_DAYS_BEFORE_AND_AFTER=2
+      # Notify due days, default is None, 2 days before and on the event day
+      #- NOTIFY_DUE_DAYS_BEFORE_AND_AFTER=2,0
       #
       #
       # Notify due at hour of day. Default every morning at 8am. Can be 0-23.
       # Notify due at hour of day. Default every morning at 8am. Can be 0-23.
       # If env variable has parsing error, use default. Notification sent to watchers.
       # If env variable has parsing error, use default. Notification sent to watchers.
@@ -426,8 +426,10 @@ services:
       # If the LDAP needs a user account to search
       # If the LDAP needs a user account to search
       #- LDAP_AUTHENTIFICATION=true
       #- LDAP_AUTHENTIFICATION=true
       #
       #
-      # The search user DN
-      #- LDAP_AUTHENTIFICATION_USERDN=cn=wekan_adm,ou=serviceaccounts,ou=admin,ou=prod,dc=mydomain,dc=com
+      # The search user DN - You need quotes when you have spaces in parameters
+      # 2 examples:
+      #- LDAP_AUTHENTIFICATION_USERDN="CN=ldap admin,CN=users,DC=domainmatter,DC=lan"
+      #- LDAP_AUTHENTIFICATION_USERDN="CN=wekan_adm,OU=serviceaccounts,OU=admin,OU=prod,DC=mydomain,DC=com"
       #
       #
       # The password for the search user
       # The password for the search user
       #- LDAP_AUTHENTIFICATION_PASSWORD=pwd
       #- LDAP_AUTHENTIFICATION_PASSWORD=pwd

+ 26 - 5
i18n/ar.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "تعديل وضوح الرؤية",
   "boardChangeVisibilityPopup-title": "تعديل وضوح الرؤية",
   "boardChangeWatchPopup-title": "تغيير المتابعة",
   "boardChangeWatchPopup-title": "تغيير المتابعة",
   "boardMenuPopup-title": "Board Settings",
   "boardMenuPopup-title": "Board Settings",
+  "boardChangeViewPopup-title": "عرض اللوحات",
   "boards": "لوحات",
   "boards": "لوحات",
   "board-view": "عرض اللوحات",
   "board-view": "عرض اللوحات",
   "board-view-cal": "التقويم",
   "board-view-cal": "التقويم",
   "board-view-swimlanes": "خطوط السباحة",
   "board-view-swimlanes": "خطوط السباحة",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "القائمات",
   "board-view-lists": "القائمات",
   "bucket-example": "مثل « todo list » على سبيل المثال",
   "bucket-example": "مثل « todo list » على سبيل المثال",
   "cancel": "إلغاء",
   "cancel": "إلغاء",
@@ -300,8 +302,18 @@
   "error-username-taken": "إسم المستخدم مأخوذ مسبقا",
   "error-username-taken": "إسم المستخدم مأخوذ مسبقا",
   "error-email-taken": "البريد الإلكتروني مأخوذ بالفعل",
   "error-email-taken": "البريد الإلكتروني مأخوذ بالفعل",
   "export-board": "Export board",
   "export-board": "Export board",
+  "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": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "مسح التصفية",
   "filter-clear": "مسح التصفية",
   "filter-no-label": "لا يوجد ملصق",
   "filter-no-label": "لا يوجد ملصق",
   "filter-no-member": "ليس هناك أي عضو",
   "filter-no-member": "ليس هناك أي عضو",
@@ -426,7 +438,7 @@
   "save": "حفظ",
   "save": "حفظ",
   "search": "بحث",
   "search": "بحث",
   "rules": "Rules",
   "rules": "Rules",
-  "search-cards": "Search from card titles and descriptions on this board",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Text to search for?",
   "search-example": "Text to search for?",
   "select-color": "اختيار اللون",
   "select-color": "اختيار اللون",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "You have successfully sent an email",
   "email-smtp-test-text": "You have successfully sent an email",
   "error-invitation-code-not-exist": "رمز الدعوة غير موجود",
   "error-invitation-code-not-exist": "رمز الدعوة غير موجود",
   "error-notAuthorized": "أنتَ لا تملك الصلاحيات لرؤية هذه الصفحة.",
   "error-notAuthorized": "أنتَ لا تملك الصلاحيات لرؤية هذه الصفحة.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "الويبهوك الصادرة",
   "outgoing-webhooks": "الويبهوك الصادرة",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "الويبهوك الصادرة",
   "outgoingWebhooksPopup-title": "الويبهوك الصادرة",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "ويبهوك جديدة ",
   "new-outgoing-webhook": "ويبهوك جديدة ",
   "no-name": "(غير معروف)",
   "no-name": "(غير معروف)",
   "Node_version": "إصدار النود",
   "Node_version": "إصدار النود",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 26 - 5
i18n/bg.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeWatchPopup-title": "Промени наблюдаването",
   "boardChangeWatchPopup-title": "Промени наблюдаването",
   "boardMenuPopup-title": "Board Settings",
   "boardMenuPopup-title": "Board Settings",
+  "boardChangeViewPopup-title": "Board View",
   "boards": "Табла",
   "boards": "Табла",
   "board-view": "Board View",
   "board-view": "Board View",
   "board-view-cal": "Календар",
   "board-view-cal": "Календар",
   "board-view-swimlanes": "Коридори",
   "board-view-swimlanes": "Коридори",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Списъци",
   "board-view-lists": "Списъци",
   "bucket-example": "Like “Bucket List” for example",
   "bucket-example": "Like “Bucket List” for example",
   "cancel": "Cancel",
   "cancel": "Cancel",
@@ -300,8 +302,18 @@
   "error-username-taken": "Това потребителско име е вече заето",
   "error-username-taken": "Това потребителско име е вече заето",
   "error-email-taken": "Имейлът е вече зает",
   "error-email-taken": "Имейлът е вече зает",
   "export-board": "Експортиране на Табло",
   "export-board": "Експортиране на Табло",
+  "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": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Премахване на филтрите",
   "filter-clear": "Премахване на филтрите",
   "filter-no-label": "без етикет",
   "filter-no-label": "без етикет",
   "filter-no-member": "без член",
   "filter-no-member": "без член",
@@ -426,7 +438,7 @@
   "save": "Запази",
   "save": "Запази",
   "search": "Търсене",
   "search": "Търсене",
   "rules": "Правила",
   "rules": "Правила",
-  "search-cards": "Search from card titles and descriptions on this board",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Text to search for?",
   "search-example": "Text to search for?",
   "select-color": "Избери цвят",
   "select-color": "Избери цвят",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "Успешно изпратихте имейл",
   "email-smtp-test-text": "Успешно изпратихте имейл",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-notAuthorized": "You are not authorized to view this page.",
   "error-notAuthorized": "You are not authorized to view this page.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Outgoing Webhooks",
   "outgoing-webhooks": "Outgoing Webhooks",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "no-name": "(Unknown)",
   "no-name": "(Unknown)",
   "Node_version": "Версия на Node",
   "Node_version": "Версия на Node",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 26 - 5
i18n/br.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeWatchPopup-title": "Change Watch",
   "boardChangeWatchPopup-title": "Change Watch",
   "boardMenuPopup-title": "Board Settings",
   "boardMenuPopup-title": "Board Settings",
+  "boardChangeViewPopup-title": "Board View",
   "boards": "Boards",
   "boards": "Boards",
   "board-view": "Board View",
   "board-view": "Board View",
   "board-view-cal": "Calendar",
   "board-view-cal": "Calendar",
   "board-view-swimlanes": "Swimlanes",
   "board-view-swimlanes": "Swimlanes",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Lists",
   "board-view-lists": "Lists",
   "bucket-example": "Like “Bucket List” for example",
   "bucket-example": "Like “Bucket List” for example",
   "cancel": "Cancel",
   "cancel": "Cancel",
@@ -300,8 +302,18 @@
   "error-username-taken": "This username is already taken",
   "error-username-taken": "This username is already taken",
   "error-email-taken": "Email has already been taken",
   "error-email-taken": "Email has already been taken",
   "export-board": "Export board",
   "export-board": "Export board",
+  "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": "Filter",
-  "filter-cards": "Filter Cards",
+  "filter-cards": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Clear filter",
   "filter-clear": "Clear filter",
   "filter-no-label": "No label",
   "filter-no-label": "No label",
   "filter-no-member": "No member",
   "filter-no-member": "No member",
@@ -426,7 +438,7 @@
   "save": "Save",
   "save": "Save",
   "search": "Search",
   "search": "Search",
   "rules": "Rules",
   "rules": "Rules",
-  "search-cards": "Search from card titles and descriptions on this board",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Text to search for?",
   "search-example": "Text to search for?",
   "select-color": "Select Color",
   "select-color": "Select Color",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "You have successfully sent an email",
   "email-smtp-test-text": "You have successfully sent an email",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-notAuthorized": "You are not authorized to view this page.",
   "error-notAuthorized": "You are not authorized to view this page.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Outgoing Webhooks",
   "outgoing-webhooks": "Outgoing Webhooks",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "no-name": "(Unknown)",
   "no-name": "(Unknown)",
   "Node_version": "Node version",
   "Node_version": "Node version",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 26 - 5
i18n/ca.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Canvia visibilitat",
   "boardChangeVisibilityPopup-title": "Canvia visibilitat",
   "boardChangeWatchPopup-title": "Canvia seguiment",
   "boardChangeWatchPopup-title": "Canvia seguiment",
   "boardMenuPopup-title": "Board Settings",
   "boardMenuPopup-title": "Board Settings",
+  "boardChangeViewPopup-title": "Visió del tauler",
   "boards": "Taulers",
   "boards": "Taulers",
   "board-view": "Visió del tauler",
   "board-view": "Visió del tauler",
   "board-view-cal": "Calendari",
   "board-view-cal": "Calendari",
   "board-view-swimlanes": "Carrils de Natació",
   "board-view-swimlanes": "Carrils de Natació",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Llistes",
   "board-view-lists": "Llistes",
   "bucket-example": "Igual que “Bucket List”,  per exemple",
   "bucket-example": "Igual que “Bucket List”,  per exemple",
   "cancel": "Cancel·la",
   "cancel": "Cancel·la",
@@ -300,8 +302,18 @@
   "error-username-taken": "Aquest usuari ja existeix",
   "error-username-taken": "Aquest usuari ja existeix",
   "error-email-taken": "L'adreça de correu electrònic ja és en ús",
   "error-email-taken": "L'adreça de correu electrònic ja és en ús",
   "export-board": "Exporta tauler",
   "export-board": "Exporta tauler",
+  "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": "Filtre",
   "filter": "Filtre",
-  "filter-cards": "Fitxes de filtre",
+  "filter-cards": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Elimina filtre",
   "filter-clear": "Elimina filtre",
   "filter-no-label": "Sense etiqueta",
   "filter-no-label": "Sense etiqueta",
   "filter-no-member": "Sense membres",
   "filter-no-member": "Sense membres",
@@ -426,7 +438,7 @@
   "save": "Desa",
   "save": "Desa",
   "search": "Cerca",
   "search": "Cerca",
   "rules": "Regles",
   "rules": "Regles",
-  "search-cards": "Cerca títols de fitxa i descripcions en aquest tauler",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Text que cercar?",
   "search-example": "Text que cercar?",
   "select-color": "Selecciona color",
   "select-color": "Selecciona color",
   "set-wip-limit-value": "Limita el màxim nombre de tasques en aquesta llista",
   "set-wip-limit-value": "Limita el màxim nombre de tasques en aquesta llista",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "Has enviat un missatge satisfactòriament",
   "email-smtp-test-text": "Has enviat un missatge satisfactòriament",
   "error-invitation-code-not-exist": "El codi d'invitació no existeix",
   "error-invitation-code-not-exist": "El codi d'invitació no existeix",
   "error-notAuthorized": "No estau autoritzats per veure aquesta pàgina",
   "error-notAuthorized": "No estau autoritzats per veure aquesta pàgina",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Webhooks sortints",
   "outgoing-webhooks": "Webhooks sortints",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Webhooks sortints",
   "outgoingWebhooksPopup-title": "Webhooks sortints",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "Nou Webook sortint",
   "new-outgoing-webhook": "Nou Webook sortint",
   "no-name": "Importa tauler des de Wekan",
   "no-name": "Importa tauler des de Wekan",
   "Node_version": "Versió Node",
   "Node_version": "Versió Node",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 30 - 9
i18n/cs.i18n.json

@@ -74,7 +74,7 @@
   "activity-checklist-completed-card": "dokončil(a) zaškrtávací seznam __checklist__ na kartě __card__ ve sloupci __list__ ve swimlane __swimlane__ na tablu __board__",
   "activity-checklist-completed-card": "dokončil(a) zaškrtávací seznam __checklist__ na kartě __card__ ve sloupci __list__ ve swimlane __swimlane__ na tablu __board__",
   "activity-checklist-uncompleted-card": "nedokončený seznam %s",
   "activity-checklist-uncompleted-card": "nedokončený seznam %s",
   "activity-editComment": "edited comment %s",
   "activity-editComment": "edited comment %s",
-  "activity-deleteComment": "deleted comment %s",
+  "activity-deleteComment": "smazat komentář %s",
   "add-attachment": "Přidat přílohu",
   "add-attachment": "Přidat přílohu",
   "add-board": "Přidat tablo",
   "add-board": "Přidat tablo",
   "add-card": "Přidat kartu",
   "add-card": "Přidat kartu",
@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Upravit viditelnost",
   "boardChangeVisibilityPopup-title": "Upravit viditelnost",
   "boardChangeWatchPopup-title": "Změnit sledování",
   "boardChangeWatchPopup-title": "Změnit sledování",
   "boardMenuPopup-title": "Nastavení Tabla",
   "boardMenuPopup-title": "Nastavení Tabla",
+  "boardChangeViewPopup-title": "Náhled tabla",
   "boards": "Tabla",
   "boards": "Tabla",
   "board-view": "Náhled tabla",
   "board-view": "Náhled tabla",
   "board-view-cal": "Kalendář",
   "board-view-cal": "Kalendář",
   "board-view-swimlanes": "Swimlanes",
   "board-view-swimlanes": "Swimlanes",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Sloupce",
   "board-view-lists": "Sloupce",
   "bucket-example": "Například \"O čem sním\"",
   "bucket-example": "Například \"O čem sním\"",
   "cancel": "Zrušit",
   "cancel": "Zrušit",
@@ -300,8 +302,18 @@
   "error-username-taken": "Toto uživatelské jméno již existuje",
   "error-username-taken": "Toto uživatelské jméno již existuje",
   "error-email-taken": "Tento email byl již použit",
   "error-email-taken": "Tento email byl již použit",
   "export-board": "Exportovat tablo",
   "export-board": "Exportovat tablo",
+  "sort": "řadit",
+  "sort-desc": "Click to Sort List",
+  "list-sort-by": "řadit seznam podle",
+  "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": "Filtr",
   "filter": "Filtr",
-  "filter-cards": "Filtrovat karty",
+  "filter-cards": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Vyčistit filtr",
   "filter-clear": "Vyčistit filtr",
   "filter-no-label": "Žádný štítek",
   "filter-no-label": "Žádný štítek",
   "filter-no-member": "Žádný člen",
   "filter-no-member": "Žádný člen",
@@ -426,7 +438,7 @@
   "save": "Uložit",
   "save": "Uložit",
   "search": "Hledat",
   "search": "Hledat",
   "rules": "Pravidla",
   "rules": "Pravidla",
-  "search-cards": "Hledat nadpisy a popisy karet v tomto tablu",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Hledaný text",
   "search-example": "Hledaný text",
   "select-color": "Vybrat barvu",
   "select-color": "Vybrat barvu",
   "set-wip-limit-value": "Nastaví limit pro maximální počet úkolů ve sloupci.",
   "set-wip-limit-value": "Nastaví limit pro maximální počet úkolů ve sloupci.",
@@ -510,14 +522,19 @@
   "email-smtp-test-text": "Email byl úspěšně odeslán",
   "email-smtp-test-text": "Email byl úspěšně odeslán",
   "error-invitation-code-not-exist": "Kód pozvánky neexistuje.",
   "error-invitation-code-not-exist": "Kód pozvánky neexistuje.",
   "error-notAuthorized": "Nejste autorizován k prohlížení této stránky.",
   "error-notAuthorized": "Nejste autorizován k prohlížení této stránky.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Odchozí Webhooky",
   "outgoing-webhooks": "Odchozí Webhooky",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Odchozí Webhooky",
   "outgoingWebhooksPopup-title": "Odchozí Webhooky",
   "boardCardTitlePopup-title": "Filtr názvů karet",
   "boardCardTitlePopup-title": "Filtr názvů karet",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "Nové odchozí Webhooky",
   "new-outgoing-webhook": "Nové odchozí Webhooky",
   "no-name": "(Neznámé)",
   "no-name": "(Neznámé)",
   "Node_version": "Node verze",
   "Node_version": "Node verze",
   "Meteor_version": "Meteor version",
   "Meteor_version": "Meteor version",
-  "MongoDB_version": "MongoDB version",
+  "MongoDB_version": "MongoDB verze",
   "MongoDB_storage_engine": "MongoDB storage engine",
   "MongoDB_storage_engine": "MongoDB storage engine",
   "MongoDB_Oplog_enabled": "MongoDB Oplog enabled",
   "MongoDB_Oplog_enabled": "MongoDB Oplog enabled",
   "OS_Arch": "OS Architektura",
   "OS_Arch": "OS Architektura",
@@ -684,9 +701,9 @@
   "r-set": "Set",
   "r-set": "Set",
   "r-update": "Update",
   "r-update": "Update",
   "r-datefield": "date field",
   "r-datefield": "date field",
-  "r-df-start-at": "start",
+  "r-df-start-at": "začátek",
   "r-df-due-at": "due",
   "r-df-due-at": "due",
-  "r-df-end-at": "end",
+  "r-df-end-at": "konec",
   "r-df-received-at": "received",
   "r-df-received-at": "received",
   "r-to-current-datetime": "to current date/time",
   "r-to-current-datetime": "to current date/time",
   "r-remove-value-from": "Remove value from",
   "r-remove-value-from": "Remove value from",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 26 - 5
i18n/da.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeWatchPopup-title": "Change Watch",
   "boardChangeWatchPopup-title": "Change Watch",
   "boardMenuPopup-title": "Board Settings",
   "boardMenuPopup-title": "Board Settings",
+  "boardChangeViewPopup-title": "Board View",
   "boards": "Boards",
   "boards": "Boards",
   "board-view": "Board View",
   "board-view": "Board View",
   "board-view-cal": "Calendar",
   "board-view-cal": "Calendar",
   "board-view-swimlanes": "Swimlanes",
   "board-view-swimlanes": "Swimlanes",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Lists",
   "board-view-lists": "Lists",
   "bucket-example": "Like “Bucket List” for example",
   "bucket-example": "Like “Bucket List” for example",
   "cancel": "Cancel",
   "cancel": "Cancel",
@@ -300,8 +302,18 @@
   "error-username-taken": "This username is already taken",
   "error-username-taken": "This username is already taken",
   "error-email-taken": "Email has already been taken",
   "error-email-taken": "Email has already been taken",
   "export-board": "Export board",
   "export-board": "Export board",
+  "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": "Filter",
-  "filter-cards": "Filter Cards",
+  "filter-cards": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Clear filter",
   "filter-clear": "Clear filter",
   "filter-no-label": "No label",
   "filter-no-label": "No label",
   "filter-no-member": "No member",
   "filter-no-member": "No member",
@@ -426,7 +438,7 @@
   "save": "Save",
   "save": "Save",
   "search": "Search",
   "search": "Search",
   "rules": "Rules",
   "rules": "Rules",
-  "search-cards": "Search from card titles and descriptions on this board",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Text to search for?",
   "search-example": "Text to search for?",
   "select-color": "Select Color",
   "select-color": "Select Color",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "You have successfully sent an email",
   "email-smtp-test-text": "You have successfully sent an email",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-notAuthorized": "You are not authorized to view this page.",
   "error-notAuthorized": "You are not authorized to view this page.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Outgoing Webhooks",
   "outgoing-webhooks": "Outgoing Webhooks",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "no-name": "(Unknown)",
   "no-name": "(Unknown)",
   "Node_version": "Node version",
   "Node_version": "Node version",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 26 - 5
i18n/de.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Sichtbarkeit ändern",
   "boardChangeVisibilityPopup-title": "Sichtbarkeit ändern",
   "boardChangeWatchPopup-title": "Beobachtung ändern",
   "boardChangeWatchPopup-title": "Beobachtung ändern",
   "boardMenuPopup-title": "Boardeinstellungen",
   "boardMenuPopup-title": "Boardeinstellungen",
+  "boardChangeViewPopup-title": "Boardansicht",
   "boards": "Boards",
   "boards": "Boards",
   "board-view": "Boardansicht",
   "board-view": "Boardansicht",
   "board-view-cal": "Kalender",
   "board-view-cal": "Kalender",
   "board-view-swimlanes": "Swimlanes",
   "board-view-swimlanes": "Swimlanes",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Listen",
   "board-view-lists": "Listen",
   "bucket-example": "z.B. \"Löffelliste\"",
   "bucket-example": "z.B. \"Löffelliste\"",
   "cancel": "Abbrechen",
   "cancel": "Abbrechen",
@@ -300,8 +302,18 @@
   "error-username-taken": "Dieser Benutzername ist bereits vergeben",
   "error-username-taken": "Dieser Benutzername ist bereits vergeben",
   "error-email-taken": "E-Mail wird schon verwendet",
   "error-email-taken": "E-Mail wird schon verwendet",
   "export-board": "Board exportieren",
   "export-board": "Board exportieren",
+  "sort": "Sortieren",
+  "sort-desc": "Zum Sortieren der Liste klicken",
+  "list-sort-by": "Sortieren der Liste nach:",
+  "list-label-modifiedAt": "Letzte Zugriffszeit",
+  "list-label-title": "Name der Liste",
+  "list-label-sort": "Ihre manuelle Sortierung",
+  "list-label-short-modifiedAt": "(Z)",
+  "list-label-short-title": "(N)",
+  "list-label-short-sort": "(M)",
   "filter": "Filter",
   "filter": "Filter",
-  "filter-cards": "Karten filtern",
+  "filter-cards": "Karten oder Listen filtern",
+  "list-filter-label": "Liste nach Titel filtern",
   "filter-clear": "Filter entfernen",
   "filter-clear": "Filter entfernen",
   "filter-no-label": "Kein Label",
   "filter-no-label": "Kein Label",
   "filter-no-member": "Kein Mitglied",
   "filter-no-member": "Kein Mitglied",
@@ -426,7 +438,7 @@
   "save": "Speichern",
   "save": "Speichern",
   "search": "Suchen",
   "search": "Suchen",
   "rules": "Regeln",
   "rules": "Regeln",
-  "search-cards": "Suche nach Kartentiteln und Beschreibungen auf diesem Board",
+  "search-cards": "Suche nach Karten-/Listentiteln und Beschreibungen auf diesem Board",
   "search-example": "Suchbegriff",
   "search-example": "Suchbegriff",
   "select-color": "Farbe auswählen",
   "select-color": "Farbe auswählen",
   "set-wip-limit-value": "Setzen Sie ein Limit für die maximale Anzahl von Aufgaben in dieser Liste",
   "set-wip-limit-value": "Setzen Sie ein Limit für die maximale Anzahl von Aufgaben in dieser Liste",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "Sie haben erfolgreich eine E-Mail versandt",
   "email-smtp-test-text": "Sie haben erfolgreich eine E-Mail versandt",
   "error-invitation-code-not-exist": "Ungültiger Einladungscode",
   "error-invitation-code-not-exist": "Ungültiger Einladungscode",
   "error-notAuthorized": "Sie sind nicht berechtigt diese Seite zu sehen.",
   "error-notAuthorized": "Sie sind nicht berechtigt diese Seite zu sehen.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional für Authentifizierung)",
   "outgoing-webhooks": "Ausgehende Webhooks",
   "outgoing-webhooks": "Ausgehende Webhooks",
+  "bidirectional-webhooks": "Zwei-Wege Webhooks",
   "outgoingWebhooksPopup-title": "Ausgehende Webhooks",
   "outgoingWebhooksPopup-title": "Ausgehende Webhooks",
   "boardCardTitlePopup-title": "Kartentitelfilter",
   "boardCardTitlePopup-title": "Kartentitelfilter",
+  "disable-webhook": "Diesen Webhook deaktivieren",
+  "global-webhook": "Globale Webhooks",
   "new-outgoing-webhook": "Neuer ausgehender Webhook",
   "new-outgoing-webhook": "Neuer ausgehender Webhook",
   "no-name": "(Unbekannt)",
   "no-name": "(Unbekannt)",
   "Node_version": "Node-Version",
   "Node_version": "Node-Version",
@@ -723,12 +740,16 @@
   "almostdue": "aktuelles Fälligkeitsdatum %s bevorstehend",
   "almostdue": "aktuelles Fälligkeitsdatum %s bevorstehend",
   "pastdue": "aktuelles Fälligkeitsdatum %s überschritten",
   "pastdue": "aktuelles Fälligkeitsdatum %s überschritten",
   "duenow": "aktuelles Fälligkeitsdatum %s heute",
   "duenow": "aktuelles Fälligkeitsdatum %s heute",
-  "act-withDue": "__card__ fällige Erinnerungen [__board__]",
+  "act-newDue": "__list__/__card__ hat seine 1. fällige Erinnerung [__board__]",
+  "act-withDue": "Erinnerung an Fällikgeit von __card__ [__board__]",
   "act-almostdue": "erinnernd an das aktuelle Fälligkeitszeitpunkt (__timeValue__) von __card__ ist bevorstehend",
   "act-almostdue": "erinnernd an das aktuelle Fälligkeitszeitpunkt (__timeValue__) von __card__ ist bevorstehend",
   "act-pastdue": "erinnernd an das aktuelle Fälligkeitszeitpunkt (__timeValue__) von __card__ ist vorbei",
   "act-pastdue": "erinnernd an das aktuelle Fälligkeitszeitpunkt (__timeValue__) von __card__ ist vorbei",
   "act-duenow": "erinnernd an das aktuelle Fälligkeitszeitpunkt (__timeValue__) von __card__ ist jetzt",
   "act-duenow": "erinnernd an das aktuelle Fälligkeitszeitpunkt (__timeValue__) von __card__ ist jetzt",
-  "act-atUserComment": "Du wurdest erwähnt in [__board__] __card__",
+  "act-atUserComment": "Sie wurden in [__board__] __list__/__card__ erwähnt",
   "delete-user-confirm-popup": "Sind Sie sicher, dass Sie diesen Account löschen wollen? Die Aktion kann nicht rückgängig gemacht werden.",
   "delete-user-confirm-popup": "Sind Sie sicher, dass Sie diesen Account löschen wollen? Die Aktion kann nicht rückgängig gemacht werden.",
   "accounts-allowUserDelete": "Erlaube Benutzern ihren eigenen Account zu löschen",
   "accounts-allowUserDelete": "Erlaube Benutzern ihren eigenen Account zu löschen",
-  "hide-minicard-label-text": "Labeltext auf Minikarte ausblenden"
+  "hide-minicard-label-text": "Labeltext auf Minikarte ausblenden",
+  "show-desktop-drag-handles": "Desktop-Ziehpunkte anzeigen",
+  "assignee": "Zugewiesen",
+  "cardAssigneesPopup-title": "Zugewiesen"
 }
 }

+ 26 - 5
i18n/el.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Αλλαγή Ορατότητας",
   "boardChangeVisibilityPopup-title": "Αλλαγή Ορατότητας",
   "boardChangeWatchPopup-title": "Change Watch",
   "boardChangeWatchPopup-title": "Change Watch",
   "boardMenuPopup-title": "Ρυθμίσεις Πίνακα",
   "boardMenuPopup-title": "Ρυθμίσεις Πίνακα",
+  "boardChangeViewPopup-title": "Board View",
   "boards": "Πίνακες",
   "boards": "Πίνακες",
   "board-view": "Board View",
   "board-view": "Board View",
   "board-view-cal": "Ημερολόγιο",
   "board-view-cal": "Ημερολόγιο",
   "board-view-swimlanes": "Swimlanes",
   "board-view-swimlanes": "Swimlanes",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Λίστες",
   "board-view-lists": "Λίστες",
   "bucket-example": "Like “Bucket List” for example",
   "bucket-example": "Like “Bucket List” for example",
   "cancel": "Ακύρωση",
   "cancel": "Ακύρωση",
@@ -300,8 +302,18 @@
   "error-username-taken": "This username is already taken",
   "error-username-taken": "This username is already taken",
   "error-email-taken": "Email has already been taken",
   "error-email-taken": "Email has already been taken",
   "export-board": "Εξαγωγή πίνακα",
   "export-board": "Εξαγωγή πίνακα",
+  "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",
+  "filter-cards": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Clear filter",
   "filter-clear": "Clear filter",
   "filter-no-label": "No label",
   "filter-no-label": "No label",
   "filter-no-member": "Κανένα μέλος",
   "filter-no-member": "Κανένα μέλος",
@@ -426,7 +438,7 @@
   "save": "Αποθήκευση",
   "save": "Αποθήκευση",
   "search": "Αναζήτηση",
   "search": "Αναζήτηση",
   "rules": "Rules",
   "rules": "Rules",
-  "search-cards": "Search from card titles and descriptions on this board",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Text to search for?",
   "search-example": "Text to search for?",
   "select-color": "Επιλέξτε Χρώμα",
   "select-color": "Επιλέξτε Χρώμα",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "You have successfully sent an email",
   "email-smtp-test-text": "You have successfully sent an email",
   "error-invitation-code-not-exist": "Ο κωδικός πρόσκλησης δεν υπάρχει",
   "error-invitation-code-not-exist": "Ο κωδικός πρόσκλησης δεν υπάρχει",
   "error-notAuthorized": "You are not authorized to view this page.",
   "error-notAuthorized": "You are not authorized to view this page.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Outgoing Webhooks",
   "outgoing-webhooks": "Outgoing Webhooks",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "no-name": "(Άγνωστο)",
   "no-name": "(Άγνωστο)",
   "Node_version": "Έκδοση Node",
   "Node_version": "Έκδοση Node",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 26 - 5
i18n/en-GB.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeWatchPopup-title": "Change Watch",
   "boardChangeWatchPopup-title": "Change Watch",
   "boardMenuPopup-title": "Board Settings",
   "boardMenuPopup-title": "Board Settings",
+  "boardChangeViewPopup-title": "Board View",
   "boards": "Boards",
   "boards": "Boards",
   "board-view": "Board View",
   "board-view": "Board View",
   "board-view-cal": "Calendar",
   "board-view-cal": "Calendar",
   "board-view-swimlanes": "Swimlanes",
   "board-view-swimlanes": "Swimlanes",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Lists",
   "board-view-lists": "Lists",
   "bucket-example": "Like “Bucket List” for example",
   "bucket-example": "Like “Bucket List” for example",
   "cancel": "Cancel",
   "cancel": "Cancel",
@@ -300,8 +302,18 @@
   "error-username-taken": "This username is already taken",
   "error-username-taken": "This username is already taken",
   "error-email-taken": "Email has already been taken",
   "error-email-taken": "Email has already been taken",
   "export-board": "Export board",
   "export-board": "Export board",
+  "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": "Filter",
-  "filter-cards": "Filter Cards",
+  "filter-cards": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Clear filter",
   "filter-clear": "Clear filter",
   "filter-no-label": "No label",
   "filter-no-label": "No label",
   "filter-no-member": "No member",
   "filter-no-member": "No member",
@@ -426,7 +438,7 @@
   "save": "Save",
   "save": "Save",
   "search": "Search",
   "search": "Search",
   "rules": "Rules",
   "rules": "Rules",
-  "search-cards": "Search from card titles and descriptions on this board",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Text to search for?",
   "search-example": "Text to search for?",
   "select-color": "Select Colour",
   "select-color": "Select Colour",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "You have successfully sent an email",
   "email-smtp-test-text": "You have successfully sent an email",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-notAuthorized": "You are not authorised to view this page.",
   "error-notAuthorized": "You are not authorised to view this page.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Outgoing Webhooks",
   "outgoing-webhooks": "Outgoing Webhooks",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "no-name": "(Unknown)",
   "no-name": "(Unknown)",
   "Node_version": "Node version",
   "Node_version": "Node version",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 26 - 5
i18n/en.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeWatchPopup-title": "Change Watch",
   "boardChangeWatchPopup-title": "Change Watch",
   "boardMenuPopup-title": "Board Settings",
   "boardMenuPopup-title": "Board Settings",
+  "boardChangeViewPopup-title": "Board View",
   "boards": "Boards",
   "boards": "Boards",
   "board-view": "Board View",
   "board-view": "Board View",
   "board-view-cal": "Calendar",
   "board-view-cal": "Calendar",
   "board-view-swimlanes": "Swimlanes",
   "board-view-swimlanes": "Swimlanes",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Lists",
   "board-view-lists": "Lists",
   "bucket-example": "Like “Bucket List” for example",
   "bucket-example": "Like “Bucket List” for example",
   "cancel": "Cancel",
   "cancel": "Cancel",
@@ -300,8 +302,18 @@
   "error-username-taken": "This username is already taken",
   "error-username-taken": "This username is already taken",
   "error-email-taken": "Email has already been taken",
   "error-email-taken": "Email has already been taken",
   "export-board": "Export board",
   "export-board": "Export board",
+  "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": "Filter",
-  "filter-cards": "Filter Cards",
+  "filter-cards": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Clear filter",
   "filter-clear": "Clear filter",
   "filter-no-label": "No label",
   "filter-no-label": "No label",
   "filter-no-member": "No member",
   "filter-no-member": "No member",
@@ -426,7 +438,7 @@
   "save": "Save",
   "save": "Save",
   "search": "Search",
   "search": "Search",
   "rules": "Rules",
   "rules": "Rules",
-  "search-cards": "Search from card titles and descriptions on this board",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Text to search for?",
   "search-example": "Text to search for?",
   "select-color": "Select Color",
   "select-color": "Select Color",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "You have successfully sent an email",
   "email-smtp-test-text": "You have successfully sent an email",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-notAuthorized": "You are not authorized to view this page.",
   "error-notAuthorized": "You are not authorized to view this page.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Outgoing Webhooks",
   "outgoing-webhooks": "Outgoing Webhooks",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "no-name": "(Unknown)",
   "no-name": "(Unknown)",
   "Node_version": "Node version",
   "Node_version": "Node version",
@@ -726,12 +743,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 26 - 5
i18n/eo.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeWatchPopup-title": "Change Watch",
   "boardChangeWatchPopup-title": "Change Watch",
   "boardMenuPopup-title": "Board Settings",
   "boardMenuPopup-title": "Board Settings",
+  "boardChangeViewPopup-title": "Board View",
   "boards": "Boards",
   "boards": "Boards",
   "board-view": "Board View",
   "board-view": "Board View",
   "board-view-cal": "Calendar",
   "board-view-cal": "Calendar",
   "board-view-swimlanes": "Swimlanes",
   "board-view-swimlanes": "Swimlanes",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Listoj",
   "board-view-lists": "Listoj",
   "bucket-example": "Like “Bucket List” for example",
   "bucket-example": "Like “Bucket List” for example",
   "cancel": "Cancel",
   "cancel": "Cancel",
@@ -300,8 +302,18 @@
   "error-username-taken": "Uzantnomo jam prenita",
   "error-username-taken": "Uzantnomo jam prenita",
   "error-email-taken": "Email has already been taken",
   "error-email-taken": "Email has already been taken",
   "export-board": "Export board",
   "export-board": "Export board",
+  "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": "Filter",
-  "filter-cards": "Filter Cards",
+  "filter-cards": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Clear filter",
   "filter-clear": "Clear filter",
   "filter-no-label": "Nenia etikedo",
   "filter-no-label": "Nenia etikedo",
   "filter-no-member": "Nenia membro",
   "filter-no-member": "Nenia membro",
@@ -426,7 +438,7 @@
   "save": "Savi",
   "save": "Savi",
   "search": "Serĉi",
   "search": "Serĉi",
   "rules": "Rules",
   "rules": "Rules",
-  "search-cards": "Search from card titles and descriptions on this board",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Text to search for?",
   "search-example": "Text to search for?",
   "select-color": "Select Color",
   "select-color": "Select Color",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "You have successfully sent an email",
   "email-smtp-test-text": "You have successfully sent an email",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-notAuthorized": "You are not authorized to view this page.",
   "error-notAuthorized": "You are not authorized to view this page.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Outgoing Webhooks",
   "outgoing-webhooks": "Outgoing Webhooks",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "no-name": "(Unknown)",
   "no-name": "(Unknown)",
   "Node_version": "Node version",
   "Node_version": "Node version",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 26 - 5
i18n/es-AR.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Cambiar Visibilidad",
   "boardChangeVisibilityPopup-title": "Cambiar Visibilidad",
   "boardChangeWatchPopup-title": "Alternar Seguimiento",
   "boardChangeWatchPopup-title": "Alternar Seguimiento",
   "boardMenuPopup-title": "Opciones del Tablero",
   "boardMenuPopup-title": "Opciones del Tablero",
+  "boardChangeViewPopup-title": "Vista de Tablero",
   "boards": "Tableros",
   "boards": "Tableros",
   "board-view": "Vista de Tablero",
   "board-view": "Vista de Tablero",
   "board-view-cal": "Calendario",
   "board-view-cal": "Calendario",
   "board-view-swimlanes": "Calles",
   "board-view-swimlanes": "Calles",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Listas",
   "board-view-lists": "Listas",
   "bucket-example": "Como \"Lista de Contenedores\" por ejemplo",
   "bucket-example": "Como \"Lista de Contenedores\" por ejemplo",
   "cancel": "Cancelar",
   "cancel": "Cancelar",
@@ -300,8 +302,18 @@
   "error-username-taken": "El nombre de usuario ya existe",
   "error-username-taken": "El nombre de usuario ya existe",
   "error-email-taken": "El email ya existe",
   "error-email-taken": "El email ya existe",
   "export-board": "Exportar tablero",
   "export-board": "Exportar tablero",
+  "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": "Filtrar",
   "filter": "Filtrar",
-  "filter-cards": "Filtrar Tarjetas",
+  "filter-cards": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Sacar filtro",
   "filter-clear": "Sacar filtro",
   "filter-no-label": "Sin etiqueta",
   "filter-no-label": "Sin etiqueta",
   "filter-no-member": "No es miembro",
   "filter-no-member": "No es miembro",
@@ -426,7 +438,7 @@
   "save": "Grabar",
   "save": "Grabar",
   "search": "Buscar",
   "search": "Buscar",
   "rules": "Rules",
   "rules": "Rules",
-  "search-cards": "Buscar en títulos y descripciones de tarjeta en este tablero",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "¿Texto a buscar?",
   "search-example": "¿Texto a buscar?",
   "select-color": "Seleccionar Color",
   "select-color": "Seleccionar Color",
   "set-wip-limit-value": "Fijar un límite para el número máximo de tareas en esta lista",
   "set-wip-limit-value": "Fijar un límite para el número máximo de tareas en esta lista",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "Enviaste el correo correctamente",
   "email-smtp-test-text": "Enviaste el correo correctamente",
   "error-invitation-code-not-exist": "El código de invitación no existe",
   "error-invitation-code-not-exist": "El código de invitación no existe",
   "error-notAuthorized": "No estás autorizado para ver esta página.",
   "error-notAuthorized": "No estás autorizado para ver esta página.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Ganchos Web Salientes",
   "outgoing-webhooks": "Ganchos Web Salientes",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Ganchos Web Salientes",
   "outgoingWebhooksPopup-title": "Ganchos Web Salientes",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "Nuevo Gancho Web",
   "new-outgoing-webhook": "Nuevo Gancho Web",
   "no-name": "(desconocido)",
   "no-name": "(desconocido)",
   "Node_version": "Versión de Node",
   "Node_version": "Versión de Node",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 25 - 4
i18n/es.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Cambiar visibilidad",
   "boardChangeVisibilityPopup-title": "Cambiar visibilidad",
   "boardChangeWatchPopup-title": "Cambiar vigilancia",
   "boardChangeWatchPopup-title": "Cambiar vigilancia",
   "boardMenuPopup-title": "Preferencias del tablero",
   "boardMenuPopup-title": "Preferencias del tablero",
+  "boardChangeViewPopup-title": "Vista del tablero",
   "boards": "Tableros",
   "boards": "Tableros",
   "board-view": "Vista del tablero",
   "board-view": "Vista del tablero",
   "board-view-cal": "Calendario",
   "board-view-cal": "Calendario",
   "board-view-swimlanes": "Carriles",
   "board-view-swimlanes": "Carriles",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Listas",
   "board-view-lists": "Listas",
   "bucket-example": "Como “Cosas por hacer” por ejemplo",
   "bucket-example": "Como “Cosas por hacer” por ejemplo",
   "cancel": "Cancelar",
   "cancel": "Cancelar",
@@ -300,8 +302,18 @@
   "error-username-taken": "Este nombre de usuario ya está en uso",
   "error-username-taken": "Este nombre de usuario ya está en uso",
   "error-email-taken": "Esta dirección de correo ya está en uso",
   "error-email-taken": "Esta dirección de correo ya está en uso",
   "export-board": "Exportar el tablero",
   "export-board": "Exportar el tablero",
+  "sort": "Ordenar",
+  "sort-desc": "Click para ordenar la lista",
+  "list-sort-by": "Ordenar la lista por:",
+  "list-label-modifiedAt": "Hora de último acceso",
+  "list-label-title": "Nombre de la lista",
+  "list-label-sort": "Tu orden manual",
+  "list-label-short-modifiedAt": "(L)",
+  "list-label-short-title": "(N)",
+  "list-label-short-sort": "(M)",
   "filter": "Filtrar",
   "filter": "Filtrar",
-  "filter-cards": "Filtrar tarjetas",
+  "filter-cards": "Filtrar tarjetas o listas",
+  "list-filter-label": "Filtrar listas por título",
   "filter-clear": "Limpiar el filtro",
   "filter-clear": "Limpiar el filtro",
   "filter-no-label": "Sin etiqueta",
   "filter-no-label": "Sin etiqueta",
   "filter-no-member": "Sin miembro",
   "filter-no-member": "Sin miembro",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "El correo se ha enviado correctamente",
   "email-smtp-test-text": "El correo se ha enviado correctamente",
   "error-invitation-code-not-exist": "El código de invitación no existe",
   "error-invitation-code-not-exist": "El código de invitación no existe",
   "error-notAuthorized": "No estás autorizado a ver esta página.",
   "error-notAuthorized": "No estás autorizado a ver esta página.",
+  "webhook-title": "Nombre del Webhook",
+  "webhook-token": "Token (opcional para la autenticación)",
   "outgoing-webhooks": "Webhooks salientes",
   "outgoing-webhooks": "Webhooks salientes",
+  "bidirectional-webhooks": "Webhooks de doble sentido",
   "outgoingWebhooksPopup-title": "Webhooks salientes",
   "outgoingWebhooksPopup-title": "Webhooks salientes",
   "boardCardTitlePopup-title": "Filtro de títulos de tarjeta",
   "boardCardTitlePopup-title": "Filtro de títulos de tarjeta",
+  "disable-webhook": "Deshabilitar este Webhook",
+  "global-webhook": "Webhooks globales",
   "new-outgoing-webhook": "Nuevo webhook saliente",
   "new-outgoing-webhook": "Nuevo webhook saliente",
   "no-name": "(Desconocido)",
   "no-name": "(Desconocido)",
   "Node_version": "Versión de Node",
   "Node_version": "Versión de Node",
@@ -723,12 +740,16 @@
   "almostdue": "está próxima la hora de vencimiento actual %s",
   "almostdue": "está próxima la hora de vencimiento actual %s",
   "pastdue": "se sobrepasó la hora de vencimiento actual%s",
   "pastdue": "se sobrepasó la hora de vencimiento actual%s",
   "duenow": "la hora de vencimiento actual %s es hoy",
   "duenow": "la hora de vencimiento actual %s es hoy",
-  "act-withDue": "__card__ notificaciones de vencimiento [__board__]",
+  "act-newDue": "__list__/__card__ tiene una 1ra notificación de vencimiento [__board__]",
+  "act-withDue": "__list__/__card__ notificaciones de vencimiento [__board__]",
   "act-almostdue": "se ha notificado que el vencimiento actual (__timeValue__) de __card__ está próximo",
   "act-almostdue": "se ha notificado que el vencimiento actual (__timeValue__) de __card__ está próximo",
   "act-pastdue": "se ha notificado que el vencimiento actual (__timeValue__) de __card__ se sobrepasó",
   "act-pastdue": "se ha notificado que el vencimiento actual (__timeValue__) de __card__ se sobrepasó",
   "act-duenow": "se ha notificado que el vencimiento actual (__timeValue__) de __card__ es ahora",
   "act-duenow": "se ha notificado que el vencimiento actual (__timeValue__) de __card__ es ahora",
-  "act-atUserComment": "Te mencionaron en [__board__] __card__",
+  "act-atUserComment": "Se te mencionó en [__board__] __list__/__card__",
   "delete-user-confirm-popup": "¿Seguro que quieres eliminar esta cuenta? Esta acción no puede deshacerse.",
   "delete-user-confirm-popup": "¿Seguro que quieres eliminar esta cuenta? Esta acción no puede deshacerse.",
   "accounts-allowUserDelete": "Permitir a los usuarios eliminar su cuenta",
   "accounts-allowUserDelete": "Permitir a los usuarios eliminar su cuenta",
-  "hide-minicard-label-text": "Ocultar el texto de la etiqueta de la minitarjeta"
+  "hide-minicard-label-text": "Ocultar el texto de la etiqueta de la minitarjeta",
+  "show-desktop-drag-handles": "Mostrar los controles de arrastre del escritorio",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 26 - 5
i18n/eu.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Aldatu ikusgaitasuna",
   "boardChangeVisibilityPopup-title": "Aldatu ikusgaitasuna",
   "boardChangeWatchPopup-title": "Aldatu ikuskatzea",
   "boardChangeWatchPopup-title": "Aldatu ikuskatzea",
   "boardMenuPopup-title": "Board Settings",
   "boardMenuPopup-title": "Board Settings",
+  "boardChangeViewPopup-title": "Board View",
   "boards": "Arbelak",
   "boards": "Arbelak",
   "board-view": "Board View",
   "board-view": "Board View",
   "board-view-cal": "Calendar",
   "board-view-cal": "Calendar",
   "board-view-swimlanes": "Swimlanes",
   "board-view-swimlanes": "Swimlanes",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Zerrendak",
   "board-view-lists": "Zerrendak",
   "bucket-example": "Esaterako \"Pertz zerrenda\"",
   "bucket-example": "Esaterako \"Pertz zerrenda\"",
   "cancel": "Utzi",
   "cancel": "Utzi",
@@ -300,8 +302,18 @@
   "error-username-taken": "Erabiltzaile-izen hori hartuta dago",
   "error-username-taken": "Erabiltzaile-izen hori hartuta dago",
   "error-email-taken": "E-mail hori hartuta dago",
   "error-email-taken": "E-mail hori hartuta dago",
   "export-board": "Esportatu arbela",
   "export-board": "Esportatu arbela",
+  "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": "Iragazi",
   "filter": "Iragazi",
-  "filter-cards": "Iragazi txartelak",
+  "filter-cards": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Garbitu iragazkia",
   "filter-clear": "Garbitu iragazkia",
   "filter-no-label": "Etiketarik ez",
   "filter-no-label": "Etiketarik ez",
   "filter-no-member": "Kiderik ez",
   "filter-no-member": "Kiderik ez",
@@ -426,7 +438,7 @@
   "save": "Gorde",
   "save": "Gorde",
   "search": "Bilatu",
   "search": "Bilatu",
   "rules": "Rules",
   "rules": "Rules",
-  "search-cards": "Search from card titles and descriptions on this board",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Text to search for?",
   "search-example": "Text to search for?",
   "select-color": "Aukeratu kolorea",
   "select-color": "Aukeratu kolorea",
   "set-wip-limit-value": "Zerrenda honetako atazen muga maximoa ezarri",
   "set-wip-limit-value": "Zerrenda honetako atazen muga maximoa ezarri",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "Arrakastaz bidali duzu posta elektroniko mezua",
   "email-smtp-test-text": "Arrakastaz bidali duzu posta elektroniko mezua",
   "error-invitation-code-not-exist": "Gonbidapen kodea ez da existitzen",
   "error-invitation-code-not-exist": "Gonbidapen kodea ez da existitzen",
   "error-notAuthorized": "Ez duzu orri hau ikusteko baimenik.",
   "error-notAuthorized": "Ez duzu orri hau ikusteko baimenik.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Irteerako Webhook-ak",
   "outgoing-webhooks": "Irteerako Webhook-ak",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Irteerako Webhook-ak",
   "outgoingWebhooksPopup-title": "Irteerako Webhook-ak",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "Irteera-webhook berria",
   "new-outgoing-webhook": "Irteera-webhook berria",
   "no-name": "(Ezezaguna)",
   "no-name": "(Ezezaguna)",
   "Node_version": "Nodo bertsioa",
   "Node_version": "Nodo bertsioa",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 26 - 5
i18n/fa.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "تغییر وضعیت نمایش",
   "boardChangeVisibilityPopup-title": "تغییر وضعیت نمایش",
   "boardChangeWatchPopup-title": "تغییر دیده بانی",
   "boardChangeWatchPopup-title": "تغییر دیده بانی",
   "boardMenuPopup-title": "Board Settings",
   "boardMenuPopup-title": "Board Settings",
+  "boardChangeViewPopup-title": "نمایش تخته",
   "boards": "تخته‌ها",
   "boards": "تخته‌ها",
   "board-view": "نمایش تخته",
   "board-view": "نمایش تخته",
   "board-view-cal": "تقویم",
   "board-view-cal": "تقویم",
   "board-view-swimlanes": "Swimlanes",
   "board-view-swimlanes": "Swimlanes",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "فهرست‌ها",
   "board-view-lists": "فهرست‌ها",
   "bucket-example": "برای مثال چیزی شبیه \"لیست سبدها\"",
   "bucket-example": "برای مثال چیزی شبیه \"لیست سبدها\"",
   "cancel": "انصراف",
   "cancel": "انصراف",
@@ -300,8 +302,18 @@
   "error-username-taken": "این نام کاربری استفاده شده است",
   "error-username-taken": "این نام کاربری استفاده شده است",
   "error-email-taken": "رایانامه توسط گیرنده دریافت شده است",
   "error-email-taken": "رایانامه توسط گیرنده دریافت شده است",
   "export-board": "انتقال به بیرون تخته",
   "export-board": "انتقال به بیرون تخته",
+  "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": "صافی ـFilterـ",
-  "filter-cards": "صافی ـFilterـ کارت‌ها",
+  "filter-cards": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "حذف صافی ـFilterـ",
   "filter-clear": "حذف صافی ـFilterـ",
   "filter-no-label": "بدون برچسب",
   "filter-no-label": "بدون برچسب",
   "filter-no-member": "بدون عضو",
   "filter-no-member": "بدون عضو",
@@ -426,7 +438,7 @@
   "save": "ذخیره",
   "save": "ذخیره",
   "search": "جستجو",
   "search": "جستجو",
   "rules": "قوانین",
   "rules": "قوانین",
-  "search-cards": "جستجو در میان عناوین و توضیحات در این تخته",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "متن مورد جستجو؟",
   "search-example": "متن مورد جستجو؟",
   "select-color": "انتخاب رنگ",
   "select-color": "انتخاب رنگ",
   "set-wip-limit-value": "تعیین بیشینه تعداد وظایف در این فهرست",
   "set-wip-limit-value": "تعیین بیشینه تعداد وظایف در این فهرست",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "با موفقیت، یک رایانامه را فرستادید",
   "email-smtp-test-text": "با موفقیت، یک رایانامه را فرستادید",
   "error-invitation-code-not-exist": "چنین کد دعوتی یافت نشد",
   "error-invitation-code-not-exist": "چنین کد دعوتی یافت نشد",
   "error-notAuthorized": "شما مجاز به دیدن این صفحه نیستید.",
   "error-notAuthorized": "شما مجاز به دیدن این صفحه نیستید.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Outgoing Webhooks",
   "outgoing-webhooks": "Outgoing Webhooks",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "boardCardTitlePopup-title": "فیلتر موضوع کارت",
   "boardCardTitlePopup-title": "فیلتر موضوع کارت",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "no-name": "(ناشناخته)",
   "no-name": "(ناشناخته)",
   "Node_version": "نسخه Node",
   "Node_version": "نسخه Node",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "به شما در  [__board__] __card__ اشاره شده",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 26 - 5
i18n/fi.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Muokkaa näkyvyyttä",
   "boardChangeVisibilityPopup-title": "Muokkaa näkyvyyttä",
   "boardChangeWatchPopup-title": "Muokkaa seuraamista",
   "boardChangeWatchPopup-title": "Muokkaa seuraamista",
   "boardMenuPopup-title": "Tauluasetukset",
   "boardMenuPopup-title": "Tauluasetukset",
+  "boardChangeViewPopup-title": "Taulunäkymä",
   "boards": "Taulut",
   "boards": "Taulut",
   "board-view": "Taulunäkymä",
   "board-view": "Taulunäkymä",
   "board-view-cal": "Kalenteri",
   "board-view-cal": "Kalenteri",
   "board-view-swimlanes": "Swimlanet",
   "board-view-swimlanes": "Swimlanet",
+  "board-view-collapse": "Pienennä",
   "board-view-lists": "Listat",
   "board-view-lists": "Listat",
   "bucket-example": "Kuten “Laatikko lista” esimerkiksi",
   "bucket-example": "Kuten “Laatikko lista” esimerkiksi",
   "cancel": "Peruuta",
   "cancel": "Peruuta",
@@ -300,8 +302,18 @@
   "error-username-taken": "Tämä käyttäjätunnus on jo käytössä",
   "error-username-taken": "Tämä käyttäjätunnus on jo käytössä",
   "error-email-taken": "Sähköpostiosoite on jo käytössä",
   "error-email-taken": "Sähköpostiosoite on jo käytössä",
   "export-board": "Vie taulu",
   "export-board": "Vie taulu",
+  "sort": "Lajittele",
+  "sort-desc": "Klikkaa lajitellaksesi listan",
+  "list-sort-by": "Lajittele lista:",
+  "list-label-modifiedAt": "Viimeinen käyttöaika",
+  "list-label-title": "Listan nimi",
+  "list-label-sort": "Oma manuaalinen järjestys",
+  "list-label-short-modifiedAt": "(L)",
+  "list-label-short-title": "(N)",
+  "list-label-short-sort": "(M)",
   "filter": "Suodata",
   "filter": "Suodata",
-  "filter-cards": "Suodata kortit",
+  "filter-cards": "Suodata kortit tai listat",
+  "list-filter-label": "Suodata listat otsikon mukaan",
   "filter-clear": "Poista suodatin",
   "filter-clear": "Poista suodatin",
   "filter-no-label": "Ei tunnistetta",
   "filter-no-label": "Ei tunnistetta",
   "filter-no-member": "Ei jäseniä",
   "filter-no-member": "Ei jäseniä",
@@ -426,7 +438,7 @@
   "save": "Tallenna",
   "save": "Tallenna",
   "search": "Etsi",
   "search": "Etsi",
   "rules": "Säännöt",
   "rules": "Säännöt",
-  "search-cards": "Etsi korttien otsikoista ja kuvauksista tällä taululla",
+  "search-cards": "Etsi kortin/listan otsikoista ja kuvauksista tällä taululla",
   "search-example": "Etsittävä teksti?",
   "search-example": "Etsittävä teksti?",
   "select-color": "Valitse väri",
   "select-color": "Valitse väri",
   "set-wip-limit-value": "Aseta tämän listan tehtävien enimmäismäärä",
   "set-wip-limit-value": "Aseta tämän listan tehtävien enimmäismäärä",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "Olet onnistuneesti lähettänyt sähköpostin",
   "email-smtp-test-text": "Olet onnistuneesti lähettänyt sähköpostin",
   "error-invitation-code-not-exist": "Kutsukoodia ei ole olemassa",
   "error-invitation-code-not-exist": "Kutsukoodia ei ole olemassa",
   "error-notAuthorized": "Sinulla ei ole oikeutta tarkastella tätä sivua.",
   "error-notAuthorized": "Sinulla ei ole oikeutta tarkastella tätä sivua.",
+  "webhook-title": "Webkoukun nimi",
+  "webhook-token": "Token (Valinnainen autentikoinnissa)",
   "outgoing-webhooks": "Lähtevät Webkoukut",
   "outgoing-webhooks": "Lähtevät Webkoukut",
+  "bidirectional-webhooks": "Kaksisuuntaiset Webkoukut",
   "outgoingWebhooksPopup-title": "Lähtevät Webkoukut",
   "outgoingWebhooksPopup-title": "Lähtevät Webkoukut",
   "boardCardTitlePopup-title": "Kortin otsikkosuodatin",
   "boardCardTitlePopup-title": "Kortin otsikkosuodatin",
+  "disable-webhook": "Poista käytöstä tämä Webkoukku",
+  "global-webhook": "Kaikenkattavat Webkoukut",
   "new-outgoing-webhook": "Uusi lähtevä Webkoukku",
   "new-outgoing-webhook": "Uusi lähtevä Webkoukku",
   "no-name": "(Tuntematon)",
   "no-name": "(Tuntematon)",
   "Node_version": "Node-versio",
   "Node_version": "Node-versio",
@@ -723,12 +740,16 @@
   "almostdue": "nykyinen eräaika %s lähestyy",
   "almostdue": "nykyinen eräaika %s lähestyy",
   "pastdue": "nykyinen eräaika %s on mennyt",
   "pastdue": "nykyinen eräaika %s on mennyt",
   "duenow": "nykyinen eräaika %s on tänään",
   "duenow": "nykyinen eräaika %s on tänään",
-  "act-withDue": "__card__ eräaika muistutukset [__board__]",
+  "act-newDue": "__list__/__card__ on 1. erääntymismuistutus [__board__]",
+  "act-withDue": "__list__/__card__ erääntymismuistutukset [__board__]",
   "act-almostdue": "muistutti nykyisen eräajan (__timeValue__) kortilla __card__ lähestyvän",
   "act-almostdue": "muistutti nykyisen eräajan (__timeValue__) kortilla __card__ lähestyvän",
   "act-pastdue": "muistutti nykyisen eräajan (__timeValue__) kortilla __card__ menneen",
   "act-pastdue": "muistutti nykyisen eräajan (__timeValue__) kortilla __card__ menneen",
   "act-duenow": "muistutti nykyisen eräajan (__timeValue__) kortilla __card__ olevan nyt",
   "act-duenow": "muistutti nykyisen eräajan (__timeValue__) kortilla __card__ olevan nyt",
-  "act-atUserComment": "Sinut mainittiin [__board__] __card__",
+  "act-atUserComment": "Sinut mainittiin [__board__] __list__/__card__",
   "delete-user-confirm-popup": "Haluatko varmasti poistaa tämän käyttäjätilin? Tätä ei voi peruuttaa.",
   "delete-user-confirm-popup": "Haluatko varmasti poistaa tämän käyttäjätilin? Tätä ei voi peruuttaa.",
   "accounts-allowUserDelete": "Salli käyttäjien poistaa tilinsä itse",
   "accounts-allowUserDelete": "Salli käyttäjien poistaa tilinsä itse",
-  "hide-minicard-label-text": "Piilota minikortin tunniste teksti"
+  "hide-minicard-label-text": "Piilota minikortin tunniste teksti",
+  "show-desktop-drag-handles": "Näytä työpöydän vedon kahvat",
+  "assignee": "Valtuutettu",
+  "cardAssigneesPopup-title": "Valtuutettu"
 }
 }

+ 26 - 5
i18n/fr.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Changer la visibilité",
   "boardChangeVisibilityPopup-title": "Changer la visibilité",
   "boardChangeWatchPopup-title": "Modifier le suivi",
   "boardChangeWatchPopup-title": "Modifier le suivi",
   "boardMenuPopup-title": "Paramètres du tableau",
   "boardMenuPopup-title": "Paramètres du tableau",
+  "boardChangeViewPopup-title": "Vue du tableau",
   "boards": "Tableaux",
   "boards": "Tableaux",
   "board-view": "Vue du tableau",
   "board-view": "Vue du tableau",
   "board-view-cal": "Calendrier",
   "board-view-cal": "Calendrier",
   "board-view-swimlanes": "Couloirs",
   "board-view-swimlanes": "Couloirs",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Listes",
   "board-view-lists": "Listes",
   "bucket-example": "Comme « todo list » par exemple",
   "bucket-example": "Comme « todo list » par exemple",
   "cancel": "Annuler",
   "cancel": "Annuler",
@@ -300,8 +302,18 @@
   "error-username-taken": "Ce nom d'utilisateur est déjà utilisé",
   "error-username-taken": "Ce nom d'utilisateur est déjà utilisé",
   "error-email-taken": "Cette adresse mail est déjà utilisée",
   "error-email-taken": "Cette adresse mail est déjà utilisée",
   "export-board": "Exporter le tableau",
   "export-board": "Exporter le tableau",
+  "sort": "Tri",
+  "sort-desc": "Cliquez pour trier la liste",
+  "list-sort-by": "Trier la liste par:",
+  "list-label-modifiedAt": "Dernier accès",
+  "list-label-title": "Nom de liste",
+  "list-label-sort": "Votre manuel",
+  "list-label-short-modifiedAt": "(D)",
+  "list-label-short-title": "(N)",
+  "list-label-short-sort": "(M)",
   "filter": "Filtrer",
   "filter": "Filtrer",
-  "filter-cards": "Filtrer les cartes",
+  "filter-cards": "Filtrer les cartes ou listes",
+  "list-filter-label": "Filtrer la liste par titre",
   "filter-clear": "Supprimer les filtres",
   "filter-clear": "Supprimer les filtres",
   "filter-no-label": "Aucune étiquette",
   "filter-no-label": "Aucune étiquette",
   "filter-no-member": "Aucun participant",
   "filter-no-member": "Aucun participant",
@@ -426,7 +438,7 @@
   "save": "Enregistrer",
   "save": "Enregistrer",
   "search": "Chercher",
   "search": "Chercher",
   "rules": "Règles",
   "rules": "Règles",
-  "search-cards": "Rechercher parmi les titres et descriptions des cartes de ce tableau",
+  "search-cards": "Chercher selon les titres de carte/liste et descriptions de ce tableau",
   "search-example": "Texte à rechercher ?",
   "search-example": "Texte à rechercher ?",
   "select-color": "Sélectionner une couleur",
   "select-color": "Sélectionner une couleur",
   "set-wip-limit-value": "Définit une limite maximale au nombre de cartes de cette liste",
   "set-wip-limit-value": "Définit une limite maximale au nombre de cartes de cette liste",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "Vous avez envoyé un mail avec succès",
   "email-smtp-test-text": "Vous avez envoyé un mail avec succès",
   "error-invitation-code-not-exist": "Ce code d'invitation n'existe pas.",
   "error-invitation-code-not-exist": "Ce code d'invitation n'existe pas.",
   "error-notAuthorized": "Vous n'êtes pas autorisé à accéder à cette page.",
   "error-notAuthorized": "Vous n'êtes pas autorisé à accéder à cette page.",
+  "webhook-title": "Nom du webhook",
+  "webhook-token": "Jeton (optionnel pour l'authentification)",
   "outgoing-webhooks": "Webhooks sortants",
   "outgoing-webhooks": "Webhooks sortants",
+  "bidirectional-webhooks": "Webhooks bidirectionnels",
   "outgoingWebhooksPopup-title": "Webhooks sortants",
   "outgoingWebhooksPopup-title": "Webhooks sortants",
   "boardCardTitlePopup-title": "Filtre par titre de carte",
   "boardCardTitlePopup-title": "Filtre par titre de carte",
+  "disable-webhook": "Désactiver ce webhook",
+  "global-webhook": "Webhooks globaux",
   "new-outgoing-webhook": "Nouveau webhook sortant",
   "new-outgoing-webhook": "Nouveau webhook sortant",
   "no-name": "(Inconnu)",
   "no-name": "(Inconnu)",
   "Node_version": "Version de Node",
   "Node_version": "Version de Node",
@@ -723,12 +740,16 @@
   "almostdue": "La date d'échéance %s approche",
   "almostdue": "La date d'échéance %s approche",
   "pastdue": "La date d'échéance %s est passée",
   "pastdue": "La date d'échéance %s est passée",
   "duenow": "La date d'échéance %s est aujourd'hui",
   "duenow": "La date d'échéance %s est aujourd'hui",
-  "act-withDue": "__card__ rappel d'échéance [__board__]",
+  "act-newDue": "__list__/__card__ a un 1er rappel d'échéance [__board__]",
+  "act-withDue": "__list__/__card__ rappel d'échéance [__board__]",
   "act-almostdue": "rappelle que l'échéance (__timeValue__) de __card__ approche",
   "act-almostdue": "rappelle que l'échéance (__timeValue__) de __card__ approche",
   "act-pastdue": "rappelle que l'échéance (__timeValue__) de __card__  est passée",
   "act-pastdue": "rappelle que l'échéance (__timeValue__) de __card__  est passée",
   "act-duenow": "rappelle que l'échéance (__timeValue__) de __card__ est maintenant",
   "act-duenow": "rappelle que l'échéance (__timeValue__) de __card__ est maintenant",
-  "act-atUserComment": "Vous avez été mentionné dans [__board__] __card__",
+  "act-atUserComment": "Vous avez été mentionné dans [__board__] __list__/__card__",
   "delete-user-confirm-popup": "Êtes-vous sûr de vouloir supprimer ce compte ? Cette opération ne peut pas être annulée. ",
   "delete-user-confirm-popup": "Êtes-vous sûr de vouloir supprimer ce compte ? Cette opération ne peut pas être annulée. ",
   "accounts-allowUserDelete": "Autoriser les utilisateurs à supprimer leur compte",
   "accounts-allowUserDelete": "Autoriser les utilisateurs à supprimer leur compte",
-  "hide-minicard-label-text": "Cacher le label de la minicarte"
+  "hide-minicard-label-text": "Cacher le label de la minicarte",
+  "show-desktop-drag-handles": "Voir les poignées de déplacement du bureau",
+  "assignee": "Cessionnaire",
+  "cardAssigneesPopup-title": "Cessionnaire"
 }
 }

+ 26 - 5
i18n/gl.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeWatchPopup-title": "Change Watch",
   "boardChangeWatchPopup-title": "Change Watch",
   "boardMenuPopup-title": "Board Settings",
   "boardMenuPopup-title": "Board Settings",
+  "boardChangeViewPopup-title": "Board View",
   "boards": "Taboleiros",
   "boards": "Taboleiros",
   "board-view": "Board View",
   "board-view": "Board View",
   "board-view-cal": "Calendar",
   "board-view-cal": "Calendar",
   "board-view-swimlanes": "Swimlanes",
   "board-view-swimlanes": "Swimlanes",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Listas",
   "board-view-lists": "Listas",
   "bucket-example": "Like “Bucket List” for example",
   "bucket-example": "Like “Bucket List” for example",
   "cancel": "Cancelar",
   "cancel": "Cancelar",
@@ -300,8 +302,18 @@
   "error-username-taken": "Este nome de usuario xa está collido",
   "error-username-taken": "Este nome de usuario xa está collido",
   "error-email-taken": "Email has already been taken",
   "error-email-taken": "Email has already been taken",
   "export-board": "Exportar taboleiro",
   "export-board": "Exportar taboleiro",
+  "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": "Filtro",
   "filter": "Filtro",
-  "filter-cards": "Filtrar tarxetas",
+  "filter-cards": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Limpar filtro",
   "filter-clear": "Limpar filtro",
   "filter-no-label": "Non hai etiquetas",
   "filter-no-label": "Non hai etiquetas",
   "filter-no-member": "Non hai membros",
   "filter-no-member": "Non hai membros",
@@ -426,7 +438,7 @@
   "save": "Save",
   "save": "Save",
   "search": "Search",
   "search": "Search",
   "rules": "Rules",
   "rules": "Rules",
-  "search-cards": "Search from card titles and descriptions on this board",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Text to search for?",
   "search-example": "Text to search for?",
   "select-color": "Select Color",
   "select-color": "Select Color",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "You have successfully sent an email",
   "email-smtp-test-text": "You have successfully sent an email",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-notAuthorized": "You are not authorized to view this page.",
   "error-notAuthorized": "You are not authorized to view this page.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Outgoing Webhooks",
   "outgoing-webhooks": "Outgoing Webhooks",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "no-name": "(Unknown)",
   "no-name": "(Unknown)",
   "Node_version": "Node version",
   "Node_version": "Node version",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 26 - 5
i18n/he.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "שינוי מצב הצגה",
   "boardChangeVisibilityPopup-title": "שינוי מצב הצגה",
   "boardChangeWatchPopup-title": "שינוי הגדרת המעקב",
   "boardChangeWatchPopup-title": "שינוי הגדרת המעקב",
   "boardMenuPopup-title": "הגדרות לוח",
   "boardMenuPopup-title": "הגדרות לוח",
+  "boardChangeViewPopup-title": "תצוגת לוח",
   "boards": "לוחות",
   "boards": "לוחות",
   "board-view": "תצוגת לוח",
   "board-view": "תצוגת לוח",
   "board-view-cal": "לוח שנה",
   "board-view-cal": "לוח שנה",
   "board-view-swimlanes": "מסלולים",
   "board-view-swimlanes": "מסלולים",
+  "board-view-collapse": "צמצום",
   "board-view-lists": "רשימות",
   "board-view-lists": "רשימות",
   "bucket-example": "כמו למשל „רשימת המשימות“",
   "bucket-example": "כמו למשל „רשימת המשימות“",
   "cancel": "ביטול",
   "cancel": "ביטול",
@@ -300,8 +302,18 @@
   "error-username-taken": "המשתמש כבר קיים במערכת",
   "error-username-taken": "המשתמש כבר קיים במערכת",
   "error-email-taken": "כתובת הדוא״ל כבר נמצאת בשימוש",
   "error-email-taken": "כתובת הדוא״ל כבר נמצאת בשימוש",
   "export-board": "ייצוא לוח",
   "export-board": "ייצוא לוח",
+  "sort": "מיון",
+  "sort-desc": "לחיצה למיון הרשימה",
+  "list-sort-by": "מיון הרשימה לפי:",
+  "list-label-modifiedAt": "מועד הגישה האחרון:",
+  "list-label-title": "שם הרשימה",
+  "list-label-sort": "סדר ידני משלך",
+  "list-label-short-modifiedAt": "(ג)",
+  "list-label-short-title": "(ש)",
+  "list-label-short-sort": "(י)",
   "filter": "מסנן",
   "filter": "מסנן",
-  "filter-cards": "סינון כרטיסים",
+  "filter-cards": "סינון כרטיסים או רשימות",
+  "list-filter-label": "סינון רשימה לפי כותרת",
   "filter-clear": "ניקוי המסנן",
   "filter-clear": "ניקוי המסנן",
   "filter-no-label": "אין תווית",
   "filter-no-label": "אין תווית",
   "filter-no-member": "אין חבר כזה",
   "filter-no-member": "אין חבר כזה",
@@ -426,7 +438,7 @@
   "save": "שמירה",
   "save": "שמירה",
   "search": "חיפוש",
   "search": "חיפוש",
   "rules": "כללים",
   "rules": "כללים",
-  "search-cards": "חיפוש אחר כותרות ותיאורים של כרטיסים בלוח זה",
+  "search-cards": "חיפוש בין כותרות של כרטיסים/רשימות ותיאורים בלוח זה",
   "search-example": "טקסט לחיפוש ?",
   "search-example": "טקסט לחיפוש ?",
   "select-color": "בחירת צבע",
   "select-color": "בחירת צבע",
   "set-wip-limit-value": "הגדרת מגבלה למספר המרבי של משימות ברשימה זו",
   "set-wip-limit-value": "הגדרת מגבלה למספר המרבי של משימות ברשימה זו",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "שלחת הודעת דוא״ל בהצלחה",
   "email-smtp-test-text": "שלחת הודעת דוא״ל בהצלחה",
   "error-invitation-code-not-exist": "קוד ההזמנה אינו קיים",
   "error-invitation-code-not-exist": "קוד ההזמנה אינו קיים",
   "error-notAuthorized": "אין לך הרשאה לצפות בעמוד זה.",
   "error-notAuthorized": "אין לך הרשאה לצפות בעמוד זה.",
+  "webhook-title": "שם ההתלייה",
+  "webhook-token": "אסימון (כרשות לצורך אימות)",
   "outgoing-webhooks": "קרסי רשת יוצאים",
   "outgoing-webhooks": "קרסי רשת יוצאים",
+  "bidirectional-webhooks": "התליות דו־כיווניות",
   "outgoingWebhooksPopup-title": "קרסי רשת יוצאים",
   "outgoingWebhooksPopup-title": "קרסי רשת יוצאים",
   "boardCardTitlePopup-title": "מסנן כותרת כרטיס",
   "boardCardTitlePopup-title": "מסנן כותרת כרטיס",
+  "disable-webhook": "השבתת ההתלייה הזאת",
+  "global-webhook": "התליות גלובליות",
   "new-outgoing-webhook": "קרסי רשת יוצאים חדשים",
   "new-outgoing-webhook": "קרסי רשת יוצאים חדשים",
   "no-name": "(לא ידוע)",
   "no-name": "(לא ידוע)",
   "Node_version": "גרסת Node",
   "Node_version": "גרסת Node",
@@ -723,12 +740,16 @@
   "almostdue": "מועד היעד הנוכחי %s מתקרב",
   "almostdue": "מועד היעד הנוכחי %s מתקרב",
   "pastdue": "מועד היעד הנוכחי %s חלף",
   "pastdue": "מועד היעד הנוכחי %s חלף",
   "duenow": "מועד היעד הנוכחי %s הוא היום",
   "duenow": "מועד היעד הנוכחי %s הוא היום",
-  "act-withDue": "__card__ תזכורות למועדי יעד [__board__]",
+  "act-newDue": "__list__/__card__ יש תזכורת ראשונה שתוקפה פג [__board__]",
+  "act-withDue": "__list__/__card__ יש תזכורות שתוקפן פג [__board__]",
   "act-almostdue": "הזכירה שמועד היעד הנוכחי (__timeValue__) של __card__ מתקרב",
   "act-almostdue": "הזכירה שמועד היעד הנוכחי (__timeValue__) של __card__ מתקרב",
   "act-pastdue": "הזכירה שמועד היעד הנוכחי (__timeValue__) של __card__ חלף",
   "act-pastdue": "הזכירה שמועד היעד הנוכחי (__timeValue__) של __card__ חלף",
   "act-duenow": "הזכירה שמועד היעד הנוכחי (__timeValue__) של __card__ הוא עכשיו",
   "act-duenow": "הזכירה שמועד היעד הנוכחי (__timeValue__) של __card__ הוא עכשיו",
-  "act-atUserComment": "אוזכרת תחת [__board__] __card__",
+  "act-atUserComment": "אוזכרת תחת [__board__] __list__/__card__",
   "delete-user-confirm-popup": "למחוק את החשבון הזה? אי אפשר לבטל.",
   "delete-user-confirm-popup": "למחוק את החשבון הזה? אי אפשר לבטל.",
   "accounts-allowUserDelete": "לאפשר למשתמשים למחוק את החשבונות של עצמם",
   "accounts-allowUserDelete": "לאפשר למשתמשים למחוק את החשבונות של עצמם",
-  "hide-minicard-label-text": "הסתרת טקסט התווית של מיני כרטיס"
+  "hide-minicard-label-text": "הסתרת טקסט התווית של מיני כרטיס",
+  "show-desktop-drag-handles": "הצגת ידיות גרירה של שולחן העבודה",
+  "assignee": "גורם אחראי",
+  "cardAssigneesPopup-title": "גורם אחראי"
 }
 }

+ 26 - 5
i18n/hi.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "दृश्यता बदलें",
   "boardChangeVisibilityPopup-title": "दृश्यता बदलें",
   "boardChangeWatchPopup-title": "बदलें वॉच",
   "boardChangeWatchPopup-title": "बदलें वॉच",
   "boardMenuPopup-title": "बोर्ड सेटिंग्स",
   "boardMenuPopup-title": "बोर्ड सेटिंग्स",
+  "boardChangeViewPopup-title": "बोर्ड दृष्टिकोण",
   "boards": "बोर्डों",
   "boards": "बोर्डों",
   "board-view": "बोर्ड दृष्टिकोण",
   "board-view": "बोर्ड दृष्टिकोण",
   "board-view-cal": "तिथि-पत्र",
   "board-view-cal": "तिथि-पत्र",
   "board-view-swimlanes": "तैरना",
   "board-view-swimlanes": "तैरना",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "सूचियाँ",
   "board-view-lists": "सूचियाँ",
   "bucket-example": "उदाहरण के लिए “बाल्टी सूची” की तरह",
   "bucket-example": "उदाहरण के लिए “बाल्टी सूची” की तरह",
   "cancel": "रद्द करें",
   "cancel": "रद्द करें",
@@ -300,8 +302,18 @@
   "error-username-taken": "यह username is already taken",
   "error-username-taken": "यह username is already taken",
   "error-email-taken": "Email has already been taken",
   "error-email-taken": "Email has already been taken",
   "export-board": "Export बोर्ड",
   "export-board": "Export बोर्ड",
+  "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": "Filter",
-  "filter-cards": "Filter कार्ड",
+  "filter-cards": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Clear filter",
   "filter-clear": "Clear filter",
   "filter-no-label": "No label",
   "filter-no-label": "No label",
   "filter-no-member": "No सदस्य",
   "filter-no-member": "No सदस्य",
@@ -426,7 +438,7 @@
   "save": "Save",
   "save": "Save",
   "search": "Search",
   "search": "Search",
   "rules": "Rules",
   "rules": "Rules",
-  "search-cards": "Search से कार्ड titles और descriptions इस पर बोर्ड",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Text तक search for?",
   "search-example": "Text तक search for?",
   "select-color": "Select Color",
   "select-color": "Select Color",
   "set-wip-limit-value": "Set एक limit for the maximum number of tasks अंदर में  यह list",
   "set-wip-limit-value": "Set एक limit for the maximum number of tasks अंदर में  यह list",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "You have successfully प्रेषित an email",
   "email-smtp-test-text": "You have successfully प्रेषित an email",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-notAuthorized": "You are not authorized तक  आलोकन  यह page.",
   "error-notAuthorized": "You are not authorized तक  आलोकन  यह page.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Outgoing Webhooks",
   "outgoing-webhooks": "Outgoing Webhooks",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "no-name": "(Unknown)",
   "no-name": "(Unknown)",
   "Node_version": "Node version",
   "Node_version": "Node version",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 26 - 5
i18n/hu.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Láthatóság megváltoztatása",
   "boardChangeVisibilityPopup-title": "Láthatóság megváltoztatása",
   "boardChangeWatchPopup-title": "Megfigyelés megváltoztatása",
   "boardChangeWatchPopup-title": "Megfigyelés megváltoztatása",
   "boardMenuPopup-title": "Tábla beállítások",
   "boardMenuPopup-title": "Tábla beállítások",
+  "boardChangeViewPopup-title": "Tábla nézet",
   "boards": "Táblák",
   "boards": "Táblák",
   "board-view": "Tábla nézet",
   "board-view": "Tábla nézet",
   "board-view-cal": "Naptár",
   "board-view-cal": "Naptár",
   "board-view-swimlanes": "Swimlanes",
   "board-view-swimlanes": "Swimlanes",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Listák",
   "board-view-lists": "Listák",
   "bucket-example": "Mint például „Bakancslista”",
   "bucket-example": "Mint például „Bakancslista”",
   "cancel": "Mégse",
   "cancel": "Mégse",
@@ -300,8 +302,18 @@
   "error-username-taken": "Ez a felhasználónév már foglalt",
   "error-username-taken": "Ez a felhasználónév már foglalt",
   "error-email-taken": "Az e-mail már foglalt",
   "error-email-taken": "Az e-mail már foglalt",
   "export-board": "Tábla exportálása",
   "export-board": "Tábla exportálása",
+  "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": "Szűrő",
   "filter": "Szűrő",
-  "filter-cards": "Kártyák szűrése",
+  "filter-cards": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Szűrő törlése",
   "filter-clear": "Szűrő törlése",
   "filter-no-label": "Nincs címke",
   "filter-no-label": "Nincs címke",
   "filter-no-member": "Nincs tag",
   "filter-no-member": "Nincs tag",
@@ -426,7 +438,7 @@
   "save": "Mentés",
   "save": "Mentés",
   "search": "Keresés",
   "search": "Keresés",
   "rules": "Rules",
   "rules": "Rules",
-  "search-cards": "Keresés a táblán lévő kártyák címében illetve leírásában",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "keresőkifejezés",
   "search-example": "keresőkifejezés",
   "select-color": "Szín kiválasztása",
   "select-color": "Szín kiválasztása",
   "set-wip-limit-value": "Korlát beállítása a listán lévő feladatok legnagyobb számához",
   "set-wip-limit-value": "Korlát beállítása a listán lévő feladatok legnagyobb számához",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "Sikeresen elküldött egy e-mailt",
   "email-smtp-test-text": "Sikeresen elküldött egy e-mailt",
   "error-invitation-code-not-exist": "A meghívási kód nem létezik",
   "error-invitation-code-not-exist": "A meghívási kód nem létezik",
   "error-notAuthorized": "Nincs jogosultsága az oldal megtekintéséhez.",
   "error-notAuthorized": "Nincs jogosultsága az oldal megtekintéséhez.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Kimenő webhurkok",
   "outgoing-webhooks": "Kimenő webhurkok",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Kimenő webhurkok",
   "outgoingWebhooksPopup-title": "Kimenő webhurkok",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "Új kimenő webhurok",
   "new-outgoing-webhook": "Új kimenő webhurok",
   "no-name": "(Ismeretlen)",
   "no-name": "(Ismeretlen)",
   "Node_version": "Node verzió",
   "Node_version": "Node verzió",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 26 - 5
i18n/hy.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeWatchPopup-title": "Change Watch",
   "boardChangeWatchPopup-title": "Change Watch",
   "boardMenuPopup-title": "Board Settings",
   "boardMenuPopup-title": "Board Settings",
+  "boardChangeViewPopup-title": "Board View",
   "boards": "Boards",
   "boards": "Boards",
   "board-view": "Board View",
   "board-view": "Board View",
   "board-view-cal": "Calendar",
   "board-view-cal": "Calendar",
   "board-view-swimlanes": "Swimlanes",
   "board-view-swimlanes": "Swimlanes",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Lists",
   "board-view-lists": "Lists",
   "bucket-example": "Like “Bucket List” for example",
   "bucket-example": "Like “Bucket List” for example",
   "cancel": "Cancel",
   "cancel": "Cancel",
@@ -300,8 +302,18 @@
   "error-username-taken": "This username is already taken",
   "error-username-taken": "This username is already taken",
   "error-email-taken": "Email has already been taken",
   "error-email-taken": "Email has already been taken",
   "export-board": "Export board",
   "export-board": "Export board",
+  "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": "Filter",
-  "filter-cards": "Filter Cards",
+  "filter-cards": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Clear filter",
   "filter-clear": "Clear filter",
   "filter-no-label": "No label",
   "filter-no-label": "No label",
   "filter-no-member": "No member",
   "filter-no-member": "No member",
@@ -426,7 +438,7 @@
   "save": "Save",
   "save": "Save",
   "search": "Search",
   "search": "Search",
   "rules": "Rules",
   "rules": "Rules",
-  "search-cards": "Search from card titles and descriptions on this board",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Text to search for?",
   "search-example": "Text to search for?",
   "select-color": "Select Color",
   "select-color": "Select Color",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "You have successfully sent an email",
   "email-smtp-test-text": "You have successfully sent an email",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-notAuthorized": "You are not authorized to view this page.",
   "error-notAuthorized": "You are not authorized to view this page.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Outgoing Webhooks",
   "outgoing-webhooks": "Outgoing Webhooks",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "no-name": "(Unknown)",
   "no-name": "(Unknown)",
   "Node_version": "Node version",
   "Node_version": "Node version",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 26 - 5
i18n/id.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Ubah Penampakan",
   "boardChangeVisibilityPopup-title": "Ubah Penampakan",
   "boardChangeWatchPopup-title": "Ubah Pengamatan",
   "boardChangeWatchPopup-title": "Ubah Pengamatan",
   "boardMenuPopup-title": "Board Settings",
   "boardMenuPopup-title": "Board Settings",
+  "boardChangeViewPopup-title": "Board View",
   "boards": "Panel",
   "boards": "Panel",
   "board-view": "Board View",
   "board-view": "Board View",
   "board-view-cal": "Calendar",
   "board-view-cal": "Calendar",
   "board-view-swimlanes": "Swimlanes",
   "board-view-swimlanes": "Swimlanes",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Daftar",
   "board-view-lists": "Daftar",
   "bucket-example": "Contohnya seperti “Bucket List” ",
   "bucket-example": "Contohnya seperti “Bucket List” ",
   "cancel": "Batal",
   "cancel": "Batal",
@@ -300,8 +302,18 @@
   "error-username-taken": "Nama pengguna ini sudah dipakai",
   "error-username-taken": "Nama pengguna ini sudah dipakai",
   "error-email-taken": "Email has already been taken",
   "error-email-taken": "Email has already been taken",
   "export-board": "Exspor Panel",
   "export-board": "Exspor Panel",
+  "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": "Penyaringan",
   "filter": "Penyaringan",
-  "filter-cards": "Filter Kartu",
+  "filter-cards": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Bersihkan penyaringan",
   "filter-clear": "Bersihkan penyaringan",
   "filter-no-label": "Tidak ada label",
   "filter-no-label": "Tidak ada label",
   "filter-no-member": "Tidak ada anggota",
   "filter-no-member": "Tidak ada anggota",
@@ -426,7 +438,7 @@
   "save": "Simpan",
   "save": "Simpan",
   "search": "Cari",
   "search": "Cari",
   "rules": "Rules",
   "rules": "Rules",
-  "search-cards": "Search from card titles and descriptions on this board",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Text to search for?",
   "search-example": "Text to search for?",
   "select-color": "Select Color",
   "select-color": "Select Color",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "You have successfully sent an email",
   "email-smtp-test-text": "You have successfully sent an email",
   "error-invitation-code-not-exist": "Kode undangan tidak ada",
   "error-invitation-code-not-exist": "Kode undangan tidak ada",
   "error-notAuthorized": "You are not authorized to view this page.",
   "error-notAuthorized": "You are not authorized to view this page.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Outgoing Webhooks",
   "outgoing-webhooks": "Outgoing Webhooks",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "no-name": "(Unknown)",
   "no-name": "(Unknown)",
   "Node_version": "Node version",
   "Node_version": "Node version",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 26 - 5
i18n/ig.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeWatchPopup-title": "Change Watch",
   "boardChangeWatchPopup-title": "Change Watch",
   "boardMenuPopup-title": "Board Settings",
   "boardMenuPopup-title": "Board Settings",
+  "boardChangeViewPopup-title": "Board View",
   "boards": "Boards",
   "boards": "Boards",
   "board-view": "Board View",
   "board-view": "Board View",
   "board-view-cal": "Calendar",
   "board-view-cal": "Calendar",
   "board-view-swimlanes": "Swimlanes",
   "board-view-swimlanes": "Swimlanes",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Lists",
   "board-view-lists": "Lists",
   "bucket-example": "Like “Bucket List” for example",
   "bucket-example": "Like “Bucket List” for example",
   "cancel": "Cancel",
   "cancel": "Cancel",
@@ -300,8 +302,18 @@
   "error-username-taken": "This username is already taken",
   "error-username-taken": "This username is already taken",
   "error-email-taken": "Email has already been taken",
   "error-email-taken": "Email has already been taken",
   "export-board": "Export board",
   "export-board": "Export board",
+  "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": "Filter",
-  "filter-cards": "Filter Cards",
+  "filter-cards": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Clear filter",
   "filter-clear": "Clear filter",
   "filter-no-label": "No label",
   "filter-no-label": "No label",
   "filter-no-member": "No member",
   "filter-no-member": "No member",
@@ -426,7 +438,7 @@
   "save": "Save",
   "save": "Save",
   "search": "Search",
   "search": "Search",
   "rules": "Rules",
   "rules": "Rules",
-  "search-cards": "Search from card titles and descriptions on this board",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Text to search for?",
   "search-example": "Text to search for?",
   "select-color": "Select Color",
   "select-color": "Select Color",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "You have successfully sent an email",
   "email-smtp-test-text": "You have successfully sent an email",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-notAuthorized": "You are not authorized to view this page.",
   "error-notAuthorized": "You are not authorized to view this page.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Outgoing Webhooks",
   "outgoing-webhooks": "Outgoing Webhooks",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "no-name": "(Unknown)",
   "no-name": "(Unknown)",
   "Node_version": "Node version",
   "Node_version": "Node version",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 41 - 20
i18n/it.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Cambia visibilità",
   "boardChangeVisibilityPopup-title": "Cambia visibilità",
   "boardChangeWatchPopup-title": "Cambia faccia",
   "boardChangeWatchPopup-title": "Cambia faccia",
   "boardMenuPopup-title": "Impostazioni bacheca",
   "boardMenuPopup-title": "Impostazioni bacheca",
+  "boardChangeViewPopup-title": "Visualizza bacheca",
   "boards": "Bacheche",
   "boards": "Bacheche",
   "board-view": "Visualizza bacheca",
   "board-view": "Visualizza bacheca",
   "board-view-cal": "Calendario",
   "board-view-cal": "Calendario",
   "board-view-swimlanes": "Diagramma Swimlane",
   "board-view-swimlanes": "Diagramma Swimlane",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Liste",
   "board-view-lists": "Liste",
   "bucket-example": "Per esempio come \"una lista di cose da fare\"",
   "bucket-example": "Per esempio come \"una lista di cose da fare\"",
   "cancel": "Cancella",
   "cancel": "Cancella",
@@ -300,14 +302,24 @@
   "error-username-taken": "Questo username è già utilizzato",
   "error-username-taken": "Questo username è già utilizzato",
   "error-email-taken": "L'email è già stata presa",
   "error-email-taken": "L'email è già stata presa",
   "export-board": "Esporta bacheca",
   "export-board": "Esporta bacheca",
+  "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": "Filtra",
   "filter": "Filtra",
-  "filter-cards": "Filtra schede",
+  "filter-cards": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Pulisci filtri",
   "filter-clear": "Pulisci filtri",
   "filter-no-label": "Nessuna etichetta",
   "filter-no-label": "Nessuna etichetta",
   "filter-no-member": "Nessun membro",
   "filter-no-member": "Nessun membro",
   "filter-no-custom-fields": "Nessun campo personalizzato",
   "filter-no-custom-fields": "Nessun campo personalizzato",
-  "filter-show-archive": "Show archived lists",
-  "filter-hide-empty": "Hide empty lists",
+  "filter-show-archive": "Mostra le liste archiviate",
+  "filter-hide-empty": "Nascondi liste vuote",
   "filter-on": "Il filtro è attivo",
   "filter-on": "Il filtro è attivo",
   "filter-on-desc": "Stai filtrando le schede su questa bacheca. Clicca qui per modificare il filtro,",
   "filter-on-desc": "Stai filtrando le schede su questa bacheca. Clicca qui per modificare il filtro,",
   "filter-to-selection": "Seleziona",
   "filter-to-selection": "Seleziona",
@@ -426,7 +438,7 @@
   "save": "Salva",
   "save": "Salva",
   "search": "Cerca",
   "search": "Cerca",
   "rules": "Regole",
   "rules": "Regole",
-  "search-cards": "Ricerca per titolo e descrizione scheda su questa bacheca",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Testo da ricercare?",
   "search-example": "Testo da ricercare?",
   "select-color": "Seleziona Colore",
   "select-color": "Seleziona Colore",
   "set-wip-limit-value": "Seleziona un limite per il massimo numero di attività in questa lista",
   "set-wip-limit-value": "Seleziona un limite per il massimo numero di attività in questa lista",
@@ -510,16 +522,21 @@
   "email-smtp-test-text": "Hai inviato un'email con successo",
   "email-smtp-test-text": "Hai inviato un'email con successo",
   "error-invitation-code-not-exist": "Il codice d'invito non esiste",
   "error-invitation-code-not-exist": "Il codice d'invito non esiste",
   "error-notAuthorized": "Non sei autorizzato ad accedere a questa pagina.",
   "error-notAuthorized": "Non sei autorizzato ad accedere a questa pagina.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Server esterni",
   "outgoing-webhooks": "Server esterni",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Server esterni",
   "outgoingWebhooksPopup-title": "Server esterni",
   "boardCardTitlePopup-title": "Filtro per Titolo Scheda",
   "boardCardTitlePopup-title": "Filtro per Titolo Scheda",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "Nuovo webhook in uscita",
   "new-outgoing-webhook": "Nuovo webhook in uscita",
   "no-name": "(Sconosciuto)",
   "no-name": "(Sconosciuto)",
   "Node_version": "Versione di Node",
   "Node_version": "Versione di Node",
-  "Meteor_version": "Meteor version",
-  "MongoDB_version": "MongoDB version",
-  "MongoDB_storage_engine": "MongoDB storage engine",
-  "MongoDB_Oplog_enabled": "MongoDB Oplog enabled",
+  "Meteor_version": "Versione Meteor",
+  "MongoDB_version": "Versione MondoDB",
+  "MongoDB_storage_engine": "Versione motore dati MongoDB",
+  "MongoDB_Oplog_enabled": "MongoDB Oplog abilitato",
   "OS_Arch": "Architettura del sistema operativo",
   "OS_Arch": "Architettura del sistema operativo",
   "OS_Cpus": "Conteggio della CPU del sistema operativo",
   "OS_Cpus": "Conteggio della CPU del sistema operativo",
   "OS_Freemem": "Memoria libera del sistema operativo",
   "OS_Freemem": "Memoria libera del sistema operativo",
@@ -681,13 +698,13 @@
   "r-board-note": "Nota: Lascia un campo vuoto per abbinare ogni possibile valore",
   "r-board-note": "Nota: Lascia un campo vuoto per abbinare ogni possibile valore",
   "r-checklist-note": "Nota: Gli elementi della checklist devono essere scritti come valori separati dalla virgola",
   "r-checklist-note": "Nota: Gli elementi della checklist devono essere scritti come valori separati dalla virgola",
   "r-when-a-card-is-moved": "Quando una scheda viene spostata su un'altra lista",
   "r-when-a-card-is-moved": "Quando una scheda viene spostata su un'altra lista",
-  "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-set": "Imposta",
+  "r-update": "Aggiorna",
+  "r-datefield": "campo data",
+  "r-df-start-at": "inizio",
+  "r-df-due-at": "scadenza",
+  "r-df-end-at": "fine",
+  "r-df-received-at": "ricevuta",
   "r-to-current-datetime": "to current date/time",
   "r-to-current-datetime": "to current date/time",
   "r-remove-value-from": "Remove value from",
   "r-remove-value-from": "Remove value from",
   "ldap": "LDAP",
   "ldap": "LDAP",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
-  "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
-  "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "act-atUserComment": "You were mentioned in [__board__] __list__/__card__",
+  "delete-user-confirm-popup": "Sei sicuro di voler cancellare questo profilo? Non sarà possibile ripristinarlo.",
+  "accounts-allowUserDelete": "Permetti agli utenti di cancellare il loro profilo",
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 40 - 19
i18n/ja.i18n.json

@@ -111,8 +111,8 @@
   "restore-board": "ボードをリストア",
   "restore-board": "ボードをリストア",
   "no-archived-boards": "No Boards in Archive.",
   "no-archived-boards": "No Boards in Archive.",
   "archives": "アーカイブ",
   "archives": "アーカイブ",
-  "template": "Template",
-  "templates": "Templates",
+  "template": "テンプレート",
+  "templates": "テンプレート",
   "assign-member": "メンバーの割当",
   "assign-member": "メンバーの割当",
   "attached": "添付されました",
   "attached": "添付されました",
   "attachment": "添付ファイル",
   "attachment": "添付ファイル",
@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "公開範囲の変更",
   "boardChangeVisibilityPopup-title": "公開範囲の変更",
   "boardChangeWatchPopup-title": "ウォッチの変更",
   "boardChangeWatchPopup-title": "ウォッチの変更",
   "boardMenuPopup-title": "ボード設定",
   "boardMenuPopup-title": "ボード設定",
+  "boardChangeViewPopup-title": "Board View",
   "boards": "ボード",
   "boards": "ボード",
   "board-view": "Board View",
   "board-view": "Board View",
   "board-view-cal": "カレンダー",
   "board-view-cal": "カレンダー",
   "board-view-swimlanes": "スイムレーン",
   "board-view-swimlanes": "スイムレーン",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "リスト",
   "board-view-lists": "リスト",
   "bucket-example": "例:バケットリスト",
   "bucket-example": "例:バケットリスト",
   "cancel": "キャンセル",
   "cancel": "キャンセル",
@@ -164,7 +166,7 @@
   "cardLabelsPopup-title": "ラベル",
   "cardLabelsPopup-title": "ラベル",
   "cardMembersPopup-title": "メンバー",
   "cardMembersPopup-title": "メンバー",
   "cardMorePopup-title": "さらに見る",
   "cardMorePopup-title": "さらに見る",
-  "cardTemplatePopup-title": "Create template",
+  "cardTemplatePopup-title": "テンプレートの作成",
   "cards": "カード",
   "cards": "カード",
   "cards-count": "カード",
   "cards-count": "カード",
   "casSignIn": "Sign In with CAS",
   "casSignIn": "Sign In with CAS",
@@ -199,19 +201,19 @@
   "color-indigo": "藍",
   "color-indigo": "藍",
   "color-lime": "ライム",
   "color-lime": "ライム",
   "color-magenta": "マゼンタ",
   "color-magenta": "マゼンタ",
-  "color-mistyrose": "mistyrose",
+  "color-mistyrose": "ミスティーローズ",
   "color-navy": "濃紺",
   "color-navy": "濃紺",
   "color-orange": "オレンジ",
   "color-orange": "オレンジ",
-  "color-paleturquoise": "paleturquoise",
-  "color-peachpuff": "peachpuff",
+  "color-paleturquoise": "ペールターコイズ",
+  "color-peachpuff": "ピーチパフ",
   "color-pink": "ピンク",
   "color-pink": "ピンク",
-  "color-plum": "plum",
+  "color-plum": "プラム",
   "color-purple": "紫",
   "color-purple": "紫",
   "color-red": "赤",
   "color-red": "赤",
-  "color-saddlebrown": "saddlebrown",
+  "color-saddlebrown": "サドルブラウン",
   "color-silver": "銀",
   "color-silver": "銀",
   "color-sky": "空",
   "color-sky": "空",
-  "color-slateblue": "slateblue",
+  "color-slateblue": "スレートブルー",
   "color-white": "白",
   "color-white": "白",
   "color-yellow": "黄",
   "color-yellow": "黄",
   "unset-color": "設定しない",
   "unset-color": "設定しない",
@@ -300,8 +302,18 @@
   "error-username-taken": "このユーザ名は既に使用されています",
   "error-username-taken": "このユーザ名は既に使用されています",
   "error-email-taken": "メールは既に受け取られています",
   "error-email-taken": "メールは既に受け取られています",
   "export-board": "ボードのエクスポート",
   "export-board": "ボードのエクスポート",
+  "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": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "フィルターの解除",
   "filter-clear": "フィルターの解除",
   "filter-no-label": "ラベルなし",
   "filter-no-label": "ラベルなし",
   "filter-no-member": "メンバーなし",
   "filter-no-member": "メンバーなし",
@@ -387,8 +399,8 @@
   "muted-info": "このボードの変更は通知されません",
   "muted-info": "このボードの変更は通知されません",
   "my-boards": "自分のボード",
   "my-boards": "自分のボード",
   "name": "名前",
   "name": "名前",
-  "no-archived-cards": "No cards in Archive.",
-  "no-archived-lists": "No lists in Archive.",
+  "no-archived-cards": "カードをアーカイブする",
+  "no-archived-lists": "リストをアーカイブする",
   "no-archived-swimlanes": "No swimlanes in Archive.",
   "no-archived-swimlanes": "No swimlanes in Archive.",
   "no-results": "該当するものはありません",
   "no-results": "該当するものはありません",
   "normal": "通常",
   "normal": "通常",
@@ -426,7 +438,7 @@
   "save": "保存",
   "save": "保存",
   "search": "検索",
   "search": "検索",
   "rules": "Rules",
   "rules": "Rules",
-  "search-cards": "カードのタイトルと詳細から検索",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "検索文字",
   "search-example": "検索文字",
   "select-color": "色を選択",
   "select-color": "色を選択",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
@@ -477,9 +489,9 @@
   "welcome-swimlane": "Milestone 1",
   "welcome-swimlane": "Milestone 1",
   "welcome-list1": "基本",
   "welcome-list1": "基本",
   "welcome-list2": "高度",
   "welcome-list2": "高度",
-  "card-templates-swimlane": "Card Templates",
-  "list-templates-swimlane": "List Templates",
-  "board-templates-swimlane": "Board Templates",
+  "card-templates-swimlane": "カードのテンプレート",
+  "list-templates-swimlane": "リストのテンプレート",
+  "board-templates-swimlane": "ボードのテンプレート",
   "what-to-do": "何をしたいですか?",
   "what-to-do": "何をしたいですか?",
   "wipLimitErrorPopup-title": "Invalid WIP Limit",
   "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-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "You have successfully sent an email",
   "email-smtp-test-text": "You have successfully sent an email",
   "error-invitation-code-not-exist": "招待コードが存在しません",
   "error-invitation-code-not-exist": "招待コードが存在しません",
   "error-notAuthorized": "このページを参照する権限がありません。",
   "error-notAuthorized": "このページを参照する権限がありません。",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "発信Webフック",
   "outgoing-webhooks": "発信Webフック",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "発信Webフック",
   "outgoingWebhooksPopup-title": "発信Webフック",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "発信Webフックの作成",
   "new-outgoing-webhook": "発信Webフックの作成",
   "no-name": "(Unknown)",
   "no-name": "(Unknown)",
   "Node_version": "Nodeバージョン",
   "Node_version": "Nodeバージョン",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 26 - 5
i18n/ka.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "ხილვადობის შეცვლა",
   "boardChangeVisibilityPopup-title": "ხილვადობის შეცვლა",
   "boardChangeWatchPopup-title": "საათის შეცვლა",
   "boardChangeWatchPopup-title": "საათის შეცვლა",
   "boardMenuPopup-title": "Board Settings",
   "boardMenuPopup-title": "Board Settings",
+  "boardChangeViewPopup-title": "დაფის ნახვა",
   "boards": "დაფები",
   "boards": "დაფები",
   "board-view": "დაფის ნახვა",
   "board-view": "დაფის ნახვა",
   "board-view-cal": "კალენდარი",
   "board-view-cal": "კალენდარი",
   "board-view-swimlanes": "ბილიკები",
   "board-view-swimlanes": "ბილიკები",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "ჩამონათვალი",
   "board-view-lists": "ჩამონათვალი",
   "bucket-example": "მაგალითად “Bucket List” ",
   "bucket-example": "მაგალითად “Bucket List” ",
   "cancel": "გაუქმება",
   "cancel": "გაუქმება",
@@ -300,8 +302,18 @@
   "error-username-taken": "არსებობს მსგავსი მომხმარებელი",
   "error-username-taken": "არსებობს მსგავსი მომხმარებელი",
   "error-email-taken": "უკვე არსებობს მსგავსი ელ.ფოსტა",
   "error-email-taken": "უკვე არსებობს მსგავსი ელ.ფოსტა",
   "export-board": "დაფის ექსპორტი",
   "export-board": "დაფის ექსპორტი",
+  "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": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "ფილტრის გასუფთავება",
   "filter-clear": "ფილტრის გასუფთავება",
   "filter-no-label": "ნიშანი არ გვაქვს",
   "filter-no-label": "ნიშანი არ გვაქვს",
   "filter-no-member": "არ არის წევრები ",
   "filter-no-member": "არ არის წევრები ",
@@ -426,7 +438,7 @@
   "save": "დამახსოვრება",
   "save": "დამახსოვრება",
   "search": "ძებნა",
   "search": "ძებნა",
   "rules": "Rules",
   "rules": "Rules",
-  "search-cards": "მოძებნეთ ბარათის სახელით და აღწერით ამ დაფაზე",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "საძიებო ტექსტი",
   "search-example": "საძიებო ტექსტი",
   "select-color": "ფერის მონიშვნა",
   "select-color": "ფერის მონიშვნა",
   "set-wip-limit-value": "დააყენეთ შეზღუდვა  დავალებების მაქსიმალურ რაოდენობაზე ",
   "set-wip-limit-value": "დააყენეთ შეზღუდვა  დავალებების მაქსიმალურ რაოდენობაზე ",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "თქვენ წარმატებით გააგზავნეთ ელ.ფოსტა.",
   "email-smtp-test-text": "თქვენ წარმატებით გააგზავნეთ ელ.ფოსტა.",
   "error-invitation-code-not-exist": "მსგავსი მოსაწვევი კოდი არ არსებობს",
   "error-invitation-code-not-exist": "მსგავსი მოსაწვევი კოდი არ არსებობს",
   "error-notAuthorized": "თქვენ არ გაქვთ ამ გვერდის ნახვის უფლება",
   "error-notAuthorized": "თქვენ არ გაქვთ ამ გვერდის ნახვის უფლება",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "გამავალი Webhook",
   "outgoing-webhooks": "გამავალი Webhook",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "გამავალი Webhook",
   "outgoingWebhooksPopup-title": "გამავალი Webhook",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "no-name": "(უცნობი)",
   "no-name": "(უცნობი)",
   "Node_version": "Node ვერსია",
   "Node_version": "Node ვერსია",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 26 - 5
i18n/km.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeWatchPopup-title": "Change Watch",
   "boardChangeWatchPopup-title": "Change Watch",
   "boardMenuPopup-title": "Board Settings",
   "boardMenuPopup-title": "Board Settings",
+  "boardChangeViewPopup-title": "Board View",
   "boards": "Boards",
   "boards": "Boards",
   "board-view": "Board View",
   "board-view": "Board View",
   "board-view-cal": "Calendar",
   "board-view-cal": "Calendar",
   "board-view-swimlanes": "Swimlanes",
   "board-view-swimlanes": "Swimlanes",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Lists",
   "board-view-lists": "Lists",
   "bucket-example": "Like “Bucket List” for example",
   "bucket-example": "Like “Bucket List” for example",
   "cancel": "Cancel",
   "cancel": "Cancel",
@@ -300,8 +302,18 @@
   "error-username-taken": "This username is already taken",
   "error-username-taken": "This username is already taken",
   "error-email-taken": "Email has already been taken",
   "error-email-taken": "Email has already been taken",
   "export-board": "Export board",
   "export-board": "Export board",
+  "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": "Filter",
-  "filter-cards": "Filter Cards",
+  "filter-cards": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Clear filter",
   "filter-clear": "Clear filter",
   "filter-no-label": "No label",
   "filter-no-label": "No label",
   "filter-no-member": "No member",
   "filter-no-member": "No member",
@@ -426,7 +438,7 @@
   "save": "Save",
   "save": "Save",
   "search": "Search",
   "search": "Search",
   "rules": "Rules",
   "rules": "Rules",
-  "search-cards": "Search from card titles and descriptions on this board",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Text to search for?",
   "search-example": "Text to search for?",
   "select-color": "Select Color",
   "select-color": "Select Color",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "You have successfully sent an email",
   "email-smtp-test-text": "You have successfully sent an email",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-notAuthorized": "You are not authorized to view this page.",
   "error-notAuthorized": "You are not authorized to view this page.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Outgoing Webhooks",
   "outgoing-webhooks": "Outgoing Webhooks",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "no-name": "(Unknown)",
   "no-name": "(Unknown)",
   "Node_version": "Node version",
   "Node_version": "Node version",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 29 - 8
i18n/ko.i18n.json

@@ -1,6 +1,6 @@
 {
 {
   "accept": "확인",
   "accept": "확인",
-  "act-activity-notify": "Activity Notification",
+  "act-activity-notify": "활동 알림",
   "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
   "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-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-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "표시 여부 변경",
   "boardChangeVisibilityPopup-title": "표시 여부 변경",
   "boardChangeWatchPopup-title": "감시상태 변경",
   "boardChangeWatchPopup-title": "감시상태 변경",
   "boardMenuPopup-title": "Board Settings",
   "boardMenuPopup-title": "Board Settings",
+  "boardChangeViewPopup-title": "Board View",
   "boards": "보드",
   "boards": "보드",
   "board-view": "Board View",
   "board-view": "Board View",
   "board-view-cal": "Calendar",
   "board-view-cal": "Calendar",
   "board-view-swimlanes": "Swimlanes",
   "board-view-swimlanes": "Swimlanes",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "목록들",
   "board-view-lists": "목록들",
   "bucket-example": "예: “프로젝트 이름“ 입력",
   "bucket-example": "예: “프로젝트 이름“ 입력",
   "cancel": "취소",
   "cancel": "취소",
@@ -300,8 +302,18 @@
   "error-username-taken": "중복된 아이디 입니다.",
   "error-username-taken": "중복된 아이디 입니다.",
   "error-email-taken": "Email has already been taken",
   "error-email-taken": "Email has already been taken",
   "export-board": "보드 내보내기",
   "export-board": "보드 내보내기",
+  "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": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "필터 초기화",
   "filter-clear": "필터 초기화",
   "filter-no-label": "라벨 없음",
   "filter-no-label": "라벨 없음",
   "filter-no-member": "멤버 없음",
   "filter-no-member": "멤버 없음",
@@ -426,7 +438,7 @@
   "save": "저장",
   "save": "저장",
   "search": "검색",
   "search": "검색",
   "rules": "Rules",
   "rules": "Rules",
-  "search-cards": "Search from card titles and descriptions on this board",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Text to search for?",
   "search-example": "Text to search for?",
   "select-color": "색 선택",
   "select-color": "색 선택",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "테스트 메일을 성공적으로 발송하였습니다.",
   "email-smtp-test-text": "테스트 메일을 성공적으로 발송하였습니다.",
   "error-invitation-code-not-exist": "초대 코드가 존재하지 않습니다.",
   "error-invitation-code-not-exist": "초대 코드가 존재하지 않습니다.",
   "error-notAuthorized": "이 페이지를 볼 수있는 권한이 없습니다.",
   "error-notAuthorized": "이 페이지를 볼 수있는 권한이 없습니다.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Outgoing Webhooks",
   "outgoing-webhooks": "Outgoing Webhooks",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "no-name": "(Unknown)",
   "no-name": "(Unknown)",
   "Node_version": "Node version",
   "Node_version": "Node version",
@@ -708,8 +725,8 @@
   "people-number": "The number of people is:",
   "people-number": "The number of people is:",
   "swimlaneDeletePopup-title": "Delete Swimlane ?",
   "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.",
   "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",
+  "restore-all": "모든항목 복구",
+  "delete-all": "모두 삭제",
   "loading": "Loading, please wait.",
   "loading": "Loading, please wait.",
   "previous_as": "last time was",
   "previous_as": "last time was",
   "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__",
   "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 26 - 5
i18n/lv.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeWatchPopup-title": "Change Watch",
   "boardChangeWatchPopup-title": "Change Watch",
   "boardMenuPopup-title": "Board Settings",
   "boardMenuPopup-title": "Board Settings",
+  "boardChangeViewPopup-title": "Board View",
   "boards": "Boards",
   "boards": "Boards",
   "board-view": "Board View",
   "board-view": "Board View",
   "board-view-cal": "Calendar",
   "board-view-cal": "Calendar",
   "board-view-swimlanes": "Swimlanes",
   "board-view-swimlanes": "Swimlanes",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Lists",
   "board-view-lists": "Lists",
   "bucket-example": "Like “Bucket List” for example",
   "bucket-example": "Like “Bucket List” for example",
   "cancel": "Cancel",
   "cancel": "Cancel",
@@ -300,8 +302,18 @@
   "error-username-taken": "This username is already taken",
   "error-username-taken": "This username is already taken",
   "error-email-taken": "Email has already been taken",
   "error-email-taken": "Email has already been taken",
   "export-board": "Export board",
   "export-board": "Export board",
+  "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": "Filter",
-  "filter-cards": "Filter Cards",
+  "filter-cards": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Clear filter",
   "filter-clear": "Clear filter",
   "filter-no-label": "No label",
   "filter-no-label": "No label",
   "filter-no-member": "No member",
   "filter-no-member": "No member",
@@ -426,7 +438,7 @@
   "save": "Save",
   "save": "Save",
   "search": "Search",
   "search": "Search",
   "rules": "Rules",
   "rules": "Rules",
-  "search-cards": "Search from card titles and descriptions on this board",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Text to search for?",
   "search-example": "Text to search for?",
   "select-color": "Select Color",
   "select-color": "Select Color",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "You have successfully sent an email",
   "email-smtp-test-text": "You have successfully sent an email",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-notAuthorized": "You are not authorized to view this page.",
   "error-notAuthorized": "You are not authorized to view this page.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Outgoing Webhooks",
   "outgoing-webhooks": "Outgoing Webhooks",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "no-name": "(Unknown)",
   "no-name": "(Unknown)",
   "Node_version": "Node version",
   "Node_version": "Node version",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 26 - 5
i18n/mk.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeWatchPopup-title": "Промени наблюдаването",
   "boardChangeWatchPopup-title": "Промени наблюдаването",
   "boardMenuPopup-title": "Board Settings",
   "boardMenuPopup-title": "Board Settings",
+  "boardChangeViewPopup-title": "Board View",
   "boards": "Табли",
   "boards": "Табли",
   "board-view": "Board View",
   "board-view": "Board View",
   "board-view-cal": "Календар",
   "board-view-cal": "Календар",
   "board-view-swimlanes": "Коридори",
   "board-view-swimlanes": "Коридори",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Листи",
   "board-view-lists": "Листи",
   "bucket-example": "Like “Bucket List” for example",
   "bucket-example": "Like “Bucket List” for example",
   "cancel": "Откажи",
   "cancel": "Откажи",
@@ -300,8 +302,18 @@
   "error-username-taken": "Това потребителско име е вече заето",
   "error-username-taken": "Това потребителско име е вече заето",
   "error-email-taken": "Имейлът е вече зает",
   "error-email-taken": "Имейлът е вече зает",
   "export-board": "Експортиране на Табло",
   "export-board": "Експортиране на Табло",
+  "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": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Премахване на филтрите",
   "filter-clear": "Премахване на филтрите",
   "filter-no-label": "без етикет",
   "filter-no-label": "без етикет",
   "filter-no-member": "без член",
   "filter-no-member": "без член",
@@ -426,7 +438,7 @@
   "save": "Запази",
   "save": "Запази",
   "search": "Търсене",
   "search": "Търсене",
   "rules": "Правила",
   "rules": "Правила",
-  "search-cards": "Search from card titles and descriptions on this board",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Text to search for?",
   "search-example": "Text to search for?",
   "select-color": "Избери цвят",
   "select-color": "Избери цвят",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "Успешно изпратихте е-маил",
   "email-smtp-test-text": "Успешно изпратихте е-маил",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-notAuthorized": "You are not authorized to view this page.",
   "error-notAuthorized": "You are not authorized to view this page.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Outgoing Webhooks",
   "outgoing-webhooks": "Outgoing Webhooks",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "no-name": "(Unknown)",
   "no-name": "(Unknown)",
   "Node_version": "Версия на Node",
   "Node_version": "Версия на Node",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 37 - 16
i18n/mn.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeWatchPopup-title": "Change Watch",
   "boardChangeWatchPopup-title": "Change Watch",
   "boardMenuPopup-title": "Board Settings",
   "boardMenuPopup-title": "Board Settings",
+  "boardChangeViewPopup-title": "Board View",
   "boards": "Boards",
   "boards": "Boards",
   "board-view": "Board View",
   "board-view": "Board View",
   "board-view-cal": "Calendar",
   "board-view-cal": "Calendar",
   "board-view-swimlanes": "Swimlanes",
   "board-view-swimlanes": "Swimlanes",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Lists",
   "board-view-lists": "Lists",
   "bucket-example": "Like “Bucket List” for example",
   "bucket-example": "Like “Bucket List” for example",
   "cancel": "Cancel",
   "cancel": "Cancel",
@@ -264,23 +266,23 @@
   "edit": "Edit",
   "edit": "Edit",
   "edit-avatar": "Аватар өөрчлөх",
   "edit-avatar": "Аватар өөрчлөх",
   "edit-profile": "Бүртгэл засварлах",
   "edit-profile": "Бүртгэл засварлах",
-  "edit-wip-limit": "Edit WIP Limit",
+  "edit-wip-limit": "WIP хязгаарлалтыг өөрчлөх",
   "soft-wip-limit": "Soft 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",
+  "editCardStartDatePopup-title": "Эхлэх өдрийг өөрчлөх",
+  "editCardDueDatePopup-title": "Дуусах өдрийг өөрчлөх",
+  "editCustomFieldPopup-title": "Талбарыг засварлах",
+  "editCardSpentTimePopup-title": "Зарцуулсан хугацааг засварлах",
+  "editLabelPopup-title": "Шошгыг өөрчлөх",
   "editNotificationPopup-title": "Мэдэгдэл тохируулах",
   "editNotificationPopup-title": "Мэдэгдэл тохируулах",
   "editProfilePopup-title": "Бүртгэл засварлах",
   "editProfilePopup-title": "Бүртгэл засварлах",
-  "email": "Email",
+  "email": "Имэйл",
   "email-enrollAccount-subject": "An account created for you on __siteName__",
   "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-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": "Sending email failed",
   "email-fail-text": "Error trying to send email",
   "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-invalid": "Буруу имэйл",
+  "email-invite": "Имэйлээр урих",
+  "email-invite-subject": "__inviter__ танд урилга илгээлээ",
   "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-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-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-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.",
@@ -300,8 +302,18 @@
   "error-username-taken": "This username is already taken",
   "error-username-taken": "This username is already taken",
   "error-email-taken": "Email has already been taken",
   "error-email-taken": "Email has already been taken",
   "export-board": "Export board",
   "export-board": "Export board",
+  "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": "Filter",
-  "filter-cards": "Filter Cards",
+  "filter-cards": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Clear filter",
   "filter-clear": "Clear filter",
   "filter-no-label": "No label",
   "filter-no-label": "No label",
   "filter-no-member": "No member",
   "filter-no-member": "No member",
@@ -426,7 +438,7 @@
   "save": "Save",
   "save": "Save",
   "search": "Search",
   "search": "Search",
   "rules": "Rules",
   "rules": "Rules",
-  "search-cards": "Search from card titles and descriptions on this board",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Text to search for?",
   "search-example": "Text to search for?",
   "select-color": "Select Color",
   "select-color": "Select Color",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
@@ -504,15 +516,20 @@
   "send-from": "From",
   "send-from": "From",
   "send-smtp-test": "Send a test email to yourself",
   "send-smtp-test": "Send a test email to yourself",
   "invitation-code": "Invitation Code",
   "invitation-code": "Invitation Code",
-  "email-invite-register-subject": "__inviter__ sent you an invitation",
+  "email-invite-register-subject": "__inviter__ танд урилга илгээлээ",
   "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-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-subject": "SMTP Test Email",
   "email-smtp-test-text": "You have successfully sent an email",
   "email-smtp-test-text": "You have successfully sent an email",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-notAuthorized": "You are not authorized to view this page.",
   "error-notAuthorized": "You are not authorized to view this page.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Outgoing Webhooks",
   "outgoing-webhooks": "Outgoing Webhooks",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "no-name": "(Unknown)",
   "no-name": "(Unknown)",
   "Node_version": "Node version",
   "Node_version": "Node version",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 89 - 68
i18n/nb.i18n.json

@@ -107,9 +107,9 @@
   "archive-selection": "Move selection to Archive",
   "archive-selection": "Move selection to Archive",
   "archiveBoardPopup-title": "Move Board to Archive?",
   "archiveBoardPopup-title": "Move Board to Archive?",
   "archived-items": "Arkiv",
   "archived-items": "Arkiv",
-  "archived-boards": "Boards in Archive",
+  "archived-boards": "Tavler i arkivet",
   "restore-board": "Restore Board",
   "restore-board": "Restore Board",
-  "no-archived-boards": "No Boards in Archive.",
+  "no-archived-boards": "Ingen tavler i arkivet",
   "archives": "Arkiv",
   "archives": "Arkiv",
   "template": "Template",
   "template": "Template",
   "templates": "Templates",
   "templates": "Templates",
@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Endre synlighet",
   "boardChangeVisibilityPopup-title": "Endre synlighet",
   "boardChangeWatchPopup-title": "Endre overvåkning",
   "boardChangeWatchPopup-title": "Endre overvåkning",
   "boardMenuPopup-title": "Board Settings",
   "boardMenuPopup-title": "Board Settings",
+  "boardChangeViewPopup-title": "Board View",
   "boards": "Tavler",
   "boards": "Tavler",
   "board-view": "Board View",
   "board-view": "Board View",
   "board-view-cal": "Calendar",
   "board-view-cal": "Calendar",
   "board-view-swimlanes": "Swimlanes",
   "board-view-swimlanes": "Swimlanes",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Lists",
   "board-view-lists": "Lists",
   "bucket-example": "Som \"Bucket List\" for eksempel",
   "bucket-example": "Som \"Bucket List\" for eksempel",
   "cancel": "Avbryt",
   "cancel": "Avbryt",
@@ -176,26 +178,26 @@
   "change-password": "Endre passord",
   "change-password": "Endre passord",
   "change-permissions": "Endre rettigheter",
   "change-permissions": "Endre rettigheter",
   "change-settings": "Endre innstillinger",
   "change-settings": "Endre innstillinger",
-  "changeAvatarPopup-title": "Endre Avatar",
+  "changeAvatarPopup-title": "Endre avatar",
   "changeLanguagePopup-title": "Endre språk",
   "changeLanguagePopup-title": "Endre språk",
   "changePasswordPopup-title": "Endre passord",
   "changePasswordPopup-title": "Endre passord",
   "changePermissionsPopup-title": "Endre tillatelser",
   "changePermissionsPopup-title": "Endre tillatelser",
   "changeSettingsPopup-title": "Endre innstillinger",
   "changeSettingsPopup-title": "Endre innstillinger",
-  "subtasks": "Subtasks",
+  "subtasks": "Deloppgave",
   "checklists": "Sjekklister",
   "checklists": "Sjekklister",
   "click-to-star": "Click to star this board.",
   "click-to-star": "Click to star this board.",
   "click-to-unstar": "Click to unstar this board.",
   "click-to-unstar": "Click to unstar this board.",
   "clipboard": "Clipboard or drag & drop",
   "clipboard": "Clipboard or drag & drop",
-  "close": "Close",
+  "close": "Lukk",
   "close-board": "Close Board",
   "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-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.",
-  "color-black": "black",
-  "color-blue": "blue",
+  "color-black": "svart",
+  "color-blue": "blå",
   "color-crimson": "crimson",
   "color-crimson": "crimson",
-  "color-darkgreen": "darkgreen",
-  "color-gold": "gold",
-  "color-gray": "gray",
-  "color-green": "green",
+  "color-darkgreen": "mørkegrønn",
+  "color-gold": "gull",
+  "color-gray": "grå",
+  "color-green": "grønn",
   "color-indigo": "indigo",
   "color-indigo": "indigo",
   "color-lime": "lime",
   "color-lime": "lime",
   "color-magenta": "magenta",
   "color-magenta": "magenta",
@@ -204,9 +206,9 @@
   "color-orange": "orange",
   "color-orange": "orange",
   "color-paleturquoise": "paleturquoise",
   "color-paleturquoise": "paleturquoise",
   "color-peachpuff": "peachpuff",
   "color-peachpuff": "peachpuff",
-  "color-pink": "pink",
+  "color-pink": "rosa",
   "color-plum": "plum",
   "color-plum": "plum",
-  "color-purple": "purple",
+  "color-purple": "lilla",
   "color-red": "red",
   "color-red": "red",
   "color-saddlebrown": "saddlebrown",
   "color-saddlebrown": "saddlebrown",
   "color-silver": "silver",
   "color-silver": "silver",
@@ -240,39 +242,39 @@
   "current": "current",
   "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-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-checkbox": "Checkbox",
-  "custom-field-date": "Date",
+  "custom-field-date": "Dato",
   "custom-field-dropdown": "Dropdown List",
   "custom-field-dropdown": "Dropdown List",
   "custom-field-dropdown-none": "(none)",
   "custom-field-dropdown-none": "(none)",
   "custom-field-dropdown-options": "List Options",
   "custom-field-dropdown-options": "List Options",
   "custom-field-dropdown-options-placeholder": "Press enter to add more 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-field-dropdown-unknown": "(ukjent)",
+  "custom-field-number": "Nummer",
+  "custom-field-text": "Tekst",
   "custom-fields": "Custom Fields",
   "custom-fields": "Custom Fields",
-  "date": "Date",
-  "decline": "Decline",
+  "date": "Dato",
+  "decline": "Avvis",
   "default-avatar": "Default avatar",
   "default-avatar": "Default avatar",
-  "delete": "Delete",
+  "delete": "Slett",
   "deleteCustomFieldPopup-title": "Delete Custom Field?",
   "deleteCustomFieldPopup-title": "Delete Custom Field?",
   "deleteLabelPopup-title": "Delete Label?",
   "deleteLabelPopup-title": "Delete Label?",
-  "description": "Description",
+  "description": "Beskrivelse",
   "disambiguateMultiLabelPopup-title": "Disambiguate Label Action",
   "disambiguateMultiLabelPopup-title": "Disambiguate Label Action",
   "disambiguateMultiMemberPopup-title": "Disambiguate Member Action",
   "disambiguateMultiMemberPopup-title": "Disambiguate Member Action",
   "discard": "Discard",
   "discard": "Discard",
   "done": "Done",
   "done": "Done",
-  "download": "Download",
-  "edit": "Edit",
+  "download": "Last ned",
+  "edit": "Rediger",
   "edit-avatar": "Endre avatar",
   "edit-avatar": "Endre avatar",
-  "edit-profile": "Edit Profile",
-  "edit-wip-limit": "Edit WIP Limit",
+  "edit-profile": "Endre profil",
+  "edit-wip-limit": "Endre WIP grense",
   "soft-wip-limit": "Soft WIP Limit",
   "soft-wip-limit": "Soft WIP Limit",
-  "editCardStartDatePopup-title": "Change start date",
+  "editCardStartDatePopup-title": "Endre start dato",
   "editCardDueDatePopup-title": "Change due date",
   "editCardDueDatePopup-title": "Change due date",
   "editCustomFieldPopup-title": "Edit Field",
   "editCustomFieldPopup-title": "Edit Field",
   "editCardSpentTimePopup-title": "Change spent time",
   "editCardSpentTimePopup-title": "Change spent time",
   "editLabelPopup-title": "Change Label",
   "editLabelPopup-title": "Change Label",
   "editNotificationPopup-title": "Edit Notification",
   "editNotificationPopup-title": "Edit Notification",
-  "editProfilePopup-title": "Edit Profile",
+  "editProfilePopup-title": "Endre profil",
   "email": "Email",
   "email": "Email",
   "email-enrollAccount-subject": "An account created for you on __siteName__",
   "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-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.",
@@ -288,20 +290,30 @@
   "email-verifyEmail-subject": "Verify your email address on __siteName__",
   "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.",
   "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",
   "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-board-doesNotExist": "Denne tavlen finnes ikke",
+  "error-board-notAdmin": "Du må være administrator for denne tavlen for å gjøre dette",
+  "error-board-notAMember": "Du må være medlem av denne tavlen for å gjøre dette",
+  "error-json-malformed": "Denne teksten er ikke gyldig JSON",
   "error-json-schema": "Your JSON data does not include the proper information in the correct format",
   "error-json-schema": "Your JSON data does not include the proper information in the correct format",
-  "error-list-doesNotExist": "This list does not exist",
+  "error-list-doesNotExist": "Denne listen finnes ikke",
   "error-user-doesNotExist": "This user does not exist",
   "error-user-doesNotExist": "This user does not exist",
   "error-user-notAllowSelf": "You can not invite yourself",
   "error-user-notAllowSelf": "You can not invite yourself",
   "error-user-notCreated": "This user is not created",
   "error-user-notCreated": "This user is not created",
   "error-username-taken": "This username is already taken",
   "error-username-taken": "This username is already taken",
   "error-email-taken": "Email has already been taken",
   "error-email-taken": "Email has already been taken",
   "export-board": "Export board",
   "export-board": "Export board",
+  "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": "Filter",
-  "filter-cards": "Filter Cards",
+  "filter-cards": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Clear filter",
   "filter-clear": "Clear filter",
   "filter-no-label": "No label",
   "filter-no-label": "No label",
   "filter-no-member": "No member",
   "filter-no-member": "No member",
@@ -314,7 +326,7 @@
   "advanced-filter-label": "Advanced Filter",
   "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",
   "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",
   "fullname": "Full Name",
-  "header-logo-title": "Go back to your boards page.",
+  "header-logo-title": "Tilbake til dine tavler",
   "hide-system-messages": "Hide system messages",
   "hide-system-messages": "Hide system messages",
   "headerBarCreateBoardPopup-title": "Create Board",
   "headerBarCreateBoardPopup-title": "Create Board",
   "home": "Home",
   "home": "Home",
@@ -385,8 +397,8 @@
   "multi-selection-on": "Multi-Selection is on",
   "multi-selection-on": "Multi-Selection is on",
   "muted": "Muted",
   "muted": "Muted",
   "muted-info": "You will never be notified of any changes in this board",
   "muted-info": "You will never be notified of any changes in this board",
-  "my-boards": "My Boards",
-  "name": "Name",
+  "my-boards": "Mine tavler",
+  "name": "Navn",
   "no-archived-cards": "No cards in Archive.",
   "no-archived-cards": "No cards in Archive.",
   "no-archived-lists": "No lists in Archive.",
   "no-archived-lists": "No lists in Archive.",
   "no-archived-swimlanes": "No swimlanes in Archive.",
   "no-archived-swimlanes": "No swimlanes in Archive.",
@@ -395,20 +407,20 @@
   "normal-desc": "Can view and edit cards. Can't change settings.",
   "normal-desc": "Can view and edit cards. Can't change settings.",
   "not-accepted-yet": "Invitation not accepted yet",
   "not-accepted-yet": "Invitation not accepted yet",
   "notify-participate": "Receive updates to any cards you participate as creater or member",
   "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",
+  "notify-watch": "Motta oppdatering av alle tavler, lister eller kort som du overvåker",
+  "optional": "valgfritt",
+  "or": "eller",
   "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.",
   "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.",
   "page-not-found": "Page not found.",
-  "password": "Password",
+  "password": "Passord",
   "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)",
   "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)",
   "participating": "Participating",
   "participating": "Participating",
-  "preview": "Preview",
-  "previewAttachedImagePopup-title": "Preview",
-  "previewClipboardImagePopup-title": "Preview",
-  "private": "Private",
+  "preview": "Forhåndsvisning",
+  "previewAttachedImagePopup-title": "Forhåndsvisning",
+  "previewClipboardImagePopup-title": "Forhåndsvisning",
+  "private": "Privat",
   "private-desc": "This board is private. Only people added to the board can view and edit it.",
   "private-desc": "This board is private. Only people added to the board can view and edit it.",
-  "profile": "Profile",
+  "profile": "Profil",
   "public": "Public",
   "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.",
   "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.",
   "quick-access-description": "Star a board to add a shortcut in this bar.",
@@ -426,7 +438,7 @@
   "save": "Save",
   "save": "Save",
   "search": "Search",
   "search": "Search",
   "rules": "Rules",
   "rules": "Rules",
-  "search-cards": "Search from card titles and descriptions on this board",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Text to search for?",
   "search-example": "Text to search for?",
   "select-color": "Select Color",
   "select-color": "Select Color",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
@@ -467,7 +479,7 @@
   "upload": "Upload",
   "upload": "Upload",
   "upload-avatar": "Upload an avatar",
   "upload-avatar": "Upload an avatar",
   "uploaded-avatar": "Uploaded an avatar",
   "uploaded-avatar": "Uploaded an avatar",
-  "username": "Username",
+  "username": "Brukernavn",
   "view-it": "View it",
   "view-it": "View it",
   "warn-list-archived": "warning: this card is in an list at Archive",
   "warn-list-archived": "warning: this card is in an list at Archive",
   "watch": "Watch",
   "watch": "Watch",
@@ -485,9 +497,9 @@
   "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
   "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.",
   "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
   "admin-panel": "Admin Panel",
   "admin-panel": "Admin Panel",
-  "settings": "Settings",
-  "people": "People",
-  "registration": "Registration",
+  "settings": "Innstillinger",
+  "people": "Folk",
+  "registration": "Registrering",
   "disable-self-registration": "Disable Self-Registration",
   "disable-self-registration": "Disable Self-Registration",
   "invite": "Invite",
   "invite": "Invite",
   "invite-people": "Invite People",
   "invite-people": "Invite People",
@@ -498,8 +510,8 @@
   "smtp-tls-description": "Enable TLS support for SMTP server",
   "smtp-tls-description": "Enable TLS support for SMTP server",
   "smtp-host": "SMTP Host",
   "smtp-host": "SMTP Host",
   "smtp-port": "SMTP Port",
   "smtp-port": "SMTP Port",
-  "smtp-username": "Username",
-  "smtp-password": "Password",
+  "smtp-username": "Brukernavn",
+  "smtp-password": "Passord",
   "smtp-tls": "TLS support",
   "smtp-tls": "TLS support",
   "send-from": "From",
   "send-from": "From",
   "send-smtp-test": "Send a test email to yourself",
   "send-smtp-test": "Send a test email to yourself",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "You have successfully sent an email",
   "email-smtp-test-text": "You have successfully sent an email",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-notAuthorized": "You are not authorized to view this page.",
   "error-notAuthorized": "You are not authorized to view this page.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Outgoing Webhooks",
   "outgoing-webhooks": "Outgoing Webhooks",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "no-name": "(Unknown)",
   "no-name": "(Unknown)",
   "Node_version": "Node version",
   "Node_version": "Node version",
@@ -630,10 +647,10 @@
   "r-unarchive": "Restore from Archive",
   "r-unarchive": "Restore from Archive",
   "r-card": "card",
   "r-card": "card",
   "r-add": "Legg til",
   "r-add": "Legg til",
-  "r-remove": "Remove",
+  "r-remove": "Fjern",
   "r-label": "label",
   "r-label": "label",
-  "r-member": "member",
-  "r-remove-all": "Remove all members from the card",
+  "r-member": "medlem",
+  "r-remove-all": "Fjern alle medlemmer fra kortet",
   "r-set-color": "Set color to",
   "r-set-color": "Set color to",
   "r-checklist": "checklist",
   "r-checklist": "checklist",
   "r-check-all": "Check all",
   "r-check-all": "Check all",
@@ -644,17 +661,17 @@
   "r-item": "item",
   "r-item": "item",
   "r-of-checklist": "of checklist",
   "r-of-checklist": "of checklist",
   "r-send-email": "Send an email",
   "r-send-email": "Send an email",
-  "r-to": "to",
-  "r-subject": "subject",
+  "r-to": "til",
+  "r-subject": "Emne",
   "r-rule-details": "Rule details",
   "r-rule-details": "Rule details",
   "r-d-move-to-top-gen": "Move card to top of its list",
   "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-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-move-to-bottom-gen": "Flytt kortet til bunnen av sin liste",
+  "r-d-move-to-bottom-spec": "Flytt kortet til bunnen av listen",
+  "r-d-send-email": "Send e-post",
+  "r-d-send-email-to": "til",
+  "r-d-send-email-subject": "Emne",
+  "r-d-send-email-message": "Melding",
   "r-d-archive": "Move card to Archive",
   "r-d-archive": "Move card to Archive",
   "r-d-unarchive": "Restore card from Archive",
   "r-d-unarchive": "Restore card from Archive",
   "r-d-add-label": "Add label",
   "r-d-add-label": "Add label",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
-  "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
-  "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "act-atUserComment": "Du ble nevnt i [__board__] __list__/__card__",
+  "delete-user-confirm-popup": "Er du sikker på at du vil slette denne kontoen?",
+  "accounts-allowUserDelete": "Tillat at brukere sletter sin konto",
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 417 - 396
i18n/nl.i18n.json

@@ -1,91 +1,91 @@
 {
 {
   "accept": "Accepteren",
   "accept": "Accepteren",
-  "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-activity-notify": "Activiteiten Notificatie",
+  "act-addAttachment": "bijlage __attachment__ toegevoegd aan kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
+  "act-deleteAttachment": "bijlage __attachment__ verwijderd op kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
+  "act-addSubtask": "subtaak __subtask__ toegevoegd aan kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
+  "act-addLabel": "Label __label__ toegevoegd aan kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
+  "act-addedLabel": "Label __label__ toegevoegd aan kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
+  "act-removeLabel": "Label __label__ verwijderd van kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
+  "act-removedLabel": "Label __label__ verwijderd van kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
+  "act-addChecklist": "checklist __checklist__ toegevoegd aan kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
+  "act-addChecklistItem": "checklist item __checklistItem__ toegevoegd aan checklist __checklist__ op kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
+  "act-removeChecklist": "checklist __checklist__ verwijderd van kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
+  "act-removeChecklistItem": "checklist item __checklistItem__ verwijderd van checklist __checkList__ op kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
+  "act-checkedItem": "__checklistItem__ aangevinkt van checklist __checklist__ op kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
+  "act-uncheckedItem": "__checklistItem__ uitgevinkt van checklist __checklist__ op kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
+  "act-completeChecklist": "checklist __checklist__ afgewerkt op kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
+  "act-uncompleteChecklist": "checklist __checklist__ onafgewerkt op kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
+  "act-addComment": "heeft aantekening toegevoegd aan kaart __card__: __comment__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
+  "act-editComment": "heeft aantekening gewijzigd op kaart __card__: __comment__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
+  "act-deleteComment": "heeft aantekening verwijderd van kaart __card__: __comment__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
+  "act-createBoard": "bord __board__ aangemaakt",
+  "act-createSwimlane": "swimlane __swimlane__ aangemaakt op bord __board__",
+  "act-createCard": "kaart __card__ aangemaakt in lijst __list__ in swimlane __swimlane__ op bord __board__",
+  "act-createCustomField": "maatwerkveld __customField__ aangemaakt op bord __board__",
+  "act-deleteCustomField": "maatwerkveld __customField__ verwijderd van bord __board__",
+  "act-setCustomField": "maatwerkveld gewijzigd __customField__: __customFieldValue__ op kaart __card__ in lijst __list__ uit swimlane __swimlane__ op bord __board__",
+  "act-createList": "lijst __list__ toegevoegd aan bord __board__",
+  "act-addBoardMember": "lid __member__ toegevoegd aan bord __board__",
+  "act-archivedBoard": "Bord __board__ verplaatst naar Archief",
+  "act-archivedCard": "Kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__ verplaatst naar Archief",
+  "act-archivedList": "Lijst __list__ uit swimlane __swimlane__ op bord __board__ verplaatst naar Archief",
+  "act-archivedSwimlane": "Swimlane __swimlane__ op bord __board__ verplaatst naar Archief",
+  "act-importBoard": "bord __board__ geïmporteerd",
+  "act-importCard": "kaart __card__ geïmporteerd in lijst __list__ in swimlane __swimlane__ op bord __board__",
+  "act-importList": "lijst __list__ geïmporteerd in swimlane __swimlane__ op bord __board__",
+  "act-joinMember": "lid __member__ toegevoegd aan kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
+  "act-moveCard": "heeft kaart __card__ verplaatst op bord __board__ van lijst __oldList__ uit swimlane __oldSwimlane__ naar lijst __list__ in swimlane __swimlane__",
+  "act-moveCardToOtherBoard": "kaart __card__ verplaatst van lijst __oldList__ uit swimlane __oldSwimlane__ op bord __oldBoard__ naar lijst __list__ in swimlane __swimlane__ op bord __board__",
+  "act-removeBoardMember": "lid __member__ verwijderd van bord __board__",
+  "act-restoredCard": "kaart __card__ teruggehaald naar lijst __list__ in swimlane __swimlane__ op bord __board__",
+  "act-unjoinMember": "lid __member__ verwijderd van kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
   "act-withBoardTitle": "__board__",
   "act-withBoardTitle": "__board__",
   "act-withCardTitle": "[__board__] __card__",
   "act-withCardTitle": "[__board__] __card__",
   "actions": "Acties",
   "actions": "Acties",
   "activities": "Activiteiten",
   "activities": "Activiteiten",
   "activity": "Activiteit",
   "activity": "Activiteit",
   "activity-added": "%s toegevoegd aan %s",
   "activity-added": "%s toegevoegd aan %s",
-  "activity-archived": "%s moved to Archive",
+  "activity-archived": "%s verplaatst naar Archief",
   "activity-attached": "%s bijgevoegd aan %s",
   "activity-attached": "%s bijgevoegd aan %s",
   "activity-created": "%s aangemaakt",
   "activity-created": "%s aangemaakt",
-  "activity-customfield-created": "created custom field %s",
+  "activity-customfield-created": "maatwerkveld aangemaakt %s",
   "activity-excluded": "%s uitgesloten van %s",
   "activity-excluded": "%s uitgesloten van %s",
-  "activity-imported": "%s geimporteerd in %s van %s",
-  "activity-imported-board": "%s geimporteerd van %s",
+  "activity-imported": "%s geïmporteerd in %s van %s",
+  "activity-imported-board": "%s geïmporteerd van %s",
   "activity-joined": "%s toegetreden",
   "activity-joined": "%s toegetreden",
   "activity-moved": "%s verplaatst van %s naar %s",
   "activity-moved": "%s verplaatst van %s naar %s",
   "activity-on": "bij %s",
   "activity-on": "bij %s",
   "activity-removed": "%s verwijderd van %s",
   "activity-removed": "%s verwijderd van %s",
   "activity-sent": "%s gestuurd naar %s",
   "activity-sent": "%s gestuurd naar %s",
   "activity-unjoined": "uit %s gegaan",
   "activity-unjoined": "uit %s gegaan",
-  "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-subtask-added": "subtaak toegevoegd aan %s",
+  "activity-checked-item": "%s aangevinkt in checklist %s van %s",
+  "activity-unchecked-item": "%s uitgevinkt in checklist %s van %s",
   "activity-checklist-added": "checklist toegevoegd aan %s",
   "activity-checklist-added": "checklist toegevoegd aan %s",
-  "activity-checklist-removed": "removed a checklist from %s",
-  "activity-checklist-completed": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-  "activity-checklist-uncompleted": "uncompleted the checklist %s of %s",
-  "activity-checklist-item-added": "checklist punt toegevoegd aan '%s' in '%s'",
-  "activity-checklist-item-removed": "removed a checklist item from '%s' in %s",
+  "activity-checklist-removed": "checklist verwijderd van %s",
+  "activity-checklist-completed": "checklist __checklist__ afgewerkt op kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
+  "activity-checklist-uncompleted": "checklist %s onafgewerkt van %s",
+  "activity-checklist-item-added": "checklist item toegevoegd aan '%s' in '%s'",
+  "activity-checklist-item-removed": "checklist item verwijderd van '%s' in %s",
   "add": "Toevoegen",
   "add": "Toevoegen",
-  "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",
-  "add-attachment": "Voeg Bijlage Toe",
-  "add-board": "Voeg Bord Toe",
-  "add-card": "Voeg Kaart Toe",
+  "activity-checked-item-card": "%s aangevinkt in checklist %s",
+  "activity-unchecked-item-card": "%s uitgevinkt in checklist %s",
+  "activity-checklist-completed-card": "checklist __checklist__ afgewerkt op kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
+  "activity-checklist-uncompleted-card": "checklist %s onafgewerkt",
+  "activity-editComment": "aantekening gewijzigd %s",
+  "activity-deleteComment": "aantekening verwijderd %s",
+  "add-attachment": "Bijlage Toevoegen",
+  "add-board": "Bord Toevoegen",
+  "add-card": "Kaart Toevoegen",
   "add-swimlane": "Swimlane Toevoegen",
   "add-swimlane": "Swimlane Toevoegen",
-  "add-subtask": "Add Subtask",
-  "add-checklist": "Voeg Checklist Toe",
+  "add-subtask": "Subtaak Toevoegen",
+  "add-checklist": "Checkcklist Toevoegen",
   "add-checklist-item": "Voeg item toe aan checklist",
   "add-checklist-item": "Voeg item toe aan checklist",
-  "add-cover": "Voeg Cover Toe",
-  "add-label": "Voeg Label Toe",
-  "add-list": "Voeg Lijst Toe",
-  "add-members": "Voeg Leden Toe",
+  "add-cover": "Cover Toevoegen",
+  "add-label": "Label Toevoegen",
+  "add-list": "Lijst Toevoegen",
+  "add-members": "Leden Toevoegen",
   "added": "Toegevoegd",
   "added": "Toegevoegd",
   "addMemberPopup-title": "Leden",
   "addMemberPopup-title": "Leden",
   "admin": "Administrator",
   "admin": "Administrator",
@@ -94,35 +94,35 @@
   "admin-announcement-active": "Systeem melding",
   "admin-announcement-active": "Systeem melding",
   "admin-announcement-title": "Melding van de administrator",
   "admin-announcement-title": "Melding van de administrator",
   "all-boards": "Alle borden",
   "all-boards": "Alle borden",
-  "and-n-other-card": "En nog __count__ ander",
+  "and-n-other-card": "En  __count__ andere kaarten",
   "and-n-other-card_plural": "En __count__ andere kaarten",
   "and-n-other-card_plural": "En __count__ andere kaarten",
   "apply": "Aanmelden",
   "apply": "Aanmelden",
-  "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?",
+  "app-is-offline": "Wekan is aan het laden, wacht alstublieft. Het verversen van de pagina zorgt voor verlies van gegevens. Als Wekan niet laadt, check dan of de Wekan server niet is gestopt. ",
+  "archive": "Verplaats naar Archief",
+  "archive-all": "Verplaats Alles naar Archief",
+  "archive-board": "Verplaats Bord naar Archief",
+  "archive-card": "Verplaats Kaart naar Archief",
+  "archive-list": "Verplaats Lijst naar Archief",
+  "archive-swimlane": "Verplaats Swimlane naar Archief",
+  "archive-selection": "Verplaats selectie naar Archief",
+  "archiveBoardPopup-title": "Bord naar Archief verplaatsen?",
   "archived-items": "Archiveren",
   "archived-items": "Archiveren",
-  "archived-boards": "Boards in Archive",
+  "archived-boards": "Borden in Archief",
   "restore-board": "Herstel Bord",
   "restore-board": "Herstel Bord",
-  "no-archived-boards": "No Boards in Archive.",
-  "archives": "Archiveren",
+  "no-archived-boards": "Geen Borden in Archief.",
+  "archives": "Archief",
   "template": "Template",
   "template": "Template",
   "templates": "Templates",
   "templates": "Templates",
-  "assign-member": "Wijs lid aan",
+  "assign-member": "Lid toevoegen",
   "attached": "bijgevoegd",
   "attached": "bijgevoegd",
   "attachment": "Bijlage",
   "attachment": "Bijlage",
   "attachment-delete-pop": "Een bijlage verwijderen is permanent. Er is geen herstelmogelijkheid.",
   "attachment-delete-pop": "Een bijlage verwijderen is permanent. Er is geen herstelmogelijkheid.",
-  "attachmentDeletePopup-title": "Verwijder Bijlage?",
+  "attachmentDeletePopup-title": "Bijlage verwijderen?",
   "attachments": "Bijlagen",
   "attachments": "Bijlagen",
   "auto-watch": "Automatisch borden bekijken wanneer deze aangemaakt worden",
   "auto-watch": "Automatisch borden bekijken wanneer deze aangemaakt worden",
   "avatar-too-big": "De bestandsgrootte van je avatar is te groot (70KB max)",
   "avatar-too-big": "De bestandsgrootte van je avatar is te groot (70KB max)",
   "back": "Terug",
   "back": "Terug",
-  "board-change-color": "Verander kleur",
+  "board-change-color": "Wijzig kleur",
   "board-nb-stars": "%s sterren",
   "board-nb-stars": "%s sterren",
   "board-not-found": "Bord is niet gevonden",
   "board-not-found": "Bord is niet gevonden",
   "board-private-info": "Dit bord is nu <strong>privé</strong>.",
   "board-private-info": "Dit bord is nu <strong>privé</strong>.",
@@ -131,25 +131,27 @@
   "boardChangeTitlePopup-title": "Hernoem bord",
   "boardChangeTitlePopup-title": "Hernoem bord",
   "boardChangeVisibilityPopup-title": "Verander zichtbaarheid",
   "boardChangeVisibilityPopup-title": "Verander zichtbaarheid",
   "boardChangeWatchPopup-title": "Verander naar 'Watch'",
   "boardChangeWatchPopup-title": "Verander naar 'Watch'",
-  "boardMenuPopup-title": "Board Settings",
+  "boardMenuPopup-title": "Bord Instellingen",
+  "boardChangeViewPopup-title": "Bord overzicht",
   "boards": "Borden",
   "boards": "Borden",
   "board-view": "Bord overzicht",
   "board-view": "Bord overzicht",
-  "board-view-cal": "Calendar",
+  "board-view-cal": "Kalender",
   "board-view-swimlanes": "Swimlanes",
   "board-view-swimlanes": "Swimlanes",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Lijsten",
   "board-view-lists": "Lijsten",
-  "bucket-example": "Zoals \"Bucket List\" bijvoorbeeld",
+  "bucket-example": "Zoals bijvoorbeeld een \"Bucket List\"",
   "cancel": "Annuleren",
   "cancel": "Annuleren",
-  "card-archived": "This card is moved to Archive.",
-  "board-archived": "This board is moved to Archive.",
-  "card-comments-title": "Deze kaart heeft %s reactie.",
+  "card-archived": "Deze kaart is verplaatst naar Archief.",
+  "board-archived": "Dit bord is verplaatst naar Archief.",
+  "card-comments-title": "Deze kaart heeft %s aantekening(en).",
   "card-delete-notice": "Verwijdering is permanent. Als je dit doet, verlies je alle informatie die op deze kaart is opgeslagen.",
   "card-delete-notice": "Verwijdering is permanent. Als je dit doet, verlies je alle informatie die op deze kaart is opgeslagen.",
-  "card-delete-pop": "Alle acties worden verwijderd van de activiteiten feed, en er zal geen mogelijkheid zijn om de kaart opnieuw te openen. Deze actie kan je niet ongedaan maken.",
-  "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.",
-  "card-due": "Deadline: ",
-  "card-due-on": "Deadline: ",
-  "card-spent": "gespendeerde tijd",
+  "card-delete-pop": "Alle acties worden verwijderd van de activiteiten feed, en er zal geen mogelijkheid zijn om de kaart opnieuw te openen. Er is geen herstelmogelijkheid.",
+  "card-delete-suggest-archive": "Je kunt een kaart naar Archief verplaatsen om die van het bord te verwijderen waarbij de activiteiten  behouden blijven.",
+  "card-due": "Verval",
+  "card-due-on": "Vervalt op ",
+  "card-spent": "Gespendeerde tijd",
   "card-edit-attachments": "Wijzig bijlagen",
   "card-edit-attachments": "Wijzig bijlagen",
-  "card-edit-custom-fields": "Edit custom fields",
+  "card-edit-custom-fields": "Wijzig maatwerkvelden",
   "card-edit-labels": "Wijzig labels",
   "card-edit-labels": "Wijzig labels",
   "card-edit-members": "Wijzig leden",
   "card-edit-members": "Wijzig leden",
   "card-labels-title": "Wijzig de labels vam de kaart.",
   "card-labels-title": "Wijzig de labels vam de kaart.",
@@ -157,75 +159,75 @@
   "card-start": "Begin",
   "card-start": "Begin",
   "card-start-on": "Begint op",
   "card-start-on": "Begint op",
   "cardAttachmentsPopup-title": "Voeg bestand toe vanuit",
   "cardAttachmentsPopup-title": "Voeg bestand toe vanuit",
-  "cardCustomField-datePopup-title": "Change date",
-  "cardCustomFieldsPopup-title": "Edit custom fields",
+  "cardCustomField-datePopup-title": "Wijzigingsdatum",
+  "cardCustomFieldsPopup-title": "Wijzig maatwerkvelden",
   "cardDeletePopup-title": "Kaart verwijderen?",
   "cardDeletePopup-title": "Kaart verwijderen?",
   "cardDetailsActionsPopup-title": "Kaart actie ondernemen",
   "cardDetailsActionsPopup-title": "Kaart actie ondernemen",
   "cardLabelsPopup-title": "Labels",
   "cardLabelsPopup-title": "Labels",
   "cardMembersPopup-title": "Leden",
   "cardMembersPopup-title": "Leden",
   "cardMorePopup-title": "Meer",
   "cardMorePopup-title": "Meer",
-  "cardTemplatePopup-title": "Create template",
+  "cardTemplatePopup-title": "Template aanmaken",
   "cards": "Kaarten",
   "cards": "Kaarten",
   "cards-count": "Kaarten",
   "cards-count": "Kaarten",
-  "casSignIn": "Sign In with CAS",
-  "cardType-card": "Card",
-  "cardType-linkedCard": "Linked Card",
-  "cardType-linkedBoard": "Linked Board",
+  "casSignIn": "Log in met CAS",
+  "cardType-card": "Kaart",
+  "cardType-linkedCard": "Gekoppelde Kaart",
+  "cardType-linkedBoard": "Gekoppeld Bord",
   "change": "Wijzig",
   "change": "Wijzig",
   "change-avatar": "Wijzig avatar",
   "change-avatar": "Wijzig avatar",
   "change-password": "Wijzig wachtwoord",
   "change-password": "Wijzig wachtwoord",
   "change-permissions": "Wijzig permissies",
   "change-permissions": "Wijzig permissies",
   "change-settings": "Wijzig instellingen",
   "change-settings": "Wijzig instellingen",
   "changeAvatarPopup-title": "Wijzig avatar",
   "changeAvatarPopup-title": "Wijzig avatar",
-  "changeLanguagePopup-title": "Verander van taal",
+  "changeLanguagePopup-title": "Wijzig taal",
   "changePasswordPopup-title": "Wijzig wachtwoord",
   "changePasswordPopup-title": "Wijzig wachtwoord",
   "changePermissionsPopup-title": "Wijzig permissies",
   "changePermissionsPopup-title": "Wijzig permissies",
   "changeSettingsPopup-title": "Wijzig instellingen",
   "changeSettingsPopup-title": "Wijzig instellingen",
-  "subtasks": "Subtasks",
+  "subtasks": "Subtaken",
   "checklists": "Checklists",
   "checklists": "Checklists",
   "click-to-star": "Klik om het bord als favoriet in te stellen",
   "click-to-star": "Klik om het bord als favoriet in te stellen",
   "click-to-unstar": "Klik om het bord uit favorieten weg te halen",
   "click-to-unstar": "Klik om het bord uit favorieten weg te halen",
   "clipboard": "Vanuit clipboard of sleep het bestand hierheen",
   "clipboard": "Vanuit clipboard of sleep het bestand hierheen",
   "close": "Sluiten",
   "close": "Sluiten",
   "close-board": "Sluit bord",
   "close-board": "Sluit bord",
-  "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.",
+  "close-board-pop": "Je kunt het bord terughalen door de \"Archief\" knop te klikken in de menubalk \"Mijn Borden\".",
   "color-black": "zwart",
   "color-black": "zwart",
   "color-blue": "blauw",
   "color-blue": "blauw",
-  "color-crimson": "crimson",
-  "color-darkgreen": "darkgreen",
-  "color-gold": "gold",
-  "color-gray": "gray",
+  "color-crimson": "karmijn",
+  "color-darkgreen": "donkergroen",
+  "color-gold": "goud",
+  "color-gray": "grijs",
   "color-green": "groen",
   "color-green": "groen",
   "color-indigo": "indigo",
   "color-indigo": "indigo",
-  "color-lime": "Felgroen",
+  "color-lime": "felgroen",
   "color-magenta": "magenta",
   "color-magenta": "magenta",
-  "color-mistyrose": "mistyrose",
-  "color-navy": "navy",
-  "color-orange": "Oranje",
-  "color-paleturquoise": "paleturquoise",
-  "color-peachpuff": "peachpuff",
-  "color-pink": "Roze",
-  "color-plum": "plum",
-  "color-purple": "Paars",
-  "color-red": "Rood",
-  "color-saddlebrown": "saddlebrown",
-  "color-silver": "silver",
-  "color-sky": "Lucht",
-  "color-slateblue": "slateblue",
-  "color-white": "white",
-  "color-yellow": "Geel",
-  "unset-color": "Unset",
-  "comment": "Reageer",
-  "comment-placeholder": "Schrijf reactie",
-  "comment-only": "Alleen reageren",
-  "comment-only-desc": "Kan alleen op kaarten reageren.",
-  "no-comments": "No comments",
-  "no-comments-desc": "Can not see comments and activities.",
+  "color-mistyrose": "zachtroze",
+  "color-navy": "marineblauw",
+  "color-orange": "oranje",
+  "color-paleturquoise": "vaalturkoois",
+  "color-peachpuff": "perzikroze",
+  "color-pink": "roze",
+  "color-plum": "pruim",
+  "color-purple": "paars",
+  "color-red": "rood",
+  "color-saddlebrown": "zadelbruin",
+  "color-silver": "zilver",
+  "color-sky": "lucht",
+  "color-slateblue": "leiblauw",
+  "color-white": "wit",
+  "color-yellow": "geel",
+  "unset-color": "Ongedefinieerd",
+  "comment": "Aantekening",
+  "comment-placeholder": "Schrijf aantekening",
+  "comment-only": "Alleen aantekeningen maken",
+  "comment-only-desc": "Kan alleen op kaarten aantekenen.",
+  "no-comments": "Geen aantekeningen",
+  "no-comments-desc": "Zie geen aantekeningen of activiteiten.",
   "computer": "Computer",
   "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?",
+  "confirm-subtask-delete-dialog": "Weet je zeker dat je de subtaak wilt verwijderen?",
+  "confirm-checklist-delete-dialog": "Weet je zeker dat je de checklist wilt verwijderen?",
   "copy-card-link-to-clipboard": "Kopieer kaart link naar klembord",
   "copy-card-link-to-clipboard": "Kopieer kaart link naar klembord",
-  "linkCardPopup-title": "Link Card",
+  "linkCardPopup-title": "Koppel Kaart",
   "searchElementPopup-title": "Zoek",
   "searchElementPopup-title": "Zoek",
   "copyCardPopup-title": "Kopieer kaart",
   "copyCardPopup-title": "Kopieer kaart",
   "copyChecklistToManyCardsPopup-title": "Checklist sjabloon kopiëren naar meerdere kaarten",
   "copyChecklistToManyCardsPopup-title": "Checklist sjabloon kopiëren naar meerdere kaarten",
@@ -235,30 +237,30 @@
   "createBoardPopup-title": "Bord aanmaken",
   "createBoardPopup-title": "Bord aanmaken",
   "chooseBoardSourcePopup-title": "Importeer bord",
   "chooseBoardSourcePopup-title": "Importeer bord",
   "createLabelPopup-title": "Label aanmaken",
   "createLabelPopup-title": "Label aanmaken",
-  "createCustomField": "Create Field",
-  "createCustomFieldPopup-title": "Create Field",
+  "createCustomField": "Veld aanmaken",
+  "createCustomFieldPopup-title": "Veld aanmaken",
   "current": "Huidige",
   "current": "Huidige",
-  "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.",
+  "custom-field-delete-pop": "Er is geen herstelmogelijkheid. Deze actie zal dit maatwerkveld van alle kaarten verwijderen en de bijbehorende historie wissen.",
   "custom-field-checkbox": "Checkbox",
   "custom-field-checkbox": "Checkbox",
   "custom-field-date": "Datum",
   "custom-field-date": "Datum",
-  "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",
+  "custom-field-dropdown": "Dropdown Lijst",
+  "custom-field-dropdown-none": "(geen)",
+  "custom-field-dropdown-options": "Lijst Opties",
+  "custom-field-dropdown-options-placeholder": "Toets Enter om meer opties toe te voegen ",
+  "custom-field-dropdown-unknown": "(onbekend)",
+  "custom-field-number": "Aantal",
+  "custom-field-text": "Tekst",
+  "custom-fields": "Maatwerkvelden",
   "date": "Datum",
   "date": "Datum",
   "decline": "Weigeren",
   "decline": "Weigeren",
   "default-avatar": "Standaard avatar",
   "default-avatar": "Standaard avatar",
   "delete": "Verwijderen",
   "delete": "Verwijderen",
-  "deleteCustomFieldPopup-title": "Delete Custom Field?",
-  "deleteLabelPopup-title": "Verwijder label?",
+  "deleteCustomFieldPopup-title": "Maatwerkveld verwijderen?",
+  "deleteLabelPopup-title": "Label verwijderen?",
   "description": "Beschrijving",
   "description": "Beschrijving",
   "disambiguateMultiLabelPopup-title": "Disambigueer Label Actie",
   "disambiguateMultiLabelPopup-title": "Disambigueer Label Actie",
   "disambiguateMultiMemberPopup-title": "Disambigueer Lid Actie",
   "disambiguateMultiMemberPopup-title": "Disambigueer Lid Actie",
-  "discard": "Weggooien",
+  "discard": "Negeer",
   "done": "Klaar",
   "done": "Klaar",
   "download": "Download",
   "download": "Download",
   "edit": "Wijzig",
   "edit": "Wijzig",
@@ -267,8 +269,8 @@
   "edit-wip-limit": "Verander WIP limiet",
   "edit-wip-limit": "Verander WIP limiet",
   "soft-wip-limit": "Zachte WIP limiet",
   "soft-wip-limit": "Zachte WIP limiet",
   "editCardStartDatePopup-title": "Wijzig start datum",
   "editCardStartDatePopup-title": "Wijzig start datum",
-  "editCardDueDatePopup-title": "Wijzig deadline",
-  "editCustomFieldPopup-title": "Edit Field",
+  "editCardDueDatePopup-title": "Wijzig vervaldatum",
+  "editCustomFieldPopup-title": "Wijzig Veld",
   "editCardSpentTimePopup-title": "Verander gespendeerde tijd",
   "editCardSpentTimePopup-title": "Verander gespendeerde tijd",
   "editLabelPopup-title": "Wijzig label",
   "editLabelPopup-title": "Wijzig label",
   "editNotificationPopup-title": "Wijzig notificatie",
   "editNotificationPopup-title": "Wijzig notificatie",
@@ -278,7 +280,7 @@
   "email-enrollAccount-text": "Hallo __user__,\n\nOm gebruik te maken van de online dienst, kan je op de volgende link klikken.\n\n__url__\n\nBedankt.",
   "email-enrollAccount-text": "Hallo __user__,\n\nOm gebruik te maken van de online dienst, kan je op de volgende link klikken.\n\n__url__\n\nBedankt.",
   "email-fail": "E-mail verzenden is mislukt",
   "email-fail": "E-mail verzenden is mislukt",
   "email-fail-text": "Fout tijdens het verzenden van de email",
   "email-fail-text": "Fout tijdens het verzenden van de email",
-  "email-invalid": "Ongeldige e-mail",
+  "email-invalid": "Ongeldig e-mailadres",
   "email-invite": "Nodig uit via e-mail",
   "email-invite": "Nodig uit via e-mail",
   "email-invite-subject": "__inviter__ heeft je een uitnodiging gestuurd",
   "email-invite-subject": "__inviter__ heeft je een uitnodiging gestuurd",
   "email-invite-text": "Beste __user__,\n\n__inviter__ heeft je uitgenodigd om voor een samenwerking deel te nemen aan het bord \"__board__\".\n\nKlik op de link hieronder:\n\n__url__\n\nBedankt.",
   "email-invite-text": "Beste __user__,\n\n__inviter__ heeft je uitgenodigd om voor een samenwerking deel te nemen aan het bord \"__board__\".\n\nKlik op de link hieronder:\n\n__url__\n\nBedankt.",
@@ -286,7 +288,7 @@
   "email-resetPassword-text": "Hallo __user__,\n\nKlik op de link hier beneden om je wachtwoord te resetten.\n\n__url__\n\nBedankt.",
   "email-resetPassword-text": "Hallo __user__,\n\nKlik op de link hier beneden om je wachtwoord te resetten.\n\n__url__\n\nBedankt.",
   "email-sent": "E-mail is verzonden",
   "email-sent": "E-mail is verzonden",
   "email-verifyEmail-subject": "Verifieer je e-mailadres op __siteName__",
   "email-verifyEmail-subject": "Verifieer je e-mailadres op __siteName__",
-  "email-verifyEmail-text": "Hallo __user__,\n\nOm je e-mail te verifiëren vragen we je om op de link hieronder te drukken.\n\n__url__\n\nBedankt.",
+  "email-verifyEmail-text": "Hallo __user__,\n\nOm je e-mail te verifiëren vragen we je om op de link hieronder te klikken.\n\n__url__\n\nBedankt.",
   "enable-wip-limit": "Activeer WIP limiet",
   "enable-wip-limit": "Activeer WIP limiet",
   "error-board-doesNotExist": "Dit bord bestaat niet.",
   "error-board-doesNotExist": "Dit bord bestaat niet.",
   "error-board-notAdmin": "Je moet een administrator zijn van dit bord om dat te doen.",
   "error-board-notAdmin": "Je moet een administrator zijn van dit bord om dat te doen.",
@@ -297,22 +299,32 @@
   "error-user-doesNotExist": "Deze gebruiker bestaat niet",
   "error-user-doesNotExist": "Deze gebruiker bestaat niet",
   "error-user-notAllowSelf": "Je kan jezelf niet uitnodigen",
   "error-user-notAllowSelf": "Je kan jezelf niet uitnodigen",
   "error-user-notCreated": "Deze gebruiker is niet aangemaakt",
   "error-user-notCreated": "Deze gebruiker is niet aangemaakt",
-  "error-username-taken": "Deze gebruikersnaam is al bezet",
-  "error-email-taken": "Deze e-mail is al eerder gebruikt",
+  "error-username-taken": "Deze gebruikersnaam is al in gebruik",
+  "error-email-taken": "Dit e-mailadres is al in gebruik",
   "export-board": "Exporteer bord",
   "export-board": "Exporteer bord",
+  "sort": "Sorteer",
+  "sort-desc": "Klik om lijst te sorteren",
+  "list-sort-by": "Sorteer lijst op",
+  "list-label-modifiedAt": "Laatste toegangstijd",
+  "list-label-title": "Naam van de lijst",
+  "list-label-sort": "Je handmatige volgorde",
+  "list-label-short-modifiedAt": "(L)",
+  "list-label-short-title": "(N)",
+  "list-label-short-sort": "(M)",
   "filter": "Filter",
   "filter": "Filter",
-  "filter-cards": "Filter kaarten",
-  "filter-clear": "Reset filter",
+  "filter-cards": "Filter kaarten of lijsten",
+  "list-filter-label": "Filter lijst op titel",
+  "filter-clear": "Wis filter",
   "filter-no-label": "Geen label",
   "filter-no-label": "Geen label",
   "filter-no-member": "Geen lid",
   "filter-no-member": "Geen lid",
-  "filter-no-custom-fields": "No Custom Fields",
-  "filter-show-archive": "Show archived lists",
-  "filter-hide-empty": "Hide empty lists",
-  "filter-on": "Filter staat aan",
+  "filter-no-custom-fields": "Geen maatwerkvelden",
+  "filter-show-archive": "Toon gearchiveerde lijsten",
+  "filter-hide-empty": "Verberg lege lijsten",
+  "filter-on": "Filter is actief",
   "filter-on-desc": "Je bent nu kaarten aan het filteren op dit bord. Klik hier om het filter te wijzigen.",
   "filter-on-desc": "Je bent nu kaarten aan het filteren op dit bord. Klik hier om het filter te wijzigen.",
   "filter-to-selection": "Filter zoals selectie",
   "filter-to-selection": "Filter zoals selectie",
-  "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",
+  "advanced-filter-label": "Geavanceerd Filter",
+  "advanced-filter-description": "Met het Geavanceerd Filter kun je een tekst schrijven die de volgende operatoren mag bevatten:  == != <= >= && || ( ) Een Spatie wordt als scheiding gebruikt tussen de verschillende operatoren. Je kunt filteren op alle Maatwerkvelden door hun namen en waarden in te tikken. Bijvoorbeeld: Veld1 == Waarde1. Let op: Als velden of waarden spaties bevatten dan moet je die tussen enkele aanhalingstekens zetten. Bijvoorbeeld: 'Veld 1' == 'Waarde 1'.  Om controle karakters (' \\/) over te slaan gebruik je \\. Bijvoorbeeld: Veld1 == I\\'m. Je kunt ook meerdere condities combineren. Bijvoorbeeld: F1 == V1 || F1 == V2. Normalerwijze worden alle operatoren van links naar rechts verwerkt. Dit kun je veranderen door ronde haken te gebruiken. Bijvoorbeeld: F1 == V1 && ( F2 == V2 || F2 == V3 ). Je kunt ook met regex in tekstvelden zoeken. Bijvoorbeeld: F1 == /Tes.*/i",
   "fullname": "Volledige naam",
   "fullname": "Volledige naam",
   "header-logo-title": "Ga terug naar jouw borden pagina.",
   "header-logo-title": "Ga terug naar jouw borden pagina.",
   "hide-system-messages": "Verberg systeemberichten",
   "hide-system-messages": "Verberg systeemberichten",
@@ -322,52 +334,52 @@
   "link": "Link",
   "link": "Link",
   "import-board": "Importeer bord",
   "import-board": "Importeer bord",
   "import-board-c": "Importeer bord",
   "import-board-c": "Importeer bord",
-  "import-board-title-trello": "Importeer bord van Trello",
-  "import-board-title-wekan": "Import board from previous export",
-  "import-sandstorm-backup-warning": "Do not delete data you import from original exported board or Trello before checking does this grain close and open again, or do you get Board not found error, that means data loss.",
-  "import-sandstorm-warning": "Het geïmporteerde bord verwijdert alle data op het huidige bord, om het daarna te vervangen.",
-  "from-trello": "Van Trello",
-  "from-wekan": "From previous export",
+  "import-board-title-trello": "Importeer bord vanuit Trello",
+  "import-board-title-wekan": "Importeer bord vanuit eerdere export",
+  "import-sandstorm-backup-warning": "Verwijder nog niet de data van je geëxporteerde Trello-bord totdat je vastgesteld hebt dat het Wekan-bord werkt. Doe dit door het nieuwe bord te sluiten en opnieuw te openen. Als er dan een foutmelding krijgt of het nieuwe bord opent niet dan kun je nog terugvallen op het originele bord. ",
+  "import-sandstorm-warning": "Het geïmporteerde bord verwijdert alle huidige data op dit bord, om het daarna te vervangen.",
+  "from-trello": "Vanuit Trello",
+  "from-wekan": "Vanuit eerdere export",
   "import-board-instruction-trello": "Op jouw Trello bord, ga naar 'Menu', dan naar 'Meer', 'Print en Exporteer', 'Exporteer JSON', en kopieer de tekst.",
   "import-board-instruction-trello": "Op jouw Trello bord, ga naar 'Menu', dan naar 'Meer', 'Print en Exporteer', 'Exporteer JSON', en kopieer de tekst.",
-  "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-board-instruction-wekan": "Ga op je bord naar 'Menu' en klik dan 'Export board' en kopieer de tekst in het gedownloade bestand.",
+  "import-board-instruction-about-errors": "Als je tijdens de import van het bord foutmeldingen krijgt is de import soms toch gelukt en vind je het bord terug op de 'Alle borden' scherm.",
   "import-json-placeholder": "Plak geldige JSON data hier",
   "import-json-placeholder": "Plak geldige JSON data hier",
   "import-map-members": "Breng leden in kaart",
   "import-map-members": "Breng leden in kaart",
-  "import-members-map": "Your imported board has some members. Please map the members you want to import to your users",
+  "import-members-map": "Je geïmporteerde bord heeft een aantal leden. Koppel de leden die je wilt importeren aan je gebruikers.",
   "import-show-user-mapping": "Breng leden overzicht tevoorschijn",
   "import-show-user-mapping": "Breng leden overzicht tevoorschijn",
-  "import-user-select": "Pick your existing user you want to use as this member",
-  "importMapMembersAddPopup-title": "Select member",
+  "import-user-select": "Kies een bestaande gebruiker die je als dit lid wilt koppelen",
+  "importMapMembersAddPopup-title": "Kies lid",
   "info": "Versie",
   "info": "Versie",
   "initials": "Initialen",
   "initials": "Initialen",
   "invalid-date": "Ongeldige datum",
   "invalid-date": "Ongeldige datum",
   "invalid-time": "Ongeldige tijd",
   "invalid-time": "Ongeldige tijd",
   "invalid-user": "Ongeldige gebruiker",
   "invalid-user": "Ongeldige gebruiker",
   "joined": "doet nu mee met",
   "joined": "doet nu mee met",
-  "just-invited": "Je bent zojuist uitgenodigd om mee toen doen met dit bord",
+  "just-invited": "Je bent zojuist uitgenodigd om mee toen doen aan dit bord",
   "keyboard-shortcuts": "Toetsenbord snelkoppelingen",
   "keyboard-shortcuts": "Toetsenbord snelkoppelingen",
   "label-create": "Label aanmaken",
   "label-create": "Label aanmaken",
   "label-default": "%s label (standaard)",
   "label-default": "%s label (standaard)",
-  "label-delete-pop": "Je kan het niet ongedaan maken. Deze actie zal de label van alle kaarten verwijderen, en de feed.",
+  "label-delete-pop": "Er is geen herstelmogelijkheid. Deze actie zal het label van alle kaarten verwijderen met de bijbehorende historie.",
   "labels": "Labels",
   "labels": "Labels",
   "language": "Taal",
   "language": "Taal",
-  "last-admin-desc": "Je kan de permissies niet veranderen omdat er maar een administrator is.",
+  "last-admin-desc": "Je kunt de permissies niet veranderen omdat er minimaal een administrator moet zijn.",
   "leave-board": "Verlaat bord",
   "leave-board": "Verlaat bord",
-  "leave-board-pop": "Weet u zeker dat u __boardTitle__ wilt verlaten? U wordt verwijderd van alle kaarten binnen dit bord",
+  "leave-board-pop": "Weet je zeker dat je __boardTitle__ wilt verlaten? Je wordt verwijderd van alle kaarten binnen dit bord",
   "leaveBoardPopup-title": "Bord verlaten?",
   "leaveBoardPopup-title": "Bord verlaten?",
   "link-card": "Link naar deze kaart",
   "link-card": "Link naar deze kaart",
-  "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-archive-cards": "Verplaats alle kaarten in deze lijst naar Archief",
+  "list-archive-cards-pop": "Dit zal alle kaarten uit deze lijst op dit bord verwijderen. Om de kaarten in het Archief te tonen en terug te halen, klik \"Menu\" > \"Archief\".",
   "list-move-cards": "Verplaats alle kaarten in deze lijst",
   "list-move-cards": "Verplaats alle kaarten in deze lijst",
   "list-select-cards": "Selecteer alle kaarten in deze lijst",
   "list-select-cards": "Selecteer alle kaarten in deze lijst",
-  "set-color-list": "Set Color",
+  "set-color-list": "Wijzig kleur in",
   "listActionPopup-title": "Lijst acties",
   "listActionPopup-title": "Lijst acties",
   "swimlaneActionPopup-title": "Swimlane handelingen",
   "swimlaneActionPopup-title": "Swimlane handelingen",
-  "swimlaneAddPopup-title": "Add a Swimlane below",
+  "swimlaneAddPopup-title": "Voeg hieronder een Swimlane toe",
   "listImportCardPopup-title": "Importeer een Trello kaart",
   "listImportCardPopup-title": "Importeer een Trello kaart",
   "listMorePopup-title": "Meer",
   "listMorePopup-title": "Meer",
   "link-list": "Link naar deze lijst",
   "link-list": "Link naar deze lijst",
-  "list-delete-pop": "Alle acties zullen verwijderd worden van de activiteiten feed, en je zult deze niet meer kunnen herstellen. Je kan deze actie niet ongedaan maken.",
-  "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.",
+  "list-delete-pop": "Alle acties zullen verwijderd worden van de activiteiten feed, en je zult deze niet meer kunnen herstellen. Er is geen herstelmogelijkheid.",
+  "list-delete-suggest-archive": "Je kunt een lijst naar Archief verplaatsen om die van het bord te verwijderen waarbij de activiteiten behouden blijven.",
   "lists": "Lijsten",
   "lists": "Lijsten",
   "swimlanes": "Swimlanes",
   "swimlanes": "Swimlanes",
   "log-out": "Uitloggen",
   "log-out": "Uitloggen",
@@ -387,14 +399,14 @@
   "muted-info": "Je zal nooit meer geïnformeerd worden bij veranderingen in dit bord.",
   "muted-info": "Je zal nooit meer geïnformeerd worden bij veranderingen in dit bord.",
   "my-boards": "Mijn Borden",
   "my-boards": "Mijn Borden",
   "name": "Naam",
   "name": "Naam",
-  "no-archived-cards": "No cards in Archive.",
-  "no-archived-lists": "No lists in Archive.",
-  "no-archived-swimlanes": "No swimlanes in Archive.",
+  "no-archived-cards": "Geen kaarten in Archief.",
+  "no-archived-lists": "Geen lijsten in Archief..",
+  "no-archived-swimlanes": "Geen swimlanes in Archief.",
   "no-results": "Geen resultaten",
   "no-results": "Geen resultaten",
   "normal": "Normaal",
   "normal": "Normaal",
   "normal-desc": "Kan de kaarten zien en wijzigen. Kan de instellingen niet wijzigen.",
   "normal-desc": "Kan de kaarten zien en wijzigen. Kan de instellingen niet wijzigen.",
-  "not-accepted-yet": "Uitnodiging niet geaccepteerd",
-  "notify-participate": "Ontvang updates van elke kaart die je hebt gemaakt of lid van bent",
+  "not-accepted-yet": "Uitnodiging nog niet geaccepteerd",
+  "notify-participate": "Ontvang updates van elke kaart die je hebt aangemaakt of lid van bent",
   "notify-watch": "Ontvang updates van elke bord, lijst of kaart die je bekijkt.",
   "notify-watch": "Ontvang updates van elke bord, lijst of kaart die je bekijkt.",
   "optional": "optioneel",
   "optional": "optioneel",
   "or": "of",
   "or": "of",
@@ -407,34 +419,34 @@
   "previewAttachedImagePopup-title": "Voorbeeld",
   "previewAttachedImagePopup-title": "Voorbeeld",
   "previewClipboardImagePopup-title": "Voorbeeld",
   "previewClipboardImagePopup-title": "Voorbeeld",
   "private": "Privé",
   "private": "Privé",
-  "private-desc": "Dit bord is privé. Alleen mensen die toegevoegd zijn aan het bord kunnen het bekijken en wijzigen.",
+  "private-desc": "Dit bord is privé. Alleen gebruikers die toegevoegd zijn aan het bord kunnen het bekijken en wijzigen.",
   "profile": "Profiel",
   "profile": "Profiel",
-  "public": "Publiek",
-  "public-desc": "Dit bord is publiek. Het is zichtbaar voor iedereen met de link en zal tevoorschijn komen op zoekmachines zoals Google. Alleen mensen die toegevoegd zijn kunnen het bord wijzigen.",
+  "public": "Openbaar",
+  "public-desc": "Dit bord is openbaar. Het is zichtbaar voor iedereen met de link en zal tevoorschijn komen op zoekmachines zoals Google. Alleen gebruikers die toegevoegd zijn aan het bord kunnen het wijzigen.",
   "quick-access-description": "Maak een bord favoriet om een snelkoppeling toe te voegen aan deze balk.",
   "quick-access-description": "Maak een bord favoriet om een snelkoppeling toe te voegen aan deze balk.",
   "remove-cover": "Verwijder Cover",
   "remove-cover": "Verwijder Cover",
   "remove-from-board": "Verwijder van bord",
   "remove-from-board": "Verwijder van bord",
   "remove-label": "Verwijder label",
   "remove-label": "Verwijder label",
-  "listDeletePopup-title": "Verwijder lijst?",
+  "listDeletePopup-title": "Lijst verwijderen?",
   "remove-member": "Verwijder lid",
   "remove-member": "Verwijder lid",
   "remove-member-from-card": "Verwijder van kaart",
   "remove-member-from-card": "Verwijder van kaart",
   "remove-member-pop": "Verwijder __name__ (__username__) van __boardTitle__? Het lid zal verwijderd worden van alle kaarten op dit bord, en zal een notificatie ontvangen.",
   "remove-member-pop": "Verwijder __name__ (__username__) van __boardTitle__? Het lid zal verwijderd worden van alle kaarten op dit bord, en zal een notificatie ontvangen.",
-  "removeMemberPopup-title": "Verwijder lid?",
+  "removeMemberPopup-title": "Lid verwijderen?",
   "rename": "Hernoem",
   "rename": "Hernoem",
   "rename-board": "Hernoem bord",
   "rename-board": "Hernoem bord",
   "restore": "Herstel",
   "restore": "Herstel",
   "save": "Opslaan",
   "save": "Opslaan",
   "search": "Zoek",
   "search": "Zoek",
-  "rules": "Rules",
-  "search-cards": "Zoeken in kaart titels en omschrijvingen op dit bord",
+  "rules": "Regels",
+  "search-cards": "Zoek op kaarten/lijsten en omschrijvingen op dit bord",
   "search-example": "Tekst om naar te zoeken?",
   "search-example": "Tekst om naar te zoeken?",
   "select-color": "Selecteer kleur",
   "select-color": "Selecteer kleur",
   "set-wip-limit-value": "Zet een limiet voor het maximaal aantal taken in deze lijst",
   "set-wip-limit-value": "Zet een limiet voor het maximaal aantal taken in deze lijst",
   "setWipLimitPopup-title": "Zet een WIP limiet",
   "setWipLimitPopup-title": "Zet een WIP limiet",
-  "shortcut-assign-self": "Wijs jezelf toe aan huidige kaart",
+  "shortcut-assign-self": "Voeg jezelf toe aan huidige kaart",
   "shortcut-autocomplete-emoji": "Emojis automatisch aanvullen",
   "shortcut-autocomplete-emoji": "Emojis automatisch aanvullen",
   "shortcut-autocomplete-members": "Leden automatisch aanvullen",
   "shortcut-autocomplete-members": "Leden automatisch aanvullen",
-  "shortcut-clear-filters": "Alle filters vrijmaken",
+  "shortcut-clear-filters": "Wis alle filters",
   "shortcut-close-dialog": "Sluit dialoog",
   "shortcut-close-dialog": "Sluit dialoog",
   "shortcut-filter-my-cards": "Filter mijn kaarten",
   "shortcut-filter-my-cards": "Filter mijn kaarten",
   "shortcut-show-shortcuts": "Haal lijst met snelkoppelingen tevoorschijn",
   "shortcut-show-shortcuts": "Haal lijst met snelkoppelingen tevoorschijn",
@@ -461,7 +473,7 @@
   "tracking": "Volgen",
   "tracking": "Volgen",
   "tracking-info": "Je wordt op de hoogte gesteld als er veranderingen zijn aan de kaarten waar je lid of maker van bent.",
   "tracking-info": "Je wordt op de hoogte gesteld als er veranderingen zijn aan de kaarten waar je lid of maker van bent.",
   "type": "Type",
   "type": "Type",
-  "unassign-member": "Lid ontkennen",
+  "unassign-member": "Lid verwijderen",
   "unsaved-description": "Je hebt een niet opgeslagen beschrijving.",
   "unsaved-description": "Je hebt een niet opgeslagen beschrijving.",
   "unwatch": "Niet bekijken",
   "unwatch": "Niet bekijken",
   "upload": "Upload",
   "upload": "Upload",
@@ -469,24 +481,24 @@
   "uploaded-avatar": "Avatar is geüpload",
   "uploaded-avatar": "Avatar is geüpload",
   "username": "Gebruikersnaam",
   "username": "Gebruikersnaam",
   "view-it": "Bekijk het",
   "view-it": "Bekijk het",
-  "warn-list-archived": "warning: this card is in an list at Archive",
+  "warn-list-archived": "Let op: deze kaart zit in gearchiveerde lijst",
   "watch": "Bekijk",
   "watch": "Bekijk",
   "watching": "Bekijken",
   "watching": "Bekijken",
-  "watching-info": "Je zal op de hoogte worden gesteld als er een verandering gebeurt op dit bord.",
+  "watching-info": "Je zal op de hoogte worden gesteld als er een verandering plaatsvind op dit bord.",
   "welcome-board": "Welkom Bord",
   "welcome-board": "Welkom Bord",
   "welcome-swimlane": "Mijlpaal 1",
   "welcome-swimlane": "Mijlpaal 1",
   "welcome-list1": "Basis",
   "welcome-list1": "Basis",
   "welcome-list2": "Geadvanceerd",
   "welcome-list2": "Geadvanceerd",
-  "card-templates-swimlane": "Card Templates",
-  "list-templates-swimlane": "List Templates",
-  "board-templates-swimlane": "Board Templates",
+  "card-templates-swimlane": "Kaart Templates",
+  "list-templates-swimlane": "Lijst Templates",
+  "board-templates-swimlane": "Bord Templates",
   "what-to-do": "Wat wil je doen?",
   "what-to-do": "Wat wil je doen?",
   "wipLimitErrorPopup-title": "Ongeldige WIP limiet",
   "wipLimitErrorPopup-title": "Ongeldige WIP limiet",
   "wipLimitErrorPopup-dialog-pt1": "Het aantal taken in deze lijst is groter dan de gedefinieerde WIP limiet ",
   "wipLimitErrorPopup-dialog-pt1": "Het aantal taken in deze lijst is groter dan de gedefinieerde WIP limiet ",
   "wipLimitErrorPopup-dialog-pt2": "Verwijder een aantal taken uit deze lijst, of zet de WIP limiet hoger",
   "wipLimitErrorPopup-dialog-pt2": "Verwijder een aantal taken uit deze lijst, of zet de WIP limiet hoger",
   "admin-panel": "Administrator paneel",
   "admin-panel": "Administrator paneel",
   "settings": "Instellingen",
   "settings": "Instellingen",
-  "people": "Mensen",
+  "people": "Gebruikers",
   "registration": "Registratie",
   "registration": "Registratie",
   "disable-self-registration": "Schakel zelf-registratie uit",
   "disable-self-registration": "Schakel zelf-registratie uit",
   "invite": "Uitnodigen",
   "invite": "Uitnodigen",
@@ -502,233 +514,242 @@
   "smtp-password": "Wachtwoord",
   "smtp-password": "Wachtwoord",
   "smtp-tls": "TLS ondersteuning",
   "smtp-tls": "TLS ondersteuning",
   "send-from": "Van",
   "send-from": "Van",
-  "send-smtp-test": "Verzend een email naar uzelf",
+  "send-smtp-test": "Verzend een test email naar jezelf",
   "invitation-code": "Uitnodigings code",
   "invitation-code": "Uitnodigings code",
   "email-invite-register-subject": "__inviter__ heeft je een uitnodiging gestuurd",
   "email-invite-register-subject": "__inviter__ heeft je een uitnodiging gestuurd",
-  "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-invite-register-text": "Beste __user__,\n\n__inviter__ nodigt je uit voor een Kanban-bord om samen te werken.\n\nHet bord vind je via onderstaande link:\n__url__\n\nJe uitnodigingscode is: __icode__\n\nBedankt en tot ziens.",
   "email-smtp-test-subject": "SMTP Test Email",
   "email-smtp-test-subject": "SMTP Test Email",
-  "email-smtp-test-text": "U heeft met succes een email verzonden",
+  "email-smtp-test-text": "Je hebt met succes een email verzonden",
   "error-invitation-code-not-exist": "Uitnodigings code bestaat niet",
   "error-invitation-code-not-exist": "Uitnodigings code bestaat niet",
   "error-notAuthorized": "Je bent niet toegestaan om deze pagina te bekijken.",
   "error-notAuthorized": "Je bent niet toegestaan om deze pagina te bekijken.",
+  "webhook-title": "Webhook Naam",
+  "webhook-token": "Token (Optioneel voor Authenticatie)",
   "outgoing-webhooks": "Uitgaande Webhooks",
   "outgoing-webhooks": "Uitgaande Webhooks",
+  "bidirectional-webhooks": "Twee-Weg Webhooks",
   "outgoingWebhooksPopup-title": "Uitgaande Webhooks",
   "outgoingWebhooksPopup-title": "Uitgaande Webhooks",
-  "boardCardTitlePopup-title": "Card Title Filter",
+  "boardCardTitlePopup-title": "Kaarttitel Filter",
+  "disable-webhook": "Schakel deze Webhook uit",
+  "global-webhook": "Globale Webhooks",
   "new-outgoing-webhook": "Nieuwe webhook",
   "new-outgoing-webhook": "Nieuwe webhook",
   "no-name": "(Onbekend)",
   "no-name": "(Onbekend)",
   "Node_version": "Node versie",
   "Node_version": "Node versie",
-  "Meteor_version": "Meteor version",
-  "MongoDB_version": "MongoDB version",
+  "Meteor_version": "Meteor versie",
+  "MongoDB_version": "MongoDB versie",
   "MongoDB_storage_engine": "MongoDB storage engine",
   "MongoDB_storage_engine": "MongoDB storage engine",
-  "MongoDB_Oplog_enabled": "MongoDB Oplog enabled",
+  "MongoDB_Oplog_enabled": "MongoDB Oplog ingeschakeld",
   "OS_Arch": "OS Arch",
   "OS_Arch": "OS Arch",
   "OS_Cpus": "OS CPU Count",
   "OS_Cpus": "OS CPU Count",
   "OS_Freemem": "OS Vrij Geheugen",
   "OS_Freemem": "OS Vrij Geheugen",
-  "OS_Loadavg": "OS Gemiddelde Lading",
+  "OS_Loadavg": "OS Gemiddelde Belasting",
   "OS_Platform": "OS Platform",
   "OS_Platform": "OS Platform",
   "OS_Release": "OS Versie",
   "OS_Release": "OS Versie",
   "OS_Totalmem": "OS Totaal Geheugen",
   "OS_Totalmem": "OS Totaal Geheugen",
   "OS_Type": "OS Type",
   "OS_Type": "OS Type",
   "OS_Uptime": "OS Uptime",
   "OS_Uptime": "OS Uptime",
-  "days": "days",
+  "days": "dagen",
   "hours": "uren",
   "hours": "uren",
   "minutes": "minuten",
   "minutes": "minuten",
   "seconds": "seconden",
   "seconds": "seconden",
-  "show-field-on-card": "Show this field on card",
-  "automatically-field-on-card": "Auto create field to all cards",
-  "showLabel-field-on-card": "Show field label on minicard",
+  "show-field-on-card": "Toon dit veld op kaart",
+  "automatically-field-on-card": "Maak veld automatisch aan op alle kaarten",
+  "showLabel-field-on-card": "Toon veldnaam op minikaart",
   "yes": "Ja",
   "yes": "Ja",
   "no": "Nee",
   "no": "Nee",
   "accounts": "Accounts",
   "accounts": "Accounts",
   "accounts-allowEmailChange": "Sta E-mailadres wijzigingen toe",
   "accounts-allowEmailChange": "Sta E-mailadres wijzigingen toe",
-  "accounts-allowUserNameChange": "Allow Username Change",
+  "accounts-allowUserNameChange": "Sta Gebruikersnaam wijzigingen toe",
   "createdAt": "Gemaakt op",
   "createdAt": "Gemaakt op",
   "verified": "Geverifieerd",
   "verified": "Geverifieerd",
   "active": "Actief",
   "active": "Actief",
-  "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",
-  "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",
-  "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
-  "show-subtasks-field": "Cards can have subtasks",
-  "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-when-a-card": "When a card",
+  "card-received": "Ontvangen",
+  "card-received-on": "Ontvangen op",
+  "card-end": "Einde",
+  "card-end-on": "Eindigt op",
+  "editCardReceivedDatePopup-title": "Pas ontvangstdatum aan",
+  "editCardEndDatePopup-title": "Wijzig einddatum",
+  "setCardColorPopup-title": "Stel kleur in",
+  "setCardActionsColorPopup-title": "Kies een kleur",
+  "setSwimlaneColorPopup-title": "Kies een kleur",
+  "setListColorPopup-title": "Kies een kleur",
+  "assigned-by": "Toegewezen door",
+  "requested-by": "Aangevraagd door",
+  "board-delete-notice": "Verwijdering kan niet ongedaan gemaakt worden. Je raakt alle met dit bord gerelateerde lijsten, kaarten en acties kwijt.",
+  "delete-board-confirm-popup": "Alle lijsten, kaarten, labels en activiteiten zullen worden verwijderd en je kunt de bordinhoud niet terughalen. Er is geen herstelmogelijkheid. ",
+  "boardDeletePopup-title": "Bord verwijderen?",
+  "delete-board": "Verwijder bord",
+  "default-subtasks-board": "Subtaken voor __board__ bord",
+  "default": "Standaard",
+  "queue": "Rij",
+  "subtask-settings": "Subtaak Instellingen",
+  "boardSubtaskSettingsPopup-title": "Bord Subtaak Instellingen",
+  "show-subtasks-field": "Kaarten kunnen subtaken hebben",
+  "deposit-subtasks-board": "Plaats subtaken op dit bord:",
+  "deposit-subtasks-list": "Plaats subtaken in deze lijst:",
+  "show-parent-in-minicard": "Toon bron in minikaart:",
+  "prefix-with-full-path": "Prefix met volledig pad",
+  "prefix-with-parent": "Prefix met bron",
+  "subtext-with-full-path": "Subtekst met volledig pad",
+  "subtext-with-parent": "Subtekst met bron",
+  "change-card-parent": "Wijzig bron van kaart",
+  "parent-card": "Bronkaart",
+  "source-board": "Bronbord",
+  "no-parent": "Toon bron niet",
+  "activity-added-label": "label toegevoegd '%s' aan %s",
+  "activity-removed-label": "label verwijderd '%s' van %s",
+  "activity-delete-attach": "een bijlage verwijderd van %s",
+  "activity-added-label-card": "label toegevoegd '%s'",
+  "activity-removed-label-card": "label verwijderd '%s'",
+  "activity-delete-attach-card": "een bijlage verwijderd",
+  "activity-set-customfield": "wijzig maatwerkveld '%s' naar '%s' in %s",
+  "activity-unset-customfield": "wijzig maatwerkveld '%s' in %s",
+  "r-rule": "Regel",
+  "r-add-trigger": "Voeg signaal toe",
+  "r-add-action": "Actie toevoegen",
+  "r-board-rules": "Bord regels",
+  "r-add-rule": "Regel toevoegen",
+  "r-view-rule": "Toon regel",
+  "r-delete-rule": "Verwijder regel",
+  "r-new-rule-name": "Nieuwe regelnaam",
+  "r-no-rules": "Geen regels",
+  "r-when-a-card": "Als een kaart",
   "r-is": "is",
   "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",
-  "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-is-moved": "is verplaatst",
+  "r-added-to": "toegevoegd aan",
+  "r-removed-from": "verwijderd van",
+  "r-the-board": "het bord",
+  "r-list": "lijst",
+  "set-filter": "Definieer Filter",
+  "r-moved-to": "verplaatst naar",
+  "r-moved-from": "verplaatst van",
+  "r-archived": "Verplaatst naar Archief",
+  "r-unarchived": "Teruggehaald uit Archief",
+  "r-a-card": "een kaart",
+  "r-when-a-label-is": "Als een label is",
+  "r-when-the-label": "Als het label",
+  "r-list-name": "lijstnaam",
+  "r-when-a-member": "Als een lid is",
+  "r-when-the-member": "Als het lid",
+  "r-name": "naam",
+  "r-when-a-attach": "Als een bijlage",
+  "r-when-a-checklist": "Als een checklist is",
+  "r-when-the-checklist": "Als de checklist",
+  "r-completed": "Afgewerkt",
+  "r-made-incomplete": "Onafgewerkt gemaakt",
+  "r-when-a-item": "Als een checklist item is",
+  "r-when-the-item": "Als het checklist item",
+  "r-checked": "Aangevinkt",
+  "r-unchecked": "Uitgevinkt",
+  "r-move-card-to": "Verplaats kaart naar",
+  "r-top-of": "Bovenste van",
+  "r-bottom-of": "Onderste van",
+  "r-its-list": "zijn lijst",
+  "r-archive": "Verplaats naar Archief",
+  "r-unarchive": "Terughalen uit Archief",
+  "r-card": "kaart",
   "r-add": "Toevoegen",
   "r-add": "Toevoegen",
-  "r-remove": "Remove",
+  "r-remove": "Verwijder",
   "r-label": "label",
   "r-label": "label",
-  "r-member": "member",
-  "r-remove-all": "Remove all members from the card",
-  "r-set-color": "Set color to",
+  "r-member": "lid",
+  "r-remove-all": "Verwijder alle leden van de kaart",
+  "r-set-color": "Wijzig kleur naar",
   "r-checklist": "checklist",
   "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-check-all": "Vink alles aan",
+  "r-uncheck-all": "Vink alles uit",
+  "r-items-check": "items van checklist",
+  "r-check": "Vink aan",
+  "r-uncheck": "Vink uit",
   "r-item": "item",
   "r-item": "item",
-  "r-of-checklist": "of checklist",
-  "r-send-email": "Send an email",
-  "r-to": "to",
-  "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-of-checklist": "van checklist",
+  "r-send-email": "Verzend een email",
+  "r-to": "naar",
+  "r-subject": "onderwerp",
+  "r-rule-details": "Regel details",
+  "r-d-move-to-top-gen": "Verplaats kaart helemaal naar boven op de lijst",
+  "r-d-move-to-top-spec": "Verplaats kaart naar bovenaan op lijst",
+  "r-d-move-to-bottom-gen": "Verplaats kaart naar onderaan op de lijst",
+  "r-d-move-to-bottom-spec": "Verplaats kaart naar onderaan op lijst",
+  "r-d-send-email": "Verzend email",
+  "r-d-send-email-to": "naar",
+  "r-d-send-email-subject": "onderwerp",
+  "r-d-send-email-message": "bericht",
+  "r-d-archive": "Verplaats kaart naar Archief",
+  "r-d-unarchive": "Haal kaart terug uit Archief",
+  "r-d-add-label": "Label toevoegen",
+  "r-d-remove-label": "Verwijder label",
+  "r-create-card": "Maak nieuwe kaart aan",
+  "r-in-list": "van lijst",
   "r-in-swimlane": "in swimlane",
   "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",
+  "r-d-add-member": "Lid toevoegen",
+  "r-d-remove-member": "Verwijder lid",
+  "r-d-remove-all-member": "Verwijder alle leden",
+  "r-d-check-all": "Vink alle items van een lijst aan",
+  "r-d-uncheck-all": "Vink alle items van een lijst uit",
+  "r-d-check-one": "Vink item aan",
+  "r-d-uncheck-one": "Vink item uit",
+  "r-d-check-of-list": "van checklist",
+  "r-d-add-checklist": "Checklist toevoegen",
+  "r-d-remove-checklist": "Verwijder checklist",
+  "r-by": "door",
+  "r-add-checklist": "Checklist toevoegen",
+  "r-with-items": "met items",
+  "r-items-list": "item1, item2, item3",
+  "r-add-swimlane": "Swimlane toevoegen",
+  "r-swimlane-name": "Swimlane-naam",
+  "r-board-note": "Let op: laat een veld leeg om er niet op te selecteren",
+  "r-checklist-note": "Let op: checklist items moeten geschreven worden als kommagescheiden waarden.",
+  "r-when-a-card-is-moved": "Als een kaart is verplaatst naar een andere lijst",
+  "r-set": "Wijzig",
+  "r-update": "Bijwerken",
+  "r-datefield": "datumveld",
+  "r-df-start-at": "begin",
+  "r-df-due-at": "verval",
+  "r-df-end-at": "einde",
+  "r-df-received-at": "ontvangen",
+  "r-to-current-datetime": "naar huidige datum/tijd",
+  "r-remove-value-from": "Verwijder waarde van",
   "ldap": "LDAP",
   "ldap": "LDAP",
   "oauth2": "OAuth2",
   "oauth2": "OAuth2",
   "cas": "CAS",
   "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",
-  "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-withDue": "__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__] __card__",
-  "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
-  "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "authentication-method": "Authenticatiemethode",
+  "authentication-type": "Authenticatietype",
+  "custom-product-name": "Eigen Productnaam",
+  "layout": "Lay-out",
+  "hide-logo": "Verberg Logo",
+  "add-custom-html-after-body-start": "Voeg eigen HTML toe na <body> start",
+  "add-custom-html-before-body-end": "Voeg eigen HTML toe voor </body> einde",
+  "error-undefined": "Er is iets misgegaan",
+  "error-ldap-login": "Er is een fout opgetreden tijdens het inloggen",
+  "display-authentication-method": "Toon Authenticatiemethode",
+  "default-authentication-method": "Standaard Authenticatiemethode",
+  "duplicate-board": "Dupliceer Bord",
+  "people-number": "Het aantal gebruikers is:",
+  "swimlaneDeletePopup-title": "Swimlane verwijderen?",
+  "swimlane-delete-pop": "Alle acties zullen verwijderd worden van de activiteiten feed en je kunt de swimlane niet terughalen. Er is geen herstelmogelijkheid.",
+  "restore-all": "Haal alles terug",
+  "delete-all": "Verwijder alles",
+  "loading": "Laden, even geduld.",
+  "previous_as": "laatste keer was",
+  "act-a-dueAt": "heeft vervaldatum gewijzigd naar \nOp: __timeValue__\nKaart: __card__\noude vervaldatum was __timeOldValue__",
+  "act-a-endAt": "einddatum gewijzigd naar __timeValue__ van (__timeOldValue__)",
+  "act-a-startAt": "begindatum gewijzigd naar __timeValue__ van (__timeOldValue__)",
+  "act-a-receivedAt": "ontvangstdatum gewijzigd naar __timeValue__ van (__timeOldValue__)",
+  "a-dueAt": "vervaldatum gewijzigd naar",
+  "a-endAt": "einddatum gewijzigd naar",
+  "a-startAt": "begindatum gewijzigd naar",
+  "a-receivedAt": "ontvangstdatum gewijzigd naar",
+  "almostdue": "huidige vervaldatum %s nadert",
+  "pastdue": "huidige vervaldatum %s is verlopen",
+  "duenow": "huidige vervaldatum %s is vandaag",
+  "act-newDue": "__list__/__card__ heeft eerste vervaldatum herinnering [__board__]",
+  "act-withDue": "__list__/__card__ vervaldatum herinneringen [__board__]",
+  "act-almostdue": "wil je herinneren aan het naderen van de huidige vervaldatum (__timeValue__) van __card__ ",
+  "act-pastdue": "wil je herinneren aan het verlopen van de huidige vervaldatum (__timeValue__) van __card__ ",
+  "act-duenow": "wil je herinneren aan het vandaag verlopen van de huidige vervaldatum (__timeValue__) van __card__ ",
+  "act-atUserComment": "Je werd genoemd in [__board__] __list__/__card__",
+  "delete-user-confirm-popup": "Weet je zeker dat je dit account wilt verwijderen? Er is geen herstelmogelijkheid.",
+  "accounts-allowUserDelete": "Sta gebruikers toe om hun eigen account te verwijderen",
+  "hide-minicard-label-text": "Verberg minikaart labeltekst",
+  "show-desktop-drag-handles": "Toon sleep gereedschap op werkblad",
+  "assignee": "Toegewezen aan",
+  "cardAssigneesPopup-title": "Toegewezen aan"
 }
 }

+ 29 - 8
i18n/oc.i18n.json

@@ -132,16 +132,18 @@
   "boardChangeVisibilityPopup-title": "Cambiar la visibilitat",
   "boardChangeVisibilityPopup-title": "Cambiar la visibilitat",
   "boardChangeWatchPopup-title": "Cambiar lo seguit",
   "boardChangeWatchPopup-title": "Cambiar lo seguit",
   "boardMenuPopup-title": "Opcions del tablèu",
   "boardMenuPopup-title": "Opcions del tablèu",
+  "boardChangeViewPopup-title": "Presentacion del tablèu",
   "boards": "Tablèus",
   "boards": "Tablèus",
   "board-view": "Presentacion del tablèu",
   "board-view": "Presentacion del tablèu",
   "board-view-cal": "Calendièr",
   "board-view-cal": "Calendièr",
   "board-view-swimlanes": "Corredor",
   "board-view-swimlanes": "Corredor",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Tièras",
   "board-view-lists": "Tièras",
   "bucket-example": "Coma \"Tota la tièra\" per exemple",
   "bucket-example": "Coma \"Tota la tièra\" per exemple",
   "cancel": "Tornar",
   "cancel": "Tornar",
-  "card-archived": "Aquesta carta es desplaçada dins Archius",
-  "board-archived": "Aqueste tablèu esdesplaçat dins Archius",
-  "card-comments-title": "Aquesta carta a %s de comentaris.",
+  "card-archived": "Aquesta carta es desplaçada dins Archius.",
+  "board-archived": "Aqueste tablèu esdesplaçat dins Archius.",
+  "card-comments-title": "Aquesta carta a %s comentari(s).",
   "card-delete-notice": "Un còp tirat, pas de posibilitat de tornar enrè",
   "card-delete-notice": "Un còp tirat, pas de posibilitat de tornar enrè",
   "card-delete-pop": "Totes las accions van èsser quitadas del seguit d'activitat e poiretz pas mai utilizar aquesta carta.",
   "card-delete-pop": "Totes las accions van èsser quitadas del seguit d'activitat e poiretz pas mai utilizar aquesta carta.",
   "card-delete-suggest-archive": "Podètz desplaçar una carta dins Archius per la quitar del tablèu e gardar las activitats.",
   "card-delete-suggest-archive": "Podètz desplaçar una carta dins Archius per la quitar del tablèu e gardar las activitats.",
@@ -300,8 +302,18 @@
   "error-username-taken": "Lo nom es ja pres",
   "error-username-taken": "Lo nom es ja pres",
   "error-email-taken": "Lo corrièl es ja pres ",
   "error-email-taken": "Lo corrièl es ja pres ",
   "export-board": "Exportar lo tablèu",
   "export-board": "Exportar lo tablèu",
+  "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": "Filtre",
   "filter": "Filtre",
-  "filter-cards": "Filtre cartas",
+  "filter-cards": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Escafar lo filtre",
   "filter-clear": "Escafar lo filtre",
   "filter-no-label": "Pas cap d'etiqueta",
   "filter-no-label": "Pas cap d'etiqueta",
   "filter-no-member": "Pas cap de participant",
   "filter-no-member": "Pas cap de participant",
@@ -426,7 +438,7 @@
   "save": "Salvar",
   "save": "Salvar",
   "search": "Cèrca",
   "search": "Cèrca",
   "rules": "Règlas",
   "rules": "Règlas",
-  "search-cards": "Search from card titles and descriptions on this board",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Text to search for?",
   "search-example": "Text to search for?",
   "select-color": "Color causida",
   "select-color": "Color causida",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "As capitat de mandar un corrièl",
   "email-smtp-test-text": "As capitat de mandar un corrièl",
   "error-invitation-code-not-exist": "Lo còde de convit existís pas",
   "error-invitation-code-not-exist": "Lo còde de convit existís pas",
   "error-notAuthorized": "Sès pas autorizat a agachar aquesta pagina",
   "error-notAuthorized": "Sès pas autorizat a agachar aquesta pagina",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Outgoing Webhooks",
   "outgoing-webhooks": "Outgoing Webhooks",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "no-name": "(Desconegut)",
   "no-name": "(Desconegut)",
   "Node_version": "Node version",
   "Node_version": "Node version",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 26 - 5
i18n/pl.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Zmień widoczność tablicy",
   "boardChangeVisibilityPopup-title": "Zmień widoczność tablicy",
   "boardChangeWatchPopup-title": "Zmień sposób wysyłania powiadomień",
   "boardChangeWatchPopup-title": "Zmień sposób wysyłania powiadomień",
   "boardMenuPopup-title": "Ustawienia tablicy",
   "boardMenuPopup-title": "Ustawienia tablicy",
+  "boardChangeViewPopup-title": "Widok tablicy",
   "boards": "Tablice",
   "boards": "Tablice",
   "board-view": "Widok tablicy",
   "board-view": "Widok tablicy",
   "board-view-cal": "Kalendarz",
   "board-view-cal": "Kalendarz",
   "board-view-swimlanes": "Diagramy czynności",
   "board-view-swimlanes": "Diagramy czynności",
+  "board-view-collapse": "Zwiń",
   "board-view-lists": "Listy",
   "board-view-lists": "Listy",
   "bucket-example": "Tak jak na przykład \"lista kubełkowa\"",
   "bucket-example": "Tak jak na przykład \"lista kubełkowa\"",
   "cancel": "Anuluj",
   "cancel": "Anuluj",
@@ -300,8 +302,18 @@
   "error-username-taken": "Ta nazwa jest już zajęta",
   "error-username-taken": "Ta nazwa jest już zajęta",
   "error-email-taken": "Adres email jest już zarezerwowany",
   "error-email-taken": "Adres email jest już zarezerwowany",
   "export-board": "Eksportuj tablicę",
   "export-board": "Eksportuj tablicę",
+  "sort": "Sortuj",
+  "sort-desc": "Kliknij by sortować listę",
+  "list-sort-by": "Sortuj listę przez:",
+  "list-label-modifiedAt": "Ostatni czas dostępu",
+  "list-label-title": "Nazwa listy",
+  "list-label-sort": "Twoja kolejność ustawiona ręcznie",
+  "list-label-short-modifiedAt": "(O)",
+  "list-label-short-title": "(N)",
+  "list-label-short-sort": "(K)",
   "filter": "Filtr",
   "filter": "Filtr",
-  "filter-cards": "Odfiltruj karty",
+  "filter-cards": "Filtruj karty i listy",
+  "list-filter-label": "Filtruj listy względem tytułu",
   "filter-clear": "Usuń filter",
   "filter-clear": "Usuń filter",
   "filter-no-label": "Brak etykiety",
   "filter-no-label": "Brak etykiety",
   "filter-no-member": "Brak członków",
   "filter-no-member": "Brak członków",
@@ -426,7 +438,7 @@
   "save": "Zapisz",
   "save": "Zapisz",
   "search": "Wyszukaj",
   "search": "Wyszukaj",
   "rules": "Reguły",
   "rules": "Reguły",
-  "search-cards": "Szukaj spośród tytułów kart oraz opisów na tej tablicy",
+  "search-cards": "Szukaj w tytułach kart/list oraz opisach na tej tablicy",
   "search-example": "Czego mam szukać?",
   "search-example": "Czego mam szukać?",
   "select-color": "Wybierz kolor",
   "select-color": "Wybierz kolor",
   "set-wip-limit-value": "Ustaw maksymalny limit zadań na tej liście",
   "set-wip-limit-value": "Ustaw maksymalny limit zadań na tej liście",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "Wiadomość testowa została wysłana z powodzeniem.",
   "email-smtp-test-text": "Wiadomość testowa została wysłana z powodzeniem.",
   "error-invitation-code-not-exist": "Kod zaproszenia nie istnieje",
   "error-invitation-code-not-exist": "Kod zaproszenia nie istnieje",
   "error-notAuthorized": "Nie jesteś uprawniony do przeglądania tej strony.",
   "error-notAuthorized": "Nie jesteś uprawniony do przeglądania tej strony.",
+  "webhook-title": "Nazwa webhooka",
+  "webhook-token": "Token (opcjonalny do autoryzacji)",
   "outgoing-webhooks": "Wychodzące webhooki",
   "outgoing-webhooks": "Wychodzące webhooki",
+  "bidirectional-webhooks": "Dwustronne webhooki",
   "outgoingWebhooksPopup-title": "Wychodzące webhooki",
   "outgoingWebhooksPopup-title": "Wychodzące webhooki",
   "boardCardTitlePopup-title": "Filtruj poprzez nazwę karty",
   "boardCardTitlePopup-title": "Filtruj poprzez nazwę karty",
+  "disable-webhook": "Wyłącz tego webhooka",
+  "global-webhook": "Globalne webhooki",
   "new-outgoing-webhook": "Nowy wychodzący webhook",
   "new-outgoing-webhook": "Nowy wychodzący webhook",
   "no-name": "(nieznany)",
   "no-name": "(nieznany)",
   "Node_version": "Wersja Node",
   "Node_version": "Wersja Node",
@@ -723,12 +740,16 @@
   "almostdue": "aktualny termin ukończenia %s dobiega końca",
   "almostdue": "aktualny termin ukończenia %s dobiega końca",
   "pastdue": "aktualny termin ukończenia %s jest w przeszłości",
   "pastdue": "aktualny termin ukończenia %s jest w przeszłości",
   "duenow": "aktualny termin ukończenia %s jest dzisiaj",
   "duenow": "aktualny termin ukończenia %s jest dzisiaj",
-  "act-withDue": "__card__ przypomina o zakończeniu terminu [__board__]",
+  "act-newDue": "__list__/__card__ przypomina o 1szym zakończeniu terminu [__board__]",
+  "act-withDue": "__list__/__card__ posiada przypomnienia zakończenia terminu [__board__]",
   "act-almostdue": "przypomina o zbliżającej się dacie ukończenia (__timeValue__) karty __card__",
   "act-almostdue": "przypomina o zbliżającej się dacie ukończenia (__timeValue__) karty __card__",
   "act-pastdue": "przypomina o ubiegłej dacie ukończenia (__timeValue__) karty __card__",
   "act-pastdue": "przypomina o ubiegłej dacie ukończenia (__timeValue__) karty __card__",
   "act-duenow": "przypomina o ubiegającej teraz dacie ukończenia (__timeValue__) karty __card__",
   "act-duenow": "przypomina o ubiegającej teraz dacie ukończenia (__timeValue__) karty __card__",
-  "act-atUserComment": "Zostałeś wspomniany na __board__ (__card__)",
+  "act-atUserComment": "Zostałeś wspomniany w [__board] __list__/__card__",
   "delete-user-confirm-popup": "Czy jesteś pewien, że chcesz usunąć te konto? Nie można tego wycofać.",
   "delete-user-confirm-popup": "Czy jesteś pewien, że chcesz usunąć te konto? Nie można tego wycofać.",
   "accounts-allowUserDelete": "Pozwól użytkownikom na usuwanie własnych kont",
   "accounts-allowUserDelete": "Pozwól użytkownikom na usuwanie własnych kont",
-  "hide-minicard-label-text": "Ukryj opisy etykiet minikart"
+  "hide-minicard-label-text": "Ukryj opisy etykiet minikart",
+  "show-desktop-drag-handles": "Pokaż przeciągnięcia na pulpit",
+  "assignee": "Przypisujący",
+  "cardAssigneesPopup-title": "Przypisujący"
 }
 }

+ 26 - 5
i18n/pt-BR.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Alterar Visibilidade",
   "boardChangeVisibilityPopup-title": "Alterar Visibilidade",
   "boardChangeWatchPopup-title": "Alterar observação",
   "boardChangeWatchPopup-title": "Alterar observação",
   "boardMenuPopup-title": "Configurações do quadro",
   "boardMenuPopup-title": "Configurações do quadro",
+  "boardChangeViewPopup-title": "Visão de quadro",
   "boards": "Quadros",
   "boards": "Quadros",
   "board-view": "Visão de quadro",
   "board-view": "Visão de quadro",
   "board-view-cal": "Calendário",
   "board-view-cal": "Calendário",
   "board-view-swimlanes": "Raias",
   "board-view-swimlanes": "Raias",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Listas",
   "board-view-lists": "Listas",
   "bucket-example": "\"Bucket List\", por exemplo",
   "bucket-example": "\"Bucket List\", por exemplo",
   "cancel": "Cancelar",
   "cancel": "Cancelar",
@@ -300,8 +302,18 @@
   "error-username-taken": "Esse username já existe",
   "error-username-taken": "Esse username já existe",
   "error-email-taken": "E-mail já está em uso",
   "error-email-taken": "E-mail já está em uso",
   "export-board": "Exportar quadro",
   "export-board": "Exportar quadro",
+  "sort": "Ordenar",
+  "sort-desc": "Clique para Ordenar Lista",
+  "list-sort-by": "Ordenar a Lista por:",
+  "list-label-modifiedAt": "Último Acesso",
+  "list-label-title": "Nome da Lista",
+  "list-label-sort": "Ordem Manual",
+  "list-label-short-modifiedAt": "(L)",
+  "list-label-short-title": "(N)",
+  "list-label-short-sort": "(M)",
   "filter": "Filtrar",
   "filter": "Filtrar",
-  "filter-cards": "Filtrar Cartões",
+  "filter-cards": "Filtrar Cartões ou Listas",
+  "list-filter-label": "Filtrar Lista por Título",
   "filter-clear": "Limpar filtro",
   "filter-clear": "Limpar filtro",
   "filter-no-label": "Sem etiquetas",
   "filter-no-label": "Sem etiquetas",
   "filter-no-member": "Sem membros",
   "filter-no-member": "Sem membros",
@@ -426,7 +438,7 @@
   "save": "Salvar",
   "save": "Salvar",
   "search": "Buscar",
   "search": "Buscar",
   "rules": "Regras",
   "rules": "Regras",
-  "search-cards": "Pesquisa em títulos e descrições de cartões neste quadro",
+  "search-cards": "Procurar por título e descrição de cartão/lista neste quadro ",
   "search-example": "Texto para procurar",
   "search-example": "Texto para procurar",
   "select-color": "Selecionar Cor",
   "select-color": "Selecionar Cor",
   "set-wip-limit-value": "Defina um limite máximo para o número de tarefas nesta lista",
   "set-wip-limit-value": "Defina um limite máximo para o número de tarefas nesta lista",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "Você enviou um e-mail com sucesso",
   "email-smtp-test-text": "Você enviou um e-mail com sucesso",
   "error-invitation-code-not-exist": "O código do convite não existe",
   "error-invitation-code-not-exist": "O código do convite não existe",
   "error-notAuthorized": "Você não está autorizado à ver esta página.",
   "error-notAuthorized": "Você não está autorizado à ver esta página.",
+  "webhook-title": "Nome do Webhook",
+  "webhook-token": "Token (Opcional para autenticação)",
   "outgoing-webhooks": "Webhook de saída",
   "outgoing-webhooks": "Webhook de saída",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Webhook de saída",
   "outgoingWebhooksPopup-title": "Webhook de saída",
   "boardCardTitlePopup-title": "Filtro do Título do Cartão",
   "boardCardTitlePopup-title": "Filtro do Título do Cartão",
+  "disable-webhook": "Desabilitar este Webhook",
+  "global-webhook": "Webhooks globais",
   "new-outgoing-webhook": "Novo Webhook de saída",
   "new-outgoing-webhook": "Novo Webhook de saída",
   "no-name": "(Desconhecido)",
   "no-name": "(Desconhecido)",
   "Node_version": "Versão do Node",
   "Node_version": "Versão do Node",
@@ -723,12 +740,16 @@
   "almostdue": "prazo final atual %s está próximo",
   "almostdue": "prazo final atual %s está próximo",
   "pastdue": "prazo final atual %s venceu",
   "pastdue": "prazo final atual %s venceu",
   "duenow": "prazo final atual %s é hoje",
   "duenow": "prazo final atual %s é hoje",
-  "act-withDue": "__card__ lembrete de prazos finais [__board__]",
+  "act-newDue": "__list__/__card__ possui 1º lembrete de prazo [__board__]",
+  "act-withDue": "__list__/__card__ lembretes de prazo [__board__]",
   "act-almostdue": "está lembrando que o prazo final atual (__timeValue__) do __card__ está próximo",
   "act-almostdue": "está lembrando que o prazo final atual (__timeValue__) do __card__ está próximo",
   "act-pastdue": "está lembrando que o prazo final atual (__timeValue__) do __card__ venceu",
   "act-pastdue": "está lembrando que o prazo final atual (__timeValue__) do __card__ venceu",
   "act-duenow": "está lembrando que o prazo final (__timeValue__) do __card__ é agora",
   "act-duenow": "está lembrando que o prazo final (__timeValue__) do __card__ é agora",
-  "act-atUserComment": "Você foi mencionado no [__board__] __card__",
+  "act-atUserComment": "Você foi mencionado no [__board__] __list__/__card__",
   "delete-user-confirm-popup": "Você realmente quer apagar esta conta? Não há como desfazer.",
   "delete-user-confirm-popup": "Você realmente quer apagar esta conta? Não há como desfazer.",
   "accounts-allowUserDelete": "Permitir que usuários apaguem a própria conta",
   "accounts-allowUserDelete": "Permitir que usuários apaguem a própria conta",
-  "hide-minicard-label-text": "Esconder rótulo da etiqueta do mini cartão"
+  "hide-minicard-label-text": "Esconder rótulo da etiqueta do mini cartão",
+  "show-desktop-drag-handles": "Mostrar alças de arrasto da área de trabalho",
+  "assignee": "Administrador",
+  "cardAssigneesPopup-title": "Administrador"
 }
 }

+ 26 - 5
i18n/pt.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Alterar Visibilidade",
   "boardChangeVisibilityPopup-title": "Alterar Visibilidade",
   "boardChangeWatchPopup-title": "Alterar Observação",
   "boardChangeWatchPopup-title": "Alterar Observação",
   "boardMenuPopup-title": "Configurações do Quadro",
   "boardMenuPopup-title": "Configurações do Quadro",
+  "boardChangeViewPopup-title": "Visão do Quadro",
   "boards": "Quadros",
   "boards": "Quadros",
   "board-view": "Visão do Quadro",
   "board-view": "Visão do Quadro",
   "board-view-cal": "Calendário",
   "board-view-cal": "Calendário",
   "board-view-swimlanes": "Pistas",
   "board-view-swimlanes": "Pistas",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Listas",
   "board-view-lists": "Listas",
   "bucket-example": "\"Lista de Desejos\", por exemplo",
   "bucket-example": "\"Lista de Desejos\", por exemplo",
   "cancel": "Cancelar",
   "cancel": "Cancelar",
@@ -300,8 +302,18 @@
   "error-username-taken": "Esse nome de utilizador já existe",
   "error-username-taken": "Esse nome de utilizador já existe",
   "error-email-taken": "Endereço de e-mail já está em uso",
   "error-email-taken": "Endereço de e-mail já está em uso",
   "export-board": "Exportar quadro",
   "export-board": "Exportar quadro",
+  "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": "Filtrar",
   "filter": "Filtrar",
-  "filter-cards": "Filtrar Cartões",
+  "filter-cards": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Limpar filtro",
   "filter-clear": "Limpar filtro",
   "filter-no-label": "Sem etiquetas",
   "filter-no-label": "Sem etiquetas",
   "filter-no-member": "Sem membros",
   "filter-no-member": "Sem membros",
@@ -426,7 +438,7 @@
   "save": "Guardar",
   "save": "Guardar",
   "search": "Procurar",
   "search": "Procurar",
   "rules": "Regras",
   "rules": "Regras",
-  "search-cards": "Pesquisar nos títulos e descrições dos cartões deste quadro",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Texto a procurar?",
   "search-example": "Texto a procurar?",
   "select-color": "Seleccionar Cor",
   "select-color": "Seleccionar Cor",
   "set-wip-limit-value": "Defina um limite máximo para o número de tarefas nesta lista",
   "set-wip-limit-value": "Defina um limite máximo para o número de tarefas nesta lista",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "Enviou um e-mail com sucesso",
   "email-smtp-test-text": "Enviou um e-mail com sucesso",
   "error-invitation-code-not-exist": "O código do convite não existe",
   "error-invitation-code-not-exist": "O código do convite não existe",
   "error-notAuthorized": "Não tem autorização para ver esta página.",
   "error-notAuthorized": "Não tem autorização para ver esta página.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Webhooks de saída",
   "outgoing-webhooks": "Webhooks de saída",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Webhooks de saída",
   "outgoingWebhooksPopup-title": "Webhooks de saída",
   "boardCardTitlePopup-title": "Filtro do Título do Cartão",
   "boardCardTitlePopup-title": "Filtro do Título do Cartão",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "Novo Webhook de saída",
   "new-outgoing-webhook": "Novo Webhook de saída",
   "no-name": "(Desconhecido)",
   "no-name": "(Desconhecido)",
   "Node_version": "Versão do Node",
   "Node_version": "Versão do Node",
@@ -723,12 +740,16 @@
   "almostdue": "a data limite actual %s está-se a aproximar",
   "almostdue": "a data limite actual %s está-se a aproximar",
   "pastdue": "a data limite actual %s já passou",
   "pastdue": "a data limite actual %s já passou",
   "duenow": "a data limite actual %s é hoje",
   "duenow": "a data limite actual %s é hoje",
-  "act-withDue": "lembretes das datas limites de __card__ [__board__]",
+  "act-newDue": "__list__/__card__ has 1st due reminder [__board__]",
+  "act-withDue": "__list__/__card__ due reminders [__board__]",
   "act-almostdue": "estava a lembrar que a data limite actual (__timeValue__) de __card__ está-se a aproximar",
   "act-almostdue": "estava a lembrar que a data limite actual (__timeValue__) de __card__ está-se a aproximar",
   "act-pastdue": "estava a lembrar que a data limite (__timeValue__) de __card__ já passou",
   "act-pastdue": "estava a lembrar que a data limite (__timeValue__) de __card__ já passou",
   "act-duenow": "estava a lembrar que a data limite (__timeValue__) de __card__ é agora",
   "act-duenow": "estava a lembrar que a data limite (__timeValue__) de __card__ é agora",
-  "act-atUserComment": "Foi mencionado em [__board__] __card__",
+  "act-atUserComment": "You were mentioned in [__board__] __list__/__card__",
   "delete-user-confirm-popup": "Tem a certeza que pretende apagar esta conta? Não há como desfazer.",
   "delete-user-confirm-popup": "Tem a certeza que pretende apagar esta conta? Não há como desfazer.",
   "accounts-allowUserDelete": "Permitir aos utilizadores apagar as suas próprias contas",
   "accounts-allowUserDelete": "Permitir aos utilizadores apagar as suas próprias contas",
-  "hide-minicard-label-text": "Ocultar texto das etiquetas dos mini-cartões"
+  "hide-minicard-label-text": "Ocultar texto das etiquetas dos mini-cartões",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 26 - 5
i18n/ro.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeVisibilityPopup-title": "Change Visibility",
   "boardChangeWatchPopup-title": "Change Watch",
   "boardChangeWatchPopup-title": "Change Watch",
   "boardMenuPopup-title": "Board Settings",
   "boardMenuPopup-title": "Board Settings",
+  "boardChangeViewPopup-title": "Board View",
   "boards": "Boards",
   "boards": "Boards",
   "board-view": "Board View",
   "board-view": "Board View",
   "board-view-cal": "Calendar",
   "board-view-cal": "Calendar",
   "board-view-swimlanes": "Swimlanes",
   "board-view-swimlanes": "Swimlanes",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Liste",
   "board-view-lists": "Liste",
   "bucket-example": "Like “Bucket List” for example",
   "bucket-example": "Like “Bucket List” for example",
   "cancel": "Cancel",
   "cancel": "Cancel",
@@ -300,8 +302,18 @@
   "error-username-taken": "This username is already taken",
   "error-username-taken": "This username is already taken",
   "error-email-taken": "Email has already been taken",
   "error-email-taken": "Email has already been taken",
   "export-board": "Export board",
   "export-board": "Export board",
+  "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": "Filter",
-  "filter-cards": "Filter Cards",
+  "filter-cards": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Clear filter",
   "filter-clear": "Clear filter",
   "filter-no-label": "No label",
   "filter-no-label": "No label",
   "filter-no-member": "No member",
   "filter-no-member": "No member",
@@ -426,7 +438,7 @@
   "save": "Salvează",
   "save": "Salvează",
   "search": "Caută",
   "search": "Caută",
   "rules": "Rules",
   "rules": "Rules",
-  "search-cards": "Search from card titles and descriptions on this board",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Text to search for?",
   "search-example": "Text to search for?",
   "select-color": "Select Color",
   "select-color": "Select Color",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
   "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
@@ -510,9 +522,14 @@
   "email-smtp-test-text": "You have successfully sent an email",
   "email-smtp-test-text": "You have successfully sent an email",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-invitation-code-not-exist": "Invitation code doesn't exist",
   "error-notAuthorized": "You are not authorized to view this page.",
   "error-notAuthorized": "You are not authorized to view this page.",
+  "webhook-title": "Webhook Name",
+  "webhook-token": "Token (Optional for Authentication)",
   "outgoing-webhooks": "Outgoing Webhooks",
   "outgoing-webhooks": "Outgoing Webhooks",
+  "bidirectional-webhooks": "Two-Way Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "outgoingWebhooksPopup-title": "Outgoing Webhooks",
   "boardCardTitlePopup-title": "Card Title Filter",
   "boardCardTitlePopup-title": "Card Title Filter",
+  "disable-webhook": "Disable This Webhook",
+  "global-webhook": "Global Webhooks",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "new-outgoing-webhook": "New Outgoing Webhook",
   "no-name": "(Unknown)",
   "no-name": "(Unknown)",
   "Node_version": "Node version",
   "Node_version": "Node version",
@@ -723,12 +740,16 @@
   "almostdue": "current due time %s is approaching",
   "almostdue": "current due time %s is approaching",
   "pastdue": "current due time %s is past",
   "pastdue": "current due time %s is past",
   "duenow": "current due time %s is today",
   "duenow": "current due time %s is today",
-  "act-withDue": "__card__ due reminders [__board__]",
+  "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-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
   "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
   "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-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
-  "act-atUserComment": "You were mentioned in [__board__] __card__",
+  "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-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
   "accounts-allowUserDelete": "Allow users to self delete their account",
   "accounts-allowUserDelete": "Allow users to self delete their account",
-  "hide-minicard-label-text": "Hide minicard label text"
+  "hide-minicard-label-text": "Hide minicard label text",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

+ 29 - 8
i18n/ru.i18n.json

@@ -132,10 +132,12 @@
   "boardChangeVisibilityPopup-title": "Изменить настройки видимости",
   "boardChangeVisibilityPopup-title": "Изменить настройки видимости",
   "boardChangeWatchPopup-title": "Режимы оповещения",
   "boardChangeWatchPopup-title": "Режимы оповещения",
   "boardMenuPopup-title": "Настройки доски",
   "boardMenuPopup-title": "Настройки доски",
+  "boardChangeViewPopup-title": "Вид доски",
   "boards": "Доски",
   "boards": "Доски",
   "board-view": "Вид доски",
   "board-view": "Вид доски",
   "board-view-cal": "Календарь",
   "board-view-cal": "Календарь",
   "board-view-swimlanes": "Дорожки",
   "board-view-swimlanes": "Дорожки",
+  "board-view-collapse": "Collapse",
   "board-view-lists": "Списки",
   "board-view-lists": "Списки",
   "bucket-example": "Например “Список дел”",
   "bucket-example": "Например “Список дел”",
   "cancel": "Отмена",
   "cancel": "Отмена",
@@ -300,8 +302,18 @@
   "error-username-taken": "Это имя пользователя уже занято",
   "error-username-taken": "Это имя пользователя уже занято",
   "error-email-taken": "Этот адрес уже занят",
   "error-email-taken": "Этот адрес уже занят",
   "export-board": "Экспортировать доску",
   "export-board": "Экспортировать доску",
+  "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": "Filter Cards or Lists",
+  "list-filter-label": "Filter List by Title",
   "filter-clear": "Очистить фильтр",
   "filter-clear": "Очистить фильтр",
   "filter-no-label": "Нет метки",
   "filter-no-label": "Нет метки",
   "filter-no-member": "Нет участников",
   "filter-no-member": "Нет участников",
@@ -426,7 +438,7 @@
   "save": "Сохранить",
   "save": "Сохранить",
   "search": "Поиск",
   "search": "Поиск",
   "rules": "Правила",
   "rules": "Правила",
-  "search-cards": "Искать в названиях и описаниях карточек на этой доске",
+  "search-cards": "Search from card/list titles and descriptions on this board",
   "search-example": "Искать текст?",
   "search-example": "Искать текст?",
   "select-color": "Выбрать цвет",
   "select-color": "Выбрать цвет",
   "set-wip-limit-value": "Устанавливает ограничение на максимальное количество задач в этом списке",
   "set-wip-limit-value": "Устанавливает ограничение на максимальное количество задач в этом списке",
@@ -510,10 +522,15 @@
   "email-smtp-test-text": "Вы успешно отправили письмо",
   "email-smtp-test-text": "Вы успешно отправили письмо",
   "error-invitation-code-not-exist": "Код приглашения не существует",
   "error-invitation-code-not-exist": "Код приглашения не существует",
   "error-notAuthorized": "У вас нет доступа на просмотр этой страницы.",
   "error-notAuthorized": "У вас нет доступа на просмотр этой страницы.",
-  "outgoing-webhooks": "Исходящие Веб-хуки",
-  "outgoingWebhooksPopup-title": "Исходящие Веб-хуки",
+  "webhook-title": "Имя Веб-Хука",
+  "webhook-token": "Токен (Опционально для аутентификации)",
+  "outgoing-webhooks": "Исходящие Веб-Хуки",
+  "bidirectional-webhooks": "Двунаправленный Веб-Хук",
+  "outgoingWebhooksPopup-title": "Исходящие Веб-Хуки",
   "boardCardTitlePopup-title": "Фильтр названий карточек",
   "boardCardTitlePopup-title": "Фильтр названий карточек",
-  "new-outgoing-webhook": "Новый исходящий Веб-хук",
+  "disable-webhook": "Отключить этот Веб-Хук",
+  "global-webhook": "Глобальные Веб-Хуки",
+  "new-outgoing-webhook": "Новый исходящий Веб-Хук",
   "no-name": "(Неизвестный)",
   "no-name": "(Неизвестный)",
   "Node_version": "Версия NodeJS",
   "Node_version": "Версия NodeJS",
   "Meteor_version": "Версия Meteor",
   "Meteor_version": "Версия Meteor",
@@ -723,12 +740,16 @@
   "almostdue": "текущий срок выполнения %s приближается",
   "almostdue": "текущий срок выполнения %s приближается",
   "pastdue": "текущий срок выполнения %s прошел",
   "pastdue": "текущий срок выполнения %s прошел",
   "duenow": "текущий срок выполнения %s сегодня",
   "duenow": "текущий срок выполнения %s сегодня",
-  "act-withDue": "__card__ напоминания о сроке выполнения [__board__]",
+  "act-newDue": "__list__/__card__ has 1st due reminder [__board__]",
+  "act-withDue": "__list__/__card__ due reminders [__board__]",
   "act-almostdue": "напомнил, что скоро завершается срок выполнения (__timeValue__) карточки __card__",
   "act-almostdue": "напомнил, что скоро завершается срок выполнения (__timeValue__) карточки __card__",
   "act-pastdue": "напомнил, что срок выполнения (__timeValue__) карточки __card__ прошел",
   "act-pastdue": "напомнил, что срок выполнения (__timeValue__) карточки __card__ прошел",
   "act-duenow": "напомнил, что срок выполнения (__timeValue__) карточки __card__ — это уже сейчас",
   "act-duenow": "напомнил, что срок выполнения (__timeValue__) карточки __card__ — это уже сейчас",
-  "act-atUserComment": "Вас упомянули в [__board__] __card__",
+  "act-atUserComment": "Вас упомянули в [__board__] __list__/__card__",
   "delete-user-confirm-popup": "Вы уверены, что хотите удалить аккаунт? Данное действие необратимо.",
   "delete-user-confirm-popup": "Вы уверены, что хотите удалить аккаунт? Данное действие необратимо.",
   "accounts-allowUserDelete": "Разрешить пользователям удалять собственные аккаунты",
   "accounts-allowUserDelete": "Разрешить пользователям удалять собственные аккаунты",
-  "hide-minicard-label-text": "Скрыть текст меток на карточках"
+  "hide-minicard-label-text": "Скрыть текст меток на карточках",
+  "show-desktop-drag-handles": "Show desktop drag handles",
+  "assignee": "Assignee",
+  "cardAssigneesPopup-title": "Assignee"
 }
 }

部分文件因文件數量過多而無法顯示