Merge branch 'devel'

This commit is contained in:
Lauri Ojansivu 2018-01-28 00:02:35 +02:00
commit 6aca70f0d1
74 changed files with 2480 additions and 526 deletions

View file

@ -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

View file

@ -1 +1 @@
METEOR@1.4.4.1
METEOR@1.6.0.1

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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:

View file

@ -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 && \

View file

@ -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

View file

@ -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();
},
});

View file

@ -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

View file

@ -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}}"

View file

@ -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());
},

View file

@ -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() {

View file

@ -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
margin-right: 0.3em

View file

@ -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');

View file

@ -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);
},

View file

@ -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

View file

@ -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}}")

View file

@ -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();
},

View file

@ -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'}}

View file

@ -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();
},
});

View file

@ -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;

View file

@ -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": "تتبع",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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": "پیگردی",

View file

@ -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.",

View file

@ -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",

View file

@ -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",

View file

@ -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": "מעקב",

View file

@ -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",

428
i18n/ibo.json Normal file
View file

@ -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 cant 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 youre 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"
}

View file

@ -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",

View file

@ -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",

View file

@ -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": "トラッキング",

View file

@ -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",

View file

@ -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",

428
i18n/mn.i18n.json Normal file
View file

@ -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 cant 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 youre 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"
}

View file

@ -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",

View file

@ -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"
}

View file

@ -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",

View file

@ -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",

428
i18n/pt.i18n.json Normal file
View file

@ -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 cant 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 youre 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"
}

View file

@ -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",

View file

@ -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": "Отслеживание",

View file

@ -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",

View file

@ -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"
}

View file

@ -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",

View file

@ -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": "ติดตาม",

View file

@ -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": "ılan süre (saat)",
"overtime": "ı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",

View file

@ -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",

View file

@ -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",

View file

@ -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": "跟踪",

View file

@ -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": "追蹤",

View file

@ -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',
};
}
return {};
// 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);
}
},
}),
],
});
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'],
});
}
// 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 : '' } } );
}
});
Attachments.files.after.remove((userId, doc) => {
Activities.remove({
attachmentId: doc._id,
fetch: ['boardId'],
});
});
}
}
// 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: '',
},
});
}
});
Attachments.files.after.remove((userId, doc) => {
Activities.remove({
attachmentId: doc._id,
});
});
}

View file

@ -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;

View file

@ -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,
};

View file

@ -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() {

219
models/swimlanes.js Normal file
View file

@ -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,
});
}
});
}

View file

@ -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",

View file

@ -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,

View file

@ -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');

View file

@ -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
);
}
});
});

View file

@ -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

View file

@ -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/