summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.meteor/packages30
-rw-r--r--.meteor/release2
-rw-r--r--.meteor/versions96
-rw-r--r--.travis.yml6
-rw-r--r--.tx/config2
-rw-r--r--CHANGELOG.md24
-rw-r--r--Dockerfile32
-rw-r--r--client/components/boards/boardBody.jade35
-rw-r--r--client/components/boards/boardBody.js158
-rw-r--r--client/components/boards/boardBody.styl10
-rw-r--r--client/components/boards/boardHeader.jade5
-rw-r--r--client/components/boards/boardHeader.js21
-rw-r--r--client/components/cards/cardDate.js14
-rw-r--r--client/components/cards/cardDate.styl14
-rw-r--r--client/components/cards/cardDetails.js12
-rw-r--r--client/components/lists/list.js7
-rw-r--r--client/components/lists/list.styl5
-rw-r--r--client/components/lists/listBody.jade2
-rw-r--r--client/components/lists/listBody.js16
-rw-r--r--client/components/swimlanes/swimlanes.jade78
-rw-r--r--client/components/swimlanes/swimlanes.js223
-rw-r--r--client/components/swimlanes/swimlanes.styl20
-rw-r--r--i18n/ar.i18n.json6
-rw-r--r--i18n/br.i18n.json6
-rw-r--r--i18n/ca.i18n.json6
-rw-r--r--i18n/cs.i18n.json6
-rw-r--r--i18n/de.i18n.json6
-rw-r--r--i18n/el.i18n.json6
-rw-r--r--i18n/en-GB.i18n.json6
-rw-r--r--i18n/en.i18n.json6
-rw-r--r--i18n/eo.i18n.json6
-rw-r--r--i18n/es-AR.i18n.json6
-rw-r--r--i18n/es.i18n.json26
-rw-r--r--i18n/eu.i18n.json6
-rw-r--r--i18n/fa.i18n.json6
-rw-r--r--i18n/fi.i18n.json4
-rw-r--r--i18n/fr.i18n.json12
-rw-r--r--i18n/gl.i18n.json6
-rw-r--r--i18n/he.i18n.json6
-rw-r--r--i18n/hu.i18n.json30
-rw-r--r--i18n/ibo.json428
-rw-r--r--i18n/id.i18n.json6
-rw-r--r--i18n/it.i18n.json6
-rw-r--r--i18n/ja.i18n.json6
-rw-r--r--i18n/ko.i18n.json46
-rw-r--r--i18n/lv.i18n.json6
-rw-r--r--i18n/mn.i18n.json428
-rw-r--r--i18n/nb.i18n.json6
-rw-r--r--i18n/nl.i18n.json74
-rw-r--r--i18n/pl.i18n.json6
-rw-r--r--i18n/pt-BR.i18n.json12
-rw-r--r--i18n/pt.i18n.json428
-rw-r--r--i18n/ro.i18n.json6
-rw-r--r--i18n/ru.i18n.json6
-rw-r--r--i18n/sr.i18n.json6
-rw-r--r--i18n/sv.i18n.json16
-rw-r--r--i18n/ta.i18n.json6
-rw-r--r--i18n/th.i18n.json6
-rw-r--r--i18n/tr.i18n.json30
-rw-r--r--i18n/uk.i18n.json6
-rw-r--r--i18n/vi.i18n.json6
-rw-r--r--i18n/zh-CN.i18n.json6
-rw-r--r--i18n/zh-TW.i18n.json6
-rw-r--r--models/attachments.js153
-rw-r--r--models/boards.js12
-rw-r--r--models/cards.js6
-rw-r--r--models/lists.js10
-rw-r--r--models/swimlanes.js219
-rw-r--r--package.json6
-rw-r--r--sandstorm-pkgdef.capnp4
-rw-r--r--sandstorm.js2
-rw-r--r--server/migrations.js36
-rw-r--r--server/publications/boards.js1
-rw-r--r--snapcraft.yaml25
74 files changed, 2474 insertions, 520 deletions
diff --git a/.meteor/packages b/.meteor/packages
index 0bbe54df..8e2f5784 100644
--- a/.meteor/packages
+++ b/.meteor/packages
@@ -3,13 +3,13 @@
# 'meteor add' and 'meteor remove' will edit this file for you,
# but you can also edit it by hand.
-meteor-base@1.0.4
+meteor-base@1.2.0
# Build system
-ecmascript@0.7.2
-stylus@2.513.9
-standard-minifier-css@1.3.4
-standard-minifier-js@2.0.0
+ecmascript@0.9.0
+stylus@2.513.13
+standard-minifier-css@1.3.5
+standard-minifier-js@2.2.0
mquandalle:jade
# Polyfills
@@ -17,18 +17,16 @@ es5-shim@4.6.15
# Collections
aldeed:collection2
-cfs:gridfs
cfs:standard-packages
cottz:publish-relations
dburles:collection-helpers
idmontie:migrations
matb33:collection-hooks
matteodem:easy-search
-mongo@1.1.16
+mongo@1.3.1
mquandalle:collection-mutations
# Account system
-accounts-password@1.3.5
kenton:accounts-sandstorm
service-configuration@1.0.11
useraccounts:unstyled
@@ -38,9 +36,9 @@ useraccounts:flow-routing
check@1.2.5
jquery@1.11.10
random@1.0.10
-reactive-dict@1.1.8
+reactive-dict@1.2.0
session@1.1.7
-tracker@1.1.2
+tracker@1.1.3
underscore@1.0.10
3stack:presence
alethes:pages
@@ -48,7 +46,6 @@ arillo:flow-router-helpers
audit-argument-checks@1.0.7
kadira:blaze-layout
kadira:dochead
-meteorhacks:fast-render
meteorhacks:picker
meteorhacks:subs-manager
mquandalle:autofocus
@@ -56,7 +53,7 @@ mquandalle:moment
ongoworks:speakingurl
raix:handlebar-helpers
tap:i18n
-http
+http@1.3.0
# UI components
blaze
@@ -74,10 +71,15 @@ templates:tabs
verron:autosize
simple:json-routes
rajit:bootstrap3-datepicker
-kadira:flow-router
-shell-server@0.2.3
+shell-server@0.3.0
simple:rest-accounts-password
useraccounts:core
email@1.2.3
horka:swipebox
+dynamic-import@0.2.0
+staringatlights:fast-render
+staringatlights:flow-router
+
mixmax:smart-disconnect
+accounts-password@1.5.0
+cfs:gridfs
diff --git a/.meteor/release b/.meteor/release
index 605b4e1f..56a7a07f 100644
--- a/.meteor/release
+++ b/.meteor/release
@@ -1 +1 @@
-METEOR@1.4.4.1
+METEOR@1.6.0.1
diff --git a/.meteor/versions b/.meteor/versions
index e3f904be..90e6394d 100644
--- a/.meteor/versions
+++ b/.meteor/versions
@@ -1,23 +1,23 @@
-3stack:presence@1.0.5
-accounts-base@1.2.16
-accounts-password@1.3.5
+3stack:presence@1.1.2
+accounts-base@1.4.0
+accounts-password@1.5.0
aldeed:collection2@2.10.0
aldeed:collection2-core@1.2.0
aldeed:schema-deny@1.1.0
aldeed:schema-index@1.1.1
aldeed:simple-schema@1.5.3
alethes:pages@1.8.6
-allow-deny@1.0.9
+allow-deny@1.1.0
arillo:flow-router-helpers@0.5.2
audit-argument-checks@1.0.7
autoupdate@1.3.12
-babel-compiler@6.18.2
-babel-runtime@1.0.1
+babel-compiler@6.24.7
+babel-runtime@1.1.1
base64@1.0.10
binary-heap@1.0.10
blaze@2.3.2
blaze-tools@1.0.10
-boilerplate-generator@1.0.11
+boilerplate-generator@1.3.1
caching-compiler@1.1.9
caching-html-compiler@1.1.2
callback-hook@1.0.10
@@ -27,7 +27,7 @@ cfs:collection@0.5.5
cfs:collection-filters@0.2.4
cfs:data-man@0.0.6
cfs:file@0.1.17
-cfs:gridfs@0.0.33
+cfs:gridfs@0.0.34
cfs:http-methods@0.0.32
cfs:http-publish@0.0.13
cfs:power-queue@0.9.11
@@ -40,19 +40,23 @@ cfs:upload-http@0.0.20
cfs:worker@0.1.4
check@1.2.5
chuangbo:cookie@1.1.0
-coffeescript@1.12.3_1
-cottz:publish-relations@2.0.7
+coffeescript@1.12.7_3
+coffeescript-compiler@1.12.7_3
+cottz:publish-relations@2.0.8
dburles:collection-helpers@1.1.0
-ddp@1.2.5
-ddp-client@1.3.4
-ddp-common@1.2.8
+ddp@1.4.0
+ddp-client@2.2.0
+ddp-common@1.3.0
ddp-rate-limiter@1.0.7
-ddp-server@1.3.14
+ddp-server@2.1.1
deps@1.0.12
diff-sequence@1.0.7
-ecmascript@0.7.3
-ecmascript-runtime@0.3.15
-ejson@1.0.13
+dynamic-import@0.2.1
+ecmascript@0.9.0
+ecmascript-runtime@0.5.0
+ecmascript-runtime-client@0.5.0
+ecmascript-runtime-server@0.5.0
+ejson@1.1.0
email@1.2.3
es5-shim@4.6.15
fastclick@1.0.13
@@ -62,41 +66,40 @@ horka:swipebox@1.0.2
hot-code-push@1.0.4
html-tools@1.0.11
htmljs@1.0.11
-http@1.2.12
+http@1.3.0
id-map@1.0.9
idmontie:migrations@1.0.3
jquery@1.11.10
kadira:blaze-layout@2.3.0
kadira:dochead@1.5.0
kadira:flow-router@2.12.1
-kenton:accounts-sandstorm@0.6.0
+kenton:accounts-sandstorm@0.7.0
launch-screen@1.1.1
livedata@1.0.18
-localstorage@1.0.12
-logging@1.1.17
+localstorage@1.2.0
+logging@1.1.19
matb33:collection-hooks@0.8.4
matteodem:easy-search@1.6.4
mdg:validation-error@0.5.1
-meteor@1.6.1
-meteor-base@1.0.4
+meteor@1.8.2
+meteor-base@1.2.0
meteor-platform@1.2.6
meteorhacks:aggregate@1.3.0
meteorhacks:collection-utils@1.2.0
-meteorhacks:fast-render@2.16.0
-meteorhacks:inject-data@2.0.0
meteorhacks:meteorx@1.4.1
meteorhacks:picker@1.0.3
meteorhacks:subs-manager@1.6.4
meteorspark:util@0.2.0
minifier-css@1.2.16
-minifier-js@2.0.0
+minifier-js@2.2.2
minifiers@1.1.8-faster-rebuild.0
-minimongo@1.0.21
+minimongo@1.4.3
mixmax:smart-disconnect@0.0.4
mobile-status-bar@1.0.14
-modules@0.8.2
-modules-runtime@0.7.10
-mongo@1.1.16
+modules@0.11.0
+modules-runtime@0.9.1
+mongo@1.3.1
+mongo-dev-server@1.1.0
mongo-id@1.0.6
mongo-livedata@1.0.12
mousetrap:mousetrap@1.4.6_1
@@ -109,24 +112,24 @@ mquandalle:jquery-ui-drag-drop-sort@0.2.0
mquandalle:moment@1.0.1
mquandalle:mousetrap-bindglobal@0.0.1
mquandalle:perfect-scrollbar@0.6.5_2
-npm-bcrypt@0.9.2
-npm-mongo@2.2.24
+npm-bcrypt@0.9.3
+npm-mongo@2.2.33
observe-sequence@1.0.16
ongoworks:speakingurl@1.1.0
ordered-dict@1.0.9
peerlibrary:assert@0.2.5
peerlibrary:base-component@0.16.0
peerlibrary:blaze-components@0.15.1
-peerlibrary:computed-field@0.6.1
+peerlibrary:computed-field@0.7.0
peerlibrary:reactive-field@0.3.0
perak:markdown@1.0.5
-promise@0.8.8
+promise@0.10.0
raix:eventemitter@0.1.3
raix:handlebar-helpers@0.2.5
-rajit:bootstrap3-datepicker@1.6.4
+rajit:bootstrap3-datepicker@1.7.1
random@1.0.10
rate-limit@1.0.8
-reactive-dict@1.1.8
+reactive-dict@1.2.0
reactive-var@1.0.11
reload@1.1.11
retry@1.0.9
@@ -135,26 +138,29 @@ seriousm:emoji-continued@1.4.0
service-configuration@1.0.11
session@1.1.7
sha@1.0.9
-shell-server@0.2.3
+shell-server@0.3.1
simple:authenticate-user-by-token@1.0.1
simple:json-routes@2.1.0
simple:rest-accounts-password@1.1.2
simple:rest-bearer-token-parser@1.0.1
simple:rest-json-error-handler@1.0.1
-softwarerero:accounts-t9n@1.3.9
+softwarerero:accounts-t9n@1.3.11
spacebars@1.0.15
-spacebars-compiler@1.1.2
+spacebars-compiler@1.1.3
srp@1.0.10
-standard-minifier-css@1.3.4
-standard-minifier-js@2.0.0
-stylus@2.513.9
+standard-minifier-css@1.3.5
+standard-minifier-js@2.2.3
+staringatlights:fast-render@2.16.5
+staringatlights:flow-router@2.12.2
+staringatlights:inject-data@2.0.5
+stylus@2.513.13
tap:i18n@1.8.2
templates:tabs@2.3.0
templating@1.3.2
-templating-compiler@1.3.2
+templating-compiler@1.3.3
templating-runtime@1.3.2
templating-tools@1.1.2
-tracker@1.1.2
+tracker@1.1.3
ui@1.0.13
underscore@1.0.10
url@1.1.0
@@ -162,6 +168,6 @@ useraccounts:core@1.14.2
useraccounts:flow-routing@1.14.2
useraccounts:unstyled@1.14.2
verron:autosize@3.0.8
-webapp@1.3.15
+webapp@1.4.0
webapp-hashing@1.0.9
zimme:active-route@2.3.2
diff --git a/.travis.yml b/.travis.yml
index bad4d10e..cde2bf33 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,9 +2,9 @@ dist: trusty
sudo: required
env:
- TRAVIS_DOCKER_COMPOSE_VERSION: 1.12.0
- TRAVIS_NODE_VERSION: 4.8.4
- TRAVIS_NPM_VERSION: 4.6.1
+ TRAVIS_DOCKER_COMPOSE_VERSION: 1.17.0
+ TRAVIS_NODE_VERSION: 8.9.3
+ TRAVIS_NPM_VERSION: 5.5.1
before_install:
- sudo apt-get update -y
diff --git a/.tx/config b/.tx/config
index 278d87f9..61beba64 100644
--- a/.tx/config
+++ b/.tx/config
@@ -39,7 +39,7 @@ host = https://www.transifex.com
# 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
# or the other, so we need to do a Manual mapping.
-lang_map = en_GB:en-GB, es_AR:es-AR, el_GR:el, fa_IR:fa, fi_FI:fi, hu_HU:hu, id_ID:id, no:nb, lv_LV:lv, pt_BR:pt-BR, ro_RO:ro, zh_CN:zh-CN, zh_TW:zh-TW
+lang_map = en_GB:en-GB, es_AR:es-AR, el_GR:el, fa_IR:fa, fi_FI:fi, ig:ibo, 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
[wekan.application]
file_filter = i18n/<lang>.i18n.json
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ec5d9a7c..24a188cc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,27 @@
+# v0.65 2018-01-28 Wekan release
+
+This release adds the following new features:
+
+* [Swimlanes, part 1](https://github.com/wekan/wekan/issues/955);
+* Added new language: Igbo.
+
+Thanks to GitHub user andresmanelli for contributions.
+
+# v0.64 2018-01-22 Wekan release
+
+This release adds the following new features:
+
+* [Different icons for start and due date](https://github.com/wekan/wekan/pull/1420).
+* Added new languages: Mongolian and Portuguese;
+* Upgraded to Meteor 1.6.0.1, Node 8.9.3, NPM 5.5.1 and fibers 2.0.0.
+
+and fixes the following bugs:
+
+* [Fix for dragging into scrolled-down list](https://github.com/wekan/wekan/pull/1424).
+* [Fix double slash bug on snap](https://github.com/wekan/wekan/issues/962#issuecomment-357785748).
+
+Thanks to GitHub users dpoznyak, mmarschall and xet7 for their contributions.
+
# v0.63 2017-12-20 Wekan release
This release adds the following new features:
diff --git a/Dockerfile b/Dockerfile
index 70f1af2f..a99391b6 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM debian:jessie-slim
+FROM debian:buster-slim
MAINTAINER wekan
# Declare Arguments
@@ -13,14 +13,13 @@ ARG SRC_PATH
# Set the environment variables (defaults where required)
# paxctl fix for alpine linux: https://github.com/wekan/wekan/issues/1303
-ENV BUILD_DEPS="wget curl bzip2 build-essential python git ca-certificates gcc-4.9 paxctl"
-ENV GOSU_VERSION=1.10
-ENV NODE_VERSION ${NODE_VERSION:-v4.8.7}
-ENV METEOR_RELEASE ${METEOR_RELEASE:-1.4.4.1}
+ENV BUILD_DEPS="apt-utils gnupg gosu wget curl bzip2 build-essential python git ca-certificates gcc-7 paxctl"
+ENV NODE_VERSION ${NODE_VERSION:-v8.9.3}
+ENV METEOR_RELEASE ${METEOR_RELEASE:-1.6.0.1}
ENV USE_EDGE ${USE_EDGE:-false}
ENV METEOR_EDGE ${METEOR_EDGE:-1.5-beta.17}
-ENV NPM_VERSION ${NPM_VERSION:-4.6.1}
-ENV FIBERS_VERSION ${FIBERS_VERSION:-1.0.15}
+ENV NPM_VERSION ${NPM_VERSION:-5.5.1}
+ENV FIBERS_VERSION ${FIBERS_VERSION:-2.0.0}
ENV ARCHITECTURE ${ARCHITECTURE:-linux-x64}
ENV SRC_PATH ${SRC_PATH:-./}
@@ -32,17 +31,7 @@ RUN \
useradd --user-group --system --home-dir /home/wekan wekan && \
\
# OS dependencies
- apt-get update -y && apt-get dist-upgrade -y && apt-get install -y --no-install-recommends ${BUILD_DEPS} && \
- \
- # Gosu installation
- GOSU_ARCHITECTURE="$(dpkg --print-architecture | awk -F- '{ print $NF }')" && \
- wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/${GOSU_VERSION}/gosu-${GOSU_ARCHITECTURE}" && \
- wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/${GOSU_VERSION}/gosu-${GOSU_ARCHITECTURE}.asc" && \
- export GNUPGHOME="$(mktemp -d)" && \
- gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 && \
- gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu && \
- rm -R "$GNUPGHOME" /usr/local/bin/gosu.asc && \
- chmod +x /usr/local/bin/gosu && \
+ apt-get update -y && apt-get install -y --no-install-recommends ${BUILD_DEPS} && \
\
# Download nodejs
wget https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \
@@ -90,14 +79,14 @@ RUN \
# Change user to wekan and install meteor
cd /home/wekan/ && \
chown wekan:wekan --recursive /home/wekan && \
- curl https://install.meteor.com -o ./install_meteor.sh && \
+ curl https://install.meteor.com -o /home/wekan/install_meteor.sh && \
sed -i "s|RELEASE=.*|RELEASE=${METEOR_RELEASE}\"\"|g" ./install_meteor.sh && \
echo "Starting meteor ${METEOR_RELEASE} installation... \n" && \
- chown wekan:wekan ./install_meteor.sh && \
+ chown wekan:wekan /home/wekan/install_meteor.sh && \
\
# Check if opting for a release candidate instead of major release
if [ "$USE_EDGE" = false ]; then \
- gosu wekan:wekan sh ./install_meteor.sh; \
+ gosu wekan:wekan sh /home/wekan/install_meteor.sh; \
else \
gosu wekan:wekan git clone --recursive --depth 1 -b release/METEOR@${METEOR_EDGE} git://github.com/meteor/meteor.git /home/wekan/.meteor; \
fi; \
@@ -119,7 +108,6 @@ RUN \
gosu wekan:wekan /home/wekan/.meteor/meteor build --directory /home/wekan/app_build && \
cp /home/wekan/app/fix-download-unicode/cfs_access-point.txt /home/wekan/app_build/bundle/programs/server/packages/cfs_access-point.js && \
chown wekan:wekan /home/wekan/app_build/bundle/programs/server/packages/cfs_access-point.js && \
- gosu wekan:wekan sed -i "s|build\/Release\/bson|browser_build\/bson|g" /home/wekan/app_build/bundle/programs/server/npm/node_modules/meteor/cfs_gridfs/node_modules/mongodb/node_modules/bson/ext/index.js && \
cd /home/wekan/app_build/bundle/programs/server/npm/node_modules/meteor/npm-bcrypt && \
gosu wekan:wekan rm -rf node_modules/bcrypt && \
gosu wekan:wekan npm install bcrypt && \
diff --git a/client/components/boards/boardBody.jade b/client/components/boards/boardBody.jade
index bb3d2906..30e70b31 100644
--- a/client/components/boards/boardBody.jade
+++ b/client/components/boards/boardBody.jade
@@ -20,33 +20,8 @@ template(name="boardBody")
class="{{#if draggingActive.get}}is-dragging-active{{/if}}")
if showOverlay.get
.board-overlay
- .lists.js-lists
- if isMiniScreen
- if currentList
- +list(currentList)
- else
- each currentBoard.lists
- +miniList(this)
- if currentUser.isBoardMember
- +addListForm
- else
- each currentBoard.lists
- +list(this)
- if currentCardIsInThisList
- +cardDetails(currentCard)
- if currentUser.isBoardMember
- +addListForm
-
-template(name="addListForm")
- .list.js-list.list-composer.js-list-composer
- .list-header
- +inlinedForm(autoclose=false)
- input.list-name-input.full-line(type="text" placeholder="{{_ 'add-list'}}"
- autocomplete="off" autofocus)
- .edit-controls.clearfix
- button.primary.confirm(type="submit") {{_ 'save'}}
- a.fa.fa-times-thin.js-close-inlined-form
- else
- a.open-list-composer.js-open-inlined-form
- i.fa.fa-plus
- | {{_ 'add-list'}}
+ if isViewSwimlanes
+ each currentBoard.swimlanes
+ +swimlane(this)
+ if isViewLists
+ +listsGroup
diff --git a/client/components/boards/boardBody.js b/client/components/boards/boardBody.js
index b3880c61..a068dd04 100644
--- a/client/components/boards/boardBody.js
+++ b/client/components/boards/boardBody.js
@@ -29,10 +29,6 @@ BlazeComponent.extendComponent({
this.mouseHasEnterCardDetails = false;
},
- openNewListForm() {
- this.childComponents('addListForm')[0].open();
- },
-
// XXX Flow components allow us to avoid creating these two setter methods by
// exposing a public API to modify the component state. We need to investigate
// best practices here.
@@ -47,16 +43,22 @@ BlazeComponent.extendComponent({
});
},
- currentCardIsInThisList() {
- const currentCard = Cards.findOne(Session.get('currentCard'));
- const listId = this.currentData()._id;
- return currentCard && currentCard.listId === listId;
- },
-
onlyShowCurrentCard() {
return Utils.isMiniScreen() && Session.get('currentCard');
},
+ isViewSwimlanes() {
+ const currentBoardId = Session.get('currentBoard');
+ const board = Boards.findOne(currentBoardId);
+ return (board.view === 'board-view-swimlanes');
+ },
+
+ isViewLists() {
+ const currentBoardId = Session.get('currentBoard');
+ const board = Boards.findOne(currentBoardId);
+ return (board.view === 'board-view-lists');
+ },
+
events() {
return [{
// XXX The board-overlay div should probably be moved to the parent
@@ -66,147 +68,11 @@ BlazeComponent.extendComponent({
this.showOverlay.set(false);
}
},
-
- // Click-and-drag action
- 'mousedown .board-canvas'(evt) {
- // Translating the board canvas using the click-and-drag action can
- // conflict with the build-in browser mechanism to select text. We
- // 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
- // his mouse.
- const noDragInside = ['a', 'input', 'textarea', 'p', '.js-list-header'];
- if ($(evt.target).closest(noDragInside.join(',')).length === 0 && $('.lists').prop('clientHeight') > evt.offsetY) {
- this._isDragging = true;
- this._lastDragPositionX = evt.clientX;
- }
- },
'mouseup'() {
if (this._isDragging) {
this._isDragging = false;
}
},
- 'mousemove'(evt) {
- if (this._isDragging) {
- // Update the canvas position
- this.listsDom.scrollLeft -= evt.clientX - this._lastDragPositionX;
- this._lastDragPositionX = evt.clientX;
- // Disable browser text selection while dragging
- evt.stopPropagation();
- evt.preventDefault();
- // Don't close opened card or inlined form at the end of the
- // click-and-drag.
- EscapeActions.executeUpTo('popup-close');
- EscapeActions.preventNextClick();
- }
- },
}];
},
}).register('board');
-
-Template.boardBody.onRendered(function() {
- const self = BlazeComponent.getComponentForElement(this.firstNode);
-
- self.listsDom = this.find('.js-lists');
-
- if (!Session.get('currentCard')) {
- self.scrollLeft();
- }
-
- // We want to animate the card details window closing. We rely on CSS
- // transition for the actual animation.
- self.listsDom._uihooks = {
- removeElement(node) {
- const removeNode = _.once(() => {
- node.parentNode.removeChild(node);
- });
- if ($(node).hasClass('js-card-details')) {
- $(node).css({
- flexBasis: 0,
- padding: 0,
- });
- $(self.listsDom).one(CSSEvents.transitionend, removeNode);
- } else {
- removeNode();
- }
- },
- };
-
- $(self.listsDom).sortable({
- tolerance: 'pointer',
- helper: 'clone',
- handle: '.js-list-header',
- items: '.js-list:not(.js-list-composer)',
- placeholder: 'list placeholder',
- distance: 7,
- start(evt, ui) {
- ui.placeholder.height(ui.helper.height());
- Popup.close();
- },
- stop() {
- $(self.listsDom).find('.js-list:not(.js-list-composer)').each(
- (i, list) => {
- const data = Blaze.getData(list);
- Lists.update(data._id, {
- $set: {
- sort: i,
- },
- });
- }
- );
- },
- });
-
- function userIsMember() {
- return Meteor.user() && Meteor.user().isBoardMember();
- }
-
- // Disable drag-dropping while in multi-selection mode, or if the current user
- // is not a board member
- self.autorun(() => {
- const $listDom = $(self.listsDom);
- if ($listDom.data('sortable')) {
- $(self.listsDom).sortable('option', 'disabled',
- MultiSelection.isActive() || !userIsMember());
- }
- });
-
- // If there is no data in the board (ie, no lists) we autofocus the list
- // creation form by clicking on the corresponding element.
- const currentBoard = Boards.findOne(Session.get('currentBoard'));
- if (userIsMember() && currentBoard.lists().count() === 0) {
- self.openNewListForm();
- }
-});
-
-BlazeComponent.extendComponent({
- // Proxy
- open() {
- this.childComponents('inlinedForm')[0].open();
- },
-
- events() {
- return [{
- submit(evt) {
- evt.preventDefault();
- const titleInput = this.find('.list-name-input');
- const title = titleInput.value.trim();
- if (title) {
- Lists.insert({
- title,
- boardId: Session.get('currentBoard'),
- sort: $('.list').length,
- });
-
- titleInput.value = '';
- titleInput.focus();
- }
- },
- }];
- },
-}).register('addListForm');
-
-Template.boardBody.helpers({
- canSeeAddList() {
- return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
- },
-});
diff --git a/client/components/boards/boardBody.styl b/client/components/boards/boardBody.styl
index bb9beb19..f5ecc08e 100644
--- a/client/components/boards/boardBody.styl
+++ b/client/components/boards/boardBody.styl
@@ -20,15 +20,14 @@ position()
&.is-sibling-sidebar-open
margin-right: 248px
- .lists
- align-items: flex-start
+ .swimlane
+ border-bottom: 1px solid #CCC
display: flex
flex-direction: row
margin: 0 0 10px
padding: 0 40px 5px 0
overflow-x: auto
overflow-y: hidden
- position: cover
.board-overlay
position: cover
@@ -49,12 +48,11 @@ position()
.board-canvas
- .lists
- align-items: flex-start
+ .swimlane
+ border-bottom: 1px solid #CCC
display: flex
flex-direction: column
margin: 0
padding: 0 40px 0px 0
overflow-x: hidden
overflow-y: auto
- position: cover
diff --git a/client/components/boards/boardHeader.jade b/client/components/boards/boardHeader.jade
index ffb8eb27..1a65ce27 100644
--- a/client/components/boards/boardHeader.jade
+++ b/client/components/boards/boardHeader.jade
@@ -87,6 +87,11 @@ template(name="boardHeaderBar")
a.board-header-btn-close.js-filter-reset(title="{{_ 'filter-clear'}}")
i.fa.fa-times-thin
+ a.board-header-btn.js-toggle-board-view(
+ title="{{_ 'board-view'}}")
+ i.fa.fa-th-large
+ span {{_ currentBoard.view}}
+
if canModifyBoard
a.board-header-btn.js-multiselection-activate(
title="{{#if MultiSelection.isActive}}{{_ 'multi-selection-on'}}{{else}}{{_ 'multi-selection'}}{{/if}}"
diff --git a/client/components/boards/boardHeader.js b/client/components/boards/boardHeader.js
index fe10dab1..67b05446 100644
--- a/client/components/boards/boardHeader.js
+++ b/client/components/boards/boardHeader.js
@@ -76,6 +76,22 @@ BlazeComponent.extendComponent({
'click .js-open-archived-board'() {
Modal.open('archivedBoards');
},
+ 'click .js-toggle-board-view'() {
+ const currentBoard = Boards.findOne(Session.get('currentBoard'));
+ if (currentBoard.view === 'board-view-swimlanes') {
+ Boards.update(currentBoard._id, {
+ $set: {
+ view: 'board-view-lists',
+ },
+ });
+ } else if (currentBoard.view === 'board-view-lists') {
+ Boards.update(currentBoard._id, {
+ $set: {
+ view: 'board-view-swimlanes',
+ },
+ });
+ }
+ },
'click .js-open-filter-view'() {
Sidebar.setView('filter');
},
@@ -164,6 +180,11 @@ const CreateBoard = BlazeComponent.extendComponent({
permission: visibility,
}));
+ Swimlanes.insert({
+ title: 'Default',
+ boardId: this.boardId.get(),
+ });
+
Utils.goBoardId(this.boardId.get());
},
diff --git a/client/components/cards/cardDate.js b/client/components/cards/cardDate.js
index 3f69f384..abf6a42b 100644
--- a/client/components/cards/cardDate.js
+++ b/client/components/cards/cardDate.js
@@ -171,11 +171,12 @@ class CardStartDate extends CardDate {
}
classes() {
+ let classes = 'start-date' + ' ';
if (this.date.get().isBefore(this.now.get(), 'minute') &&
this.now.get().isBefore(this.data().dueAt)) {
- return 'current';
+ classes += 'current';
}
- return '';
+ return classes;
}
showTitle() {
@@ -200,13 +201,14 @@ class CardDueDate extends CardDate {
}
classes() {
+ let classes = 'due-date' + ' ';
if (this.now.get().diff(this.date.get(), 'days') >= 2)
- return 'long-overdue';
+ classes += 'long-overdue';
else if (this.now.get().diff(this.date.get(), 'minute') >= 0)
- return 'due';
+ classes += 'due';
else if (this.now.get().diff(this.date.get(), 'days') >= -1)
- return 'almost-due';
- return '';
+ classes += 'almost-due';
+ return classes;
}
showTitle() {
diff --git a/client/components/cards/cardDate.styl b/client/components/cards/cardDate.styl
index 1631baa5..e0c3fc9e 100644
--- a/client/components/cards/cardDate.styl
+++ b/client/components/cards/cardDate.styl
@@ -49,10 +49,20 @@
&:hover, &.is-active
background-color: darken(#fd5d47, 7)
+ &.due-date
+ time
+ &::before
+ content: "\f090" // symbol: fa-sign-in
+
+ &.start-date
+ time
+ &::before
+ content: "\f08b" // symbol: fa-sign-out
+
time
&::before
font: normal normal normal 14px/1 FontAwesome
font-size: inherit
-webkit-font-smoothing: antialiased
- content: "\f017" // clock symbol
- margin-right: 0.3em \ No newline at end of file
+ margin-right: 0.3em
+
diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js
index f4e6e773..94a938f0 100644
--- a/client/components/cards/cardDetails.js
+++ b/client/components/cards/cardDetails.js
@@ -20,8 +20,8 @@ BlazeComponent.extendComponent({
onCreated() {
this.isLoaded = new ReactiveVar(false);
- this.parentComponent().showOverlay.set(true);
- this.parentComponent().mouseHasEnterCardDetails = false;
+ this.parentComponent().parentComponent().showOverlay.set(true);
+ this.parentComponent().parentComponent().mouseHasEnterCardDetails = false;
this.calculateNextPeak();
Meteor.subscribe('unsaved-edits');
@@ -42,7 +42,7 @@ BlazeComponent.extendComponent({
scrollParentContainer() {
const cardPanelWidth = 510;
- const bodyBoardComponent = this.parentComponent();
+ const bodyBoardComponent = this.parentComponent().parentComponent();
const $cardContainer = bodyBoardComponent.$('.js-lists');
const $cardView = this.$(this.firstNode());
@@ -69,7 +69,7 @@ BlazeComponent.extendComponent({
},
onDestroyed() {
- this.parentComponent().showOverlay.set(false);
+ this.parentComponent().parentComponent().showOverlay.set(false);
},
events() {
@@ -104,8 +104,8 @@ BlazeComponent.extendComponent({
'click .js-add-members': Popup.open('cardMembers'),
'click .js-add-labels': Popup.open('cardLabels'),
'mouseenter .js-card-details' () {
- this.parentComponent().showOverlay.set(true);
- this.parentComponent().mouseHasEnterCardDetails = true;
+ this.parentComponent().parentComponent().showOverlay.set(true);
+ this.parentComponent().parentComponent().mouseHasEnterCardDetails = true;
},
'click #toggleButton'() {
Meteor.call('toggleSystemMessages');
diff --git a/client/components/lists/list.js b/client/components/lists/list.js
index a65ccc56..e922a3fd 100644
--- a/client/components/lists/list.js
+++ b/client/components/lists/list.js
@@ -18,7 +18,7 @@ BlazeComponent.extendComponent({
// callback, we basically solve all issues related to reactive updates. A
// comment below provides further details.
onRendered() {
- const boardComponent = this.parentComponent();
+ const boardComponent = this.parentComponent().parentComponent();
const itemsSelector = '.js-minicard:not(.placeholder, .js-card-composer)';
const $cards = this.$('.js-minicards');
$cards.sortable({
@@ -55,6 +55,7 @@ BlazeComponent.extendComponent({
const nCards = MultiSelection.isActive() ? MultiSelection.count() : 1;
const sortIndex = calculateIndex(prevCardDom, nextCardDom, nCards);
const listId = Blaze.getData(ui.item.parents('.list').get(0))._id;
+ const swimlaneId = Blaze.getData(ui.item.parents('.swimlane').get(0))._id;
// Normally the jquery-ui sortable library moves the dragged DOM element
// to its new position, which disrupts Blaze reactive updates mechanism
@@ -67,12 +68,12 @@ BlazeComponent.extendComponent({
if (MultiSelection.isActive()) {
Cards.find(MultiSelection.getMongoSelector()).forEach((card, i) => {
- card.move(listId, sortIndex.base + i * sortIndex.increment);
+ card.move(swimlaneId, listId, sortIndex.base + i * sortIndex.increment);
});
} else {
const cardDomElement = ui.item.get(0);
const card = Blaze.getData(cardDomElement);
- card.move(listId, sortIndex.base);
+ card.move(swimlaneId, listId, sortIndex.base);
}
boardComponent.setIsDragging(false);
},
diff --git a/client/components/lists/list.styl b/client/components/lists/list.styl
index d5800140..c3753360 100644
--- a/client/components/lists/list.styl
+++ b/client/components/lists/list.styl
@@ -9,7 +9,6 @@
// Even if this background color is the same as the body we can't leave it
// transparent, because that won't work during a list drag.
background: darken(white, 13%)
- height: 100%
border-left: 1px solid darken(white, 20%)
padding: 0
float: left
@@ -88,12 +87,14 @@
.list-body
flex: 1
+ flex-direction: column
display: flex
overflow-y: auto
padding: 5px 11px
.minicards
- flex: 1
+ flex-grow: 1
+ flex-shrink: 0
form
margin-bottom: 9px
diff --git a/client/components/lists/listBody.jade b/client/components/lists/listBody.jade
index 840fd801..32c6b278 100644
--- a/client/components/lists/listBody.jade
+++ b/client/components/lists/listBody.jade
@@ -4,7 +4,7 @@ template(name="listBody")
if cards.count
+inlinedForm(autoclose=false position="top")
+addCardForm(listId=_id position="top")
- each cards
+ each (cards (idOrNull ../../_id))
a.minicard-wrapper.js-minicard(href=absoluteUrl
class="{{#if cardIsSelected}}is-selected{{/if}}"
class="{{#if MultiSelection.isSelected _id}}is-checked{{/if}}")
diff --git a/client/components/lists/listBody.js b/client/components/lists/listBody.js
index fe2f1630..6cc94371 100644
--- a/client/components/lists/listBody.js
+++ b/client/components/lists/listBody.js
@@ -36,6 +36,14 @@ BlazeComponent.extendComponent({
const members = formComponent.members.get();
const labelIds = formComponent.labels.get();
+ const boardId = this.data().board()._id;
+ const board = Boards.findOne(boardId);
+ let swimlaneId = '';
+ if (board.view === 'board-view-swimlanes')
+ swimlaneId = this.parentComponent().parentComponent().data()._id;
+ else
+ swimlaneId = Swimlanes.findOne({boardId})._id;
+
if (title) {
const _id = Cards.insert({
title,
@@ -44,6 +52,7 @@ BlazeComponent.extendComponent({
listId: this.data()._id,
boardId: this.data().board()._id,
sort: sortIndex,
+ swimlaneId,
});
// In case the filter is active we need to add the newly inserted card in
// the list of exceptions -- cards that are not filtered. Otherwise the
@@ -96,6 +105,13 @@ BlazeComponent.extendComponent({
MultiSelection.toggle(this.currentData()._id);
},
+ idOrNull(swimlaneId) {
+ const board = Boards.findOne(Session.get('currentBoard'));
+ if (board.view === 'board-view-swimlanes')
+ return swimlaneId;
+ return undefined;
+ },
+
canSeeAddCard() {
return !this.reachedWipLimit() && Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
},
diff --git a/client/components/swimlanes/swimlanes.jade b/client/components/swimlanes/swimlanes.jade
new file mode 100644
index 00000000..77afa399
--- /dev/null
+++ b/client/components/swimlanes/swimlanes.jade
@@ -0,0 +1,78 @@
+template(name="swimlane")
+ .swimlane.js-lists
+ .swimlane-header-wrap
+ .swimlane-header
+ = title
+ if isMiniScreen
+ if currentList
+ +list(currentList)
+ else
+ each currentBoard.lists
+ +miniList(this)
+ if currentUser.isBoardMember
+ +addListForm
+ else
+ each currentBoard.lists
+ +list(this)
+ if currentCardIsInThisList
+ +cardDetails(currentCard)
+ if currentUser.isBoardMember
+ +addListForm
+ +addListAndSwimlaneForm
+
+template(name="listsGroup")
+ .swimlane.js-lists
+ if isMiniScreen
+ if currentList
+ +list(currentList)
+ else
+ each currentBoard.lists
+ +miniList(this)
+ if currentUser.isBoardMember
+ +addListForm
+ else
+ each currentBoard.lists
+ +list(this)
+ if currentCardIsInThisList
+ +cardDetails(currentCard)
+ if currentUser.isBoardMember
+ +addListForm
+
+template(name="addListAndSwimlaneForm")
+ .list.js-list.list-composer.js-list-composer
+ .list-header
+ +inlinedForm(autoclose=false)
+ input.list-name-input.full-line(type="text" placeholder="{{_ 'add-list'}}"
+ autocomplete="off" autofocus)
+ .edit-controls.clearfix
+ button.primary.confirm(type="submit") {{_ 'save'}}
+ a.fa.fa-times-thin.js-close-inlined-form
+ else
+ a.open-list-composer.js-open-inlined-form
+ i.fa.fa-plus
+ | {{_ 'add-list'}}
+ .list-header
+ +inlinedForm(autoclose=false)
+ input.swimlane-name-input.full-line(type="text" placeholder="{{_ 'add-swimlane'}}"
+ autocomplete="off" autofocus)
+ .edit-controls.clearfix
+ button.primary.confirm(type="submit") {{_ 'save'}}
+ a.fa.fa-times-thin.js-close-inlined-form
+ else
+ a.open-list-composer.js-open-inlined-form
+ i.fa.fa-plus
+ | {{_ 'add-swimlane'}}
+
+template(name="addListForm")
+ .list.js-list.list-composer.js-list-composer
+ .list-header
+ +inlinedForm(autoclose=false)
+ input.list-name-input.full-line(type="text" placeholder="{{_ 'add-list'}}"
+ autocomplete="off" autofocus)
+ .edit-controls.clearfix
+ button.primary.confirm(type="submit") {{_ 'save'}}
+ a.fa.fa-times-thin.js-close-inlined-form
+ else
+ a.open-list-composer.js-open-inlined-form
+ i.fa.fa-plus
+ | {{_ 'add-list'}}
diff --git a/client/components/swimlanes/swimlanes.js b/client/components/swimlanes/swimlanes.js
new file mode 100644
index 00000000..397f9e9b
--- /dev/null
+++ b/client/components/swimlanes/swimlanes.js
@@ -0,0 +1,223 @@
+BlazeComponent.extendComponent({
+ onCreated() {
+ this.draggingActive = new ReactiveVar(false);
+
+ this._isDragging = false;
+ this._lastDragPositionX = 0;
+ },
+
+ openNewListForm() {
+ this.childComponents('addListForm')[0].open();
+ },
+
+ id() {
+ return this._id;
+ },
+
+ // XXX Flow components allow us to avoid creating these two setter methods by
+ // exposing a public API to modify the component state. We need to investigate
+ // best practices here.
+ setIsDragging(bool) {
+ this.draggingActive.set(bool);
+ },
+
+ scrollLeft(position = 0) {
+ const lists = this.$('.js-lists');
+ lists && lists.animate({
+ scrollLeft: position,
+ });
+ },
+
+ currentCardIsInThisList() {
+ const currentCard = Cards.findOne(Session.get('currentCard'));
+ const listId = this.currentData()._id;
+ return currentCard && currentCard.listId === listId; //TODO: AND IN THIS SWIMLANE
+ },
+
+ events() {
+ return [{
+ // Click-and-drag action
+ 'mousedown .board-canvas'(evt) {
+ // Translating the board canvas using the click-and-drag action can
+ // conflict with the build-in browser mechanism to select text. We
+ // 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
+ // his mouse.
+ const noDragInside = ['a', 'input', 'textarea', 'p', '.js-list-header'];
+ if ($(evt.target).closest(noDragInside.join(',')).length === 0 && this.$('.swimlane').prop('clientHeight') > evt.offsetY) {
+ this._isDragging = true;
+ this._lastDragPositionX = evt.clientX;
+ }
+ },
+ 'mouseup'() {
+ if (this._isDragging) {
+ this._isDragging = false;
+ }
+ },
+ 'mousemove'(evt) {
+ if (this._isDragging) {
+ // Update the canvas position
+ this.listsDom.scrollLeft -= evt.clientX - this._lastDragPositionX;
+ this._lastDragPositionX = evt.clientX;
+ // Disable browser text selection while dragging
+ evt.stopPropagation();
+ evt.preventDefault();
+ // Don't close opened card or inlined form at the end of the
+ // click-and-drag.
+ EscapeActions.executeUpTo('popup-close');
+ EscapeActions.preventNextClick();
+ }
+ },
+ }];
+ },
+}).register('swimlane');
+
+Template.swimlane.onRendered(function() {
+ const self = BlazeComponent.getComponentForElement(this.firstNode);
+
+ self.listsDom = this.find('.js-lists');
+
+ if (!Session.get('currentCard')) {
+ self.scrollLeft();
+ }
+
+ // We want to animate the card details window closing. We rely on CSS
+ // transition for the actual animation.
+ self.listsDom._uihooks = {
+ removeElement(node) {
+ const removeNode = _.once(() => {
+ node.parentNode.removeChild(node);
+ });
+ if ($(node).hasClass('js-card-details')) {
+ $(node).css({
+ flexBasis: 0,
+ padding: 0,
+ });
+ $(self.listsDom).one(CSSEvents.transitionend, removeNode);
+ } else {
+ removeNode();
+ }
+ },
+ };
+
+ $(self.listsDom).sortable({
+ tolerance: 'pointer',
+ helper: 'clone',
+ handle: '.js-list-header',
+ items: '.js-list:not(.js-list-composer)',
+ placeholder: 'list placeholder',
+ distance: 7,
+ start(evt, ui) {
+ ui.placeholder.height(ui.helper.height());
+ Popup.close();
+ },
+ stop() {
+ $(self.listsDom).find('.js-list:not(.js-list-composer)').each(
+ (i, list) => {
+ const data = Blaze.getData(list);
+ Lists.update(data._id, {
+ $set: {
+ sort: i,
+ },
+ });
+ }
+ );
+ },
+ });
+
+ function userIsMember() {
+ return Meteor.user() && Meteor.user().isBoardMember();
+ }
+
+ // Disable drag-dropping while in multi-selection mode, or if the current user
+ // is not a board member
+ self.autorun(() => {
+ const $listDom = $(self.listsDom);
+ if ($listDom.data('sortable')) {
+ $(self.listsDom).sortable('option', 'disabled',
+ MultiSelection.isActive() || !userIsMember());
+ }
+ });
+
+ // If there is no data in the board (ie, no lists) we autofocus the list
+ // creation form by clicking on the corresponding element.
+ const currentBoard = Boards.findOne(Session.get('currentBoard'));
+ if (userIsMember() && currentBoard.lists().count() === 0) {
+ self.openNewListForm();
+ }
+});
+
+BlazeComponent.extendComponent({
+ // Proxy
+ open() {
+ this.childComponents('inlinedForm')[0].open();
+ },
+
+ events() {
+ return [{
+ submit(evt) {
+ evt.preventDefault();
+ const titleInput = this.find('.list-name-input');
+ const title = titleInput.value.trim();
+ if (title) {
+ Lists.insert({
+ title,
+ boardId: Session.get('currentBoard'),
+ sort: $('.list').length,
+ });
+
+ titleInput.value = '';
+ titleInput.focus();
+ }
+ },
+ }];
+ },
+}).register('addListForm');
+
+BlazeComponent.extendComponent({
+ // Proxy
+ open() {
+ this.childComponents('inlinedForm')[0].open();
+ },
+
+ events() {
+ return [{
+ submit(evt) {
+ evt.preventDefault();
+ let titleInput = this.find('.list-name-input');
+ if (titleInput) {
+ const title = titleInput.value.trim();
+ if (title) {
+ Lists.insert({
+ title,
+ boardId: Session.get('currentBoard'),
+ sort: $('.list').length,
+ });
+
+ titleInput.value = '';
+ titleInput.focus();
+ }
+ } else {
+ titleInput = this.find('.swimlane-name-input');
+ const title = titleInput.value.trim();
+ if (title) {
+ Swimlanes.insert({
+ title,
+ boardId: Session.get('currentBoard'),
+ sort: $('.swimlane').length,
+ });
+
+ titleInput.value = '';
+ titleInput.focus();
+ }
+ }
+ },
+ }];
+ },
+}).register('addListAndSwimlaneForm');
+
+Template.swimlane.helpers({
+ canSeeAddList() {
+ return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
+ },
+});
diff --git a/client/components/swimlanes/swimlanes.styl b/client/components/swimlanes/swimlanes.styl
new file mode 100644
index 00000000..48bc495c
--- /dev/null
+++ b/client/components/swimlanes/swimlanes.styl
@@ -0,0 +1,20 @@
+@import 'nib'
+
+.swimlane-header-wrap
+ display: flex;
+ flex-direction: column;
+ flex: 0 0 50px;
+
+ .swimlane-header
+ writing-mode: sideways-lr;
+ font-size: 14px;
+ line-height: 50px;
+ margin: 0;
+ font-weight: bold;
+ min-height: 9px;
+ min-width: 30px;
+ overflow: hidden;
+ -o-text-overflow: ellipsis;
+ text-overflow: ellipsis;
+ word-wrap: break-word;
+ text-align: center;
diff --git a/i18n/ar.i18n.json b/i18n/ar.i18n.json
index f704a0f1..90a13cfd 100644
--- a/i18n/ar.i18n.json
+++ b/i18n/ar.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "إضافة مرفق",
"add-board": "إضافة لوحة",
"add-card": "إضافة بطاقة",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "إضافة قائمة تدقيق",
"add-checklist-item": "إضافة عنصر إلى قائمة التحقق",
"add-cover": "إضافة غلاف",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "تغيير المتابعة",
"boardMenuPopup-title": "قائمة اللوحة",
"boards": "لوحات",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "القائمات",
"bucket-example": "مثل « todo list » على سبيل المثال",
"cancel": "إلغاء",
"card-archived": "هذه البطاقة أُرشفت.",
@@ -346,7 +350,7 @@
"overtime-hours": "Overtime (hours)",
"overtime": "Overtime",
"has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "الوقت",
"title": "عنوان",
"tracking": "تتبع",
diff --git a/i18n/br.i18n.json b/i18n/br.i18n.json
index 5224804b..6a3a16f1 100644
--- a/i18n/br.i18n.json
+++ b/i18n/br.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Add Attachment",
"add-board": "Add Board",
"add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Add Checklist",
"add-checklist-item": "Add an item to checklist",
"add-cover": "Ouzphenn ur golo",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Change Watch",
"boardMenuPopup-title": "Board Menu",
"boards": "Boards",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Lists",
"bucket-example": "Like “Bucket List” for example",
"cancel": "Cancel",
"card-archived": "This card is archived.",
@@ -346,7 +350,7 @@
"overtime-hours": "Overtime (hours)",
"overtime": "Overtime",
"has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"tracking": "Tracking",
diff --git a/i18n/ca.i18n.json b/i18n/ca.i18n.json
index e3ba2e2c..f713cc29 100644
--- a/i18n/ca.i18n.json
+++ b/i18n/ca.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Afegeix adjunt",
"add-board": "Afegeix Tauler",
"add-card": "Afegeix fitxa",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Afegeix checklist",
"add-checklist-item": "Afegeix un ítem",
"add-cover": "Afegeix coberta",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Canvia seguiment",
"boardMenuPopup-title": "Menú del tauler",
"boards": "Taulers",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Llistes",
"bucket-example": "Igual que “Bucket List”, per exemple",
"cancel": "Cancel·la",
"card-archived": "Aquesta fitxa està arxivada.",
@@ -346,7 +350,7 @@
"overtime-hours": "Overtime (hours)",
"overtime": "Overtime",
"has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Hora",
"title": "Títol",
"tracking": "En seguiment",
diff --git a/i18n/cs.i18n.json b/i18n/cs.i18n.json
index 2ebf0da3..5c165f4b 100644
--- a/i18n/cs.i18n.json
+++ b/i18n/cs.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Přidat přílohu",
"add-board": "Přidat tablo",
"add-card": "Přidat kartu",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Přidat zaškrtávací seznam",
"add-checklist-item": "Přidat položku do zaškrtávacího seznamu",
"add-cover": "Přidat obal",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Change Watch",
"boardMenuPopup-title": "Menu tabla",
"boards": "Tabla",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Seznamy",
"bucket-example": "Například \"Než mě odvedou\"",
"cancel": "Zrušit",
"card-archived": "Tato karta je archivována.",
@@ -346,7 +350,7 @@
"overtime-hours": "Overtime (hours)",
"overtime": "Overtime",
"has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Název",
"tracking": "Tracking",
diff --git a/i18n/de.i18n.json b/i18n/de.i18n.json
index d731d587..63971cb5 100644
--- a/i18n/de.i18n.json
+++ b/i18n/de.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Datei anhängen",
"add-board": "neues Board",
"add-card": "Karte hinzufügen",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Checkliste hinzufügen",
"add-checklist-item": "Punkt zu einer Checkliste hinzufügen",
"add-cover": "Cover hinzufügen",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Beobachtung ändern",
"boardMenuPopup-title": "Boardmenü",
"boards": "Boards",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Listen",
"bucket-example": "z.B. \"Löffelliste\"",
"cancel": "Abbrechen",
"card-archived": "Diese Karte wurde archiviert.",
@@ -346,7 +350,7 @@
"overtime-hours": "Überzeit (Stunden)",
"overtime": "Überzeit",
"has-overtime-cards": "Hat Karten mit Überzeit",
- "has-spenttime-cards": "Hat Karten mit aufgewendeter Zeit",
+ "has-spenttime-cards": "Hat Karten mit aufgewendeten Zeiten",
"time": "Zeit",
"title": "Titel",
"tracking": "Folgen",
diff --git a/i18n/el.i18n.json b/i18n/el.i18n.json
index 73a31304..f8ac1249 100644
--- a/i18n/el.i18n.json
+++ b/i18n/el.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Add Attachment",
"add-board": "Add Board",
"add-card": "Προσθήκη Κάρτας",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Add Checklist",
"add-checklist-item": "Add an item to checklist",
"add-cover": "Add Cover",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Change Watch",
"boardMenuPopup-title": "Board Menu",
"boards": "Boards",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Λίστες",
"bucket-example": "Like “Bucket List” for example",
"cancel": "Ακύρωση",
"card-archived": "This card is archived.",
@@ -346,7 +350,7 @@
"overtime-hours": "Overtime (hours)",
"overtime": "Overtime",
"has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Ώρα",
"title": "Τίτλος",
"tracking": "Tracking",
diff --git a/i18n/en-GB.i18n.json b/i18n/en-GB.i18n.json
index e938ef93..82f34a08 100644
--- a/i18n/en-GB.i18n.json
+++ b/i18n/en-GB.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Add Attachment",
"add-board": "Add Board",
"add-card": "Add Card",
+ "add-swimlane": "Lisää Swimlane",
"add-checklist": "Add Checklist",
"add-checklist-item": "Add an item to checklist",
"add-cover": "Add Cover",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Change Watch",
"boardMenuPopup-title": "Board Menu",
"boards": "Boards",
+ "board-view": "Taulu näkymä",
+ "board-view-swimlanes": "Swimlanet",
+ "board-view-lists": "Lists",
"bucket-example": "Like “Bucket List” for example",
"cancel": "Cancel",
"card-archived": "This card is archived.",
@@ -346,7 +350,7 @@
"overtime-hours": "Overtime (hours)",
"overtime": "Overtime",
"has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "has-spenttime-cards": "Sisältää käytetty aika kortteja",
"time": "Time",
"title": "Title",
"tracking": "Tracking",
diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json
index 1419c3e0..71726a39 100644
--- a/i18n/en.i18n.json
+++ b/i18n/en.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Add Attachment",
"add-board": "Add Board",
"add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Add Checklist",
"add-checklist-item": "Add an item to checklist",
"add-cover": "Add Cover",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Change Watch",
"boardMenuPopup-title": "Board Menu",
"boards": "Boards",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Lists",
"bucket-example": "Like “Bucket List” for example",
"cancel": "Cancel",
"card-archived": "This card is archived.",
@@ -346,7 +350,7 @@
"overtime-hours": "Overtime (hours)",
"overtime": "Overtime",
"has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"tracking": "Tracking",
diff --git a/i18n/eo.i18n.json b/i18n/eo.i18n.json
index d2c2552c..87061bc0 100644
--- a/i18n/eo.i18n.json
+++ b/i18n/eo.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Add Attachment",
"add-board": "Add Board",
"add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Add Checklist",
"add-checklist-item": "Add an item to checklist",
"add-cover": "Add Cover",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Change Watch",
"boardMenuPopup-title": "Board Menu",
"boards": "Boards",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Listoj",
"bucket-example": "Like “Bucket List” for example",
"cancel": "Cancel",
"card-archived": "Karto arkivita",
@@ -346,7 +350,7 @@
"overtime-hours": "Overtime (hours)",
"overtime": "Overtime",
"has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Tempo",
"title": "Titolo",
"tracking": "Tracking",
diff --git a/i18n/es-AR.i18n.json b/i18n/es-AR.i18n.json
index d232988f..8fc444a9 100644
--- a/i18n/es-AR.i18n.json
+++ b/i18n/es-AR.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Agregar Adjunto",
"add-board": "Agregar Tablero",
"add-card": "Agregar Tarjeta",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Agregar Lista de Tareas",
"add-checklist-item": "Agregar ítem a lista de tareas",
"add-cover": "Agregar Portadas",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Alternar Seguimiento",
"boardMenuPopup-title": "Menú del Tablero",
"boards": "Tableros",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Listas",
"bucket-example": "Como \"Lista de Contenedores\" por ejemplo",
"cancel": "Cancelar",
"card-archived": "Esta tarjeta está archivada",
@@ -346,7 +350,7 @@
"overtime-hours": "Sobretiempo (horas)",
"overtime": "Sobretiempo",
"has-overtime-cards": "Tiene tarjetas con sobretiempo",
- "has-spenttime-cards": "Tiene tarjetas con tiempo empleado",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Hora",
"title": "Título",
"tracking": "Seguimiento",
diff --git a/i18n/es.i18n.json b/i18n/es.i18n.json
index b86f99a8..13c31bd7 100644
--- a/i18n/es.i18n.json
+++ b/i18n/es.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Añadir adjunto",
"add-board": "Añadir tablero",
"add-card": "Añadir una tarjeta",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Añadir una lista de tareas",
"add-checklist-item": "Añadir un elemento a la lista de tareas",
"add-cover": "Añadir portada",
@@ -72,7 +73,7 @@
"archived-items": "Elementos archivados",
"archived-boards": "Tableros archivados",
"restore-board": "Restaurar el tablero",
- "no-archived-boards": "No hay tableros archivados",
+ "no-archived-boards": "No hay tableros archivados.",
"archives": "Archivos",
"assign-member": "Asignar miembros",
"attached": "adjuntado",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Cambiar vigilancia",
"boardMenuPopup-title": "Menú del tablero",
"boards": "Tableros",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Listas",
"bucket-example": "Como “Cosas por hacer” por ejemplo",
"cancel": "Cancelar",
"card-archived": "Esta tarjeta está ahora archivada.",
@@ -172,8 +176,8 @@
"edit": "Editar",
"edit-avatar": "Cambiar el avatar",
"edit-profile": "Editar el perfil",
- "edit-wip-limit": "Cambiar el límite del WIP",
- "soft-wip-limit": "Límite flexible del WIP",
+ "edit-wip-limit": "Cambiar el límite del TEP",
+ "soft-wip-limit": "Límite del TEP flexible",
"editCardStartDatePopup-title": "Cambiar la fecha de inicio",
"editCardDueDatePopup-title": "Cambiar la fecha de vencimiento",
"editCardSpentTimePopup-title": "Cambiar el tiempo consumido",
@@ -194,7 +198,7 @@
"email-sent": "Correo enviado",
"email-verifyEmail-subject": "Verifica tu dirección de correo en __siteName__",
"email-verifyEmail-text": "Hola __user__,\n\nPara verificar tu cuenta de correo electrónico, haz clic en el siguiente enlace.\n\n__url__\n\nGracias.",
- "enable-wip-limit": "Activar el límite del WIP",
+ "enable-wip-limit": "Activar el límite del TEP",
"error-board-doesNotExist": "El tablero no existe",
"error-board-notAdmin": "Es necesario ser administrador de este tablero para hacer eso",
"error-board-notAMember": "Es necesario ser miembro de este tablero para hacer eso",
@@ -225,7 +229,7 @@
"import-board-c": "Importar un tablero",
"import-board-title-trello": "Importar un tablero desde Trello",
"import-board-title-wekan": "Importar un tablero desde Wekan",
- "import-sandstorm-warning": "El tablero importado eliminará todos los datos existentes en este tablero y a reemplazarlos con los datos del tablero importado.",
+ "import-sandstorm-warning": "El tablero importado eliminará todos los datos existentes en este tablero y los reemplazará con los datos del tablero importado.",
"from-trello": "Desde Trello",
"from-wekan": "Desde Wekan",
"import-board-instruction-trello": "En tu tablero de Trello, ve a 'Menú', luego 'Más' > 'Imprimir y exportar' > 'Exportar JSON', y copia el texto resultante.",
@@ -320,8 +324,8 @@
"save": "Guardar",
"search": "Buscar",
"select-color": "Selecciona un color",
- "set-wip-limit-value": "Fija un límite para el número máximo de tareas en esta lista",
- "setWipLimitPopup-title": "Fijar el límite del WIP",
+ "set-wip-limit-value": "Fija un límite para el número máximo de tareas en esta lista.",
+ "setWipLimitPopup-title": "Fijar el límite del TEP",
"shortcut-assign-self": "Asignarte a ti mismo a la tarjeta actual",
"shortcut-autocomplete-emoji": "Autocompletar emoji",
"shortcut-autocomplete-members": "Autocompletar miembros",
@@ -346,7 +350,7 @@
"overtime-hours": "Tiempo excesivo (horas)",
"overtime": "Tiempo excesivo",
"has-overtime-cards": "Hay tarjetas con el tiempo excedido",
- "has-spenttime-cards": "Hay tarjetas con el tiempo consumido",
+ "has-spenttime-cards": "Se ha excedido el tiempo de las tarjetas",
"time": "Hora",
"title": "Título",
"tracking": "Seguimiento",
@@ -367,9 +371,9 @@
"welcome-list1": "Básicos",
"welcome-list2": "Avanzados",
"what-to-do": "¿Qué deseas hacer?",
- "wipLimitErrorPopup-title": "Límite del WIP no válido",
- "wipLimitErrorPopup-dialog-pt1": "El número de tareas en esta lista es mayor que el límite del WIP que has definido.",
- "wipLimitErrorPopup-dialog-pt2": "Por favor, mueve algunas tareas fuera de esta lista, o fija un límite del WIP más alto.",
+ "wipLimitErrorPopup-title": "Límite del TEP no válido",
+ "wipLimitErrorPopup-dialog-pt1": "El número de tareas en esta lista es mayor que el límite del TEP que has definido.",
+ "wipLimitErrorPopup-dialog-pt2": "Por favor, mueve algunas tareas fuera de esta lista, o fija un límite del TEP más alto.",
"admin-panel": "Panel del administrador",
"settings": "Ajustes",
"people": "Personas",
diff --git a/i18n/eu.i18n.json b/i18n/eu.i18n.json
index 6096f4e0..25efa3c3 100644
--- a/i18n/eu.i18n.json
+++ b/i18n/eu.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Gehitu eranskina",
"add-board": "Gehitu arbela",
"add-card": "Gehitu txartela",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Gehitu egiaztaketa zerrenda",
"add-checklist-item": "Gehitu elementu bat egiaztaketa zerrendara",
"add-cover": "Gehitu azala",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Aldatu ikuskatzea",
"boardMenuPopup-title": "Arbelaren menua",
"boards": "Arbelak",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Zerrendak",
"bucket-example": "Esaterako \"Pertz zerrenda\"",
"cancel": "Utzi",
"card-archived": "Txartel hau artxibatuta dago.",
@@ -346,7 +350,7 @@
"overtime-hours": "Luzapena (orduak)",
"overtime": "Luzapena",
"has-overtime-cards": "Luzapen txartelak ditu",
- "has-spenttime-cards": "Erabilitako dendoran txartelak ditu",
+ "has-spenttime-cards": "Erabilitako denbora txartelak ditu",
"time": "Ordua",
"title": "Izenburua",
"tracking": "Jarraitzen",
diff --git a/i18n/fa.i18n.json b/i18n/fa.i18n.json
index e5e0f08e..6818ada8 100644
--- a/i18n/fa.i18n.json
+++ b/i18n/fa.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "افزودن ضمیمه",
"add-board": "افزودن برد",
"add-card": "افزودن کارت",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "افزودن چک لیست",
"add-checklist-item": "افزودن مورد به سیاهه",
"add-cover": "جلد کردن",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "تغییر دیده بانی",
"boardMenuPopup-title": "منوی تخته",
"boards": "تخته ها",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "لیست ها",
"bucket-example": "برای مثال چیزی شبیه \"لیست سبدها\" ",
"cancel": "انصراف",
"card-archived": "این کارت بایگانی شده است.",
@@ -346,7 +350,7 @@
"overtime-hours": "Overtime (hours)",
"overtime": "Overtime",
"has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "زمان",
"title": "عنوان",
"tracking": "پیگردی",
diff --git a/i18n/fi.i18n.json b/i18n/fi.i18n.json
index a27dda6d..44fc060b 100644
--- a/i18n/fi.i18n.json
+++ b/i18n/fi.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Lisää liite",
"add-board": "Lisää taulu",
"add-card": "Lisää kortti",
+ "add-swimlane": "Lisää Swimlane",
"add-checklist": "Lisää tarkistuslista",
"add-checklist-item": "Lisää kohta tarkistuslistaan",
"add-cover": "Lisää kansi",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Muokkaa seuraamista",
"boardMenuPopup-title": "Taulu valikko",
"boards": "Taulut",
+ "board-view": "Taulu näkymä",
+ "board-view-swimlanes": "Swimlanet",
+ "board-view-lists": "Listat",
"bucket-example": "Kuten “Laatikko lista” esimerkiksi",
"cancel": "Peruuta",
"card-archived": "Tämä kortti on arkistoitu.",
diff --git a/i18n/fr.i18n.json b/i18n/fr.i18n.json
index 249b19be..3b406f2d 100644
--- a/i18n/fr.i18n.json
+++ b/i18n/fr.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Ajouter une pièce jointe",
"add-board": "Ajouter un tableau",
"add-card": "Ajouter une carte",
+ "add-swimlane": "Ajouter un couloir",
"add-checklist": "Ajouter une checklist",
"add-checklist-item": "Ajouter un élément à la checklist",
"add-cover": "Ajouter la couverture",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Modifier le suivi",
"boardMenuPopup-title": "Menu du tableau",
"boards": "Tableaux",
+ "board-view": "Vue du tableau",
+ "board-view-swimlanes": "Couloirs",
+ "board-view-lists": "Listes",
"bucket-example": "Comme « todo list » par exemple",
"cancel": "Annuler",
"card-archived": "Cette carte est archivée.",
@@ -173,7 +177,7 @@
"edit-avatar": "Modifier l'avatar",
"edit-profile": "Modifier le profil",
"edit-wip-limit": "Éditer la limite WIP",
- "soft-wip-limit": "Limite Soft WIP",
+ "soft-wip-limit": "Limite WIP douce",
"editCardStartDatePopup-title": "Modifier la date de début",
"editCardDueDatePopup-title": "Modifier la date d'échéance",
"editCardSpentTimePopup-title": "Changer le temps passé",
@@ -320,7 +324,7 @@
"save": "Enregistrer",
"search": "Chercher",
"select-color": "Sélectionner une couleur",
- "set-wip-limit-value": "Définit une limite maximale au nombre de tâches dans cette liste",
+ "set-wip-limit-value": "Définit une limite maximale au nombre de cartes de cette liste",
"setWipLimitPopup-title": "Définir la limite WIP",
"shortcut-assign-self": "Affecter cette carte à vous-même",
"shortcut-autocomplete-emoji": "Auto-complétion des emoji",
@@ -368,8 +372,8 @@
"welcome-list2": "Avancés",
"what-to-do": "Que voulez-vous faire ?",
"wipLimitErrorPopup-title": "Limite WIP invalide",
- "wipLimitErrorPopup-dialog-pt1": "Le nombre de tâches dans cette liste est supérieur à la limite WIP que vous avez définie.",
- "wipLimitErrorPopup-dialog-pt2": "Veuillez enlever des tâches de cette liste, ou définir une limite WIP plus importante.",
+ "wipLimitErrorPopup-dialog-pt1": "Le nombre de cartes de cette liste est supérieur à la limite WIP que vous avez définie.",
+ "wipLimitErrorPopup-dialog-pt2": "Veuillez enlever des cartes de cette liste, ou définir une limite WIP plus importante.",
"admin-panel": "Panneau d'administration",
"settings": "Paramètres",
"people": "Personne",
diff --git a/i18n/gl.i18n.json b/i18n/gl.i18n.json
index 2111aef8..eb478895 100644
--- a/i18n/gl.i18n.json
+++ b/i18n/gl.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Engadir anexo",
"add-board": "Engadir taboleiro",
"add-card": "Engadir tarxeta",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Add Checklist",
"add-checklist-item": "Add an item to checklist",
"add-cover": "Add Cover",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Change Watch",
"boardMenuPopup-title": "Board Menu",
"boards": "Taboleiros",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Listas",
"bucket-example": "Like “Bucket List” for example",
"cancel": "Cancelar",
"card-archived": "This card is archived.",
@@ -346,7 +350,7 @@
"overtime-hours": "Overtime (hours)",
"overtime": "Overtime",
"has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Hora",
"title": "Título",
"tracking": "Seguimento",
diff --git a/i18n/he.i18n.json b/i18n/he.i18n.json
index 7c377b49..74abf889 100644
--- a/i18n/he.i18n.json
+++ b/i18n/he.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "הוספת קובץ מצורף",
"add-board": "הוספת לוח",
"add-card": "הוספת כרטיס",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "הוספת רשימת מטלות",
"add-checklist-item": "הוספת פריט לרשימת משימות",
"add-cover": "הוספת כיסוי",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "שינוי הגדרת המעקב",
"boardMenuPopup-title": "תפריט לוח",
"boards": "לוחות",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "רשימות",
"bucket-example": "כמו למשל „רשימת המשימות“",
"cancel": "ביטול",
"card-archived": "כרטיס זה שמור בארכיון.",
@@ -346,7 +350,7 @@
"overtime-hours": "שעות נוספות",
"overtime": "שעות נוספות",
"has-overtime-cards": "יש כרטיסי שעות נוספות",
- "has-spenttime-cards": "יש כרטיסי זמן שהושקע",
+ "has-spenttime-cards": "Has spent time cards",
"time": "זמן",
"title": "כותרת",
"tracking": "מעקב",
diff --git a/i18n/hu.i18n.json b/i18n/hu.i18n.json
index dfaec50f..afb0842a 100644
--- a/i18n/hu.i18n.json
+++ b/i18n/hu.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Melléklet hozzáadása",
"add-board": "Tábla hozzáadása",
"add-card": "Kártya hozzáadása",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Ellenőrzőlista hozzáadása",
"add-checklist-item": "Elem hozzáadása az ellenőrzőlistához",
"add-cover": "Borító hozzáadása",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Megfigyelés megváltoztatása",
"boardMenuPopup-title": "Tábla menü",
"boards": "Táblák",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Listák",
"bucket-example": "Mint például „Bakancslista”",
"cancel": "Mégse",
"card-archived": "Ez a kártya archiválva van.",
@@ -103,7 +107,7 @@
"card-delete-suggest-archive": "Archiválhat egy kártyát, hogy eltávolítsa a tábláról, és megőrizze a tevékenységet.",
"card-due": "Esedékes",
"card-due-on": "Esedékes ekkor",
- "card-spent": "Spent Time",
+ "card-spent": "Eltöltött idő",
"card-edit-attachments": "Mellékletek szerkesztése",
"card-edit-labels": "Címkék szerkesztése",
"card-edit-members": "Tagok szerkesztése",
@@ -176,7 +180,7 @@
"soft-wip-limit": "Gyenge WIP korlát",
"editCardStartDatePopup-title": "Kezdődátum megváltoztatása",
"editCardDueDatePopup-title": "Esedékesség dátumának megváltoztatása",
- "editCardSpentTimePopup-title": "Change spent time",
+ "editCardSpentTimePopup-title": "Eltöltött idő megváltoztatása",
"editLabelPopup-title": "Címke megváltoztatása",
"editNotificationPopup-title": "Értesítés szerkesztése",
"editProfilePopup-title": "Profil szerkesztése",
@@ -184,7 +188,7 @@
"email-enrollAccount-subject": "Létrejött a profilja a következő oldalon: __siteName__",
"email-enrollAccount-text": "Kedves __user__!\n\nA szolgáltatás használatának megkezdéséhez egyszerűen kattintson a lenti hivatkozásra.\n\n__url__\n\nKöszönjük.",
"email-fail": "Az e-mail küldése nem sikerült",
- "email-fail-text": "Error trying to send email",
+ "email-fail-text": "Hiba az e-mail küldésének kísérlete közben",
"email-invalid": "Érvénytelen e-mail",
"email-invite": "Meghívás e-mailben",
"email-invite-subject": "__inviter__ egy meghívást küldött Önnek",
@@ -239,8 +243,8 @@
"info": "Verzió",
"initials": "Kezdőbetűk",
"invalid-date": "Érvénytelen dátum",
- "invalid-time": "Invalid time",
- "invalid-user": "Invalid user",
+ "invalid-time": "Érvénytelen idő",
+ "invalid-user": "Érvénytelen felhasználó",
"joined": "csatlakozott",
"just-invited": "Éppen most hívták meg erre a táblára",
"keyboard-shortcuts": "Gyorsbillentyűk",
@@ -342,11 +346,11 @@
"team": "Csapat",
"this-board": "ez a tábla",
"this-card": "ez a kártya",
- "spent-time-hours": "Spent time (hours)",
- "overtime-hours": "Overtime (hours)",
- "overtime": "Overtime",
- "has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "spent-time-hours": "Eltöltött idő (óra)",
+ "overtime-hours": "Túlóra (óra)",
+ "overtime": "Túlóra",
+ "has-overtime-cards": "Van túlórás kártyája",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Idő",
"title": "Cím",
"tracking": "Követés",
@@ -388,12 +392,12 @@
"smtp-password": "Jelszó",
"smtp-tls": "TLS támogatás",
"send-from": "Feladó",
- "send-smtp-test": "Send a test email to yourself",
+ "send-smtp-test": "Teszt e-mail küldése magamnak",
"invitation-code": "Meghívási kód",
"email-invite-register-subject": "__inviter__ egy meghívás küldött Önnek",
"email-invite-register-text": "Kedves __user__!\n\n__inviter__ meghívta Önt közreműködésre a Wekan oldalra.\n\nKövesse a lenti hivatkozást:\n__url__\n\nÉs a meghívási kódja: __icode__\n\nKöszönjük.",
- "email-smtp-test-subject": "SMTP Test Email From Wekan",
- "email-smtp-test-text": "You have successfully sent an email",
+ "email-smtp-test-subject": "SMTP teszt e-mail a Wekantól",
+ "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-notAuthorized": "Nincs jogosultsága az oldal megtekintéséhez.",
"outgoing-webhooks": "Kimenő webhurkok",
diff --git a/i18n/ibo.json b/i18n/ibo.json
new file mode 100644
index 00000000..2844c99e
--- /dev/null
+++ b/i18n/ibo.json
@@ -0,0 +1,428 @@
+{
+ "accept": "Kwere",
+ "act-activity-notify": "[Wekan] Activity Notification",
+ "act-addAttachment": "attached __attachment__ to __card__",
+ "act-addChecklist": "added checklist __checklist__ to __card__",
+ "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
+ "act-addComment": "commented on __card__: __comment__",
+ "act-createBoard": "created __board__",
+ "act-createCard": "added __card__ to __list__",
+ "act-createList": "added __list__ to __board__",
+ "act-addBoardMember": "added __member__ to __board__",
+ "act-archivedBoard": "archived __board__",
+ "act-archivedCard": "archived __card__",
+ "act-archivedList": "archived __list__",
+ "act-importBoard": "imported __board__",
+ "act-importCard": "imported __card__",
+ "act-importList": "imported __list__",
+ "act-joinMember": "added __member__ to __card__",
+ "act-moveCard": "moved __card__ from __oldList__ to __list__",
+ "act-removeBoardMember": "removed __member__ from __board__",
+ "act-restoredCard": "restored __card__ to __board__",
+ "act-unjoinMember": "removed __member__ from __card__",
+ "act-withBoardTitle": "[Wekan] __board__",
+ "act-withCardTitle": "[__board__] __card__",
+ "actions": "Actions",
+ "activities": "Activities",
+ "activity": "Activity",
+ "activity-added": "added %s to %s",
+ "activity-archived": "archived %s",
+ "activity-attached": "attached %s to %s",
+ "activity-created": "created %s",
+ "activity-excluded": "excluded %s from %s",
+ "activity-imported": "imported %s into %s from %s",
+ "activity-imported-board": "imported %s from %s",
+ "activity-joined": "joined %s",
+ "activity-moved": "moved %s from %s to %s",
+ "activity-on": "na %s",
+ "activity-removed": "removed %s from %s",
+ "activity-sent": "sent %s to %s",
+ "activity-unjoined": "unjoined %s",
+ "activity-checklist-added": "added checklist to %s",
+ "activity-checklist-item-added": "added checklist item to '%s' in %s",
+ "add": "Tinye",
+ "add-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
+ "add-checklist": "Add Checklist",
+ "add-checklist-item": "Add an item to checklist",
+ "add-cover": "Add Cover",
+ "add-label": "Add Label",
+ "add-list": "Add List",
+ "add-members": "Tinye ndị otu ọhụrụ",
+ "added": "Etinyere ",
+ "addMemberPopup-title": "Ndị otu",
+ "admin": "Admin",
+ "admin-desc": "Can view and edit cards, remove members, and change settings for the board.",
+ "admin-announcement": "Announcement",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Announcement from Administrator",
+ "all-boards": "All boards",
+ "and-n-other-card": "And __count__ other card",
+ "and-n-other-card_plural": "And __count__ other cards",
+ "apply": "Apply",
+ "app-is-offline": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
+ "archive": "Archive",
+ "archive-all": "Archive All",
+ "archive-board": "Archive Board",
+ "archive-card": "Archive Card",
+ "archive-list": "Archive List",
+ "archive-selection": "Archive selection",
+ "archiveBoardPopup-title": "Archive Board?",
+ "archived-items": "Archived Items",
+ "archived-boards": "Archived Boards",
+ "restore-board": "Restore Board",
+ "no-archived-boards": "No Archived Boards.",
+ "archives": "Archives",
+ "assign-member": "Assign member",
+ "attached": "attached",
+ "attachment": "Attachment",
+ "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.",
+ "attachmentDeletePopup-title": "Delete Attachment?",
+ "attachments": "Attachments",
+ "auto-watch": "Automatically watch boards when they are created",
+ "avatar-too-big": "The avatar is too large (70KB max)",
+ "back": "Back",
+ "board-change-color": "Change color",
+ "board-nb-stars": "%s stars",
+ "board-not-found": "Board not found",
+ "board-private-info": "This board will be <strong>private</strong>.",
+ "board-public-info": "This board will be <strong>public</strong>.",
+ "boardChangeColorPopup-title": "Change Board Background",
+ "boardChangeTitlePopup-title": "Rename Board",
+ "boardChangeVisibilityPopup-title": "Change Visibility",
+ "boardChangeWatchPopup-title": "Change Watch",
+ "boardMenuPopup-title": "Board Menu",
+ "boards": "Boards",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Lists",
+ "bucket-example": "Like “Bucket List” for example",
+ "cancel": "Cancel",
+ "card-archived": "This card is archived.",
+ "card-comments-title": "This card has %s comment.",
+ "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.",
+ "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.",
+ "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.",
+ "card-due": "Due",
+ "card-due-on": "Due on",
+ "card-spent": "Spent Time",
+ "card-edit-attachments": "Edit attachments",
+ "card-edit-labels": "Edit labels",
+ "card-edit-members": "Edit members",
+ "card-labels-title": "Change the labels for the card.",
+ "card-members-title": "Add or remove members of the board from the card.",
+ "card-start": "Bido",
+ "card-start-on": "Starts on",
+ "cardAttachmentsPopup-title": "Attach From",
+ "cardDeletePopup-title": "Delete Card?",
+ "cardDetailsActionsPopup-title": "Card Actions",
+ "cardLabelsPopup-title": "Aha",
+ "cardMembersPopup-title": "Ndị otu",
+ "cardMorePopup-title": "More",
+ "cards": "Cards",
+ "change": "Gbanwe",
+ "change-avatar": "Change Avatar",
+ "change-password": "Change Password",
+ "change-permissions": "Change permissions",
+ "change-settings": "Change Settings",
+ "changeAvatarPopup-title": "Change Avatar",
+ "changeLanguagePopup-title": "Họrọ asụsụ ọzọ",
+ "changePasswordPopup-title": "Change Password",
+ "changePermissionsPopup-title": "Change Permissions",
+ "changeSettingsPopup-title": "Change Settings",
+ "checklists": "Checklists",
+ "click-to-star": "Click to star this board.",
+ "click-to-unstar": "Click to unstar this board.",
+ "clipboard": "Clipboard or drag & drop",
+ "close": "Close",
+ "close-board": "Close Board",
+ "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.",
+ "color-black": "black",
+ "color-blue": "blue",
+ "color-green": "green",
+ "color-lime": "lime",
+ "color-orange": "orange",
+ "color-pink": "pink",
+ "color-purple": "purple",
+ "color-red": "red",
+ "color-sky": "sky",
+ "color-yellow": "yellow",
+ "comment": "Comment",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "Can comment on cards only.",
+ "computer": "Computer",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+ "copy-card-link-to-clipboard": "Copy card link to clipboard",
+ "copyCardPopup-title": "Copy Card",
+ "create": "Create",
+ "createBoardPopup-title": "Create Board",
+ "chooseBoardSourcePopup-title": "Import board",
+ "createLabelPopup-title": "Create Label",
+ "current": "current",
+ "date": "Date",
+ "decline": "Decline",
+ "default-avatar": "Default avatar",
+ "delete": "Delete",
+ "deleteLabelPopup-title": "Delete Label?",
+ "description": "Description",
+ "disambiguateMultiLabelPopup-title": "Disambiguate Label Action",
+ "disambiguateMultiMemberPopup-title": "Disambiguate Member Action",
+ "discard": "Discard",
+ "done": "Done",
+ "download": "Download",
+ "edit": "Edit",
+ "edit-avatar": "Change Avatar",
+ "edit-profile": "Edit Profile",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
+ "editCardStartDatePopup-title": "Change start date",
+ "editCardDueDatePopup-title": "Change due date",
+ "editCardSpentTimePopup-title": "Change spent time",
+ "editLabelPopup-title": "Change Label",
+ "editNotificationPopup-title": "Edit Notification",
+ "editProfilePopup-title": "Edit Profile",
+ "email": "Email",
+ "email-enrollAccount-subject": "An account created for you on __siteName__",
+ "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.",
+ "email-fail": "Sending email failed",
+ "email-fail-text": "Error trying to send email",
+ "email-invalid": "Invalid email",
+ "email-invite": "Invite via Email",
+ "email-invite-subject": "__inviter__ sent you an invitation",
+ "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.",
+ "email-resetPassword-subject": "Reset your password on __siteName__",
+ "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.",
+ "email-sent": "Email sent",
+ "email-verifyEmail-subject": "Verify your email address on __siteName__",
+ "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.",
+ "enable-wip-limit": "Enable WIP Limit",
+ "error-board-doesNotExist": "This board does not exist",
+ "error-board-notAdmin": "You need to be admin of this board to do that",
+ "error-board-notAMember": "You need to be a member of this board to do that",
+ "error-json-malformed": "Your text is not valid JSON",
+ "error-json-schema": "Your JSON data does not include the proper information in the correct format",
+ "error-list-doesNotExist": "This list does not exist",
+ "error-user-doesNotExist": "This user does not exist",
+ "error-user-notAllowSelf": "You can not invite yourself",
+ "error-user-notCreated": "This user is not created",
+ "error-username-taken": "This username is already taken",
+ "error-email-taken": "Email has already been taken",
+ "export-board": "Export board",
+ "filter": "Filter",
+ "filter-cards": "Filter Cards",
+ "filter-clear": "Clear filter",
+ "filter-no-label": "No label",
+ "filter-no-member": "No member",
+ "filter-on": "Filter is on",
+ "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.",
+ "filter-to-selection": "Filter to selection",
+ "fullname": "Full Name",
+ "header-logo-title": "Go back to your boards page.",
+ "hide-system-messages": "Hide system messages",
+ "headerBarCreateBoardPopup-title": "Create Board",
+ "home": "Home",
+ "import": "Import",
+ "import-board": "import board",
+ "import-board-c": "Import board",
+ "import-board-title-trello": "Import board from Trello",
+ "import-board-title-wekan": "Import board from Wekan",
+ "import-sandstorm-warning": "Imported board will delete all existing data on board and replace it with imported board.",
+ "from-trello": "From Trello",
+ "from-wekan": "From Wekan",
+ "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.",
+ "import-board-instruction-wekan": "In your Wekan board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.",
+ "import-json-placeholder": "Paste your valid JSON data here",
+ "import-map-members": "Map members",
+ "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users",
+ "import-show-user-mapping": "Review members mapping",
+ "import-user-select": "Pick the Wekan user you want to use as this member",
+ "importMapMembersAddPopup-title": "Select Wekan member",
+ "info": "Version",
+ "initials": "Initials",
+ "invalid-date": "Invalid date",
+ "invalid-time": "Invalid time",
+ "invalid-user": "Invalid user",
+ "joined": "joined",
+ "just-invited": "You are just invited to this board",
+ "keyboard-shortcuts": "Keyboard shortcuts",
+ "label-create": "Create Label",
+ "label-default": "%s label (default)",
+ "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.",
+ "labels": "Aha",
+ "language": "Language",
+ "last-admin-desc": "You can’t change roles because there must be at least one admin.",
+ "leave-board": "Leave Board",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "Leave Board ?",
+ "link-card": "Link to this card",
+ "list-archive-cards": "Archive all cards in this list",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view archived cards and bring them back to the board, click “Menu” > “Archived Items”.",
+ "list-move-cards": "Move all cards in this list",
+ "list-select-cards": "Select all cards in this list",
+ "listActionPopup-title": "List Actions",
+ "listImportCardPopup-title": "Import a Trello card",
+ "listMorePopup-title": "More",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
+ "lists": "Lists",
+ "log-out": "Log Out",
+ "log-in": "Log In",
+ "loginPopup-title": "Log In",
+ "memberMenuPopup-title": "Member Settings",
+ "members": "Ndị otu",
+ "menu": "Menu",
+ "move-selection": "Move selection",
+ "moveCardPopup-title": "Move Card",
+ "moveCardToBottom-title": "Move to Bottom",
+ "moveCardToTop-title": "Move to Top",
+ "moveSelectionPopup-title": "Move selection",
+ "multi-selection": "Multi-Selection",
+ "multi-selection-on": "Multi-Selection is on",
+ "muted": "Muted",
+ "muted-info": "You will never be notified of any changes in this board",
+ "my-boards": "My Boards",
+ "name": "Name",
+ "no-archived-cards": "No archived cards.",
+ "no-archived-lists": "No archived lists.",
+ "no-results": "No results",
+ "normal": "Normal",
+ "normal-desc": "Can view and edit cards. Can't change settings.",
+ "not-accepted-yet": "Invitation not accepted yet",
+ "notify-participate": "Receive updates to any cards you participate as creater or member",
+ "notify-watch": "Receive updates to any boards, lists, or cards you’re watching",
+ "optional": "optional",
+ "or": "or",
+ "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.",
+ "page-not-found": "Page not found.",
+ "password": "Password",
+ "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)",
+ "participating": "Participating",
+ "preview": "Preview",
+ "previewAttachedImagePopup-title": "Preview",
+ "previewClipboardImagePopup-title": "Preview",
+ "private": "Private",
+ "private-desc": "This board is private. Only people added to the board can view and edit it.",
+ "profile": "Profile",
+ "public": "Public",
+ "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.",
+ "quick-access-description": "Star a board to add a shortcut in this bar.",
+ "remove-cover": "Remove Cover",
+ "remove-from-board": "Remove from Board",
+ "remove-label": "Remove Label",
+ "listDeletePopup-title": "Delete List ?",
+ "remove-member": "Remove Member",
+ "remove-member-from-card": "Remove from Card",
+ "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.",
+ "removeMemberPopup-title": "Remove Member?",
+ "rename": "Banye aha ọzọ",
+ "rename-board": "Rename Board",
+ "restore": "Restore",
+ "save": "Save",
+ "search": "Search",
+ "select-color": "Select Color",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
+ "shortcut-assign-self": "Assign yourself to current card",
+ "shortcut-autocomplete-emoji": "Autocomplete emoji",
+ "shortcut-autocomplete-members": "Autocomplete members",
+ "shortcut-clear-filters": "Clear all filters",
+ "shortcut-close-dialog": "Close Dialog",
+ "shortcut-filter-my-cards": "Filter my cards",
+ "shortcut-show-shortcuts": "Bring up this shortcuts list",
+ "shortcut-toggle-filterbar": "Toggle Filter Sidebar",
+ "shortcut-toggle-sidebar": "Toggle Board Sidebar",
+ "show-cards-minimum-count": "Show cards count if list contains more than",
+ "sidebar-open": "Open Sidebar",
+ "sidebar-close": "Close Sidebar",
+ "signupPopup-title": "Create an Account",
+ "star-board-title": "Click to star this board. It will show up at top of your boards list.",
+ "starred-boards": "Starred Boards",
+ "starred-boards-description": "Starred boards show up at the top of your boards list.",
+ "subscribe": "Subscribe",
+ "team": "Team",
+ "this-board": "this board",
+ "this-card": "this card",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
+ "time": "Time",
+ "title": "Title",
+ "tracking": "Tracking",
+ "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
+ "unassign-member": "Unassign member",
+ "unsaved-description": "You have an unsaved description.",
+ "unwatch": "Unwatch",
+ "upload": "Upload",
+ "upload-avatar": "Upload an avatar",
+ "uploaded-avatar": "Uploaded an avatar",
+ "username": "Username",
+ "view-it": "Hụ ya",
+ "warn-list-archived": "warning: this card is in an archived list",
+ "watch": "Hụ",
+ "watching": "Watching",
+ "watching-info": "You will be notified of any change in this board",
+ "welcome-board": "Welcome Board",
+ "welcome-list1": "Basics",
+ "welcome-list2": "Advanced",
+ "what-to-do": "What do you want to do?",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
+ "admin-panel": "Admin Panel",
+ "settings": "Settings",
+ "people": "Ndị mmadụ",
+ "registration": "Registration",
+ "disable-self-registration": "Disable Self-Registration",
+ "invite": "Invite",
+ "invite-people": "Invite People",
+ "to-boards": "To board(s)",
+ "email-addresses": "Email Addresses",
+ "smtp-host-description": "The address of the SMTP server that handles your emails.",
+ "smtp-port-description": "The port your SMTP server uses for outgoing emails.",
+ "smtp-tls-description": "Enable TLS support for SMTP server",
+ "smtp-host": "SMTP Host",
+ "smtp-port": "SMTP Port",
+ "smtp-username": "Username",
+ "smtp-password": "Password",
+ "smtp-tls": "TLS support",
+ "send-from": "From",
+ "send-smtp-test": "Send a test email to yourself",
+ "invitation-code": "Invitation Code",
+ "email-invite-register-subject": "__inviter__ sent you an invitation",
+ "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to Wekan 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 From Wekan",
+ "email-smtp-test-text": "You have successfully sent an email",
+ "error-invitation-code-not-exist": "Invitation code doesn't exist",
+ "error-notAuthorized": "You are not authorized to view this page.",
+ "outgoing-webhooks": "Outgoing Webhooks",
+ "outgoingWebhooksPopup-title": "Outgoing Webhooks",
+ "new-outgoing-webhook": "New Outgoing Webhook",
+ "no-name": "(Unknown)",
+ "Wekan_version": "Wekan version",
+ "Node_version": "Node version",
+ "OS_Arch": "OS Arch",
+ "OS_Cpus": "OS CPU Count",
+ "OS_Freemem": "OS Free Memory",
+ "OS_Loadavg": "OS Load Average",
+ "OS_Platform": "OS Platform",
+ "OS_Release": "OS Release",
+ "OS_Totalmem": "OS Total Memory",
+ "OS_Type": "OS Type",
+ "OS_Uptime": "OS Uptime",
+ "hours": "elekere",
+ "minutes": "nkeji",
+ "seconds": "seconds",
+ "yes": "Ee",
+ "no": "Mba",
+ "accounts": "Accounts",
+ "accounts-allowEmailChange": "Allow Email Change",
+ "createdAt": "Ekere na",
+ "verified": "Verified",
+ "active": "Active"
+} \ No newline at end of file
diff --git a/i18n/id.i18n.json b/i18n/id.i18n.json
index 57659ad8..b13a398e 100644
--- a/i18n/id.i18n.json
+++ b/i18n/id.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Add Attachment",
"add-board": "Add Board",
"add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Add Checklist",
"add-checklist-item": "Tambahkan hal ke daftar periksa",
"add-cover": "Tambahkan Sampul",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Ubah Pengamatan",
"boardMenuPopup-title": "Menu Panel",
"boards": "Panel",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Daftar",
"bucket-example": "Contohnya seperti “Bucket List” ",
"cancel": "Batal",
"card-archived": "Kartu ini diarsipkan",
@@ -346,7 +350,7 @@
"overtime-hours": "Overtime (hours)",
"overtime": "Overtime",
"has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Waktu",
"title": "Judul",
"tracking": "Pelacakan",
diff --git a/i18n/it.i18n.json b/i18n/it.i18n.json
index 100e1ab4..9f98cf0d 100644
--- a/i18n/it.i18n.json
+++ b/i18n/it.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Aggiungi Allegato",
"add-board": "Aggiungi Bacheca",
"add-card": "Aggiungi Scheda",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Aggiungi Checklist",
"add-checklist-item": "Aggiungi un elemento alla checklist",
"add-cover": "Aggiungi copertina",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Cambia faccia",
"boardMenuPopup-title": "Menu bacheca",
"boards": "Bacheche",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Liste",
"bucket-example": "Per esempio come \"una lista di cose da fare\"",
"cancel": "Cancella",
"card-archived": "Questa scheda è archiviata.",
@@ -346,7 +350,7 @@
"overtime-hours": "Overtime (ore)",
"overtime": "Overtime",
"has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Ora",
"title": "Titolo",
"tracking": "Monitoraggio",
diff --git a/i18n/ja.i18n.json b/i18n/ja.i18n.json
index d8184e88..108722e7 100644
--- a/i18n/ja.i18n.json
+++ b/i18n/ja.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "添付ファイルを追加",
"add-board": "ボードを追加",
"add-card": "カードを追加",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "チェックリストを追加",
"add-checklist-item": "チェックリストに項目を追加",
"add-cover": "カバーの追加",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "ウォッチの変更",
"boardMenuPopup-title": "ボードメニュー",
"boards": "ボード",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "リスト",
"bucket-example": "Like “Bucket List” for example",
"cancel": "キャンセル",
"card-archived": "カードはアーカイブされました。",
@@ -346,7 +350,7 @@
"overtime-hours": "Overtime (hours)",
"overtime": "Overtime",
"has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "時間",
"title": "タイトル",
"tracking": "トラッキング",
diff --git a/i18n/ko.i18n.json b/i18n/ko.i18n.json
index 82854c90..0dc6837a 100644
--- a/i18n/ko.i18n.json
+++ b/i18n/ko.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "첨부파일 추가",
"add-board": "보드 추가",
"add-card": "카드 추가",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "체크리스트 추가",
"add-checklist-item": "체크리스트에 항목 추가",
"add-cover": "커버 추가",
@@ -55,13 +56,13 @@
"admin": "관리자",
"admin-desc": "카드를 보거나 수정하고, 멤버를 삭제하고, 보드에 대한 설정을 수정할 수 있습니다.",
"admin-announcement": "Announcement",
- "admin-announcement-active": "Active System-Wide Announcement",
- "admin-announcement-title": "Announcement from Administrator",
+ "admin-announcement-active": "시스템에 공지사항을 표시합니다",
+ "admin-announcement-title": "관리자 공지사항 메시지",
"all-boards": "전체 보드",
"and-n-other-card": "__count__ 개의 다른 카드",
"and-n-other-card_plural": "__count__ 개의 다른 카드들",
"apply": "적용",
- "app-is-offline": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
+ "app-is-offline": "Wekan 로딩 중 입니다. 잠시 기다려주세요. 페이지를 새로고침 하시면 데이터가 손실될 수 있습니다. Wekan 을 불러오는데 실패한다면 서버가 중지되지 않았는지 확인 바랍니다.",
"archive": "보관",
"archive-all": "모두 보관",
"archive-board": "보드 저장소 보관",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "감시상태 변경",
"boardMenuPopup-title": "보드 메뉴",
"boards": "보드",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "목록들",
"bucket-example": "예: “프로젝트 이름“ 입력",
"cancel": "취소",
"card-archived": "이 카드를 보관합니다.",
@@ -150,12 +154,12 @@
"comment-only": "댓글만 입력 가능",
"comment-only-desc": "카드에 댓글만 달수 있습니다.",
"computer": "내 컴퓨터",
- "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
- "copy-card-link-to-clipboard": "Copy card link to clipboard",
- "copyCardPopup-title": "Copy Card",
+ "confirm-checklist-delete-dialog": "정말 이 체크리스트를 삭제할까요?",
+ "copy-card-link-to-clipboard": "클립보드에 카드의 링크가 복사되었습니다.",
+ "copyCardPopup-title": "카드 복사",
"create": "생성",
"createBoardPopup-title": "보드 생성",
- "chooseBoardSourcePopup-title": "Import board",
+ "chooseBoardSourcePopup-title": "보드 가져오기",
"createLabelPopup-title": "라벨 생성",
"current": "경향",
"date": "날짜",
@@ -172,8 +176,8 @@
"edit": "수정",
"edit-avatar": "아바타 변경",
"edit-profile": "프로필 변경",
- "edit-wip-limit": "Edit WIP Limit",
- "soft-wip-limit": "Soft WIP Limit",
+ "edit-wip-limit": "WIP 제한 변경",
+ "soft-wip-limit": "원만한 WIP 제한",
"editCardStartDatePopup-title": "시작일 변경",
"editCardDueDatePopup-title": "종료일 변경",
"editCardSpentTimePopup-title": "Change spent time",
@@ -188,13 +192,13 @@
"email-invalid": "잘못된 이메일 주소",
"email-invite": "이메일로 초대",
"email-invite-subject": "__inviter__님이 당신을 초대하였습니다.",
- "email-invite-text": "__user__님,\n\n__inviter__님은 협업을 위해 \"__board__\"보드에 가입하도록 초대합니다.\n\n아래 링크를 따라주십시오.\n\n__url__\n\n감사합니다.",
+ "email-invite-text": "__user__님,\n\n__inviter__님이 협업을 위해 \"__board__\"보드에 가입하도록 초대하셨습니다.\n\n아래 링크를 클릭해주십시오.\n\n__url__\n\n감사합니다.",
"email-resetPassword-subject": "패스워드 초기화: __siteName__",
"email-resetPassword-text": "안녕하세요 __user__님,\n\n비밀번호를 재설정하려면 아래 링크를 클릭하십시오.\n\n__url__\n\n감사합니다.",
"email-sent": "이메일 전송",
"email-verifyEmail-subject": "이메일 인증: __siteName__",
"email-verifyEmail-text": "안녕하세요. __user__님,\n\n당신의 계정과 이메일을 활성하려면 아래 링크를 클릭하십시오.\n\n__url__\n\n감사합니다.",
- "enable-wip-limit": "Enable WIP Limit",
+ "enable-wip-limit": "WIP 제한 활성화",
"error-board-doesNotExist": "보드가 없습니다.",
"error-board-notAdmin": "이 작업은 보드의 관리자만 실행할 수 있습니다.",
"error-board-notAMember": "이 작업은 보드의 멤버만 실행할 수 있습니다.",
@@ -221,10 +225,10 @@
"headerBarCreateBoardPopup-title": "보드 생성",
"home": "홈",
"import": "가져오기",
- "import-board": "import board",
- "import-board-c": "Import board",
+ "import-board": "보드 가져오기",
+ "import-board-c": "보드 가져오기",
"import-board-title-trello": "Trello에서 보드 가져오기",
- "import-board-title-wekan": "Import board from Wekan",
+ "import-board-title-wekan": "Wekan에서 보드 가져오기",
"import-sandstorm-warning": "Imported board will delete all existing data on board and replace it with imported board.",
"from-trello": "From Trello",
"from-wekan": "From Wekan",
@@ -238,9 +242,9 @@
"importMapMembersAddPopup-title": "Wekan 멤버 선택",
"info": "Version",
"initials": "이니셜",
- "invalid-date": "잘못된 날짜",
- "invalid-time": "Invalid time",
- "invalid-user": "Invalid user",
+ "invalid-date": "적절하지 않은 날짜",
+ "invalid-time": "적절하지 않은 시각",
+ "invalid-user": "적절하지 않은 사용자",
"joined": "참가함",
"just-invited": "보드에 방금 초대되었습니다.",
"keyboard-shortcuts": "키보드 단축키",
@@ -346,7 +350,7 @@
"overtime-hours": "Overtime (hours)",
"overtime": "Overtime",
"has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "시간",
"title": "제목",
"tracking": "추적",
@@ -391,9 +395,9 @@
"send-smtp-test": "Send a test email to yourself",
"invitation-code": "초대 코드",
"email-invite-register-subject": "\"__inviter__ 님이 당신에게 초대장을 보냈습니다.",
- "email-invite-register-text": "\"__user__ 님, \n\n__inviter__ 님이 Wekan 보드에 협업을 위하여 초대합니다.\n\n아래 링크를 클릭해주세요 : \n__url__\n\n그리고 초대 코드는 __icode__ 입니다.\n\n감사합니다.",
- "email-smtp-test-subject": "SMTP Test Email From Wekan",
- "email-smtp-test-text": "You have successfully sent an email",
+ "email-invite-register-text": "\"__user__ 님, \n\n__inviter__ 님이 Wekan 보드에 협업을 위하여 당신을 초대합니다.\n\n아래 링크를 클릭해주세요 : \n__url__\n\n그리고 초대 코드는 __icode__ 입니다.\n\n감사합니다.",
+ "email-smtp-test-subject": "SMTP 테스트 이메일이 발송되었습니다.",
+ "email-smtp-test-text": "테스트 메일을 성공적으로 발송하였습니다.",
"error-invitation-code-not-exist": "초대 코드가 존재하지 않습니다.",
"error-notAuthorized": "이 페이지를 볼 수있는 권한이 없습니다.",
"outgoing-webhooks": "Outgoing Webhooks",
diff --git a/i18n/lv.i18n.json b/i18n/lv.i18n.json
index 06d89445..1215e9f7 100644
--- a/i18n/lv.i18n.json
+++ b/i18n/lv.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Add Attachment",
"add-board": "Add Board",
"add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Add Checklist",
"add-checklist-item": "Add an item to checklist",
"add-cover": "Add Cover",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Change Watch",
"boardMenuPopup-title": "Board Menu",
"boards": "Boards",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Lists",
"bucket-example": "Like “Bucket List” for example",
"cancel": "Cancel",
"card-archived": "This card is archived.",
@@ -346,7 +350,7 @@
"overtime-hours": "Overtime (hours)",
"overtime": "Overtime",
"has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"tracking": "Tracking",
diff --git a/i18n/mn.i18n.json b/i18n/mn.i18n.json
new file mode 100644
index 00000000..ab4f12e9
--- /dev/null
+++ b/i18n/mn.i18n.json
@@ -0,0 +1,428 @@
+{
+ "accept": "Зөвшөөрөх",
+ "act-activity-notify": "[Wekan] Activity Notification",
+ "act-addAttachment": "_attachment__ хавсралтыг __card__-д хавсаргав",
+ "act-addChecklist": "added checklist __checklist__ to __card__",
+ "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
+ "act-addComment": "commented on __card__: __comment__",
+ "act-createBoard": "created __board__",
+ "act-createCard": "added __card__ to __list__",
+ "act-createList": "added __list__ to __board__",
+ "act-addBoardMember": "added __member__ to __board__",
+ "act-archivedBoard": "archived __board__",
+ "act-archivedCard": "archived __card__",
+ "act-archivedList": "archived __list__",
+ "act-importBoard": "imported __board__",
+ "act-importCard": "imported __card__",
+ "act-importList": "imported __list__",
+ "act-joinMember": "added __member__ to __card__",
+ "act-moveCard": "moved __card__ from __oldList__ to __list__",
+ "act-removeBoardMember": "removed __member__ from __board__",
+ "act-restoredCard": "restored __card__ to __board__",
+ "act-unjoinMember": "removed __member__ from __card__",
+ "act-withBoardTitle": "[Wekan] __board__",
+ "act-withCardTitle": "[__board__] __card__",
+ "actions": "Actions",
+ "activities": "Activities",
+ "activity": "Activity",
+ "activity-added": "added %s to %s",
+ "activity-archived": "archived %s",
+ "activity-attached": "attached %s to %s",
+ "activity-created": "created %s",
+ "activity-excluded": "excluded %s from %s",
+ "activity-imported": "imported %s into %s from %s",
+ "activity-imported-board": "imported %s from %s",
+ "activity-joined": "joined %s",
+ "activity-moved": "moved %s from %s to %s",
+ "activity-on": "on %s",
+ "activity-removed": "removed %s from %s",
+ "activity-sent": "sent %s to %s",
+ "activity-unjoined": "unjoined %s",
+ "activity-checklist-added": "added checklist to %s",
+ "activity-checklist-item-added": "added checklist item to '%s' in %s",
+ "add": "Нэмэх",
+ "add-attachment": "Хавсралт нэмэх",
+ "add-board": "Самбар нэмэх",
+ "add-card": "Карт нэмэх",
+ "add-swimlane": "Add Swimlane",
+ "add-checklist": "Чеклист нэмэх",
+ "add-checklist-item": "Add an item to checklist",
+ "add-cover": "Add Cover",
+ "add-label": "Шошго нэмэх",
+ "add-list": "Жагсаалт нэмэх",
+ "add-members": "Гишүүд нэмэх",
+ "added": "Нэмсэн",
+ "addMemberPopup-title": "Гишүүд",
+ "admin": "Админ",
+ "admin-desc": "Can view and edit cards, remove members, and change settings for the board.",
+ "admin-announcement": "Announcement",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Announcement from Administrator",
+ "all-boards": "Бүх самбарууд",
+ "and-n-other-card": "And __count__ other card",
+ "and-n-other-card_plural": "And __count__ other cards",
+ "apply": "Apply",
+ "app-is-offline": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
+ "archive": "Archive",
+ "archive-all": "Archive All",
+ "archive-board": "Archive Board",
+ "archive-card": "Archive Card",
+ "archive-list": "Archive List",
+ "archive-selection": "Archive selection",
+ "archiveBoardPopup-title": "Archive Board?",
+ "archived-items": "Archived Items",
+ "archived-boards": "Archived Boards",
+ "restore-board": "Restore Board",
+ "no-archived-boards": "No Archived Boards.",
+ "archives": "Archives",
+ "assign-member": "Assign member",
+ "attached": "attached",
+ "attachment": "Attachment",
+ "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.",
+ "attachmentDeletePopup-title": "Delete Attachment?",
+ "attachments": "Attachments",
+ "auto-watch": "Automatically watch boards when they are created",
+ "avatar-too-big": "The avatar is too large (70KB max)",
+ "back": "Back",
+ "board-change-color": "Change color",
+ "board-nb-stars": "%s stars",
+ "board-not-found": "Board not found",
+ "board-private-info": "This board will be <strong>private</strong>.",
+ "board-public-info": "This board will be <strong>public</strong>.",
+ "boardChangeColorPopup-title": "Change Board Background",
+ "boardChangeTitlePopup-title": "Rename Board",
+ "boardChangeVisibilityPopup-title": "Change Visibility",
+ "boardChangeWatchPopup-title": "Change Watch",
+ "boardMenuPopup-title": "Board Menu",
+ "boards": "Boards",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Lists",
+ "bucket-example": "Like “Bucket List” for example",
+ "cancel": "Cancel",
+ "card-archived": "This card is archived.",
+ "card-comments-title": "This card has %s comment.",
+ "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.",
+ "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.",
+ "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.",
+ "card-due": "Due",
+ "card-due-on": "Due on",
+ "card-spent": "Spent Time",
+ "card-edit-attachments": "Edit attachments",
+ "card-edit-labels": "Edit labels",
+ "card-edit-members": "Edit members",
+ "card-labels-title": "Change the labels for the card.",
+ "card-members-title": "Add or remove members of the board from the card.",
+ "card-start": "Start",
+ "card-start-on": "Starts on",
+ "cardAttachmentsPopup-title": "Attach From",
+ "cardDeletePopup-title": "Delete Card?",
+ "cardDetailsActionsPopup-title": "Card Actions",
+ "cardLabelsPopup-title": "Labels",
+ "cardMembersPopup-title": "Гишүүд",
+ "cardMorePopup-title": "More",
+ "cards": "Cards",
+ "change": "Change",
+ "change-avatar": "Change Avatar",
+ "change-password": "Change Password",
+ "change-permissions": "Change permissions",
+ "change-settings": "Change Settings",
+ "changeAvatarPopup-title": "Change Avatar",
+ "changeLanguagePopup-title": "Change Language",
+ "changePasswordPopup-title": "Change Password",
+ "changePermissionsPopup-title": "Change Permissions",
+ "changeSettingsPopup-title": "Change Settings",
+ "checklists": "Checklists",
+ "click-to-star": "Click to star this board.",
+ "click-to-unstar": "Click to unstar this board.",
+ "clipboard": "Clipboard or drag & drop",
+ "close": "Close",
+ "close-board": "Close Board",
+ "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.",
+ "color-black": "black",
+ "color-blue": "blue",
+ "color-green": "green",
+ "color-lime": "lime",
+ "color-orange": "orange",
+ "color-pink": "pink",
+ "color-purple": "purple",
+ "color-red": "red",
+ "color-sky": "sky",
+ "color-yellow": "yellow",
+ "comment": "Comment",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "Can comment on cards only.",
+ "computer": "Computer",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+ "copy-card-link-to-clipboard": "Copy card link to clipboard",
+ "copyCardPopup-title": "Copy Card",
+ "create": "Create",
+ "createBoardPopup-title": "Create Board",
+ "chooseBoardSourcePopup-title": "Import board",
+ "createLabelPopup-title": "Create Label",
+ "current": "current",
+ "date": "Date",
+ "decline": "Decline",
+ "default-avatar": "Default avatar",
+ "delete": "Delete",
+ "deleteLabelPopup-title": "Delete Label?",
+ "description": "Description",
+ "disambiguateMultiLabelPopup-title": "Disambiguate Label Action",
+ "disambiguateMultiMemberPopup-title": "Disambiguate Member Action",
+ "discard": "Discard",
+ "done": "Done",
+ "download": "Download",
+ "edit": "Edit",
+ "edit-avatar": "Change Avatar",
+ "edit-profile": "Edit Profile",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
+ "editCardStartDatePopup-title": "Change start date",
+ "editCardDueDatePopup-title": "Change due date",
+ "editCardSpentTimePopup-title": "Change spent time",
+ "editLabelPopup-title": "Change Label",
+ "editNotificationPopup-title": "Edit Notification",
+ "editProfilePopup-title": "Edit Profile",
+ "email": "Email",
+ "email-enrollAccount-subject": "An account created for you on __siteName__",
+ "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.",
+ "email-fail": "Sending email failed",
+ "email-fail-text": "Error trying to send email",
+ "email-invalid": "Invalid email",
+ "email-invite": "Invite via Email",
+ "email-invite-subject": "__inviter__ sent you an invitation",
+ "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.",
+ "email-resetPassword-subject": "Reset your password on __siteName__",
+ "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.",
+ "email-sent": "Email sent",
+ "email-verifyEmail-subject": "Verify your email address on __siteName__",
+ "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.",
+ "enable-wip-limit": "Enable WIP Limit",
+ "error-board-doesNotExist": "This board does not exist",
+ "error-board-notAdmin": "You need to be admin of this board to do that",
+ "error-board-notAMember": "You need to be a member of this board to do that",
+ "error-json-malformed": "Your text is not valid JSON",
+ "error-json-schema": "Your JSON data does not include the proper information in the correct format",
+ "error-list-doesNotExist": "This list does not exist",
+ "error-user-doesNotExist": "This user does not exist",
+ "error-user-notAllowSelf": "You can not invite yourself",
+ "error-user-notCreated": "This user is not created",
+ "error-username-taken": "This username is already taken",
+ "error-email-taken": "Email has already been taken",
+ "export-board": "Export board",
+ "filter": "Filter",
+ "filter-cards": "Filter Cards",
+ "filter-clear": "Clear filter",
+ "filter-no-label": "No label",
+ "filter-no-member": "No member",
+ "filter-on": "Filter is on",
+ "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.",
+ "filter-to-selection": "Filter to selection",
+ "fullname": "Full Name",
+ "header-logo-title": "Go back to your boards page.",
+ "hide-system-messages": "Hide system messages",
+ "headerBarCreateBoardPopup-title": "Create Board",
+ "home": "Home",
+ "import": "Import",
+ "import-board": "import board",
+ "import-board-c": "Import board",
+ "import-board-title-trello": "Import board from Trello",
+ "import-board-title-wekan": "Import board from Wekan",
+ "import-sandstorm-warning": "Imported board will delete all existing data on board and replace it with imported board.",
+ "from-trello": "From Trello",
+ "from-wekan": "From Wekan",
+ "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.",
+ "import-board-instruction-wekan": "In your Wekan board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.",
+ "import-json-placeholder": "Paste your valid JSON data here",
+ "import-map-members": "Map members",
+ "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users",
+ "import-show-user-mapping": "Review members mapping",
+ "import-user-select": "Pick the Wekan user you want to use as this member",
+ "importMapMembersAddPopup-title": "Select Wekan member",
+ "info": "Version",
+ "initials": "Initials",
+ "invalid-date": "Invalid date",
+ "invalid-time": "Invalid time",
+ "invalid-user": "Invalid user",
+ "joined": "joined",
+ "just-invited": "You are just invited to this board",
+ "keyboard-shortcuts": "Keyboard shortcuts",
+ "label-create": "Create Label",
+ "label-default": "%s label (default)",
+ "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.",
+ "labels": "Labels",
+ "language": "Language",
+ "last-admin-desc": "You can’t change roles because there must be at least one admin.",
+ "leave-board": "Leave Board",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "Leave Board ?",
+ "link-card": "Link to this card",
+ "list-archive-cards": "Archive all cards in this list",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view archived cards and bring them back to the board, click “Menu” > “Archived Items”.",
+ "list-move-cards": "Move all cards in this list",
+ "list-select-cards": "Select all cards in this list",
+ "listActionPopup-title": "List Actions",
+ "listImportCardPopup-title": "Import a Trello card",
+ "listMorePopup-title": "More",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
+ "lists": "Lists",
+ "log-out": "Log Out",
+ "log-in": "Log In",
+ "loginPopup-title": "Log In",
+ "memberMenuPopup-title": "Member Settings",
+ "members": "Гишүүд",
+ "menu": "Menu",
+ "move-selection": "Move selection",
+ "moveCardPopup-title": "Move Card",
+ "moveCardToBottom-title": "Move to Bottom",
+ "moveCardToTop-title": "Move to Top",
+ "moveSelectionPopup-title": "Move selection",
+ "multi-selection": "Multi-Selection",
+ "multi-selection-on": "Multi-Selection is on",
+ "muted": "Muted",
+ "muted-info": "You will never be notified of any changes in this board",
+ "my-boards": "My Boards",
+ "name": "Name",
+ "no-archived-cards": "No archived cards.",
+ "no-archived-lists": "No archived lists.",
+ "no-results": "No results",
+ "normal": "Normal",
+ "normal-desc": "Can view and edit cards. Can't change settings.",
+ "not-accepted-yet": "Invitation not accepted yet",
+ "notify-participate": "Receive updates to any cards you participate as creater or member",
+ "notify-watch": "Receive updates to any boards, lists, or cards you’re watching",
+ "optional": "optional",
+ "or": "or",
+ "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.",
+ "page-not-found": "Page not found.",
+ "password": "Password",
+ "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)",
+ "participating": "Participating",
+ "preview": "Preview",
+ "previewAttachedImagePopup-title": "Preview",
+ "previewClipboardImagePopup-title": "Preview",
+ "private": "Private",
+ "private-desc": "This board is private. Only people added to the board can view and edit it.",
+ "profile": "Profile",
+ "public": "Public",
+ "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.",
+ "quick-access-description": "Star a board to add a shortcut in this bar.",
+ "remove-cover": "Remove Cover",
+ "remove-from-board": "Remove from Board",
+ "remove-label": "Remove Label",
+ "listDeletePopup-title": "Delete List ?",
+ "remove-member": "Remove Member",
+ "remove-member-from-card": "Remove from Card",
+ "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.",
+ "removeMemberPopup-title": "Remove Member?",
+ "rename": "Rename",
+ "rename-board": "Rename Board",
+ "restore": "Restore",
+ "save": "Save",
+ "search": "Search",
+ "select-color": "Select Color",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
+ "shortcut-assign-self": "Assign yourself to current card",
+ "shortcut-autocomplete-emoji": "Autocomplete emoji",
+ "shortcut-autocomplete-members": "Autocomplete members",
+ "shortcut-clear-filters": "Clear all filters",
+ "shortcut-close-dialog": "Close Dialog",
+ "shortcut-filter-my-cards": "Filter my cards",
+ "shortcut-show-shortcuts": "Bring up this shortcuts list",
+ "shortcut-toggle-filterbar": "Toggle Filter Sidebar",
+ "shortcut-toggle-sidebar": "Toggle Board Sidebar",
+ "show-cards-minimum-count": "Show cards count if list contains more than",
+ "sidebar-open": "Open Sidebar",
+ "sidebar-close": "Close Sidebar",
+ "signupPopup-title": "Create an Account",
+ "star-board-title": "Click to star this board. It will show up at top of your boards list.",
+ "starred-boards": "Starred Boards",
+ "starred-boards-description": "Starred boards show up at the top of your boards list.",
+ "subscribe": "Subscribe",
+ "team": "Team",
+ "this-board": "this board",
+ "this-card": "this card",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
+ "time": "Time",
+ "title": "Title",
+ "tracking": "Tracking",
+ "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
+ "unassign-member": "Unassign member",
+ "unsaved-description": "You have an unsaved description.",
+ "unwatch": "Unwatch",
+ "upload": "Upload",
+ "upload-avatar": "Upload an avatar",
+ "uploaded-avatar": "Uploaded an avatar",
+ "username": "Username",
+ "view-it": "View it",
+ "warn-list-archived": "warning: this card is in an archived list",
+ "watch": "Watch",
+ "watching": "Watching",
+ "watching-info": "You will be notified of any change in this board",
+ "welcome-board": "Welcome Board",
+ "welcome-list1": "Basics",
+ "welcome-list2": "Advanced",
+ "what-to-do": "What do you want to do?",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
+ "admin-panel": "Admin Panel",
+ "settings": "Settings",
+ "people": "People",
+ "registration": "Registration",
+ "disable-self-registration": "Disable Self-Registration",
+ "invite": "Invite",
+ "invite-people": "Invite People",
+ "to-boards": "To board(s)",
+ "email-addresses": "Email Addresses",
+ "smtp-host-description": "The address of the SMTP server that handles your emails.",
+ "smtp-port-description": "The port your SMTP server uses for outgoing emails.",
+ "smtp-tls-description": "Enable TLS support for SMTP server",
+ "smtp-host": "SMTP Host",
+ "smtp-port": "SMTP Port",
+ "smtp-username": "Username",
+ "smtp-password": "Password",
+ "smtp-tls": "TLS support",
+ "send-from": "From",
+ "send-smtp-test": "Send a test email to yourself",
+ "invitation-code": "Invitation Code",
+ "email-invite-register-subject": "__inviter__ sent you an invitation",
+ "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to Wekan 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 From Wekan",
+ "email-smtp-test-text": "You have successfully sent an email",
+ "error-invitation-code-not-exist": "Invitation code doesn't exist",
+ "error-notAuthorized": "You are not authorized to view this page.",
+ "outgoing-webhooks": "Outgoing Webhooks",
+ "outgoingWebhooksPopup-title": "Outgoing Webhooks",
+ "new-outgoing-webhook": "New Outgoing Webhook",
+ "no-name": "(Unknown)",
+ "Wekan_version": "Wekan version",
+ "Node_version": "Node version",
+ "OS_Arch": "OS Arch",
+ "OS_Cpus": "OS CPU Count",
+ "OS_Freemem": "OS Free Memory",
+ "OS_Loadavg": "OS Load Average",
+ "OS_Platform": "OS Platform",
+ "OS_Release": "OS Release",
+ "OS_Totalmem": "OS Total Memory",
+ "OS_Type": "OS Type",
+ "OS_Uptime": "OS Uptime",
+ "hours": "hours",
+ "minutes": "minutes",
+ "seconds": "seconds",
+ "yes": "Yes",
+ "no": "No",
+ "accounts": "Accounts",
+ "accounts-allowEmailChange": "Allow Email Change",
+ "createdAt": "Created at",
+ "verified": "Verified",
+ "active": "Active"
+} \ No newline at end of file
diff --git a/i18n/nb.i18n.json b/i18n/nb.i18n.json
index 2a1b5632..84d9c035 100644
--- a/i18n/nb.i18n.json
+++ b/i18n/nb.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Add Attachment",
"add-board": "Add Board",
"add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Add Checklist",
"add-checklist-item": "Nytt punkt på sjekklisten",
"add-cover": "Nytt omslag",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Endre overvåkning",
"boardMenuPopup-title": "Tavlemeny",
"boards": "Tavler",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Lists",
"bucket-example": "Som \"Bucket List\" for eksempel",
"cancel": "Avbryt",
"card-archived": "Dette kortet er arkivert.",
@@ -346,7 +350,7 @@
"overtime-hours": "Overtime (hours)",
"overtime": "Overtime",
"has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"tracking": "Tracking",
diff --git a/i18n/nl.i18n.json b/i18n/nl.i18n.json
index 1953eb33..0a22b110 100644
--- a/i18n/nl.i18n.json
+++ b/i18n/nl.i18n.json
@@ -2,8 +2,8 @@
"accept": "Accepteren",
"act-activity-notify": "[Wekan] Activiteit Notificatie",
"act-addAttachment": "__attachment__ als bijlage toegevoegd aan __card__",
- "act-addChecklist": "added checklist __checklist__ to __card__",
- "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
+ "act-addChecklist": "__checklist__ toegevoegd aan __card__",
+ "act-addChecklistItem": "__checklistItem__ aan checklist toegevoegd aan __checklist__ op __card__",
"act-addComment": "gereageerd op __card__:__comment__",
"act-createBoard": "aangemaakte__bord__",
"act-createCard": "toegevoegd__kaart__aan__lijst__",
@@ -44,6 +44,7 @@
"add-attachment": "Voeg Bijlage Toe",
"add-board": "Voeg Bord Toe",
"add-card": "Voeg Kaart Toe",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Voeg Checklist Toe",
"add-checklist-item": "Voeg item toe aan checklist",
"add-cover": "Voeg Cover Toe",
@@ -54,9 +55,9 @@
"addMemberPopup-title": "Leden",
"admin": "Administrator",
"admin-desc": "Kan kaarten bekijken en wijzigen, leden verwijderen, en instellingen voor het bord aanpassen.",
- "admin-announcement": "Announcement",
- "admin-announcement-active": "Active System-Wide Announcement",
- "admin-announcement-title": "Announcement from Administrator",
+ "admin-announcement": "Melding",
+ "admin-announcement-active": "Systeem melding",
+ "admin-announcement-title": "Melding van de administrator",
"all-boards": "Alle borden",
"and-n-other-card": "En nog __count__ ander",
"and-n-other-card_plural": "En __count__ andere kaarten",
@@ -64,7 +65,7 @@
"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 of de Wekan server is gestopt.",
"archive": "Archiveren",
"archive-all": "Alles Archiveren",
- "archive-board": "Archiveer Bor",
+ "archive-board": "Archiveer Bord",
"archive-card": "Archiveer Kaart",
"archive-list": "Archiveer Lijst",
"archive-selection": "Archiveer Selectie",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Verander naar 'Watch'",
"boardMenuPopup-title": "Bord menu",
"boards": "Borden",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Lijsten",
"bucket-example": "Zoals \"Bucket List\" bijvoorbeeld",
"cancel": "Annuleren",
"card-archived": "Deze kaart is gearchiveerd.",
@@ -103,7 +107,7 @@
"card-delete-suggest-archive": "Om de kaart van het bord af te halen, zonder daarbij activiteiten te missen in de activiteiten feed, kan je klikken op \"archiveren\".",
"card-due": "Deadline: ",
"card-due-on": "Deadline: ",
- "card-spent": "Spent Time",
+ "card-spent": "gespendeerde tijd",
"card-edit-attachments": "Wijzig bijlagen",
"card-edit-labels": "Wijzig labels",
"card-edit-members": "Wijzig leden",
@@ -150,9 +154,9 @@
"comment-only": "Alleen reageren",
"comment-only-desc": "Kan alleen op kaarten reageren.",
"computer": "Computer",
- "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+ "confirm-checklist-delete-dialog": "Weet u zeker dat u de checklist wilt verwijderen",
"copy-card-link-to-clipboard": "Kopieer kaart link naar klembord",
- "copyCardPopup-title": "Copy Card",
+ "copyCardPopup-title": "Kopieer kaart",
"create": "Aanmaken",
"createBoardPopup-title": "Bord aanmaken",
"chooseBoardSourcePopup-title": "Importeer bord",
@@ -172,11 +176,11 @@
"edit": "Wijzig",
"edit-avatar": "Wijzig avatar",
"edit-profile": "Wijzig profiel",
- "edit-wip-limit": "Edit WIP Limit",
- "soft-wip-limit": "Soft WIP Limit",
+ "edit-wip-limit": "Verander WIP limiet",
+ "soft-wip-limit": "Zachte WIP limiet",
"editCardStartDatePopup-title": "Wijzig start datum",
"editCardDueDatePopup-title": "Wijzig deadline",
- "editCardSpentTimePopup-title": "Change spent time",
+ "editCardSpentTimePopup-title": "Verander gespendeerde tijd",
"editLabelPopup-title": "Wijzig label",
"editNotificationPopup-title": "Wijzig notificatie",
"editProfilePopup-title": "Wijzig profiel",
@@ -184,7 +188,7 @@
"email-enrollAccount-subject": "Er is een account voor je aangemaakt op __siteName__",
"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-text": "Error trying to send email",
+ "email-fail-text": "Fout tijdens het verzenden van de email",
"email-invalid": "Ongeldige e-mail",
"email-invite": "Nodig uit via e-mail",
"email-invite-subject": "__inviter__ heeft je een uitnodiging gestuurd",
@@ -194,7 +198,7 @@
"email-sent": "E-mail is verzonden",
"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.",
- "enable-wip-limit": "Enable WIP Limit",
+ "enable-wip-limit": "Activeer WIP limiet",
"error-board-doesNotExist": "Dit bord bestaat niet.",
"error-board-notAdmin": "Je moet een administrator zijn van dit bord om dat te doen.",
"error-board-notAMember": "Je moet een lid zijn van dit bord om dat te doen.",
@@ -239,8 +243,8 @@
"info": "Versie",
"initials": "Initialen",
"invalid-date": "Ongeldige datum",
- "invalid-time": "Invalid time",
- "invalid-user": "Invalid user",
+ "invalid-time": "Ongeldige tijd",
+ "invalid-user": "Ongeldige gebruiker",
"joined": "doet nu mee met",
"just-invited": "Je bent zojuist uitgenodigd om mee toen doen met dit bord",
"keyboard-shortcuts": "Toetsenbord snelkoppelingen",
@@ -251,8 +255,8 @@
"language": "Taal",
"last-admin-desc": "Je kan de permissies niet veranderen omdat er maar een administrator is.",
"leave-board": "Verlaat bord",
- "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
- "leaveBoardPopup-title": "Leave Board ?",
+ "leave-board-pop": "Weet u zeker dat u __boardTitle__ wilt verlaten? U wordt verwijderd van alle kaarten binnen dit bord",
+ "leaveBoardPopup-title": "Bord verlaten?",
"link-card": "Link naar deze kaart",
"list-archive-cards": "Achiveer alle kaarten in deze lijst",
"list-archive-cards-pop": "Deze actie zal alle kaarten in deze lijst archiveren. Om de gearchiveerde kaarten te bekijken, klik \"Menu\" > \"Gearchiveerde Items\"",
@@ -320,8 +324,8 @@
"save": "Opslaan",
"search": "Zoek",
"select-color": "Selecteer kleur",
- "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
- "setWipLimitPopup-title": "Set WIP Limit",
+ "set-wip-limit-value": "Zet een limiet voor het maximaal aantal taken in deze lijst",
+ "setWipLimitPopup-title": "Zet een WIP limiet",
"shortcut-assign-self": "Wijs jezelf toe aan huidige kaart",
"shortcut-autocomplete-emoji": "Emojis automatisch aanvullen",
"shortcut-autocomplete-members": "Leden automatisch aanvullen",
@@ -342,11 +346,11 @@
"team": "Team",
"this-board": "dit bord",
"this-card": "deze kaart",
- "spent-time-hours": "Spent time (hours)",
- "overtime-hours": "Overtime (hours)",
- "overtime": "Overtime",
- "has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "spent-time-hours": "Gespendeerde tijd (in uren)",
+ "overtime-hours": "Overwerk (in uren)",
+ "overtime": "Overwerk",
+ "has-overtime-cards": "Heeft kaarten met overwerk",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Tijd",
"title": "Titel",
"tracking": "Volgen",
@@ -367,9 +371,9 @@
"welcome-list1": "Basis",
"welcome-list2": "Geadvanceerd",
"what-to-do": "Wat wil je doen?",
- "wipLimitErrorPopup-title": "Invalid WIP Limit",
- "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
- "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
+ "wipLimitErrorPopup-title": "Ongeldige 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",
"admin-panel": "Administrator paneel",
"settings": "Instellingen",
"people": "Mensen",
@@ -388,17 +392,17 @@
"smtp-password": "Wachtwoord",
"smtp-tls": "TLS ondersteuning",
"send-from": "Van",
- "send-smtp-test": "Send a test email to yourself",
+ "send-smtp-test": "Verzend een email naar uzelf",
"invitation-code": "Uitnodigings code",
"email-invite-register-subject": "__inviter__ heeft je een uitnodiging gestuurd",
"email-invite-register-text": "Beste __user__,\n\n__inviter__ heeft je uitgenodigd voor Wekan om samen te werken.\n\nKlik op de volgende link:\n__url__\n\nEn je uitnodigingscode is __icode__\n\nBedankt.",
- "email-smtp-test-subject": "SMTP Test Email From Wekan",
- "email-smtp-test-text": "You have successfully sent an email",
+ "email-smtp-test-subject": "SMTP Test email van Wekan",
+ "email-smtp-test-text": "U heeft met succes een email verzonden",
"error-invitation-code-not-exist": "Uitnodigings code bestaat niet",
"error-notAuthorized": "Je bent niet toegestaan om deze pagina te bekijken.",
"outgoing-webhooks": "Uitgaande Webhooks",
"outgoingWebhooksPopup-title": "Uitgaande Webhooks",
- "new-outgoing-webhook": "New Outgoing Webhook",
+ "new-outgoing-webhook": "Nieuwe webhook",
"no-name": "(Onbekend)",
"Wekan_version": "Wekan versie",
"Node_version": "Node versie",
@@ -418,7 +422,7 @@
"no": "Nee",
"accounts": "Accounts",
"accounts-allowEmailChange": "Sta E-mailadres wijzigingen toe",
- "createdAt": "Created at",
- "verified": "Verified",
- "active": "Active"
+ "createdAt": "Gemaakt op",
+ "verified": "Geverifieerd",
+ "active": "Actief"
} \ No newline at end of file
diff --git a/i18n/pl.i18n.json b/i18n/pl.i18n.json
index 355a7d24..220d04b7 100644
--- a/i18n/pl.i18n.json
+++ b/i18n/pl.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Dodaj załącznik",
"add-board": "Dodaj tablicę",
"add-card": "Dodaj kartę",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Dodaj listę kontrolną",
"add-checklist-item": "Dodaj element do listy kontrolnej",
"add-cover": "Dodaj okładkę",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Change Watch",
"boardMenuPopup-title": "Menu tablicy",
"boards": "Tablice",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Listy",
"bucket-example": "Like “Bucket List” for example",
"cancel": "Anuluj",
"card-archived": "Ta karta jest zarchiwizowana.",
@@ -346,7 +350,7 @@
"overtime-hours": "Overtime (hours)",
"overtime": "Overtime",
"has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Tytuł",
"tracking": "Tracking",
diff --git a/i18n/pt-BR.i18n.json b/i18n/pt-BR.i18n.json
index 5c484934..7fbe053b 100644
--- a/i18n/pt-BR.i18n.json
+++ b/i18n/pt-BR.i18n.json
@@ -2,7 +2,7 @@
"accept": "Aceitar",
"act-activity-notify": "[Wekan] Notificação de Atividade",
"act-addAttachment": "anexo __attachment__ de __card__",
- "act-addChecklist": "added checklist __checklist__ to __card__",
+ "act-addChecklist": "added checklist __checklist__ no __card__",
"act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
"act-addComment": "comentou em __card__: __comment__",
"act-createBoard": "criou __board__",
@@ -44,6 +44,7 @@
"add-attachment": "Adicionar Anexos",
"add-board": "Adicionar Quadro",
"add-card": "Adicionar Cartão",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Adicionar Checklist",
"add-checklist-item": "Adicionar um item à lista de verificação",
"add-cover": "Adicionar Capa",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Alterar observação",
"boardMenuPopup-title": "Menu do Quadro",
"boards": "Quadros",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Listas",
"bucket-example": "\"Bucket List\", por exemplo",
"cancel": "Cancelar",
"card-archived": "Este cartão está arquivado.",
@@ -239,7 +243,7 @@
"info": "Versão",
"initials": "Iniciais",
"invalid-date": "Data inválida",
- "invalid-time": "Invalid time",
+ "invalid-time": "Hora inválida",
"invalid-user": "Usuário inválido",
"joined": "juntou-se",
"just-invited": "Você já foi convidado para este quadro",
@@ -345,8 +349,8 @@
"spent-time-hours": "Tempo gasto (Horas)",
"overtime-hours": "Tempo extras (Horas)",
"overtime": "Tempo extras",
- "has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "has-overtime-cards": "Tem cartões de horas extras",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Tempo",
"title": "Título",
"tracking": "Tracking",
diff --git a/i18n/pt.i18n.json b/i18n/pt.i18n.json
new file mode 100644
index 00000000..07e855ae
--- /dev/null
+++ b/i18n/pt.i18n.json
@@ -0,0 +1,428 @@
+{
+ "accept": "Aceitar",
+ "act-activity-notify": "[Wekan] Activity Notification",
+ "act-addAttachment": "attached __attachment__ to __card__",
+ "act-addChecklist": "added checklist __checklist__ to __card__",
+ "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
+ "act-addComment": "commented on __card__: __comment__",
+ "act-createBoard": "created __board__",
+ "act-createCard": "added __card__ to __list__",
+ "act-createList": "added __list__ to __board__",
+ "act-addBoardMember": "added __member__ to __board__",
+ "act-archivedBoard": "archived __board__",
+ "act-archivedCard": "archived __card__",
+ "act-archivedList": "archived __list__",
+ "act-importBoard": "imported __board__",
+ "act-importCard": "imported __card__",
+ "act-importList": "imported __list__",
+ "act-joinMember": "added __member__ to __card__",
+ "act-moveCard": "moved __card__ from __oldList__ to __list__",
+ "act-removeBoardMember": "removed __member__ from __board__",
+ "act-restoredCard": "restored __card__ to __board__",
+ "act-unjoinMember": "removed __member__ from __card__",
+ "act-withBoardTitle": "[Wekan] __board__",
+ "act-withCardTitle": "[__board__] __card__",
+ "actions": "Actions",
+ "activities": "Activities",
+ "activity": "Activity",
+ "activity-added": "added %s to %s",
+ "activity-archived": "Arquivo %s",
+ "activity-attached": "attached %s to %s",
+ "activity-created": "Criado %s",
+ "activity-excluded": "excluded %s from %s",
+ "activity-imported": "imported %s into %s from %s",
+ "activity-imported-board": "imported %s from %s",
+ "activity-joined": "joined %s",
+ "activity-moved": "moved %s from %s to %s",
+ "activity-on": "on %s",
+ "activity-removed": "removed %s from %s",
+ "activity-sent": "sent %s to %s",
+ "activity-unjoined": "unjoined %s",
+ "activity-checklist-added": "added checklist to %s",
+ "activity-checklist-item-added": "added checklist item to '%s' in %s",
+ "add": "Adicionar",
+ "add-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
+ "add-checklist": "Add Checklist",
+ "add-checklist-item": "Add an item to checklist",
+ "add-cover": "Add Cover",
+ "add-label": "Add Label",
+ "add-list": "Add List",
+ "add-members": "Add Members",
+ "added": "Added",
+ "addMemberPopup-title": "Membros",
+ "admin": "Admin",
+ "admin-desc": "Can view and edit cards, remove members, and change settings for the board.",
+ "admin-announcement": "Announcement",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Announcement from Administrator",
+ "all-boards": "All boards",
+ "and-n-other-card": "And __count__ other card",
+ "and-n-other-card_plural": "And __count__ other cards",
+ "apply": "Apply",
+ "app-is-offline": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
+ "archive": "Archive",
+ "archive-all": "Archive All",
+ "archive-board": "Archive Board",
+ "archive-card": "Archive Card",
+ "archive-list": "Archive List",
+ "archive-selection": "Archive selection",
+ "archiveBoardPopup-title": "Archive Board?",
+ "archived-items": "Archived Items",
+ "archived-boards": "Archived Boards",
+ "restore-board": "Restore Board",
+ "no-archived-boards": "No Archived Boards.",
+ "archives": "Archives",
+ "assign-member": "Assign member",
+ "attached": "attached",
+ "attachment": "Attachment",
+ "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.",
+ "attachmentDeletePopup-title": "Delete Attachment?",
+ "attachments": "Attachments",
+ "auto-watch": "Automatically watch boards when they are created",
+ "avatar-too-big": "The avatar is too large (70KB max)",
+ "back": "Back",
+ "board-change-color": "Change color",
+ "board-nb-stars": "%s stars",
+ "board-not-found": "Board not found",
+ "board-private-info": "This board will be <strong>private</strong>.",
+ "board-public-info": "This board will be <strong>public</strong>.",
+ "boardChangeColorPopup-title": "Change Board Background",
+ "boardChangeTitlePopup-title": "Renomear Quadro",
+ "boardChangeVisibilityPopup-title": "Change Visibility",
+ "boardChangeWatchPopup-title": "Change Watch",
+ "boardMenuPopup-title": "Board Menu",
+ "boards": "Boards",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Lists",
+ "bucket-example": "Like “Bucket List” for example",
+ "cancel": "Cancel",
+ "card-archived": "This card is archived.",
+ "card-comments-title": "This card has %s comment.",
+ "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.",
+ "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.",
+ "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.",
+ "card-due": "Due",
+ "card-due-on": "Due on",
+ "card-spent": "Spent Time",
+ "card-edit-attachments": "Edit attachments",
+ "card-edit-labels": "Edit labels",
+ "card-edit-members": "Edit members",
+ "card-labels-title": "Change the labels for the card.",
+ "card-members-title": "Add or remove members of the board from the card.",
+ "card-start": "Start",
+ "card-start-on": "Starts on",
+ "cardAttachmentsPopup-title": "Attach From",
+ "cardDeletePopup-title": "Delete Card?",
+ "cardDetailsActionsPopup-title": "Card Actions",
+ "cardLabelsPopup-title": "Etiquetas",
+ "cardMembersPopup-title": "Membros",
+ "cardMorePopup-title": "Mais",
+ "cards": "Cartões",
+ "change": "Alterar",
+ "change-avatar": "Change Avatar",
+ "change-password": "Change Password",
+ "change-permissions": "Change permissions",
+ "change-settings": "Change Settings",
+ "changeAvatarPopup-title": "Change Avatar",
+ "changeLanguagePopup-title": "Change Language",
+ "changePasswordPopup-title": "Change Password",
+ "changePermissionsPopup-title": "Change Permissions",
+ "changeSettingsPopup-title": "Change Settings",
+ "checklists": "Checklists",
+ "click-to-star": "Click to star this board.",
+ "click-to-unstar": "Click to unstar this board.",
+ "clipboard": "Clipboard or drag & drop",
+ "close": "Close",
+ "close-board": "Close Board",
+ "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.",
+ "color-black": "black",
+ "color-blue": "blue",
+ "color-green": "green",
+ "color-lime": "lime",
+ "color-orange": "orange",
+ "color-pink": "pink",
+ "color-purple": "purple",
+ "color-red": "red",
+ "color-sky": "sky",
+ "color-yellow": "yellow",
+ "comment": "Comentário",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "Can comment on cards only.",
+ "computer": "Computador",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+ "copy-card-link-to-clipboard": "Copy card link to clipboard",
+ "copyCardPopup-title": "Copy Card",
+ "create": "Create",
+ "createBoardPopup-title": "Create Board",
+ "chooseBoardSourcePopup-title": "Import board",
+ "createLabelPopup-title": "Create Label",
+ "current": "current",
+ "date": "Date",
+ "decline": "Decline",
+ "default-avatar": "Default avatar",
+ "delete": "Delete",
+ "deleteLabelPopup-title": "Delete Label?",
+ "description": "Description",
+ "disambiguateMultiLabelPopup-title": "Disambiguate Label Action",
+ "disambiguateMultiMemberPopup-title": "Disambiguate Member Action",
+ "discard": "Discard",
+ "done": "Done",
+ "download": "Download",
+ "edit": "Edit",
+ "edit-avatar": "Change Avatar",
+ "edit-profile": "Edit Profile",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
+ "editCardStartDatePopup-title": "Change start date",
+ "editCardDueDatePopup-title": "Change due date",
+ "editCardSpentTimePopup-title": "Change spent time",
+ "editLabelPopup-title": "Change Label",
+ "editNotificationPopup-title": "Edit Notification",
+ "editProfilePopup-title": "Edit Profile",
+ "email": "Email",
+ "email-enrollAccount-subject": "An account created for you on __siteName__",
+ "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.",
+ "email-fail": "Sending email failed",
+ "email-fail-text": "Error trying to send email",
+ "email-invalid": "Invalid email",
+ "email-invite": "Invite via Email",
+ "email-invite-subject": "__inviter__ sent you an invitation",
+ "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.",
+ "email-resetPassword-subject": "Reset your password on __siteName__",
+ "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.",
+ "email-sent": "Email sent",
+ "email-verifyEmail-subject": "Verify your email address on __siteName__",
+ "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.",
+ "enable-wip-limit": "Enable WIP Limit",
+ "error-board-doesNotExist": "This board does not exist",
+ "error-board-notAdmin": "You need to be admin of this board to do that",
+ "error-board-notAMember": "You need to be a member of this board to do that",
+ "error-json-malformed": "Your text is not valid JSON",
+ "error-json-schema": "Your JSON data does not include the proper information in the correct format",
+ "error-list-doesNotExist": "This list does not exist",
+ "error-user-doesNotExist": "This user does not exist",
+ "error-user-notAllowSelf": "You can not invite yourself",
+ "error-user-notCreated": "This user is not created",
+ "error-username-taken": "This username is already taken",
+ "error-email-taken": "Email has already been taken",
+ "export-board": "Export board",
+ "filter": "Filter",
+ "filter-cards": "Filter Cards",
+ "filter-clear": "Clear filter",
+ "filter-no-label": "No label",
+ "filter-no-member": "No member",
+ "filter-on": "Filter is on",
+ "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.",
+ "filter-to-selection": "Filter to selection",
+ "fullname": "Full Name",
+ "header-logo-title": "Go back to your boards page.",
+ "hide-system-messages": "Hide system messages",
+ "headerBarCreateBoardPopup-title": "Create Board",
+ "home": "Home",
+ "import": "Import",
+ "import-board": "import board",
+ "import-board-c": "Import board",
+ "import-board-title-trello": "Import board from Trello",
+ "import-board-title-wekan": "Import board from Wekan",
+ "import-sandstorm-warning": "Imported board will delete all existing data on board and replace it with imported board.",
+ "from-trello": "From Trello",
+ "from-wekan": "From Wekan",
+ "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.",
+ "import-board-instruction-wekan": "In your Wekan board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.",
+ "import-json-placeholder": "Paste your valid JSON data here",
+ "import-map-members": "Map members",
+ "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users",
+ "import-show-user-mapping": "Review members mapping",
+ "import-user-select": "Pick the Wekan user you want to use as this member",
+ "importMapMembersAddPopup-title": "Select Wekan member",
+ "info": "Version",
+ "initials": "Initials",
+ "invalid-date": "Invalid date",
+ "invalid-time": "Invalid time",
+ "invalid-user": "Invalid user",
+ "joined": "joined",
+ "just-invited": "You are just invited to this board",
+ "keyboard-shortcuts": "Keyboard shortcuts",
+ "label-create": "Create Label",
+ "label-default": "%s label (default)",
+ "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.",
+ "labels": "Etiquetas",
+ "language": "Language",
+ "last-admin-desc": "You can’t change roles because there must be at least one admin.",
+ "leave-board": "Leave Board",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "Leave Board ?",
+ "link-card": "Link to this card",
+ "list-archive-cards": "Archive all cards in this list",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view archived cards and bring them back to the board, click “Menu” > “Archived Items”.",
+ "list-move-cards": "Move all cards in this list",
+ "list-select-cards": "Select all cards in this list",
+ "listActionPopup-title": "List Actions",
+ "listImportCardPopup-title": "Import a Trello card",
+ "listMorePopup-title": "Mais",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
+ "lists": "Lists",
+ "log-out": "Log Out",
+ "log-in": "Log In",
+ "loginPopup-title": "Log In",
+ "memberMenuPopup-title": "Member Settings",
+ "members": "Membros",
+ "menu": "Menu",
+ "move-selection": "Move selection",
+ "moveCardPopup-title": "Move Card",
+ "moveCardToBottom-title": "Move to Bottom",
+ "moveCardToTop-title": "Move to Top",
+ "moveSelectionPopup-title": "Move selection",
+ "multi-selection": "Multi-Selection",
+ "multi-selection-on": "Multi-Selection is on",
+ "muted": "Muted",
+ "muted-info": "You will never be notified of any changes in this board",
+ "my-boards": "My Boards",
+ "name": "Nome",
+ "no-archived-cards": "Nenhum cartão arquivado.",
+ "no-archived-lists": "Nenhuma lista arquivada.",
+ "no-results": "Nenhum resultado",
+ "normal": "Normal",
+ "normal-desc": "Can view and edit cards. Can't change settings.",
+ "not-accepted-yet": "Invitation not accepted yet",
+ "notify-participate": "Receive updates to any cards you participate as creater or member",
+ "notify-watch": "Receive updates to any boards, lists, or cards you’re watching",
+ "optional": "optional",
+ "or": "or",
+ "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.",
+ "page-not-found": "Page not found.",
+ "password": "Password",
+ "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)",
+ "participating": "Participating",
+ "preview": "Preview",
+ "previewAttachedImagePopup-title": "Preview",
+ "previewClipboardImagePopup-title": "Preview",
+ "private": "Private",
+ "private-desc": "This board is private. Only people added to the board can view and edit it.",
+ "profile": "Profile",
+ "public": "Public",
+ "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.",
+ "quick-access-description": "Star a board to add a shortcut in this bar.",
+ "remove-cover": "Remove Cover",
+ "remove-from-board": "Remove from Board",
+ "remove-label": "Remove Label",
+ "listDeletePopup-title": "Delete List ?",
+ "remove-member": "Remove Member",
+ "remove-member-from-card": "Remove from Card",
+ "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.",
+ "removeMemberPopup-title": "Remover Membro?",
+ "rename": "Renomear",
+ "rename-board": "Renomear Quadro",
+ "restore": "Restore",
+ "save": "Save",
+ "search": "Search",
+ "select-color": "Select Color",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
+ "shortcut-assign-self": "Assign yourself to current card",
+ "shortcut-autocomplete-emoji": "Autocomplete emoji",
+ "shortcut-autocomplete-members": "Autocomplete members",
+ "shortcut-clear-filters": "Clear all filters",
+ "shortcut-close-dialog": "Close Dialog",
+ "shortcut-filter-my-cards": "Filter my cards",
+ "shortcut-show-shortcuts": "Bring up this shortcuts list",
+ "shortcut-toggle-filterbar": "Toggle Filter Sidebar",
+ "shortcut-toggle-sidebar": "Toggle Board Sidebar",
+ "show-cards-minimum-count": "Show cards count if list contains more than",
+ "sidebar-open": "Open Sidebar",
+ "sidebar-close": "Close Sidebar",
+ "signupPopup-title": "Create an Account",
+ "star-board-title": "Click to star this board. It will show up at top of your boards list.",
+ "starred-boards": "Starred Boards",
+ "starred-boards-description": "Starred boards show up at the top of your boards list.",
+ "subscribe": "Subscribe",
+ "team": "Team",
+ "this-board": "this board",
+ "this-card": "this card",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
+ "time": "Time",
+ "title": "Title",
+ "tracking": "Tracking",
+ "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
+ "unassign-member": "Unassign member",
+ "unsaved-description": "You have an unsaved description.",
+ "unwatch": "Unwatch",
+ "upload": "Upload",
+ "upload-avatar": "Upload an avatar",
+ "uploaded-avatar": "Uploaded an avatar",
+ "username": "Username",
+ "view-it": "View it",
+ "warn-list-archived": "warning: this card is in an archived list",
+ "watch": "Watch",
+ "watching": "Watching",
+ "watching-info": "You will be notified of any change in this board",
+ "welcome-board": "Welcome Board",
+ "welcome-list1": "Basics",
+ "welcome-list2": "Advanced",
+ "what-to-do": "What do you want to do?",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
+ "admin-panel": "Admin Panel",
+ "settings": "Settings",
+ "people": "People",
+ "registration": "Registration",
+ "disable-self-registration": "Disable Self-Registration",
+ "invite": "Invite",
+ "invite-people": "Invite People",
+ "to-boards": "To board(s)",
+ "email-addresses": "Email Addresses",
+ "smtp-host-description": "The address of the SMTP server that handles your emails.",
+ "smtp-port-description": "The port your SMTP server uses for outgoing emails.",
+ "smtp-tls-description": "Enable TLS support for SMTP server",
+ "smtp-host": "SMTP Host",
+ "smtp-port": "SMTP Port",
+ "smtp-username": "Username",
+ "smtp-password": "Password",
+ "smtp-tls": "TLS support",
+ "send-from": "From",
+ "send-smtp-test": "Send a test email to yourself",
+ "invitation-code": "Invitation Code",
+ "email-invite-register-subject": "__inviter__ sent you an invitation",
+ "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to Wekan 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 From Wekan",
+ "email-smtp-test-text": "You have successfully sent an email",
+ "error-invitation-code-not-exist": "Invitation code doesn't exist",
+ "error-notAuthorized": "You are not authorized to view this page.",
+ "outgoing-webhooks": "Outgoing Webhooks",
+ "outgoingWebhooksPopup-title": "Outgoing Webhooks",
+ "new-outgoing-webhook": "New Outgoing Webhook",
+ "no-name": "(Unknown)",
+ "Wekan_version": "Wekan version",
+ "Node_version": "Node version",
+ "OS_Arch": "OS Arch",
+ "OS_Cpus": "OS CPU Count",
+ "OS_Freemem": "OS Free Memory",
+ "OS_Loadavg": "OS Load Average",
+ "OS_Platform": "OS Platform",
+ "OS_Release": "OS Release",
+ "OS_Totalmem": "OS Total Memory",
+ "OS_Type": "OS Type",
+ "OS_Uptime": "OS Uptime",
+ "hours": "hours",
+ "minutes": "minutes",
+ "seconds": "seconds",
+ "yes": "Yes",
+ "no": "Não",
+ "accounts": "Contas",
+ "accounts-allowEmailChange": "Allow Email Change",
+ "createdAt": "Created at",
+ "verified": "Verificado",
+ "active": "Ativo"
+} \ No newline at end of file
diff --git a/i18n/ro.i18n.json b/i18n/ro.i18n.json
index 357a6438..6b853104 100644
--- a/i18n/ro.i18n.json
+++ b/i18n/ro.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Add Attachment",
"add-board": "Add Board",
"add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Add Checklist",
"add-checklist-item": "Add an item to checklist",
"add-cover": "Add Cover",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Change Watch",
"boardMenuPopup-title": "Board Menu",
"boards": "Boards",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Liste",
"bucket-example": "Like “Bucket List” for example",
"cancel": "Cancel",
"card-archived": "This card is archived.",
@@ -346,7 +350,7 @@
"overtime-hours": "Overtime (hours)",
"overtime": "Overtime",
"has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Titlu",
"tracking": "Tracking",
diff --git a/i18n/ru.i18n.json b/i18n/ru.i18n.json
index 264c0279..1fa425a6 100644
--- a/i18n/ru.i18n.json
+++ b/i18n/ru.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Добавить вложение",
"add-board": "Добавить доску",
"add-card": "Добавить карту",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Добавить контрольный список",
"add-checklist-item": "Добавить пункт в контрольный список",
"add-cover": "Прикрепить",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Изменить Отслеживание",
"boardMenuPopup-title": "Меню доски",
"boards": "Доски",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Списки",
"bucket-example": "Например “Список дел”",
"cancel": "Отмена",
"card-archived": "Эта карточка помещена в архив.",
@@ -346,7 +350,7 @@
"overtime-hours": "Переработка (в часах)",
"overtime": "Переработка",
"has-overtime-cards": "Имеются карточки с переработкой",
- "has-spenttime-cards": "Имеются карточки с учетом затраченного времени",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Время",
"title": "Название",
"tracking": "Отслеживание",
diff --git a/i18n/sr.i18n.json b/i18n/sr.i18n.json
index ba8f9ef2..238f144d 100644
--- a/i18n/sr.i18n.json
+++ b/i18n/sr.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Add Attachment",
"add-board": "Add Board",
"add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Add Checklist",
"add-checklist-item": "Dodaj novu stavku u listu",
"add-cover": "Dodaj zaglavlje",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Change Watch",
"boardMenuPopup-title": "Meni table",
"boards": "Table",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Lists",
"bucket-example": "Na primer \"Lista zadataka\"",
"cancel": "Otkaži",
"card-archived": "Ova kartica je arhivirana",
@@ -346,7 +350,7 @@
"overtime-hours": "Overtime (hours)",
"overtime": "Overtime",
"has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Vreme",
"title": "Naslov",
"tracking": "Praćenje",
diff --git a/i18n/sv.i18n.json b/i18n/sv.i18n.json
index 41e00665..d9d494bc 100644
--- a/i18n/sv.i18n.json
+++ b/i18n/sv.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Lägg till bilaga",
"add-board": "Lägg till anslagstavla",
"add-card": "Lägg till kort",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Lägg till checklista",
"add-checklist-item": "Lägg till ett objekt till kontrollista",
"add-cover": "Lägg till omslag",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Ändra bevaka",
"boardMenuPopup-title": "Anslagstavla meny",
"boards": "Anslagstavlor",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Listor",
"bucket-example": "Gilla \"att-göra-innan-jag-dör-lista\" till exempel",
"cancel": "Avbryt",
"card-archived": "Detta kort är arkiverat.",
@@ -345,8 +349,8 @@
"spent-time-hours": "Spenderad tid (timmar)",
"overtime-hours": "Övertid (timmar)",
"overtime": "Övertid",
- "has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "has-overtime-cards": "Har övertidskort",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Tid",
"title": "Titel",
"tracking": "Spårning",
@@ -388,12 +392,12 @@
"smtp-password": "Lösenord",
"smtp-tls": "TLS-stöd",
"send-from": "Från",
- "send-smtp-test": "Send a test email to yourself",
+ "send-smtp-test": "Skicka ett prov e-postmeddelande till dig själv",
"invitation-code": "Inbjudningskod",
"email-invite-register-subject": "__inviter__ skickade dig en inbjudan",
"email-invite-register-text": "Bästa __user__,\n\n__inviter__ inbjuder dig till Wekan för samarbeten.\n\nVänligen följ länken nedan:\n__url__\n\nOch din inbjudningskod är: __icode__\n\nTack.",
- "email-smtp-test-subject": "SMTP Test Email From Wekan",
- "email-smtp-test-text": "You have successfully sent an email",
+ "email-smtp-test-subject": "SMTP-prov e-post från Wekan",
+ "email-smtp-test-text": "Du har skickat ett e-postmeddelande",
"error-invitation-code-not-exist": "Inbjudningskod finns inte",
"error-notAuthorized": "Du är inte behörig att se den här sidan.",
"outgoing-webhooks": "Outgoing Webhooks",
@@ -418,7 +422,7 @@
"no": "Nej",
"accounts": "Konton",
"accounts-allowEmailChange": "Tillåt e-poständring",
- "createdAt": "Created at",
+ "createdAt": "Skapad vid",
"verified": "Verifierad",
"active": "Aktiv"
} \ No newline at end of file
diff --git a/i18n/ta.i18n.json b/i18n/ta.i18n.json
index 623d368f..5f338fcd 100644
--- a/i18n/ta.i18n.json
+++ b/i18n/ta.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Add Attachment",
"add-board": "Add Board",
"add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Add Checklist",
"add-checklist-item": "Add an item to checklist",
"add-cover": "Add Cover",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Change Watch",
"boardMenuPopup-title": "Board Menu",
"boards": "Boards",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Lists",
"bucket-example": "Like “Bucket List” for example",
"cancel": "Cancel",
"card-archived": "This card is archived.",
@@ -346,7 +350,7 @@
"overtime-hours": "Overtime (hours)",
"overtime": "Overtime",
"has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"tracking": "Tracking",
diff --git a/i18n/th.i18n.json b/i18n/th.i18n.json
index 46ac3ca5..ce0d3c91 100644
--- a/i18n/th.i18n.json
+++ b/i18n/th.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Add Attachment",
"add-board": "Add Board",
"add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Add Checklist",
"add-checklist-item": "เพิ่มรายการตรวจสอบ",
"add-cover": "เพิ่มหน้าปก",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "เปลี่ยนการเฝ้าดู",
"boardMenuPopup-title": "เมนูบอร์ด",
"boards": "บอร์ด",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "รายการ",
"bucket-example": "ตัวอย่างเช่น “ระบบที่ต้องทำ”",
"cancel": "ยกเลิก",
"card-archived": "การ์ดนี้ถูกเก็บไว้",
@@ -346,7 +350,7 @@
"overtime-hours": "Overtime (hours)",
"overtime": "Overtime",
"has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "เวลา",
"title": "หัวข้อ",
"tracking": "ติดตาม",
diff --git a/i18n/tr.i18n.json b/i18n/tr.i18n.json
index d43c7724..11f711d7 100644
--- a/i18n/tr.i18n.json
+++ b/i18n/tr.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Ek Ekle",
"add-board": "Pano Ekle",
"add-card": "Kart Ekle",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Yapılacak Listesi Ekle",
"add-checklist-item": "Yapılacak listesine yeni bir öğe ekle",
"add-cover": "Kapak resmi ekle",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "İzleme Durumunu Değiştir",
"boardMenuPopup-title": "Pano menüsü",
"boards": "Panolar",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Listeler",
"bucket-example": "Örn: \"Marketten Alacaklarım\"",
"cancel": "İptal",
"card-archived": "Bu kart arşivlendi.",
@@ -103,7 +107,7 @@
"card-delete-suggest-archive": "Kartı panodan kaldırıp, buna rağmen aktivitelerini saklamak istiyorsan kartı arşivleyebilirsin.",
"card-due": "Bitiş",
"card-due-on": "Bitiş tarihi:",
- "card-spent": "Spent Time",
+ "card-spent": "Harcanan Zaman",
"card-edit-attachments": "Ek dosyasını düzenle",
"card-edit-labels": "Etiketleri düzenle",
"card-edit-members": "Üyeleri düzenle",
@@ -176,7 +180,7 @@
"soft-wip-limit": "Zayıf Devam Eden İş Sınırı",
"editCardStartDatePopup-title": "Başlangıç tarihini değiştir",
"editCardDueDatePopup-title": "Bitiş tarihini değiştir",
- "editCardSpentTimePopup-title": "Change spent time",
+ "editCardSpentTimePopup-title": "Harcanan zamanı değiştir",
"editLabelPopup-title": "Etiket Değiştir",
"editNotificationPopup-title": "Bildirimi değiştir",
"editProfilePopup-title": "Profili Düzenle",
@@ -184,7 +188,7 @@
"email-enrollAccount-subject": "Hesabınız __siteName__ üzerinde oluşturuldu",
"email-enrollAccount-text": "Merhaba __user__,\n\nBu servisi kullanmaya başlamak için aşağıdaki linke tıklamalısın:\n\n__url__\n\nTeşekkürler.",
"email-fail": "E-posta gönderimi başarısız",
- "email-fail-text": "Error trying to send email",
+ "email-fail-text": "E-Posta gönderilme çalışırken hata oluştu",
"email-invalid": "Geçersiz e-posta",
"email-invite": "E-posta ile davet et",
"email-invite-subject": "__inviter__ size bir davetiye gönderdi",
@@ -239,8 +243,8 @@
"info": "Sürüm",
"initials": "İlk Harfleri",
"invalid-date": "Geçersiz tarih",
- "invalid-time": "Invalid time",
- "invalid-user": "Invalid user",
+ "invalid-time": "Geçersiz zaman",
+ "invalid-user": "Geçersiz kullanıcı",
"joined": "katıldı",
"just-invited": "Bu panoya şimdi davet edildin.",
"keyboard-shortcuts": "Klavye kısayolları",
@@ -342,11 +346,11 @@
"team": "Takım",
"this-board": "bu panoyu",
"this-card": "bu kart",
- "spent-time-hours": "Spent time (hours)",
- "overtime-hours": "Overtime (hours)",
- "overtime": "Overtime",
- "has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "spent-time-hours": "Harcanan zaman (saat)",
+ "overtime-hours": "Aşılan süre (saat)",
+ "overtime": "Aşılan süre",
+ "has-overtime-cards": "Süresi aşılmış kartlar",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Zaman",
"title": "Başlık",
"tracking": "Takip",
@@ -388,12 +392,12 @@
"smtp-password": "Parola",
"smtp-tls": "TLS desteği",
"send-from": "Gönderen",
- "send-smtp-test": "Send a test email to yourself",
+ "send-smtp-test": "Kendinize deneme E-Postası gönderin",
"invitation-code": "Davetiye kodu",
"email-invite-register-subject": "__inviter__ size bir davetiye gönderdi",
"email-invite-register-text": "Sevgili __user__,\n\n__inviter__ sizi beraber çalışabilmek için Wekan'a davet etti.\n\nLütfen aşağıdaki linke tıklayın:\n__url__\n\nDavetiye kodunuz: __icode__\n\nTeşekkürler.",
- "email-smtp-test-subject": "SMTP Test Email From Wekan",
- "email-smtp-test-text": "You have successfully sent an email",
+ "email-smtp-test-subject": "Wekan' dan SMTP E-Postası",
+ "email-smtp-test-text": "E-Posta başarıyla gönderildi",
"error-invitation-code-not-exist": "Davetiye kodu bulunamadı",
"error-notAuthorized": "Bu sayfayı görmek için yetkiniz yok.",
"outgoing-webhooks": "Dışarı giden bağlantılar",
diff --git a/i18n/uk.i18n.json b/i18n/uk.i18n.json
index 3d8a7a4b..5de926d2 100644
--- a/i18n/uk.i18n.json
+++ b/i18n/uk.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Add Attachment",
"add-board": "Add Board",
"add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Add Checklist",
"add-checklist-item": "Додати елемент в список",
"add-cover": "Додати обкладинку",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Change Watch",
"boardMenuPopup-title": "Board Menu",
"boards": "Дошки",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Lists",
"bucket-example": "Like “Bucket List” for example",
"cancel": "Відміна",
"card-archived": "This card is archived.",
@@ -346,7 +350,7 @@
"overtime-hours": "Overtime (hours)",
"overtime": "Overtime",
"has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"tracking": "Tracking",
diff --git a/i18n/vi.i18n.json b/i18n/vi.i18n.json
index 941b55c7..e621300f 100644
--- a/i18n/vi.i18n.json
+++ b/i18n/vi.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "Thêm Bản Đính Kèm",
"add-board": "Thêm Bảng",
"add-card": "Thêm Thẻ",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Thêm Danh Sách Kiểm Tra",
"add-checklist-item": "Thêm Một Mục Vào Danh Sách Kiểm Tra",
"add-cover": "Thêm Bìa",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "Đổi cách xem",
"boardMenuPopup-title": "Board Menu",
"boards": "Bảng",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Lists",
"bucket-example": "Like “Bucket List” for example",
"cancel": "Hủy",
"card-archived": "Thẻ này đã được lưu.",
@@ -346,7 +350,7 @@
"overtime-hours": "Overtime (hours)",
"overtime": "Overtime",
"has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"tracking": "Tracking",
diff --git a/i18n/zh-CN.i18n.json b/i18n/zh-CN.i18n.json
index 1c78a461..d992e924 100644
--- a/i18n/zh-CN.i18n.json
+++ b/i18n/zh-CN.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "添加附件",
"add-board": "添加看板",
"add-card": "添加卡片",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "添加待办清单",
"add-checklist-item": "扩充清单",
"add-cover": "添加封面",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "更改关注状态",
"boardMenuPopup-title": "看板菜单",
"boards": "看板",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "列表",
"bucket-example": "例如 “遗愿清单”",
"cancel": "取消",
"card-archived": "该卡片已被归档",
@@ -346,7 +350,7 @@
"overtime-hours": "超时 (小时)",
"overtime": "超时",
"has-overtime-cards": "有超时卡片",
- "has-spenttime-cards": "有耗时卡片",
+ "has-spenttime-cards": "Has spent time cards",
"time": "时间",
"title": "标题",
"tracking": "跟踪",
diff --git a/i18n/zh-TW.i18n.json b/i18n/zh-TW.i18n.json
index a39d1fe6..311c2997 100644
--- a/i18n/zh-TW.i18n.json
+++ b/i18n/zh-TW.i18n.json
@@ -44,6 +44,7 @@
"add-attachment": "新增附件",
"add-board": "新增看板",
"add-card": "新增卡片",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "新增待辦清單",
"add-checklist-item": "新增項目",
"add-cover": "新增封面",
@@ -94,6 +95,9 @@
"boardChangeWatchPopup-title": "更改觀察",
"boardMenuPopup-title": "看板選單",
"boards": "看板",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "清單",
"bucket-example": "例如 “目標清單”",
"cancel": "取消",
"card-archived": "該卡片已被刪除",
@@ -346,7 +350,7 @@
"overtime-hours": "Overtime (hours)",
"overtime": "Overtime",
"has-overtime-cards": "Has overtime cards",
- "has-spenttime-cards": "Has spenttime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "時間",
"title": "標題",
"tracking": "追蹤",
diff --git a/models/attachments.js b/models/attachments.js
index 560bec99..5e5c4926 100644
--- a/models/attachments.js
+++ b/models/attachments.js
@@ -1,83 +1,90 @@
-Attachments = new FS.Collection('attachments', {
- stores: [
+ Attachments = new FS.Collection('attachments', {
+ stores: [
- // XXX Add a new store for cover thumbnails so we don't load big images in
- // the general board view
- new FS.Store.GridFS('attachments', {
- // If the uploaded document is not an image we need to enforce browser
- // download instead of execution. This is particularly important for HTML
- // files that the browser will just execute if we don't serve them with the
- // appropriate `application/octet-stream` MIME header which can lead to user
- // data leaks. I imagine other formats (like PDF) can also be attack vectors.
- // See https://github.com/wekan/wekan/issues/99
- // XXX Should we use `beforeWrite` option of CollectionFS instead of
- // collection-hooks?
- // We should use `beforeWrite`.
- beforeWrite: (fileObj) => {
- if (!fileObj.isImage()) {
- return {
- type: 'application/octet-stream',
- };
+ // XXX Add a new store for cover thumbnails so we don't load big images in
+ // the general board view
+ new FS.Store.GridFS('attachments', {
+ // If the uploaded document is not an image we need to enforce browser
+ // download instead of execution. This is particularly important for HTML
+ // files that the browser will just execute if we don't serve them with the
+ // appropriate `application/octet-stream` MIME header which can lead to user
+ // data leaks. I imagine other formats (like PDF) can also be attack vectors.
+ // See https://github.com/wekan/wekan/issues/99
+ // XXX Should we use `beforeWrite` option of CollectionFS instead of
+ // collection-hooks?
+ // We should use `beforeWrite`.
+ beforeWrite: (fileObj) => {
+ if (!fileObj.isImage()) {
+ return {
+ type: 'application/octet-stream',
+ };
+ }
+ return {};
+ },
+ }),
+ ],
+ });
+
+
+ if (Meteor.isServer) {
+ Attachments.allow({
+ insert(userId, doc) {
+ return allowIsBoardMember(userId, Boards.findOne(doc.boardId));
+ },
+ update(userId, doc) {
+ return allowIsBoardMember(userId, Boards.findOne(doc.boardId));
+ },
+ remove(userId, doc) {
+ return allowIsBoardMember(userId, Boards.findOne(doc.boardId));
+ },
+ // We authorize the attachment download either:
+ // - if the board is public, everyone (even unconnected) can download it
+ // - if the board is private, only board members can download it
+ download(userId, doc) {
+ const board = Boards.findOne(doc.boardId);
+ if (board.isPublic()) {
+ return true;
+ } else {
+ return board.hasMember(userId);
}
- return {};
},
- }),
- ],
-});
-if (Meteor.isServer) {
- Attachments.allow({
- insert(userId, doc) {
- return allowIsBoardMember(userId, Boards.findOne(doc.boardId));
- },
- update(userId, doc) {
- return allowIsBoardMember(userId, Boards.findOne(doc.boardId));
- },
- remove(userId, doc) {
- return allowIsBoardMember(userId, Boards.findOne(doc.boardId));
- },
- // We authorize the attachment download either:
- // - if the board is public, everyone (even unconnected) can download it
- // - if the board is private, only board members can download it
- download(userId, doc) {
- const board = Boards.findOne(doc.boardId);
- if (board.isPublic()) {
- return true;
- } else {
- return board.hasMember(userId);
- }
- },
+ fetch: ['boardId'],
+ });
+ }
- fetch: ['boardId'],
- });
-}
+ // XXX Enforce a schema for the Attachments CollectionFS
-// XXX Enforce a schema for the Attachments CollectionFS
+ if (Meteor.isServer) {
+ Attachments.files.after.insert((userId, doc) => {
+ // If the attachment doesn't have a source field
+ // or its source is different than import
+ if (!doc.source || doc.source !== 'import') {
+ // Add activity about adding the attachment
+ Activities.insert({
+ userId,
+ type: 'card',
+ activityType: 'addAttachment',
+ attachmentId: doc._id,
+ boardId: doc.boardId,
+ cardId: doc.cardId,
+ });
+ } else {
+ // Don't add activity about adding the attachment as the activity
+ // be imported and delete source field
+ Attachments.update({
+ _id: doc._id,
+ }, {
+ $unset: {
+ source: '',
+ },
+ });
+ }
+ });
-if (Meteor.isServer) {
- Attachments.files.after.insert((userId, doc) => {
- // If the attachment doesn't have a source field
- // or its source is different than import
- if (!doc.source || doc.source !== 'import') {
- // Add activity about adding the attachment
- Activities.insert({
- userId,
- type: 'card',
- activityType: 'addAttachment',
+ Attachments.files.after.remove((userId, doc) => {
+ Activities.remove({
attachmentId: doc._id,
- boardId: doc.boardId,
- cardId: doc.cardId,
});
- } else {
- // Don't add activity about adding the attachment as the activity
- // be imported and delete source field
- Attachments.update( {_id: doc._id}, {$unset: { source : '' } } );
- }
- });
-
- Attachments.files.after.remove((userId, doc) => {
- Activities.remove({
- attachmentId: doc._id,
});
- });
-}
+ }
diff --git a/models/boards.js b/models/boards.js
index 594bb7b9..84a715fb 100644
--- a/models/boards.js
+++ b/models/boards.js
@@ -31,6 +31,14 @@ Boards.attachSchema(new SimpleSchema({
}
},
},
+ view: {
+ type: String,
+ autoValue() { // eslint-disable-line consistent-return
+ if (this.isInsert) {
+ return 'board-view-swimlanes';
+ }
+ },
+ },
createdAt: {
type: Date,
autoValue() { // eslint-disable-line consistent-return
@@ -187,6 +195,10 @@ Boards.helpers({
return Lists.find({ boardId: this._id, archived: false }, { sort: { sort: 1 } });
},
+ swimlanes() {
+ return Swimlanes.find({ boardId: this._id, archived: false }, { sort: { sort: 1 } });
+ },
+
hasOvertimeCards(){
const card = Cards.findOne({isOvertime: true, boardId: this._id, archived: false} );
return card !== undefined;
diff --git a/models/cards.js b/models/cards.js
index 8676dfdc..d175a430 100644
--- a/models/cards.js
+++ b/models/cards.js
@@ -18,6 +18,9 @@ Cards.attachSchema(new SimpleSchema({
listId: {
type: String,
},
+ swimlaneId: {
+ type: String,
+ },
// The system could work without this `boardId` information (we could deduce
// the board identifier from the card), but it would make the system more
// difficult to manage and less efficient.
@@ -216,9 +219,10 @@ Cards.mutations({
return {$set: {description}};
},
- move(listId, sortIndex) {
+ move(swimlaneId, listId, sortIndex) {
const list = Lists.findOne(listId);
const mutatedFields = {
+ swimlaneId,
listId,
boardId: list.boardId,
};
diff --git a/models/lists.js b/models/lists.js
index a5f4791b..7ed27361 100644
--- a/models/lists.js
+++ b/models/lists.js
@@ -75,11 +75,15 @@ Lists.allow({
});
Lists.helpers({
- cards() {
- return Cards.find(Filter.mongoSelector({
+ cards(swimlaneId) {
+ const selector = {
listId: this._id,
archived: false,
- }), { sort: ['sort'] });
+ };
+ if (swimlaneId)
+ selector.swimlaneId = swimlaneId;
+ return Cards.find(Filter.mongoSelector(selector,
+ { sort: ['sort'] }));
},
allCards() {
diff --git a/models/swimlanes.js b/models/swimlanes.js
new file mode 100644
index 00000000..68cd77da
--- /dev/null
+++ b/models/swimlanes.js
@@ -0,0 +1,219 @@
+Swimlanes = new Mongo.Collection('swimlanes');
+
+Swimlanes.attachSchema(new SimpleSchema({
+ title: {
+ type: String,
+ },
+ archived: {
+ type: Boolean,
+ autoValue() { // eslint-disable-line consistent-return
+ if (this.isInsert && !this.isSet) {
+ return false;
+ }
+ },
+ },
+ boardId: {
+ type: String,
+ },
+ createdAt: {
+ type: Date,
+ autoValue() { // eslint-disable-line consistent-return
+ if (this.isInsert) {
+ return new Date();
+ } else {
+ this.unset();
+ }
+ },
+ },
+ sort: {
+ type: Number,
+ decimal: true,
+ // XXX We should probably provide a default
+ optional: true,
+ },
+ updatedAt: {
+ type: Date,
+ optional: true,
+ autoValue() { // eslint-disable-line consistent-return
+ if (this.isUpdate) {
+ return new Date();
+ } else {
+ this.unset();
+ }
+ },
+ },
+}));
+
+Swimlanes.allow({
+ insert(userId, doc) {
+ return allowIsBoardMemberNonComment(userId, Boards.findOne(doc.boardId));
+ },
+ update(userId, doc) {
+ return allowIsBoardMemberNonComment(userId, Boards.findOne(doc.boardId));
+ },
+ remove(userId, doc) {
+ return allowIsBoardMemberNonComment(userId, Boards.findOne(doc.boardId));
+ },
+ fetch: ['boardId'],
+});
+
+Swimlanes.helpers({
+ cards() {
+ return Cards.find(Filter.mongoSelector({
+ swimlaneId: this._id,
+ archived: false,
+ }), { sort: ['sort'] });
+ },
+
+ allCards() {
+ return Cards.find({ swimlaneId: this._id });
+ },
+
+ board() {
+ return Boards.findOne(this.boardId);
+ },
+});
+
+Swimlanes.mutations({
+ rename(title) {
+ return { $set: { title } };
+ },
+
+ archive() {
+ return { $set: { archived: true } };
+ },
+
+ restore() {
+ return { $set: { archived: false } };
+ },
+});
+
+Swimlanes.hookOptions.after.update = { fetchPrevious: false };
+
+if (Meteor.isServer) {
+ Meteor.startup(() => {
+ Swimlanes._collection._ensureIndex({ boardId: 1 });
+ });
+
+ Swimlanes.after.insert((userId, doc) => {
+ Activities.insert({
+ userId,
+ type: 'swimlane',
+ activityType: 'createSwimlane',
+ boardId: doc.boardId,
+ swimlaneId: doc._id,
+ });
+ });
+
+ Swimlanes.before.remove((userId, doc) => {
+ Activities.insert({
+ userId,
+ type: 'swimlane',
+ activityType: 'removeSwimlane',
+ boardId: doc.boardId,
+ swimlaneId: doc._id,
+ title: doc.title,
+ });
+ });
+
+ Swimlanes.after.update((userId, doc) => {
+ if (doc.archived) {
+ Activities.insert({
+ userId,
+ type: 'swimlane',
+ activityType: 'archivedSwimlane',
+ swimlaneId: doc._id,
+ boardId: doc.boardId,
+ });
+ }
+ });
+}
+
+//SWIMLANE REST API
+if (Meteor.isServer) {
+ JsonRoutes.add('GET', '/api/boards/:boardId/swimlanes', function (req, res, next) {
+ try {
+ const paramBoardId = req.params.boardId;
+ Authentication.checkBoardAccess( req.userId, paramBoardId);
+
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: Swimlanes.find({ boardId: paramBoardId, archived: false }).map(function (doc) {
+ return {
+ _id: doc._id,
+ title: doc.title,
+ };
+ }),
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
+ });
+
+ JsonRoutes.add('GET', '/api/boards/:boardId/swimlanes/:swimlaneId', function (req, res, next) {
+ try {
+ const paramBoardId = req.params.boardId;
+ const paramSwimlaneId = req.params.swimlaneId;
+ Authentication.checkBoardAccess( req.userId, paramBoardId);
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: Swimlanes.findOne({ _id: paramSwimlaneId, boardId: paramBoardId, archived: false }),
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
+ });
+
+ JsonRoutes.add('POST', '/api/boards/:boardId/swimlanes', function (req, res, next) {
+ try {
+ Authentication.checkUserId( req.userId);
+ const paramBoardId = req.params.boardId;
+ const id = Swimlanes.insert({
+ title: req.body.title,
+ boardId: paramBoardId,
+ });
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: id,
+ },
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
+ });
+
+ JsonRoutes.add('DELETE', '/api/boards/:boardId/swimlanes/:swimlaneId', function (req, res, next) {
+ try {
+ Authentication.checkUserId( req.userId);
+ const paramBoardId = req.params.boardId;
+ const paramSwimlaneId = req.params.swimlaneId;
+ Swimlanes.remove({ _id: paramSwimlaneId, boardId: paramBoardId });
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: paramSwimlaneId,
+ },
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
+ });
+
+}
diff --git a/package.json b/package.json
index 0341eab0..e845460f 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "wekan",
- "version": "0.63.0",
+ "version": "0.65.0",
"description": "The open-source Trello-like kanban",
"private": true,
"scripts": {
@@ -24,8 +24,8 @@
},
"dependencies": {
"babel-runtime": "^6.23.0",
- "bcrypt": "^1.0.2",
- "bson": "^1.0.4",
+ "bcrypt": "^1.0.3",
+ "bson-ext": "^1.0.5",
"es6-promise": "^4.1.0",
"meteor-node-stubs": "^0.2.6",
"os": "^0.1.1",
diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp
index 98552e96..7b67974a 100644
--- a/sandstorm-pkgdef.capnp
+++ b/sandstorm-pkgdef.capnp
@@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = (
appTitle = (defaultText = "Wekan"),
# The name of the app as it is displayed to the user.
- appVersion = 48,
+ appVersion = 50,
# Increment this for every release.
- appMarketingVersion = (defaultText = "0.63.0~2017-12-20"),
+ appMarketingVersion = (defaultText = "0.65.0~2018-01-28"),
# Human-readable presentation of the app version.
minUpgradableAppVersion = 0,
diff --git a/sandstorm.js b/sandstorm.js
index 6b7c8172..b2141762 100644
--- a/sandstorm.js
+++ b/sandstorm.js
@@ -22,7 +22,7 @@ const sandstormBoard = {
if (isSandstorm && Meteor.isServer) {
const fs = require('fs');
- const Capnp = require('capnp');
+ const Capnp = require('/node_modules/capnp.js');
const Package = Capnp.importSystem('sandstorm/package.capnp');
const Powerbox = Capnp.importSystem('sandstorm/powerbox.capnp');
const Identity = Capnp.importSystem('sandstorm/identity.capnp');
diff --git a/server/migrations.js b/server/migrations.js
index f828a14c..f2cb124b 100644
--- a/server/migrations.js
+++ b/server/migrations.js
@@ -151,3 +151,39 @@ Migrations.add('add-sort-checklists', () => {
});
});
});
+
+Migrations.add('add-swimlanes', () => {
+ Boards.find().forEach((board) => {
+ const swimlane = Swimlanes.findOne({ boardId: board._id });
+ let swimlaneId = '';
+ if (swimlane)
+ swimlaneId = swimlane._id;
+ else
+ swimlaneId = Swimlanes.direct.insert({
+ boardId: board._id,
+ title: 'Default',
+ });
+
+ Cards.find({ boardId: board._id }).forEach((card) => {
+ if (!card.hasOwnProperty('swimlaneId')) {
+ Cards.direct.update(
+ { _id: card._id },
+ { $set: { swimlaneId } },
+ noValidate
+ );
+ }
+ });
+ });
+});
+
+Migrations.add('add-views', () => {
+ Boards.find().forEach((board) => {
+ if (!board.hasOwnProperty('view')) {
+ Boards.direct.update(
+ { _id: board._id },
+ { $set: { view: 'board-view-swimlanes' } },
+ noValidate
+ );
+ }
+ });
+});
diff --git a/server/publications/boards.js b/server/publications/boards.js
index f482f619..889bd177 100644
--- a/server/publications/boards.js
+++ b/server/publications/boards.js
@@ -73,6 +73,7 @@ Meteor.publishRelations('board', function(boardId) {
],
}, { limit: 1 }), function(boardId, board) {
this.cursor(Lists.find({ boardId }));
+ this.cursor(Swimlanes.find({ boardId }));
this.cursor(Integrations.find({ boardId }));
// Cards and cards comments
diff --git a/snapcraft.yaml b/snapcraft.yaml
index 18b980f8..ece489de 100644
--- a/snapcraft.yaml
+++ b/snapcraft.yaml
@@ -70,15 +70,16 @@ parts:
wekan:
source: .
plugin: nodejs
- node-engine: 4.8.7
+ node-engine: 8.9.3
node-packages:
- - n
- - npm@4.6.1
+ - npm@5.5.1
- node-gyp
- node-pre-gyp
- - fibers@1.0.15
- build-packages:
+ - fibers@2.0.0
+ stage-packages:
- ca-certificates
+ build-packages:
+ - apt-utils
- python
- g++
- capnproto
@@ -88,21 +89,19 @@ parts:
prepare: |
echo "Cleaning environment first"
rm -rf ~/.meteor ~/.npm /usr/local/lib/node_modules
- echo "Installing node"
- n 4.8.7
echo "Applying paxctl fix for alpine linux: https://github.com/wekan/wekan/issues/1303"
paxctl -mC `which node`
echo "Installing meteor"
curl https://install.meteor.com/ -o install_meteor.sh
- sed -i "s|RELEASE=.*|RELEASE=\"1.4.4.1\"|g" install_meteor.sh
+ sed -i "s|RELEASE=.*|RELEASE=\"1.6.0.1\"|g" install_meteor.sh
chmod +x install_meteor.sh
sh install_meteor.sh
rm install_meteor.sh
- mkdir -p ~/.meteor/packages
- cd ~/.meteor/packages
+ mkdir packages
+ cd packages
git clone --depth 1 -b master https://github.com/wekan/flow-router.git kadira-flow-router
git clone --depth 1 -b master https://github.com/meteor-useraccounts/core.git meteor-useraccounts-core
- sed -i 's/api\.versionsFrom/\/\/api.versionsFrom/' ~/.meteor/packages/meteor-useraccounts-core/package.js
+ sed -i 's/api\.versionsFrom/\/\/api.versionsFrom/' meteor-useraccounts-core/package.js
cd ..
build: |
rm -rf package-lock.json .build
@@ -110,12 +109,12 @@ parts:
meteor npm install --allow-superuser
meteor build .build --directory --allow-superuser
cp -f fix-download-unicode/cfs_access-point.txt .build/bundle/programs/server/packages/cfs_access-point.js
- sed -i "s|build\/Release\/bson|browser_build\/bson|g" .build/bundle/programs/server/npm/node_modules/meteor/cfs_gridfs/node_modules/mongodb/node_modules/bson/ext/index.js
cd .build/bundle/programs/server/npm/node_modules/meteor/npm-bcrypt
rm -rf node_modules/bcrypt
- npm install bcrypt
+ meteor npm install --save bcrypt
cd ../../../../
npm install
+ meteor npm install --save bcrypt
install: |
cp -r .build/bundle/* $SNAPCRAFT_PART_INSTALL/
cp .build/bundle/.node_version.txt $SNAPCRAFT_PART_INSTALL/