diff options
author | Lauri Ojansivu <x@xet7.org> | 2018-01-28 00:02:35 +0200 |
---|---|---|
committer | Lauri Ojansivu <x@xet7.org> | 2018-01-28 00:02:35 +0200 |
commit | 6aca70f0d11cd93355f65356c5550e7071f42aaa (patch) | |
tree | 62f9fb26fb52ae9f71c1f09d37af9058fa00ed75 | |
parent | 963e3193451327cec89da2abc1f4aee7ee308f08 (diff) | |
parent | 081c1fdf835c6f1d2030b3b9e23229378d4f8cce (diff) | |
download | wekan-6aca70f0d11cd93355f65356c5550e7071f42aaa.tar.gz wekan-6aca70f0d11cd93355f65356c5550e7071f42aaa.tar.bz2 wekan-6aca70f0d11cd93355f65356c5550e7071f42aaa.zip |
Merge branch 'devel'
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 @@ -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: @@ -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/ |