Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e1e20275a6 | ||
|
|
3c4f8f6796 | ||
|
|
406a9492fd | ||
|
|
c859cd2278 | ||
|
|
cd70d9d09e | ||
|
|
86e7e1c600 | ||
|
|
e540148d09 | ||
|
|
30b108ab36 | ||
|
|
ec535aaa9c | ||
|
|
bb108b2144 | ||
|
|
f3c76ac60b | ||
|
|
23ccb3b991 | ||
|
|
992ecfefa2 | ||
|
|
fd390d2560 | ||
|
|
3f1ac6b5db | ||
|
|
d8f112278b | ||
|
|
0704cfb8b6 | ||
|
|
5e806c3879 | ||
|
|
27b0fd35b4 | ||
|
|
5c1818fc9a | ||
|
|
a7fb9662e3 | ||
|
|
cb00cfc1b7 | ||
|
|
d7bc8d100d | ||
|
|
d067b3976c | ||
|
|
892ee60527 | ||
|
|
d83cb75f95 | ||
|
|
697aaa895d | ||
|
|
8add28d328 | ||
|
|
634df8f6f2 | ||
|
|
d194cc7a5a | ||
|
|
0834f6ed1e | ||
|
|
9d5e288bca | ||
|
|
0fe40ad9ec | ||
|
|
0765278195 | ||
|
|
f782b9c298 | ||
|
|
e611685e50 | ||
|
|
3edef95c4e | ||
|
|
9b902e1ca0 | ||
|
|
fc835815d8 | ||
|
|
da083c2e20 | ||
|
|
6ee17ab080 | ||
|
|
1e34585548 | ||
|
|
76cd5a2844 | ||
|
|
ffd1b93abf | ||
|
|
1eea102f26 | ||
|
|
94c1367684 | ||
|
|
9bf19f81a4 | ||
|
|
21de0ec396 | ||
|
|
ab4fec0f3c | ||
|
|
b983479476 | ||
|
|
f6e5e514ef | ||
|
|
ddd828083e | ||
|
|
e079b4df17 | ||
|
|
4e5ff17e18 | ||
|
|
86e1a9cd5d | ||
|
|
8a0efffdf8 | ||
|
|
c21f710a70 | ||
|
|
f3382abe3b | ||
|
|
d6c86f3cba | ||
|
|
3a6516f0cb | ||
|
|
b795115042 |
No files matched your search
+98
-1
@@ -1,3 +1,100 @@
|
||||
# v2.76 2019-06-11 Wekan release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Add support for CORS headers "Access-control-allow-headers" and
|
||||
"Access-control-expose-headers"](https://github.com/wekan/wekan/pull/2429).
|
||||
Thanks to risacher and xet7.
|
||||
- [Support scopes in OAuth2, so that Authentication via OAuth2 with Google is now possible](https://github.com/wekan/wekan/pull/2483).
|
||||
Thanks to moserben16.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix Scope parsing Issue for OAuth2 Login with simple String](https://github.com/wekan/wekan/pulls/2427).
|
||||
Thanks to DominikPf.
|
||||
- [Show attachment name in Outgoing Webhook when attachment is added to card](https://github.com/wekan/wekan/commit/992ecfefa2e46ee7321ec9b8bfc3400532e5645e).
|
||||
Thanks to xet7. Related [#2285](https://github.com/wekan/wekan/issues/2285).
|
||||
- [Show attachment name in Outgoing Webhook when attachment is removed from card](https://github.com/wekan/wekan/commit/23ccb3b991be6d7196e59f7d68df17b8949df049).
|
||||
Thanks to xet7. Related [#2285](https://github.com/wekan/wekan/issues/2285).
|
||||
- [Allow BoardAdmin to create board rules](https://github.com/wekan/wekan/pull/2433).
|
||||
Thanks to road42.
|
||||
- [Fix typo](https://github.com/wekan/wekan/pull/2442).
|
||||
Thanks to Jason-Cooke.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v2.75 2019-05-22 Wekan release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [CAS allowed LDAP groups](https://github.com/wekan/meteor-accounts-cas/pull/4).
|
||||
Thanks to ppoulard. Please test. Related [#2356](https://github.com/wekan/wekan/issues/2356).
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix](https://github.com/wekan/wekan/commit/634df8f6f26a7a7a2df6f87a705d322d88638425):
|
||||
[OAuth2 Requested Scopes are wrong / cannot be configured](https://github.com/wekan/wekan/issues/2412).
|
||||
Thanks to DominikPf and xet7. Please test.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v2.74 2019-05-14 Wekan release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- Add missing [wekan-ldap#40](https://github.com/wekan/wekan-ldap/pull/40) code about
|
||||
[LDAP_SYNC_ADMIN_STATUS](https://github.com/wekan/wekan/commit/0fe40ad9ec82ef2045578f4cc1e2ebb6cc80d47a).
|
||||
Thanks to JulianJacobi, n-st, chirrut2 and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v2.73 2019-05-14 Wekan release
|
||||
|
||||
This release fixes the following bugs with Apache I-CLA:
|
||||
|
||||
- [Card count placement and export API functionality back](https://github.com/wekan/wekan/pulls/2406).
|
||||
Thanks to bentiss.
|
||||
- [Few fixes for Dockerfile](https://github.com/wekan/wekan/pulls/2407).
|
||||
Thanks to bentiss.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- Fixed [#2338](https://github.com/wekan/wekan/issues/2338) -> [Slow opening of big boards with too many archived items](https://github.com/wekan/wekan/pull/2402).
|
||||
If some Wekan users see errors with this, please empty your browser cache.
|
||||
Thanks to nerminator.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v2.72 2019-05-13 Wekan release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Added BIDI support to "Add Card"](https://github.com/wekan/wekan/pull/2401).
|
||||
Related [#884](https://github.com/wekan/wekan/issues/884).
|
||||
Thanks to guyzyl.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v2.71 2019-05-12 Wekan release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Add partentId support on card web API](https://github.com/wekan/wekan/pulls/2400).
|
||||
Thanks to atilaromero.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v2.70 2019-05-11 Wekan release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [View markdown on List names, Custom Fields (Text and Dropdown), Label names,
|
||||
All Boards view Board names and Board descriptions](https://github.com/wekan/wekan/commit/b795115042c2eb6bccbf029f21d78849a44128ca).
|
||||
Related [#2334](https://github.com/wekan/wekan/issues/2334).
|
||||
Thanks to shaygover and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v2.69 2019-05-11 Wekan release
|
||||
|
||||
This release fixes the following translation names:
|
||||
@@ -122,7 +219,7 @@ and adds the following updates:
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix Full width of lists and space before first list](https://github.com/wekan/wekan/pull/2343).
|
||||
Thanks to hupptehcnologies.
|
||||
Thanks to hupptechnologies.
|
||||
- Remove [extra](https://github.com/wekan/wekan/pull/2332) [quotes](https://github.com/wekan/wekan/pull/2333) from docker-compose.yml.
|
||||
Thanks to hibare.
|
||||
- Fix Docker builds by moving all separately cloned wekan/packages/* repos like ldap, oidc, etc code to wekan repo code,
|
||||
|
||||
+9
-5
@@ -40,6 +40,8 @@ ENV BUILD_DEPS="apt-utils bsdtar gnupg gosu wget curl bzip2 build-essential pyth
|
||||
OAUTH2_ID_MAP="" \
|
||||
OAUTH2_USERNAME_MAP="" \
|
||||
OAUTH2_FULLNAME_MAP="" \
|
||||
OAUTH2_ID_TOKEN_WHITELIST_FIELDS=[] \
|
||||
OAUTH2_REQUEST_PERMISSIONS='openid profiles email' \
|
||||
OAUTH2_EMAIL_MAP="" \
|
||||
LDAP_ENABLE=false \
|
||||
LDAP_PORT=389 \
|
||||
@@ -97,6 +99,8 @@ ENV BUILD_DEPS="apt-utils bsdtar gnupg gosu wget curl bzip2 build-essential pyth
|
||||
LOGOUT_ON_HOURS="" \
|
||||
LOGOUT_ON_MINUTES="" \
|
||||
CORS="" \
|
||||
CORS_ALLOW_HEADERS="" \
|
||||
CORS_EXPOSE_HEADERS="" \
|
||||
DEFAULT_AUTHENTICATION_METHOD=""
|
||||
|
||||
# Copy the app to the image
|
||||
@@ -194,7 +198,7 @@ RUN \
|
||||
\
|
||||
# Get additional packages
|
||||
#mkdir -p /home/wekan/app/packages && \
|
||||
chown wekan:wekan --recursive /home/wekan && \
|
||||
#chown wekan:wekan --recursive /home/wekan && \
|
||||
# REPOS BELOW ARE INCLUDED TO WEKAN REPO
|
||||
#cd /home/wekan/app/packages && \
|
||||
#gosu wekan:wekan git clone --depth 1 -b master https://github.com/wekan/flow-router.git kadira-flow-router && \
|
||||
@@ -212,7 +216,7 @@ RUN \
|
||||
gosu wekan:wekan /home/wekan/.meteor/meteor -- help; \
|
||||
\
|
||||
# extract the OpenAPI specification
|
||||
npm install -g api2html@0.3.0 && \
|
||||
npm install -g api2html@0.3.3 && \
|
||||
mkdir -p /home/wekan/python && \
|
||||
chown wekan:wekan --recursive /home/wekan/python && \
|
||||
cd /home/wekan/python && \
|
||||
@@ -220,9 +224,9 @@ RUN \
|
||||
cd /home/wekan/python/esprima-python && \
|
||||
python3 setup.py install --record files.txt && \
|
||||
cd /home/wekan/app &&\
|
||||
mkdir -p ./public/api && \
|
||||
python3 ./openapi/generate_openapi.py --release $(git describe --tags --abbrev=0) > ./public/api/wekan.yml && \
|
||||
/opt/nodejs/bin/api2html -c ./public/logo-header.png -o ./public/api/wekan.html ./public/api/wekan.yml; \
|
||||
gosu wekan:wekan mkdir -p ./public/api && \
|
||||
gosu wekan:wekan python3 ./openapi/generate_openapi.py --release $(git describe --tags --abbrev=0) > ./public/api/wekan.yml && \
|
||||
gosu wekan:wekan /opt/nodejs/bin/api2html -c ./public/logo-header.png -o ./public/api/wekan.html ./public/api/wekan.yml; \
|
||||
# Build app
|
||||
cd /home/wekan/app && \
|
||||
gosu wekan:wekan /home/wekan/.meteor/meteor add standard-minifier-js && \
|
||||
|
||||
@@ -61,7 +61,7 @@ that by providing one-click installation on various platforms.
|
||||
- 64bit: Linux [Snap](https://github.com/wekan/wekan-snap/wiki/Install) or [Sandstorm](https://sandstorm.io) /
|
||||
[Mac](https://github.com/wekan/wekan/wiki/Mac) / [Windows](https://github.com/wekan/wekan/wiki/Install-Wekan-from-source-on-Windows).
|
||||
[More Platforms](https://github.com/wekan/wekan/wiki/Platforms). [ARM progress](https://github.com/wekan/wekan/issues/1053#issuecomment-410919264).
|
||||
- 1 GB RAM minimum free for Wekan. Production server should have miminum total 4 GB RAM.
|
||||
- 1 GB RAM minimum free for Wekan. Production server should have minimum total 4 GB RAM.
|
||||
For thousands of users, for example with [Docker](https://github.com/wekan/wekan/blob/devel/docker-compose.yml): 3 frontend servers,
|
||||
each having 2 CPU and 2 wekan-app containers. One backend wekan-db server with many CPUs.
|
||||
- Enough disk space and alerts about low disk space. If you run out disk space, MongoDB database gets corrupted.
|
||||
@@ -136,4 +136,4 @@ with [Meteor](https://www.meteor.com).
|
||||
[wekan_chat]: https://community.vanila.io/wekan
|
||||
|
||||
|
||||
[](https://app.fossa.io/projects/git%2Bgithub.com%2Fwekan%2Fwekan?ref=badge_large)
|
||||
[](https://app.fossa.io/projects/git%2Bgithub.com%2Fwekan%2Fwekan?ref=badge_large)
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
|
||||
appVersion: "v2.69.0"
|
||||
appVersion: "v2.76.0"
|
||||
files:
|
||||
userUploads:
|
||||
- README.md
|
||||
|
||||
@@ -14,7 +14,7 @@ BlazeComponent.extendComponent({
|
||||
const currentBoardId = Session.get('currentBoard');
|
||||
if (!currentBoardId)
|
||||
return;
|
||||
const handle = subManager.subscribe('board', currentBoardId);
|
||||
const handle = subManager.subscribe('board', currentBoardId, false);
|
||||
Tracker.nonreactive(() => {
|
||||
Tracker.autorun(() => {
|
||||
this.isBoardReady.set(handle.ready());
|
||||
|
||||
@@ -85,10 +85,15 @@ template(name="boardHeaderBar")
|
||||
if Filter.isActive
|
||||
a.board-header-btn-close.js-filter-reset(title="{{_ 'filter-clear'}}")
|
||||
i.fa.fa-times-thin
|
||||
|
||||
if currentUser.isAdmin
|
||||
a.board-header-btn.js-open-rules-view(title="{{_ 'rules'}}")
|
||||
i.fa.fa-magic
|
||||
span {{_ 'rules'}}
|
||||
else if currentUser.isBoardAdmin
|
||||
a.board-header-btn.js-open-rules-view(title="{{_ 'rules'}}")
|
||||
i.fa.fa-magic
|
||||
span {{_ 'rules'}}
|
||||
|
||||
a.board-header-btn.js-open-search-view(title="{{_ 'search'}}")
|
||||
i.fa.fa-search
|
||||
|
||||
@@ -18,11 +18,15 @@ template(name="boardList")
|
||||
else
|
||||
a.js-open-board.board-list-item(href="{{pathFor 'board' id=_id slug=slug}}")
|
||||
span.details
|
||||
span.board-list-item-name= title
|
||||
span.board-list-item-name
|
||||
+viewer
|
||||
= title
|
||||
i.fa.js-star-board(
|
||||
class="fa-star{{#if isStarred}} is-star-active{{else}}-o{{/if}}"
|
||||
title="{{_ 'star-board-title'}}")
|
||||
p.board-list-item-desc= description
|
||||
p.board-list-item-desc
|
||||
+viewer
|
||||
= description
|
||||
if hasSpentTimeCards
|
||||
i.fa.js-has-spenttime-cards(
|
||||
class="fa-circle{{#if hasOvertimeCards}} has-overtime-card-active{{else}} no-overtime-card-active{{/if}}"
|
||||
|
||||
@@ -33,12 +33,12 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
|
||||
hasOvertimeCards() {
|
||||
subManager.subscribe('board', this.currentData()._id);
|
||||
subManager.subscribe('board', this.currentData()._id, false);
|
||||
return this.currentData().hasOvertimeCards();
|
||||
},
|
||||
|
||||
hasSpentTimeCards() {
|
||||
subManager.subscribe('board', this.currentData()._id);
|
||||
subManager.subscribe('board', this.currentData()._id, false);
|
||||
return this.currentData().hasSpentTimeCards();
|
||||
},
|
||||
|
||||
|
||||
@@ -4,9 +4,10 @@ template(name="cardCustomFieldsPopup")
|
||||
li.item(class="")
|
||||
a.name.js-select-field(href="#")
|
||||
span.full-name
|
||||
+viewer
|
||||
= name
|
||||
if hasCustomField
|
||||
i.fa.fa-check
|
||||
i.fa.fa-check
|
||||
hr
|
||||
a.quiet-button.full.js-settings
|
||||
i.fa.fa-cog
|
||||
@@ -61,9 +62,13 @@ template(name="cardCustomField-dropdown")
|
||||
select.inline
|
||||
each items
|
||||
if($eq data.value this._id)
|
||||
option(value=_id selected="selected") {{name}}
|
||||
option(value=_id selected="selected")
|
||||
+viewer
|
||||
= name
|
||||
else
|
||||
option(value=_id) {{name}}
|
||||
option(value=_id)
|
||||
+viewer
|
||||
= name
|
||||
.edit-controls.clearfix
|
||||
button.primary(type="submit") {{_ 'save'}}
|
||||
a.fa.fa-times-thin.js-close-inlined-form
|
||||
@@ -73,4 +78,4 @@ template(name="cardCustomField-dropdown")
|
||||
+viewer
|
||||
= selectedItem
|
||||
else
|
||||
| {{_ 'edit'}}
|
||||
| {{_ 'edit'}}
|
||||
@@ -77,7 +77,9 @@ template(name="cardDetails")
|
||||
h3.card-details-item-title {{_ 'labels'}}
|
||||
a(class="{{#if canModifyCard}}js-add-labels{{else}}is-disabled{{/if}}" title="{{_ 'card-labels-title'}}")
|
||||
each labels
|
||||
span.card-label(class="card-label-{{color}}" title=name)= name
|
||||
span.card-label(class="card-label-{{color}}" title=name)
|
||||
+viewer
|
||||
= name
|
||||
if canModifyCard
|
||||
a.card-label.add-label.js-add-labels(title="{{_ 'card-labels-title'}}")
|
||||
i.fa.fa-plus
|
||||
@@ -86,7 +88,8 @@ template(name="cardDetails")
|
||||
each customFieldsWD
|
||||
.card-details-item.card-details-item-customfield
|
||||
h3.card-details-item-title
|
||||
= definition.name
|
||||
+viewer
|
||||
= definition.name
|
||||
+cardCustomField
|
||||
|
||||
.card-details-items
|
||||
|
||||
@@ -424,7 +424,7 @@ Template.moveCardPopup.events({
|
||||
});
|
||||
BlazeComponent.extendComponent({
|
||||
onCreated() {
|
||||
subManager.subscribe('board', Session.get('currentBoard'));
|
||||
subManager.subscribe('board', Session.get('currentBoard'), false);
|
||||
this.selectedBoardId = new ReactiveVar(Session.get('currentBoard'));
|
||||
},
|
||||
|
||||
@@ -453,7 +453,7 @@ BlazeComponent.extendComponent({
|
||||
return [{
|
||||
'change .js-select-boards'(evt) {
|
||||
this.selectedBoardId.set($(evt.currentTarget).val());
|
||||
subManager.subscribe('board', this.selectedBoardId.get());
|
||||
subManager.subscribe('board', this.selectedBoardId.get(), false);
|
||||
},
|
||||
}];
|
||||
},
|
||||
@@ -676,7 +676,7 @@ BlazeComponent.extendComponent({
|
||||
if (selection === 'none') {
|
||||
this.parentBoard.set(null);
|
||||
} else {
|
||||
subManager.subscribe('board', $(evt.currentTarget).val());
|
||||
subManager.subscribe('board', $(evt.currentTarget).val(), false);
|
||||
this.parentBoard.set(selection);
|
||||
list.prop('disabled', false);
|
||||
}
|
||||
|
||||
@@ -31,7 +31,8 @@ template(name="cardLabelsPopup")
|
||||
a.card-label-edit-button.fa.fa-pencil.js-edit-label
|
||||
span.card-label.card-label-selectable.js-select-label(class="card-label-{{color}}"
|
||||
class="{{# if isLabelSelected ../_id }}active{{/if}}")
|
||||
= name
|
||||
+viewer
|
||||
= name
|
||||
if(isLabelSelected ../_id)
|
||||
i.card-label-selectable-icon.fa.fa-check
|
||||
if currentUser.isBoardAdmin
|
||||
|
||||
@@ -58,7 +58,8 @@ template(name="minicard")
|
||||
.minicard-custom-field
|
||||
if definition.showLabelOnMiniCard
|
||||
.minicard-custom-field-item
|
||||
= definition.name
|
||||
+viewer
|
||||
= definition.name
|
||||
.minicard-custom-field-item
|
||||
+viewer
|
||||
= trueValue
|
||||
|
||||
@@ -99,6 +99,10 @@
|
||||
.highlight
|
||||
color: #ce1414
|
||||
|
||||
.cardCount
|
||||
color: #8c8c8c
|
||||
font-size: 0.8em
|
||||
|
||||
.list-body
|
||||
flex: 1 1 auto
|
||||
flex-direction: column
|
||||
|
||||
@@ -39,7 +39,7 @@ template(name="addCardForm")
|
||||
.minicard-labels
|
||||
each getLabels
|
||||
.minicard-label(class="card-label-{{color}}" title="{{name}}")
|
||||
textarea.minicard-composer-textarea.js-card-title(autofocus)
|
||||
textarea.minicard-composer-textarea.js-card-title(autofocus dir="auto")
|
||||
if members.get
|
||||
.minicard-members.js-minicard-composer-members
|
||||
each members.get
|
||||
@@ -96,7 +96,7 @@ template(name="searchElementPopup")
|
||||
form
|
||||
label
|
||||
| {{_ 'title'}}
|
||||
input.js-element-title(type="text" placeholder="{{_ 'title'}}" autofocus required)
|
||||
input.js-element-title(type="text" placeholder="{{_ 'title'}}" autofocus required dir="auto")
|
||||
unless isTemplateSearch
|
||||
label {{_ 'boards'}}:
|
||||
.link-board-wrapper
|
||||
|
||||
@@ -348,7 +348,7 @@ BlazeComponent.extendComponent({
|
||||
|
||||
this.boardId = Session.get('currentBoard');
|
||||
// In order to get current board info
|
||||
subManager.subscribe('board', this.boardId);
|
||||
subManager.subscribe('board', this.boardId, false);
|
||||
this.board = Boards.findOne(this.boardId);
|
||||
// List where to insert card
|
||||
const list = $(Popup._getTopStack().openerElement).closest('.js-list');
|
||||
@@ -414,7 +414,7 @@ BlazeComponent.extendComponent({
|
||||
events() {
|
||||
return [{
|
||||
'change .js-select-boards'(evt) {
|
||||
subManager.subscribe('board', $(evt.currentTarget).val());
|
||||
subManager.subscribe('board', $(evt.currentTarget).val(), false);
|
||||
this.selectedBoardId.set($(evt.currentTarget).val());
|
||||
},
|
||||
'change .js-select-swimlanes'(evt) {
|
||||
@@ -500,13 +500,13 @@ BlazeComponent.extendComponent({
|
||||
}
|
||||
const boardId = board._id;
|
||||
// Subscribe to this board
|
||||
subManager.subscribe('board', boardId);
|
||||
subManager.subscribe('board', boardId, false);
|
||||
this.selectedBoardId = new ReactiveVar(boardId);
|
||||
|
||||
if (!this.isBoardTemplateSearch) {
|
||||
this.boardId = Session.get('currentBoard');
|
||||
// In order to get current board info
|
||||
subManager.subscribe('board', this.boardId);
|
||||
subManager.subscribe('board', this.boardId, false);
|
||||
this.swimlaneId = '';
|
||||
// Swimlane where to insert card
|
||||
const swimlane = $(Popup._getTopStack().openerElement).parents('.js-swimlane');
|
||||
@@ -547,7 +547,7 @@ BlazeComponent.extendComponent({
|
||||
} else if (this.isBoardTemplateSearch) {
|
||||
const boards = board.searchBoards(this.term.get());
|
||||
boards.forEach((board) => {
|
||||
subManager.subscribe('board', board.linkedId);
|
||||
subManager.subscribe('board', board.linkedId, false);
|
||||
});
|
||||
return boards;
|
||||
} else {
|
||||
@@ -558,7 +558,7 @@ BlazeComponent.extendComponent({
|
||||
events() {
|
||||
return [{
|
||||
'change .js-select-boards'(evt) {
|
||||
subManager.subscribe('board', $(evt.currentTarget).val());
|
||||
subManager.subscribe('board', $(evt.currentTarget).val(), false);
|
||||
this.selectedBoardId.set($(evt.currentTarget).val());
|
||||
},
|
||||
'submit .js-search-term-form'(evt) {
|
||||
|
||||
@@ -10,7 +10,8 @@ template(name="listHeader")
|
||||
a.list-header-left-icon.fa.fa-angle-left.js-unselect-list
|
||||
h2.list-header-name(
|
||||
class="{{#if currentUser.isBoardMember}}js-open-inlined-form is-editable{{/if}}")
|
||||
= title
|
||||
+viewer
|
||||
= title
|
||||
if wipLimit.enabled
|
||||
| (
|
||||
span(class="{{#if reachedWipLimit}}highlight{{/if}}") {{cards.count}}
|
||||
@@ -18,7 +19,7 @@ template(name="listHeader")
|
||||
|
||||
if showCardsCountForList cards.count
|
||||
|
|
||||
p.quiet.small {{cardsCount}} {{_ 'cards-count'}}
|
||||
span(class="cardCount") {{cardsCount}} {{_ 'cards-count'}}
|
||||
if isMiniScreen
|
||||
if currentList
|
||||
if isWatching
|
||||
|
||||
@@ -189,7 +189,9 @@ template(name="labelsWidget")
|
||||
each currentBoard.labels
|
||||
a.card-label(class="card-label-{{color}}"
|
||||
class="{{#if currentUser.isNotCommentOnly}}js-label{{/if}}")
|
||||
span.card-label-name= name
|
||||
span.card-label-name
|
||||
+viewer
|
||||
= name
|
||||
if currentUser.isBoardAdmin
|
||||
a.card-label.add-label.js-add-label
|
||||
i.fa.fa-plus
|
||||
|
||||
@@ -1,54 +1,56 @@
|
||||
template(name="archivesSidebar")
|
||||
+basicTabs(tabs=tabs)
|
||||
|
||||
+tabContent(slug="cards")
|
||||
p.quiet
|
||||
a.js-restore-all-cards {{_ 'restore-all'}}
|
||||
| -
|
||||
a.js-delete-all-cards {{_ 'delete-all'}}
|
||||
each archivedCards
|
||||
.minicard-wrapper.js-minicard
|
||||
+minicard(this)
|
||||
if currentUser.isBoardMember
|
||||
if isArchiveReady.get
|
||||
+basicTabs(tabs=tabs)
|
||||
+tabContent(slug="cards")
|
||||
p.quiet
|
||||
a.js-restore-card {{_ 'restore'}}
|
||||
a.js-restore-all-cards {{_ 'restore-all'}}
|
||||
| -
|
||||
a.js-delete-card {{_ 'delete'}}
|
||||
if cardIsInArchivedList
|
||||
p.quiet.small ({{_ 'warn-list-archived'}})
|
||||
else
|
||||
p.no-items-message {{_ 'no-archived-cards'}}
|
||||
|
||||
+tabContent(slug="lists")
|
||||
p.quiet
|
||||
a.js-restore-all-lists {{_ 'restore-all'}}
|
||||
| -
|
||||
a.js-delete-all-lists {{_ 'delete-all'}}
|
||||
ul.archived-lists
|
||||
each archivedLists
|
||||
li.archived-lists-item
|
||||
= title
|
||||
a.js-delete-all-cards {{_ 'delete-all'}}
|
||||
each archivedCards
|
||||
.minicard-wrapper.js-minicard
|
||||
+minicard(this)
|
||||
if currentUser.isBoardMember
|
||||
p.quiet
|
||||
a.js-restore-list {{_ 'restore'}}
|
||||
a.js-restore-card {{_ 'restore'}}
|
||||
| -
|
||||
a.js-delete-list {{_ 'delete'}}
|
||||
else
|
||||
li.no-items-message {{_ 'no-archived-lists'}}
|
||||
a.js-delete-card {{_ 'delete'}}
|
||||
if cardIsInArchivedList
|
||||
p.quiet.small ({{_ 'warn-list-archived'}})
|
||||
else
|
||||
p.no-items-message {{_ 'no-archived-cards'}}
|
||||
|
||||
+tabContent(slug="swimlanes")
|
||||
p.quiet
|
||||
a.js-restore-all-swimlanes {{_ 'restore-all'}}
|
||||
| -
|
||||
a.js-delete-all-swimlanes {{_ 'delete-all'}}
|
||||
ul.archived-lists
|
||||
each archivedSwimlanes
|
||||
li.archived-lists-item
|
||||
= title
|
||||
if currentUser.isBoardMember
|
||||
p.quiet
|
||||
a.js-restore-swimlane {{_ 'restore'}}
|
||||
| -
|
||||
a.js-delete-swimlane {{_ 'delete'}}
|
||||
else
|
||||
li.no-items-message {{_ 'no-archived-swimlanes'}}
|
||||
+tabContent(slug="lists")
|
||||
p.quiet
|
||||
a.js-restore-all-lists {{_ 'restore-all'}}
|
||||
| -
|
||||
a.js-delete-all-lists {{_ 'delete-all'}}
|
||||
ul.archived-lists
|
||||
each archivedLists
|
||||
li.archived-lists-item
|
||||
= title
|
||||
if currentUser.isBoardMember
|
||||
p.quiet
|
||||
a.js-restore-list {{_ 'restore'}}
|
||||
| -
|
||||
a.js-delete-list {{_ 'delete'}}
|
||||
else
|
||||
li.no-items-message {{_ 'no-archived-lists'}}
|
||||
|
||||
+tabContent(slug="swimlanes")
|
||||
p.quiet
|
||||
a.js-restore-all-swimlanes {{_ 'restore-all'}}
|
||||
| -
|
||||
a.js-delete-all-swimlanes {{_ 'delete-all'}}
|
||||
ul.archived-lists
|
||||
each archivedSwimlanes
|
||||
li.archived-lists-item
|
||||
= title
|
||||
if currentUser.isBoardMember
|
||||
p.quiet
|
||||
a.js-restore-swimlane {{_ 'restore'}}
|
||||
| -
|
||||
a.js-delete-swimlane {{_ 'delete'}}
|
||||
else
|
||||
li.no-items-message {{_ 'no-archived-swimlanes'}}
|
||||
else
|
||||
+spinner
|
||||
@@ -1,4 +1,26 @@
|
||||
const subManager = new SubsManager();
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
onCreated() {
|
||||
this.isArchiveReady = new ReactiveVar(false);
|
||||
|
||||
// The pattern we use to manually handle data loading is described here:
|
||||
// https://kadira.io/academy/meteor-routing-guide/content/subscriptions-and-data-management/using-subs-manager
|
||||
// XXX The boardId should be readed from some sort the component "props",
|
||||
// unfortunatly, Blaze doesn't have this notion.
|
||||
this.autorun(() => {
|
||||
const currentBoardId = Session.get('currentBoard');
|
||||
if (!currentBoardId)
|
||||
return;
|
||||
const handle = subManager.subscribe('board', currentBoardId, true);
|
||||
Tracker.nonreactive(() => {
|
||||
Tracker.autorun(() => {
|
||||
this.isArchiveReady.set( handle.ready() );
|
||||
});
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
tabs() {
|
||||
return [
|
||||
{ name: TAPi18n.__('cards'), slug: 'cards' },
|
||||
|
||||
@@ -6,7 +6,9 @@ template(name="customFieldsSidebar")
|
||||
div.minicard
|
||||
a.fa.fa-pencil.js-edit-custom-field.minicard-edit-button
|
||||
div.minicard-title
|
||||
| {{ name }} ({{ type }})
|
||||
+viewer
|
||||
=name
|
||||
| ({{ type }})
|
||||
|
||||
if currentUser.isBoardMember
|
||||
hr
|
||||
|
||||
@@ -239,6 +239,10 @@ services:
|
||||
# ==== CORS =====
|
||||
# CORS: Set Access-Control-Allow-Origin header.
|
||||
#- CORS=*
|
||||
# CORS_ALLOW_HEADERS: Set Access-Control-Allow-Headers header. "Authorization,Content-Type" is required for cross-origin use of the API.
|
||||
#- CORS_ALLOW_HEADERS=Authorization,Content-Type
|
||||
# CORS_EXPOSE_HEADERS: Set Access-Control-Expose-Headers header. This is not needed for typical CORS situations
|
||||
#- CORS_EXPOSE_HEADERS=*
|
||||
#-----------------------------------------------------------------
|
||||
# ==== MATOMO INTEGRATION ====
|
||||
# Optional: Integration with Matomo https://matomo.org that is installed to your server
|
||||
@@ -324,6 +328,10 @@ services:
|
||||
#- OAUTH2_USERINFO_ENDPOINT=/oauth/userinfo
|
||||
# OAuth2 Token Endpoint.
|
||||
#- OAUTH2_TOKEN_ENDPOINT=/oauth/token
|
||||
# OAUTH2 ID Token Whitelist Fields.
|
||||
#- OAUTH2_ID_TOKEN_WHITELIST_FIELDS=[]
|
||||
# OAUTH2 Request Permissions.
|
||||
#- OAUTH2_REQUEST_PERMISSIONS='openid profile email'
|
||||
# OAuth2 ID Mapping
|
||||
#- OAUTH2_ID_MAP=
|
||||
# OAuth2 Username Mapping
|
||||
|
||||
+30
-30
@@ -23,10 +23,10 @@
|
||||
"act-createCustomField": "creó el campo personalizado __customField__ en la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-createList": "añadida la lista __list__ al tablero __board__",
|
||||
"act-addBoardMember": "añadido el mimbro __member__ al tablero __board__",
|
||||
"act-archivedBoard": "El tablero __board__ se ha movido a Archivo",
|
||||
"act-archivedCard": "La tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__ se ha movido a Archivo",
|
||||
"act-archivedList": "La lista __list__ del carril __swimlane__ del tablero __board__ se ha movido a Archivo",
|
||||
"act-archivedSwimlane": "El carril __swimlane__ del tablero __board__ se ha movido a Archivo",
|
||||
"act-archivedBoard": "El tablero __board__ se ha archivado",
|
||||
"act-archivedCard": "La tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__ se ha archivado",
|
||||
"act-archivedList": "La lista __list__ del carril __swimlane__ del tablero __board__ se ha archivado",
|
||||
"act-archivedSwimlane": "El carril __swimlane__ del tablero __board__ se ha archivado",
|
||||
"act-importBoard": "importado el tablero __board__",
|
||||
"act-importCard": "importada la tarjeta __card__ a la lista __list__ del carrril __swimlane__ del tablero __board__",
|
||||
"act-importList": "importada la lista __list__ al carril __swimlane__ del tablero __board__",
|
||||
@@ -42,7 +42,7 @@
|
||||
"activities": "Actividades",
|
||||
"activity": "Actividad",
|
||||
"activity-added": "ha añadido %s a %s",
|
||||
"activity-archived": "%s movido a Archivo",
|
||||
"activity-archived": "%s se ha archivado",
|
||||
"activity-attached": "ha adjuntado %s a %s",
|
||||
"activity-created": "ha creado %s",
|
||||
"activity-customfield-created": "creó el campo personalizado %s",
|
||||
@@ -92,19 +92,19 @@
|
||||
"and-n-other-card_plural": "y otras __count__ tarjetas",
|
||||
"apply": "Aplicar",
|
||||
"app-is-offline": "Cargando, espera por favor. Refrescar esta página causará pérdida de datos. Si la carga no funciona, por favor comprueba que el servidor no se ha parado.",
|
||||
"archive": "Mover al Archivo",
|
||||
"archive-all": "Mover todo al Archivo",
|
||||
"archive-board": "Mover Tablero al Archivo",
|
||||
"archive-card": "Mover tarjeta al Archivo",
|
||||
"archive-list": "Mover Lista al Archivo",
|
||||
"archive-swimlane": "Mover carril al Archivo",
|
||||
"archive-selection": "Mover selección al Archivo",
|
||||
"archiveBoardPopup-title": "¿Mover Tablero al Archivo?",
|
||||
"archived-items": "Archivar",
|
||||
"archive": "Archivar",
|
||||
"archive-all": "Archivar todo",
|
||||
"archive-board": "Archivar este tablero",
|
||||
"archive-card": "Archivar esta tarjeta",
|
||||
"archive-list": "Archivar esta lista",
|
||||
"archive-swimlane": "Archivar este carril",
|
||||
"archive-selection": "Archivar esta selección",
|
||||
"archiveBoardPopup-title": "¿Archivar este tablero?",
|
||||
"archived-items": "Archivo",
|
||||
"archived-boards": "Tableros en Archivo",
|
||||
"restore-board": "Restaurar el tablero",
|
||||
"no-archived-boards": "No hay Tableros en el Archivo",
|
||||
"archives": "Archivar",
|
||||
"archives": "Archivo",
|
||||
"template": "Plantilla",
|
||||
"templates": "Plantillas",
|
||||
"assign-member": "Asignar miembros",
|
||||
@@ -133,8 +133,8 @@
|
||||
"board-view-lists": "Listas",
|
||||
"bucket-example": "Como “Cosas por hacer” por ejemplo",
|
||||
"cancel": "Cancelar",
|
||||
"card-archived": "Esta tarjeta se movió al Archivo",
|
||||
"board-archived": "Este tablero se movió al Archivo",
|
||||
"card-archived": "Se archivó esta tarjeta",
|
||||
"board-archived": "Se archivó este tablero",
|
||||
"card-comments-title": "Esta tarjeta tiene %s comentarios.",
|
||||
"card-delete-notice": "la eliminación es permanente. Perderás todas las acciones asociadas a esta tarjeta.",
|
||||
"card-delete-pop": "Se eliminarán todas las acciones del historial de actividades y no se podrá volver a abrir la tarjeta. Esta acción no puede deshacerse.",
|
||||
@@ -347,7 +347,7 @@
|
||||
"leave-board-pop": "¿Seguro que quieres abandonar __boardTitle__? Serás desvinculado de todas las tarjetas en este tablero.",
|
||||
"leaveBoardPopup-title": "¿Abandonar el tablero?",
|
||||
"link-card": "Enlazar a esta tarjeta",
|
||||
"list-archive-cards": "Mover todas las tarjetas de la lista al Archivo",
|
||||
"list-archive-cards": "Archivar todas las tarjetas de esta lista",
|
||||
"list-archive-cards-pop": "Esto eliminará del tablero todas las tarjetas en esta lista. Para ver las tarjetas en el Archivo y recuperarlas al tablero haga click en \"Menu\" > \"Archivo\"",
|
||||
"list-move-cards": "Mover todas las tarjetas de esta lista",
|
||||
"list-select-cards": "Seleccionar todas las tarjetas de esta lista",
|
||||
@@ -514,7 +514,7 @@
|
||||
"OS_Loadavg": "Carga media del sistema",
|
||||
"OS_Platform": "Plataforma del sistema",
|
||||
"OS_Release": "Publicación del sistema",
|
||||
"OS_Totalmem": "Memoria Total del sistema",
|
||||
"OS_Totalmem": "Memoria total del sistema",
|
||||
"OS_Type": "Tipo de sistema",
|
||||
"OS_Uptime": "Tiempo activo del sistema",
|
||||
"days": "días",
|
||||
@@ -528,8 +528,8 @@
|
||||
"no": "No",
|
||||
"accounts": "Cuentas",
|
||||
"accounts-allowEmailChange": "Permitir cambiar el correo electrónico",
|
||||
"accounts-allowUserNameChange": "Permitir el cambio del nombre de usuario",
|
||||
"createdAt": "Creado en",
|
||||
"accounts-allowUserNameChange": "Permitir cambiar el nombre de usuario",
|
||||
"createdAt": "Fecha de alta",
|
||||
"verified": "Verificado",
|
||||
"active": "Activo",
|
||||
"card-received": "Recibido",
|
||||
@@ -592,7 +592,7 @@
|
||||
"set-filter": "Filtrar",
|
||||
"r-moved-to": "Movido a",
|
||||
"r-moved-from": "Movido desde",
|
||||
"r-archived": "Movido a Archivo",
|
||||
"r-archived": "Se archivó",
|
||||
"r-unarchived": "Restaurado del archivo",
|
||||
"r-a-card": "una tarjeta",
|
||||
"r-when-a-label-is": "Cuando una etiqueta es",
|
||||
@@ -610,11 +610,11 @@
|
||||
"r-when-the-item": "Cuando el elemento de la lista de verificación es",
|
||||
"r-checked": "Marcado",
|
||||
"r-unchecked": "Desmarcado",
|
||||
"r-move-card-to": "Mover tarjeta a",
|
||||
"r-move-card-to": "Mover la tarjeta a",
|
||||
"r-top-of": "Arriba de",
|
||||
"r-bottom-of": "Abajo de",
|
||||
"r-its-list": "su lista",
|
||||
"r-archive": "Mover al Archivo",
|
||||
"r-archive": "Archivar",
|
||||
"r-unarchive": "Restaurar del Archivo",
|
||||
"r-card": "tarjeta",
|
||||
"r-add": "Añadir",
|
||||
@@ -635,15 +635,15 @@
|
||||
"r-to": "a",
|
||||
"r-subject": "asunto",
|
||||
"r-rule-details": "Detalle de la regla",
|
||||
"r-d-move-to-top-gen": "Mover tarjeta arriba de su lista",
|
||||
"r-d-move-to-top-spec": "Mover tarjeta arriba de la lista",
|
||||
"r-d-move-to-bottom-gen": "Mover tarjeta abajo de su lista",
|
||||
"r-d-move-to-bottom-spec": "Mover tarjeta al fondo de la lista",
|
||||
"r-d-move-to-top-gen": "Mover la tarjeta al inicio de su lista",
|
||||
"r-d-move-to-top-spec": "Mover la tarjeta al inicio de la lista",
|
||||
"r-d-move-to-bottom-gen": "Mover la tarjeta al final de su lista",
|
||||
"r-d-move-to-bottom-spec": "Mover la tarjeta al final de la lista",
|
||||
"r-d-send-email": "Enviar email",
|
||||
"r-d-send-email-to": "a",
|
||||
"r-d-send-email-subject": "asunto",
|
||||
"r-d-send-email-message": "mensaje",
|
||||
"r-d-archive": "Mover tarjeta al Archivo",
|
||||
"r-d-archive": "Archivar la tarjeta",
|
||||
"r-d-unarchive": "Restaurar tarjeta del Archivo",
|
||||
"r-d-add-label": "Añadir etiqueta",
|
||||
"r-d-remove-label": "Eliminar etiqueta",
|
||||
@@ -675,7 +675,7 @@
|
||||
"authentication-method": "Método de autenticación",
|
||||
"authentication-type": "Tipo de autenticación",
|
||||
"custom-product-name": "Nombre de producto personalizado",
|
||||
"layout": "Disñeo",
|
||||
"layout": "Diseño",
|
||||
"hide-logo": "Ocultar logo",
|
||||
"add-custom-html-after-body-start": "Añade HTML personalizado después de <body> ",
|
||||
"add-custom-html-before-body-end": "Añade HTML personalizado después de </body>",
|
||||
|
||||
+70
-70
@@ -83,7 +83,7 @@
|
||||
"added": "Lisätty",
|
||||
"addMemberPopup-title": "Jäsenet",
|
||||
"admin": "Ylläpitäjä",
|
||||
"admin-desc": "Voi nähfä ja muokata kortteja, poistaa jäseniä, ja muuttaa taulun asetuksia.",
|
||||
"admin-desc": "Voi nähdä ja muokata kortteja, poistaa jäseniä, ja muuttaa taulun asetuksia.",
|
||||
"admin-announcement": "Ilmoitus",
|
||||
"admin-announcement-active": "Aktiivinen järjestelmänlaajuinen ilmoitus",
|
||||
"admin-announcement-title": "Ilmoitus ylläpitäjältä",
|
||||
@@ -103,7 +103,7 @@
|
||||
"archived-items": "Arkisto",
|
||||
"archived-boards": "Taulut Arkistossa",
|
||||
"restore-board": "Palauta taulu",
|
||||
"no-archived-boards": "Ei tauluja Arkistossa",
|
||||
"no-archived-boards": "Ei tauluja Arkistossa.",
|
||||
"archives": "Arkisto",
|
||||
"template": "Malli",
|
||||
"templates": "Mallit",
|
||||
@@ -114,7 +114,7 @@
|
||||
"attachmentDeletePopup-title": "Poista liitetiedosto?",
|
||||
"attachments": "Liitetiedostot",
|
||||
"auto-watch": "Automaattisesti seuraa tauluja kun ne on luotu",
|
||||
"avatar-too-big": "Profiilikuva on liian suuri (70KB maksimi)",
|
||||
"avatar-too-big": "Profiilikuva on liian suuri (enintään 70 kt)",
|
||||
"back": "Takaisin",
|
||||
"board-change-color": "Muokkaa väriä",
|
||||
"board-nb-stars": "%s tähteä",
|
||||
@@ -125,9 +125,9 @@
|
||||
"boardChangeTitlePopup-title": "Nimeä taulu uudelleen",
|
||||
"boardChangeVisibilityPopup-title": "Muokkaa näkyvyyttä",
|
||||
"boardChangeWatchPopup-title": "Muokkaa seuraamista",
|
||||
"boardMenuPopup-title": "Taulu asetukset",
|
||||
"boardMenuPopup-title": "Tauluasetukset",
|
||||
"boards": "Taulut",
|
||||
"board-view": "Taulu näkymä",
|
||||
"board-view": "Taulunäkymä",
|
||||
"board-view-cal": "Kalenteri",
|
||||
"board-view-swimlanes": "Swimlanet",
|
||||
"board-view-lists": "Listat",
|
||||
@@ -136,8 +136,8 @@
|
||||
"card-archived": "Tämä kortti on siirretty Arkistoon.",
|
||||
"board-archived": "Tämä taulu on siirretty Arkistoon.",
|
||||
"card-comments-title": "Tässä kortissa on %s kommenttia.",
|
||||
"card-delete-notice": "Poistaminen on lopullista. Menetät kaikki toimet jotka on liitetty tähän korttiin.",
|
||||
"card-delete-pop": "Kaikki toimet poistetaan toimintasyötteestä ja et tule pystymään uudelleenavaamaan korttia. Tätä ei voi peruuttaa.",
|
||||
"card-delete-notice": "Poistaminen on lopullista. Menetät kaikki tähän korttiin liitetyt toimet.",
|
||||
"card-delete-pop": "Kaikki toimet poistetaan toimintasyötteestä, etkä pysty avata korttia uudelleen. Tätä ei voi peruuttaa.",
|
||||
"card-delete-suggest-archive": "Voit siirtää kortin Arkistoon poistaaksesi sen taululta ja säilyttääksesi toimintalokin.",
|
||||
"card-due": "Erääntyy",
|
||||
"card-due-on": "Erääntyy",
|
||||
@@ -154,14 +154,14 @@
|
||||
"cardCustomField-datePopup-title": "Muokkaa päivää",
|
||||
"cardCustomFieldsPopup-title": "Muokkaa mukautettuja kenttiä",
|
||||
"cardDeletePopup-title": "Poista kortti?",
|
||||
"cardDetailsActionsPopup-title": "Kortti toimet",
|
||||
"cardDetailsActionsPopup-title": "Korttitoimet",
|
||||
"cardLabelsPopup-title": "Tunnisteet",
|
||||
"cardMembersPopup-title": "Jäsenet",
|
||||
"cardMorePopup-title": "Lisää",
|
||||
"cardTemplatePopup-title": "Luo malli",
|
||||
"cards": "Kortit",
|
||||
"cards-count": "korttia",
|
||||
"casSignIn": "CAS kirjautuminen",
|
||||
"casSignIn": "CAS-kirjautuminen",
|
||||
"cardType-card": "Kortti",
|
||||
"cardType-linkedCard": "Linkitetty kortti",
|
||||
"cardType-linkedBoard": "Linkitetty taulu",
|
||||
@@ -182,7 +182,7 @@
|
||||
"clipboard": "Leikepöytä tai raahaa ja pudota",
|
||||
"close": "Sulje",
|
||||
"close-board": "Sulje taulu",
|
||||
"close-board-pop": "Voit palauttaa taulun klikkaamalla “Arkisto” painiketta taululistan yläpalkista.",
|
||||
"close-board-pop": "Voit palauttaa taulun klikkaamalla “Arkisto”-painiketta taululistan yläpalkista.",
|
||||
"color-black": "musta",
|
||||
"color-blue": "sininen",
|
||||
"color-crimson": "karmiininpunainen",
|
||||
@@ -216,14 +216,14 @@
|
||||
"no-comments": "Ei kommentteja",
|
||||
"no-comments-desc": "Ei voi nähdä kommentteja ja toimintaa.",
|
||||
"computer": "Tietokone",
|
||||
"confirm-subtask-delete-dialog": "Oletko varma että haluat poistaa alitehtävän?",
|
||||
"confirm-checklist-delete-dialog": "Oletko varma että haluat poistaa tarkistuslistan?",
|
||||
"confirm-subtask-delete-dialog": "Haluatko varmasti poistaa alitehtävän?",
|
||||
"confirm-checklist-delete-dialog": "Haluatko varmasti poistaa tarkistuslistan?",
|
||||
"copy-card-link-to-clipboard": "Kopioi kortin linkki leikepöydälle",
|
||||
"linkCardPopup-title": "Linkitä kortti",
|
||||
"searchElementPopup-title": "Etsi",
|
||||
"copyCardPopup-title": "Kopioi kortti",
|
||||
"copyChecklistToManyCardsPopup-title": "Kopioi tarkistuslistan malli monille korteille",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Kohde korttien otsikot ja kuvaukset JSON muodossa",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Kohde korttien otsikot ja kuvaukset JSON-muodossa",
|
||||
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Ensimmäisen kortin otsikko\", \"description\":\"Ensimmäisen kortin kuvaus\"}, {\"title\":\"Toisen kortin otsikko\",\"description\":\"Toisen kortin kuvaus\"},{\"title\":\"Viimeisen kortin otsikko\",\"description\":\"Viimeisen kortin kuvaus\"} ]",
|
||||
"create": "Luo",
|
||||
"createBoardPopup-title": "Luo taulu",
|
||||
@@ -237,7 +237,7 @@
|
||||
"custom-field-date": "Päivämäärä",
|
||||
"custom-field-dropdown": "Pudotusvalikko",
|
||||
"custom-field-dropdown-none": "(ei mitään)",
|
||||
"custom-field-dropdown-options": "Luettelon vaihtoehdot",
|
||||
"custom-field-dropdown-options": "Listan vaihtoehdot",
|
||||
"custom-field-dropdown-options-placeholder": "Paina Enter lisätäksesi lisää vaihtoehtoja",
|
||||
"custom-field-dropdown-unknown": "(tuntematon)",
|
||||
"custom-field-number": "Numero",
|
||||
@@ -245,13 +245,13 @@
|
||||
"custom-fields": "Mukautetut kentät",
|
||||
"date": "Päivämäärä",
|
||||
"decline": "Kieltäydy",
|
||||
"default-avatar": "Oletus profiilikuva",
|
||||
"default-avatar": "Oletusprofiilikuva",
|
||||
"delete": "Poista",
|
||||
"deleteCustomFieldPopup-title": "Poista mukautettu kenttä?",
|
||||
"deleteLabelPopup-title": "Poista tunniste?",
|
||||
"description": "Kuvaus",
|
||||
"disambiguateMultiLabelPopup-title": "Yksikäsitteistä tunniste toiminta",
|
||||
"disambiguateMultiMemberPopup-title": "Yksikäsitteistä jäsen toiminta",
|
||||
"disambiguateMultiLabelPopup-title": "Yksikäsitteistä tunnistetoiminta",
|
||||
"disambiguateMultiMemberPopup-title": "Yksikäsitteistä jäsentoiminta",
|
||||
"discard": "Hylkää",
|
||||
"done": "Valmis",
|
||||
"download": "Lataa",
|
||||
@@ -259,7 +259,7 @@
|
||||
"edit-avatar": "Muokkaa profiilikuvaa",
|
||||
"edit-profile": "Muokkaa profiilia",
|
||||
"edit-wip-limit": "Muokkaa WIP-rajaa",
|
||||
"soft-wip-limit": "Pehmeä WIP raja",
|
||||
"soft-wip-limit": "Pehmeä WIP-raja",
|
||||
"editCardStartDatePopup-title": "Muokkaa aloituspäivää",
|
||||
"editCardDueDatePopup-title": "Muokkaa eräpäivää",
|
||||
"editCustomFieldPopup-title": "Muokkaa kenttää",
|
||||
@@ -268,25 +268,25 @@
|
||||
"editNotificationPopup-title": "Muokkaa ilmoituksia",
|
||||
"editProfilePopup-title": "Muokkaa profiilia",
|
||||
"email": "Sähköposti",
|
||||
"email-enrollAccount-subject": "An account created for you on __siteName__",
|
||||
"email-enrollAccount-text": "Hei __user__,\n\nAlkaaksesi käyttämään palvelua, klikkaa allaolevaa linkkiä.\n\n__url__\n\nKiitos.",
|
||||
"email-enrollAccount-subject": "Sinulle on luotu tili palveluun __siteName__",
|
||||
"email-enrollAccount-text": "Hei __user__,\n\nKlikkaa alla olevaa linkkiä aloittaaksesi palvelun käytön.\n\n__url__\n\nKiitos.",
|
||||
"email-fail": "Sähköpostin lähettäminen epäonnistui",
|
||||
"email-fail-text": "Virhe yrittäessä lähettää sähköpostia",
|
||||
"email-invalid": "Virheellinen sähköposti",
|
||||
"email-invite": "Kutsu sähköpostilla",
|
||||
"email-invite-subject": "__inviter__ lähetti sinulle kutsun",
|
||||
"email-invite-text": "Hyvä __user__,\n\n__inviter__ kutsuu sinut liittymään taululle \"__board__\" yhteistyötä varten.\n\nOle hyvä ja seuraa allaolevaa linkkiä:\n\n__url__\n\nKiitos.",
|
||||
"email-resetPassword-subject": "Reset your password on __siteName__",
|
||||
"email-resetPassword-text": "Hei __user__,\n\nNollataksesi salasanasi, klikkaa allaolevaa linkkiä.\n\n__url__\n\nKiitos.",
|
||||
"email-invite-text": "Hyvä __user__,\n\n__inviter__ kutsuu sinut liittymään taululle \"__board__\" yhteistyötä varten.\n\nOle hyvä ja seuraa alla olevaa linkkiä:\n\n__url__\n\nKiitos.",
|
||||
"email-resetPassword-subject": "Nollaa salasanasi palvelussa __siteName__",
|
||||
"email-resetPassword-text": "Hei __user__,\n\nNollataksesi salasanasi, klikkaa alla olevaa linkkiä.\n\n__url__\n\nKiitos.",
|
||||
"email-sent": "Sähköposti lähetetty",
|
||||
"email-verifyEmail-subject": "Varmista sähköpostiosoitteesi osoitteessa __url__",
|
||||
"email-verifyEmail-text": "Hei __user__,\n\nvahvistaaksesi sähköpostiosoitteesi, klikkaa allaolevaa linkkiä.\n\n__url__\n\nKiitos.",
|
||||
"email-verifyEmail-text": "Hei __user__,\n\nvahvistaaksesi sähköpostiosoitteesi, klikkaa alla olevaa linkkiä.\n\n__url__\n\nKiitos.",
|
||||
"enable-wip-limit": "Ota käyttöön WIP-raja",
|
||||
"error-board-doesNotExist": "Tämä taulu ei ole olemassa",
|
||||
"error-board-doesNotExist": "Tätä taulua ei ole olemassa",
|
||||
"error-board-notAdmin": "Tehdäksesi tämän sinun täytyy olla tämän taulun ylläpitäjä",
|
||||
"error-board-notAMember": "Tehdäksesi tämän sinun täytyy olla tämän taulun jäsen",
|
||||
"error-json-malformed": "Tekstisi ei ole kelvollisessa JSON muodossa",
|
||||
"error-json-schema": "JSON tietosi ei sisällä oikeaa tietoa oikeassa muodossa",
|
||||
"error-json-malformed": "Tekstisi ei ole kelvollisessa JSON-muodossa",
|
||||
"error-json-schema": "JSON-tietosi ei sisällä oikeaa tietoa oikeassa muodossa",
|
||||
"error-list-doesNotExist": "Tätä listaa ei ole olemassa",
|
||||
"error-user-doesNotExist": "Tätä käyttäjää ei ole olemassa",
|
||||
"error-user-notAllowSelf": "Et voi kutsua itseäsi",
|
||||
@@ -316,14 +316,14 @@
|
||||
"import-board-c": "Tuo taulu",
|
||||
"import-board-title-trello": "Tuo taulu Trellosta",
|
||||
"import-board-title-wekan": "Tuo taulu edellisestä viennistä",
|
||||
"import-sandstorm-backup-warning": "Älä poista tietoja joita toit alkuperäisestä viennistä tai Trellosta ennenkuin tarkistat onnistuuko sulkea ja avata tämä jyvä uudelleen, vai näkyykö Board not found virhe, joka tarkoittaa tietojen häviämistä.",
|
||||
"import-sandstorm-warning": "Tuotu taulu poistaa kaikki olemassaolevan taulun tiedot ja korvaa ne tuodulla taululla.",
|
||||
"import-sandstorm-backup-warning": "Älä poista tietoja joita toit alkuperäisestä viennistä tai Trellosta ennen kuin tarkistat onnistuuko sulkea ja avata tämä jyvä uudelleen, vai näkyykö Board not found -virhe, joka tarkoittaa tietojen häviämistä.",
|
||||
"import-sandstorm-warning": "Tuotu taulu poistaa kaikki olemassa olevan taulun tiedot ja korvaa ne tuodulla taululla.",
|
||||
"from-trello": "Trellosta",
|
||||
"from-wekan": "Edellisestä viennistä",
|
||||
"import-board-instruction-trello": "Trello taulullasi, mene 'Menu', sitten 'More', 'Print and Export', 'Export JSON', ja kopioi tuloksena saamasi teksti",
|
||||
"import-board-instruction-trello": "Mene Trello-taulullasi 'Menu', sitten 'More', 'Print and Export', 'Export JSON', ja kopioi tuloksena saamasi teksti",
|
||||
"import-board-instruction-wekan": "Taulullasi, mene 'Valikko', sitten 'Vie taulu', ja kopioi teksti ladatusta tiedostosta.",
|
||||
"import-board-instruction-about-errors": "Jos virheitä tulee taulua tuotaessa, joskus tuonti silti toimii, ja taulu on Kaikki taulut sivulla.",
|
||||
"import-json-placeholder": "Liitä kelvollinen JSON tietosi tähän",
|
||||
"import-json-placeholder": "Liitä kelvollinen JSON-tietosi tähän",
|
||||
"import-map-members": "Vastaavat jäsenet",
|
||||
"import-members-map": "Tuomallasi taululla on muutamia jäseniä. Ole hyvä ja valitse tuomiasi jäseniä vastaavat käyttäjäsi",
|
||||
"import-show-user-mapping": "Tarkasta vastaavat jäsenet",
|
||||
@@ -345,17 +345,17 @@
|
||||
"last-admin-desc": "Et voi vaihtaa rooleja koska täytyy olla olemassa ainakin yksi ylläpitäjä.",
|
||||
"leave-board": "Jää pois taululta",
|
||||
"leave-board-pop": "Haluatko varmasti poistua taululta __boardTitle__? Sinut poistetaan kaikista tämän taulun korteista.",
|
||||
"leaveBoardPopup-title": "Jää pois taululta ?",
|
||||
"leaveBoardPopup-title": "Poistu taululta?",
|
||||
"link-card": "Linkki tähän korttiin",
|
||||
"list-archive-cards": "Siirrä kaikki tämän listan kortit Arkistoon",
|
||||
"list-archive-cards-pop": "Tämä poistaa kaikki tämän listan kortit taululta. Nähdäksesi Arkistossa olevat kortit ja tuodaksesi ne takaisin taululle, klikkaa “Valikko” > “Arkisto”.",
|
||||
"list-move-cards": "Siirrä kaikki kortit tässä listassa",
|
||||
"list-select-cards": "Valitse kaikki kortit tässä listassa",
|
||||
"set-color-list": "Aseta väri",
|
||||
"listActionPopup-title": "Listaa toimet",
|
||||
"swimlaneActionPopup-title": "Swimlane toimet",
|
||||
"listActionPopup-title": "Listatoimet",
|
||||
"swimlaneActionPopup-title": "Swimlane-toimet",
|
||||
"swimlaneAddPopup-title": "Lisää Swimlane alle",
|
||||
"listImportCardPopup-title": "Tuo Trello kortti",
|
||||
"listImportCardPopup-title": "Tuo Trello-kortti",
|
||||
"listMorePopup-title": "Lisää",
|
||||
"link-list": "Linkki tähän listaan",
|
||||
"list-delete-pop": "Kaikki toimet poistetaan toimintasyötteestä ja listan poistaminen on lopullista. Tätä ei pysty peruuttamaan.",
|
||||
@@ -365,7 +365,7 @@
|
||||
"log-out": "Kirjaudu ulos",
|
||||
"log-in": "Kirjaudu sisään",
|
||||
"loginPopup-title": "Kirjaudu sisään",
|
||||
"memberMenuPopup-title": "Jäsen asetukset",
|
||||
"memberMenuPopup-title": "Jäsenasetukset",
|
||||
"members": "Jäsenet",
|
||||
"menu": "Valikko",
|
||||
"move-selection": "Siirrä valinta",
|
||||
@@ -390,7 +390,7 @@
|
||||
"notify-watch": "Vastaanota päivityksiä kaikilta tauluilta, listoilta tai korteilta joita seuraat.",
|
||||
"optional": "valinnainen",
|
||||
"or": "tai",
|
||||
"page-maybe-private": "Tämä sivu voi olla yksityinen. Voit ehkä pystyä näkemään sen <a href='%s'>kirjautumalla sisään</a>.",
|
||||
"page-maybe-private": "Tämä sivu voi olla yksityinen. Saatat nähdä sen <a href='%s'>kirjautumalla sisään</a>.",
|
||||
"page-not-found": "Sivua ei löytynyt.",
|
||||
"password": "Salasana",
|
||||
"paste-or-dragdrop": "liittääksesi, tai vedä & pudota kuvatiedosto siihen (vain kuva)",
|
||||
@@ -407,7 +407,7 @@
|
||||
"remove-cover": "Poista kansi",
|
||||
"remove-from-board": "Poista taululta",
|
||||
"remove-label": "Poista tunniste",
|
||||
"listDeletePopup-title": "Poista lista ?",
|
||||
"listDeletePopup-title": "Poista lista?",
|
||||
"remove-member": "Poista jäsen",
|
||||
"remove-member-from-card": "Poista kortilta",
|
||||
"remove-member-pop": "Poista __name__ (__username__) taululta __boardTitle__? Jäsen poistetaan kaikilta taulun korteilta. Heille lähetetään ilmoitus.",
|
||||
@@ -419,7 +419,7 @@
|
||||
"search": "Etsi",
|
||||
"rules": "Säännöt",
|
||||
"search-cards": "Etsi korttien otsikoista ja kuvauksista tällä taululla",
|
||||
"search-example": "Teksti jota etsitään?",
|
||||
"search-example": "Etsittävä teksti?",
|
||||
"select-color": "Valitse väri",
|
||||
"set-wip-limit-value": "Aseta tämän listan tehtävien enimmäismäärä",
|
||||
"setWipLimitPopup-title": "Aseta WIP-raja",
|
||||
@@ -429,9 +429,9 @@
|
||||
"shortcut-clear-filters": "Poista kaikki suodattimet",
|
||||
"shortcut-close-dialog": "Sulje valintaikkuna",
|
||||
"shortcut-filter-my-cards": "Suodata korttini",
|
||||
"shortcut-show-shortcuts": "Tuo esiin tämä pikavalinta lista",
|
||||
"shortcut-toggle-filterbar": "Muokkaa suodatus sivupalkin näkyvyyttä",
|
||||
"shortcut-toggle-sidebar": "Muokkaa taulu sivupalkin näkyvyyttä",
|
||||
"shortcut-show-shortcuts": "Tuo esiin tämä pikavalintalista",
|
||||
"shortcut-toggle-filterbar": "Muokkaa suodatussivupalkin näkyvyyttä",
|
||||
"shortcut-toggle-sidebar": "Muokkaa taulusivupalkin näkyvyyttä",
|
||||
"show-cards-minimum-count": "Näytä korttien lukumäärä jos lista sisältää enemmän kuin",
|
||||
"sidebar-open": "Avaa sivupalkki",
|
||||
"sidebar-close": "Sulje sivupalkki",
|
||||
@@ -446,8 +446,8 @@
|
||||
"spent-time-hours": "Käytetty aika (tuntia)",
|
||||
"overtime-hours": "Ylityö (tuntia)",
|
||||
"overtime": "Ylityö",
|
||||
"has-overtime-cards": "Sisältää ylityö kortteja",
|
||||
"has-spenttime-cards": "Sisältää käytetty aika kortteja",
|
||||
"has-overtime-cards": "Sisältää ylityökortteja",
|
||||
"has-spenttime-cards": "Sisältää käytetty aika -kortteja",
|
||||
"time": "Aika",
|
||||
"title": "Otsikko",
|
||||
"tracking": "Ilmoitukset",
|
||||
@@ -465,13 +465,13 @@
|
||||
"watch": "Seuraa",
|
||||
"watching": "Seurataan",
|
||||
"watching-info": "Sinulle ilmoitetaan tämän taulun muutoksista",
|
||||
"welcome-board": "Tervetuloa taulu",
|
||||
"welcome-board": "Tervetuloa-taulu",
|
||||
"welcome-swimlane": "Merkkipaalu 1",
|
||||
"welcome-list1": "Perusasiat",
|
||||
"welcome-list2": "Edistynyt",
|
||||
"card-templates-swimlane": "Kortti mallit",
|
||||
"list-templates-swimlane": "Lista mallit",
|
||||
"board-templates-swimlane": "Taulu mallit",
|
||||
"card-templates-swimlane": "Korttimallit",
|
||||
"list-templates-swimlane": "Listamallit",
|
||||
"board-templates-swimlane": "Taulumallit",
|
||||
"what-to-do": "Mitä haluat tehdä?",
|
||||
"wipLimitErrorPopup-title": "Virheellinen WIP-raja",
|
||||
"wipLimitErrorPopup-dialog-pt1": "Tässä listassa olevien tehtävien määrä on korkeampi kuin asettamasi WIP-raja.",
|
||||
@@ -480,36 +480,36 @@
|
||||
"settings": "Asetukset",
|
||||
"people": "Ihmiset",
|
||||
"registration": "Rekisteröinti",
|
||||
"disable-self-registration": "Poista käytöstä itse-rekisteröityminen",
|
||||
"disable-self-registration": "Poista käytöstä itserekisteröityminen",
|
||||
"invite": "Kutsu",
|
||||
"invite-people": "Kutsu ihmisiä",
|
||||
"to-boards": "Taulu(i)lle",
|
||||
"email-addresses": "Sähköpostiosoite",
|
||||
"smtp-host-description": "SMTP palvelimen osoite jolla sähköpostit lähetetään.",
|
||||
"smtp-port-description": "Portti jota STMP palvelimesi käyttää lähteville sähköposteille.",
|
||||
"smtp-tls-description": "Ota käyttöön TLS tuki SMTP palvelimelle",
|
||||
"smtp-host": "SMTP isäntä",
|
||||
"smtp-port": "SMTP portti",
|
||||
"smtp-host-description": "SMTP-palvelimen osoite jolla sähköpostit lähetetään.",
|
||||
"smtp-port-description": "STMP-palvelimesi käyttämä lähteville sähköposteille tarkoitettu portti.",
|
||||
"smtp-tls-description": "Ota käyttöön TLS-tuki SMTP-palvelimelle",
|
||||
"smtp-host": "SMTP-isäntä",
|
||||
"smtp-port": "SMTP-portti",
|
||||
"smtp-username": "Käyttäjätunnus",
|
||||
"smtp-password": "Salasana",
|
||||
"smtp-tls": "TLS tuki",
|
||||
"smtp-tls": "TLS-tuki",
|
||||
"send-from": "Lähettäjä",
|
||||
"send-smtp-test": "Lähetä testi sähköposti itsellesi",
|
||||
"send-smtp-test": "Lähetä testisähköposti itsellesi",
|
||||
"invitation-code": "Kutsukoodi",
|
||||
"email-invite-register-subject": "__inviter__ lähetti sinulle kutsun",
|
||||
"email-invite-register-text": "Hei __user__,\n\n__inviter__ kutsuu sinut mukaan kanban taulun käyttöön.\n\nOle hyvä ja seuraa allaolevaa linkkiä:\n__url__\n\nJa kutsukoodisi on: __icode__\n\nKiitos.",
|
||||
"email-smtp-test-subject": "SMTP testi sähköposti",
|
||||
"email-invite-register-text": "Hei __user__,\n\n__inviter__ kutsuu sinut mukaan kanban-taulun käyttöön.\n\nOle hyvä ja seuraa alla olevaa linkkiä:\n__url__\n\nKutsukoodisi on: __icode__\n\nKiitos.",
|
||||
"email-smtp-test-subject": "SMTP-testisähköposti",
|
||||
"email-smtp-test-text": "Olet onnistuneesti lähettänyt sähköpostin",
|
||||
"error-invitation-code-not-exist": "Kutsukoodi ei ole olemassa",
|
||||
"error-invitation-code-not-exist": "Kutsukoodia ei ole olemassa",
|
||||
"error-notAuthorized": "Sinulla ei ole oikeutta tarkastella tätä sivua.",
|
||||
"outgoing-webhooks": "Lähtevät Webkoukut",
|
||||
"outgoingWebhooksPopup-title": "Lähtevät Webkoukut",
|
||||
"boardCardTitlePopup-title": "Kortin otsikko suodatin",
|
||||
"boardCardTitlePopup-title": "Kortin otsikkosuodatin",
|
||||
"new-outgoing-webhook": "Uusi lähtevä Webkoukku",
|
||||
"no-name": "(Tuntematon)",
|
||||
"Node_version": "Node versio",
|
||||
"Node_version": "Node-versio",
|
||||
"OS_Arch": "Käyttöjärjestelmän arkkitehtuuri",
|
||||
"OS_Cpus": "Käyttöjärjestelmän CPU määrä",
|
||||
"OS_Cpus": "Käyttöjärjestelmän CPU-määrä",
|
||||
"OS_Freemem": "Käyttöjärjestelmän vapaa muisti",
|
||||
"OS_Loadavg": "Käyttöjärjestelmän kuorman keskiarvo",
|
||||
"OS_Platform": "Käyttöjärjestelmäalusta",
|
||||
@@ -548,13 +548,13 @@
|
||||
"delete-board-confirm-popup": "Kaikki listat, kortit, tunnisteet ja toimet poistetaan ja et pysty palauttamaan taulun sisältöä. Tätä ei voi peruuttaa.",
|
||||
"boardDeletePopup-title": "Poista taulu?",
|
||||
"delete-board": "Poista taulu",
|
||||
"default-subtasks-board": "Alitehtävät __board__ taululle",
|
||||
"default-subtasks-board": "Alitehtävät taululle __board__",
|
||||
"default": "Oletus",
|
||||
"queue": "Jono",
|
||||
"subtask-settings": "Alitehtävä asetukset",
|
||||
"boardSubtaskSettingsPopup-title": "Taulu alitehtävien asetukset",
|
||||
"subtask-settings": "Alitehtävä-asetukset",
|
||||
"boardSubtaskSettingsPopup-title": "Taulualitehtävien asetukset",
|
||||
"show-subtasks-field": "Korteilla voi olla alitehtäviä",
|
||||
"deposit-subtasks-board": "Tallenta alitehtävät tälle taululle:",
|
||||
"deposit-subtasks-board": "Talleta alitehtävät tälle taululle:",
|
||||
"deposit-subtasks-list": "Laskeutumislista alatehtäville tallennettu tänne:",
|
||||
"show-parent-in-minicard": "Näytä ylätehtävä minikortilla:",
|
||||
"prefix-with-full-path": "Etuliite koko polulla",
|
||||
@@ -562,7 +562,7 @@
|
||||
"subtext-with-full-path": "Aliteksti koko polulla",
|
||||
"subtext-with-parent": "Aliteksti ylätehtävällä",
|
||||
"change-card-parent": "Muuta kortin ylätehtävää",
|
||||
"parent-card": "Ylätehtävä kortti",
|
||||
"parent-card": "Ylätehtäväkortti",
|
||||
"source-board": "Lähdetaulu",
|
||||
"no-parent": "Älä näytä ylätehtävää",
|
||||
"activity-added-label": "lisätty tunniste '%s' kohteeseen %s",
|
||||
@@ -576,7 +576,7 @@
|
||||
"r-rule": "Sääntö",
|
||||
"r-add-trigger": "Lisää liipaisin",
|
||||
"r-add-action": "Lisää toimi",
|
||||
"r-board-rules": "Taulu säännöt",
|
||||
"r-board-rules": "Taulusäännöt",
|
||||
"r-add-rule": "Lisää sääntö",
|
||||
"r-view-rule": "Näytä sääntö",
|
||||
"r-delete-rule": "Poista sääntö",
|
||||
@@ -682,10 +682,10 @@
|
||||
"error-undefined": "Jotain meni pieleen",
|
||||
"error-ldap-login": "Virhe tapahtui yrittäessä kirjautua sisään",
|
||||
"display-authentication-method": "Näytä kirjautumistapa",
|
||||
"default-authentication-method": "Oletus kirjautumistapa",
|
||||
"default-authentication-method": "Oletuskirjautumistapa",
|
||||
"duplicate-board": "Tee kaksoiskappale taulusta",
|
||||
"people-number": "Ihmisten määrä on:",
|
||||
"swimlaneDeletePopup-title": "Poista Swimlane ?",
|
||||
"swimlaneDeletePopup-title": "Poista Swimlane?",
|
||||
"swimlane-delete-pop": "Kaikki toimet poistetaan toimintasyötteestä ja swimlanen poistaminen on lopullista. Tätä ei pysty peruuttamaan.",
|
||||
"restore-all": "Palauta kaikki",
|
||||
"delete-all": "Poista kaikki",
|
||||
|
||||
+2
-2
@@ -685,9 +685,9 @@
|
||||
"default-authentication-method": "Metodo di autenticazione predefinito",
|
||||
"duplicate-board": "Duplica bacheca",
|
||||
"people-number": "Il numero di persone è:",
|
||||
"swimlaneDeletePopup-title": "Delete Swimlane ?",
|
||||
"swimlaneDeletePopup-title": "Cancella diagramma swimlane ?",
|
||||
"swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
|
||||
"restore-all": "Restore all",
|
||||
"delete-all": "Delete all",
|
||||
"delete-all": "Cancella tutto",
|
||||
"loading": "Loading, please wait."
|
||||
}
|
||||
+315
-315
@@ -1,160 +1,160 @@
|
||||
{
|
||||
"accept": "Aceitar",
|
||||
"act-activity-notify": "Notificação de Actividade",
|
||||
"act-addAttachment": "adicionado anexo __attachment__ ao cartão __card__ na lista __list__ em pista __swimlane__ no quadro __board__",
|
||||
"act-deleteAttachment": "excluido anexo __attachment__ do cartão __card__ na lista __list__ em pista __swimlane__ no quadro __board__",
|
||||
"act-addSubtask": "adicionada sub-tarefa __subtask__ ao cartão __card__ na lista __list__ em pista __swimlane__ no quadro __board__",
|
||||
"act-addLabel": "Adicionada etiqueta __label__ ao cartão __card__ na lista __list__ em pista __swimlane__ no quadro __board__",
|
||||
"act-addedLabel": "Adicionada etiqueta __label__ ao cartão __card__ na lista __list__ em pista __swimlane__ no quadro __board__",
|
||||
"act-removeLabel": "Removida etiqueta __label__ do cartão __card__ na lista __list__ em pista __swimlane__ no quadro __board__",
|
||||
"act-removedLabel": "Removida etiqueta __label__ do cartão __card__ na lista __list__ em pista __swimlane__ no quadro __board__",
|
||||
"act-addChecklist": "adicionada lista de verificação __checklist__ ao cartão __card__ na lista __list__ em pista __swimlane__ no quadro __board__",
|
||||
"act-addChecklistItem": "adicionado o item __checklistItem__ a lista de verificação__checklist__ no cartão __card__ na lista __list__ em pista __swimlane__ no quadro __board__",
|
||||
"act-removeChecklist": "emovida a lista de verificação __checklist__ do cartão __card__ na lista __list__ em pista __swimlane__ no quadro __board__",
|
||||
"act-removeChecklistItem": "removido item __checklistItem__ da lista de verificação __checkList__ no cartão __card__ na lista __list__ em pista __swimlane__ no quadro __board__",
|
||||
"act-checkedItem": "marcado __checklistItem__ na lista de verificação __checklist__ no cartão __card__ na lista __list__ em pista __swimlane__ no quadro __board__",
|
||||
"act-uncheckedItem": "desmarcado __checklistItem__ na lista __checklist__ no cartão __card__ na lista __list__ em pista __swimlane__ no quadro __board__",
|
||||
"act-completeChecklist": "completada a lista de verificação __checklist__ no cartão __card__ na lista __list__ em pista __swimlane__ no quadro __board__",
|
||||
"act-uncompleteChecklist": "lista de verificação incompleta __checklist__ no cartão __card__ na lista __list__ em pista __swimlane__ no quadro __board__",
|
||||
"act-addComment": "comentou no cartão __card__: __comment__ na lista __list__ em pista __swimlane__ no quadro __board__",
|
||||
"act-createBoard": "criado quadro __board__",
|
||||
"act-createSwimlane": "criada a pista __swimlane__ no quadro __board__",
|
||||
"act-createCard": "criado cartão __card__ na lista __list__ em pista __swimlane__ no quadro __board__",
|
||||
"act-createCustomField": "criado campo personalizado __customField__ no cartão __card__ na lista __list__ em pista __swimlane__ no quadro __board__",
|
||||
"act-createList": "adicionada lista __list__ ao quadro __board__",
|
||||
"act-addBoardMember": "adicionado membro __member__ ao quadro __board__",
|
||||
"act-archivedBoard": "Quadro __board__ foi Arquivado",
|
||||
"act-archivedCard": "Cartão __card__ na lista __list__ em pista __swimlane__ no quadro __board__ foi Arquivado",
|
||||
"act-archivedList": "Lista __list__ em pista __swimlane__ no quadro __board__ foi Arquivada",
|
||||
"act-archivedSwimlane": "Pista __swimlane__ no quadro __board__ foi Arquivada",
|
||||
"act-importBoard": "importado quadro __board__",
|
||||
"act-importCard": "importado cartão __card__ para lista __list__ em pista __swimlane__ no quadro __board__",
|
||||
"act-importList": "importada lista __list__ para pista __swimlane__ no quadro __board__",
|
||||
"act-joinMember": "adicionado membro __member__ ao cartão __card__ na lista __list__ em pista __swimlane__ no quadro __board__",
|
||||
"act-moveCard": "movido cartão __card__ do quadro __board__ da pista __oldSwimlane__ da lista __oldList__ para a pista __swimlane__ na lista __list__",
|
||||
"act-moveCardToOtherBoard": "movido cartão __card__ da lista __oldList__ em pista __oldSwimlane__ no quadro __oldBoard__ para lista __list__ em pista __swimlane__ no quadro __board__",
|
||||
"act-removeBoardMember": "removido membro __member__ do quadro __board__",
|
||||
"act-restoredCard": "restaurado cartão __card__ a lista __list__ em pista __swimlane__ no quadro __board__",
|
||||
"act-unjoinMember": "removido membro __member__ do cartão __card__ na lista __list__ em pista __swimlane__ no quadro __board__",
|
||||
"act-addAttachment": "adicionou o anexo __attachment__ ao cartão __card__ na lista __list__ na pista __swimlane__ no quadro __board__",
|
||||
"act-deleteAttachment": "apagou o anexo __attachment__ do cartão __card__ na lista __list__ na pista __swimlane__ no quadro __board__",
|
||||
"act-addSubtask": "adicionou a sub-tarefa __subtask__ ao cartão __card__ na lista __list__ na pista __swimlane__ no quadro __board__",
|
||||
"act-addLabel": "Adicionou a etiqueta __label__ ao cartão __card__ na lista __list__ na pista __swimlane__ no quadro __board__",
|
||||
"act-addedLabel": "Adicionou a etiqueta __label__ ao cartão __card__ na lista __list__ na pista __swimlane__ no quadro __board__",
|
||||
"act-removeLabel": "Removeu a etiqueta __label__ do cartão __card__ na lista __list__ na pista __swimlane__ no quadro __board__",
|
||||
"act-removedLabel": "Removeu a etiqueta __label__ do cartão __card__ na lista __list__ na pista __swimlane__ no quadro __board__",
|
||||
"act-addChecklist": "adicionoua lista de verificação __checklist__ ao cartão __card__ na lista __list__ na pista __swimlane__ no quadro __board__",
|
||||
"act-addChecklistItem": "adicionou o item __checklistItem__ à lista de verificação __checklist__ no cartão __card__ na lista __list__ na pista __swimlane__ no quadro __board__",
|
||||
"act-removeChecklist": "removeu a lista de verificação __checklist__ do cartão __card__ na lista __list__ na pista __swimlane__ no quadro __board__",
|
||||
"act-removeChecklistItem": "removeu o item __checklistItem__ da lista de verificação __checkList__ no cartão __card__ na lista __list__ na pista __swimlane__ no quadro __board__",
|
||||
"act-checkedItem": "marcou __checklistItem__ na lista de verificação __checklist__ no cartão __card__ na lista __list__ na pista __swimlane__ no quadro __board__",
|
||||
"act-uncheckedItem": "desmarcou __checklistItem__ na lista de verificação __checklist__ no cartão __card__ na lista __list__ na pista __swimlane__ no quadro __board__",
|
||||
"act-completeChecklist": "completou a lista de verificação __checklist__ no cartão __card__ na lista __list__ na pista __swimlane__ no quadro __board__",
|
||||
"act-uncompleteChecklist": "descompletou a lista de verificação __checklist__ no cartão __card__ na lista __list__ na pista __swimlane__ no quadro __board__",
|
||||
"act-addComment": "comentou no cartão __card__: __comment__ na lista __list__ na pista __swimlane__ no quadro __board__",
|
||||
"act-createBoard": "criou o quadro __board__",
|
||||
"act-createSwimlane": "criou a pista __swimlane__ no quadro __board__",
|
||||
"act-createCard": "criou o cartão __card__ na lista __list__ na pista __swimlane__ no quadro __board__",
|
||||
"act-createCustomField": "criou o campo personalizado __customField__ no cartão __card__ na lista __list__ na pista __swimlane__ no quadro __board__",
|
||||
"act-createList": "adicionou a lista __list__ ao quadro __board__",
|
||||
"act-addBoardMember": "adicionou o membro __member__ ao quadro __board__",
|
||||
"act-archivedBoard": "O quadro __board__ foi movido para o Arquivo",
|
||||
"act-archivedCard": "O cartão __card__ na lista __list__ na pista __swimlane__ no quadro __board__ foi movido para o Arquivo",
|
||||
"act-archivedList": "A lista __list__ na pista __swimlane__ no quadro __board__ foi movida para o Arquivo",
|
||||
"act-archivedSwimlane": "A pista __swimlane__ no quadro __board__ foi movida para o Arquivo",
|
||||
"act-importBoard": "importou o quadro __board__",
|
||||
"act-importCard": "importou o cartão __card__ para a lista __list__ na pista __swimlane__ no quadro __board__",
|
||||
"act-importList": "importou a lista __list__ para pista __swimlane__ no quadro __board__",
|
||||
"act-joinMember": "adicionou o membro __member__ ao cartão __card__ na lista __list__ na pista __swimlane__ no quadro __board__",
|
||||
"act-moveCard": "moveu o cartão __card__ do quadro __board__ da pista __oldSwimlane__ da lista __oldList__ para a pista __swimlane__ na lista __list__",
|
||||
"act-moveCardToOtherBoard": "moveuo cartão __card__ da lista __oldList__ na pista __oldSwimlane__ no quadro __oldBoard__ para a lista __list__ na pista __swimlane__ no quadro __board__",
|
||||
"act-removeBoardMember": "removeuo membro __member__ do quadro __board__",
|
||||
"act-restoredCard": "restaurou o cartão __card__ para a lista __list__ na pista __swimlane__ no quadro __board__",
|
||||
"act-unjoinMember": "removeu o membro __member__ do cartão __card__ na lista __list__ na pista __swimlane__ no quadro __board__",
|
||||
"act-withBoardTitle": "__board__",
|
||||
"act-withCardTitle": "[__board__] __card__",
|
||||
"actions": "Ações",
|
||||
"activities": "Atividades",
|
||||
"activity": "Atividade",
|
||||
"actions": "Acções",
|
||||
"activities": "Actividades",
|
||||
"activity": "Actividade",
|
||||
"activity-added": "adicionou %s a %s",
|
||||
"activity-archived": "%s foi Arquivado",
|
||||
"activity-archived": "%s foi movido para o Arquivo",
|
||||
"activity-attached": "anexou %s a %s",
|
||||
"activity-created": "criou %s",
|
||||
"activity-customfield-created": "criado campo personalizado %s",
|
||||
"activity-customfield-created": "criado o campo personalizado %s",
|
||||
"activity-excluded": "excluiu %s de %s",
|
||||
"activity-imported": "importado %s em %s de %s",
|
||||
"activity-imported-board": "importado %s de %s",
|
||||
"activity-imported": "importou %s para %s de %s",
|
||||
"activity-imported-board": "importou %s de %s",
|
||||
"activity-joined": "juntou-se a %s",
|
||||
"activity-moved": "moveu %s de %s para %s",
|
||||
"activity-on": "em %s",
|
||||
"activity-removed": "removeu %s de %s",
|
||||
"activity-sent": "enviou %s de %s",
|
||||
"activity-sent": "enviou %s para %s",
|
||||
"activity-unjoined": "saiu de %s",
|
||||
"activity-subtask-added": "Adicionar sub-tarefa à",
|
||||
"activity-checked-item": "marcado %s na lista de verificação %s de %s",
|
||||
"activity-unchecked-item": "desmarcado %s na lista de verificação %s de %s",
|
||||
"activity-checklist-added": "Adicionada lista de verificação a %s",
|
||||
"activity-checklist-removed": "removida a lista de verificação de %s",
|
||||
"activity-checklist-completed": "completada a lista de verificação __checklist__ no cartão __card__ na lista __list__ em pista __swimlane__ no quadro __board__",
|
||||
"activity-checklist-uncompleted": "não-completada a lista de verificação %s de %s",
|
||||
"activity-checklist-item-added": "adicionado o item de lista de verificação para '%s' em %s",
|
||||
"activity-checklist-item-removed": "removida o item de lista de verificação de '%s' na %s",
|
||||
"add": "Novo",
|
||||
"activity-checked-item-card": "marcado %s na lista de verificação %s",
|
||||
"activity-unchecked-item-card": "desmarcado %s na lista de verificação %s",
|
||||
"activity-checklist-completed-card": "completada a lista de verificação __checklist__ no cartão __card__ na lista __list__ em pista __swimlane__ no quadro __board__",
|
||||
"activity-checklist-uncompleted-card": "não-completada a lista de verificação %s",
|
||||
"add-attachment": "Adicionar Anexos",
|
||||
"activity-subtask-added": "adicionou a sub-tarefa a",
|
||||
"activity-checked-item": "marcou %s na lista de verificação %s de %s",
|
||||
"activity-unchecked-item": "desmarcou %s na lista de verificação %s de %s",
|
||||
"activity-checklist-added": "adicionou a lista de verificação a %s",
|
||||
"activity-checklist-removed": "removeu a lista de verificação de %s",
|
||||
"activity-checklist-completed": "completou a lista de verificação __checklist__ no cartão __card__ na lista __list__ na pista __swimlane__ no quadro __board__",
|
||||
"activity-checklist-uncompleted": "descompletou a lista de verificação %s de %s",
|
||||
"activity-checklist-item-added": "adicionou o item a '%s' em %s",
|
||||
"activity-checklist-item-removed": "removeu o item de '%s' na %s",
|
||||
"add": "Adicionar",
|
||||
"activity-checked-item-card": "marcou %s na lista de verificação %s",
|
||||
"activity-unchecked-item-card": "desmarcou %s na lista de verificação %s",
|
||||
"activity-checklist-completed-card": "completou a lista de verificação __checklist__ no cartão __card__ na lista __list__ na pista __swimlane__ no quadro __board__",
|
||||
"activity-checklist-uncompleted-card": "descompletou a lista de verificação %s",
|
||||
"add-attachment": "Adicionar Anexo",
|
||||
"add-board": "Adicionar Quadro",
|
||||
"add-card": "Adicionar Cartão",
|
||||
"add-swimlane": "Adicionar Pista",
|
||||
"add-subtask": "Adicionar sub-tarefa",
|
||||
"add-checklist": "Adicionar lista de verificação",
|
||||
"add-subtask": "Adicionar Sub-tarefa",
|
||||
"add-checklist": "Adicionar Lista de Verificação",
|
||||
"add-checklist-item": "Adicionar um item à lista de verificação",
|
||||
"add-cover": "Adicionar Capa",
|
||||
"add-label": "Adicionar Etiqueta",
|
||||
"add-list": "Adicionar Lista",
|
||||
"add-members": "Adicionar Membros",
|
||||
"added": "Criado",
|
||||
"added": "Adicionado",
|
||||
"addMemberPopup-title": "Membros",
|
||||
"admin": "Administrador",
|
||||
"admin-desc": "Pode ver e editar cartões, remover membros e alterar configurações do quadro.",
|
||||
"admin-announcement": "Anúncio",
|
||||
"admin-announcement-active": "Anúncio ativo em todo o sistema",
|
||||
"admin-announcement-active": "Anúncio Activo em Todo o Sistema",
|
||||
"admin-announcement-title": "Anúncio do Administrador",
|
||||
"all-boards": "Todos os quadros",
|
||||
"and-n-other-card": "E __count__ outro cartão",
|
||||
"and-n-other-card_plural": "E __count__ outros cartões",
|
||||
"apply": "Aplicar",
|
||||
"app-is-offline": "A carregar, por favor espere. Atualizar a página causará perda de dados. Se a carga não funcionar, por favor verifique se o servidor não caiu.",
|
||||
"app-is-offline": "A carregar, por favor aguarde. Actualizar a página causará perda de dados. Se o carregamento não funcionar, por favor verifique se o servidor não parou.",
|
||||
"archive": "Mover para o Arquivo",
|
||||
"archive-all": "Mover Tudo para o Arquivo",
|
||||
"archive-board": "Mover Quadro para o Arquivo",
|
||||
"archive-card": "Mover Cartão para o Arquivo",
|
||||
"archive-list": "Mover Lista para o Arquivo",
|
||||
"archive-swimlane": "Mover Pista para Arquivo",
|
||||
"archive-selection": "Mover seleção para o Arquivo",
|
||||
"archiveBoardPopup-title": "Mover Quadro para o Arquivo?",
|
||||
"archive-board": "Mover o Quadro para o Arquivo",
|
||||
"archive-card": "Mover o Cartão para o Arquivo",
|
||||
"archive-list": "Mover a Lista para o Arquivo",
|
||||
"archive-swimlane": "Mover a Pista para o Arquivo",
|
||||
"archive-selection": "Mover a selecção para o Arquivo",
|
||||
"archiveBoardPopup-title": "Mover o Quadro para o Arquivo?",
|
||||
"archived-items": "Arquivo",
|
||||
"archived-boards": "Quadros no Arquivo",
|
||||
"restore-board": "Restaurar Quadro",
|
||||
"no-archived-boards": "Sem Quadros no Arquivo.",
|
||||
"archives": "Arquivos",
|
||||
"archives": "Arquivo",
|
||||
"template": "Modelo",
|
||||
"templates": "Modelos",
|
||||
"assign-member": "Atribuir Membro",
|
||||
"attached": "anexado",
|
||||
"attachment": "Anexo",
|
||||
"attachment-delete-pop": "Excluir um anexo é permanente. Não será possível recuperá-lo.",
|
||||
"attachmentDeletePopup-title": "Excluir Anexo?",
|
||||
"attachment-delete-pop": "Apagar um anexo é permanente. Não será possível recuperá-lo.",
|
||||
"attachmentDeletePopup-title": "Apagar Anexo?",
|
||||
"attachments": "Anexos",
|
||||
"auto-watch": "Veja automaticamente os boards que são criados",
|
||||
"avatar-too-big": "O avatar é muito grande (70KB max)",
|
||||
"auto-watch": "Observar automaticamente os quadros quando são criados",
|
||||
"avatar-too-big": "O avatar é muito grande (70KB máx)",
|
||||
"back": "Voltar",
|
||||
"board-change-color": "Alterar cor",
|
||||
"board-nb-stars": "%s estrelas",
|
||||
"board-not-found": "Quadro não encontrado",
|
||||
"board-private-info": "Este quadro será <strong>privado</strong>.",
|
||||
"board-public-info": "Este quadro será <strong>público</strong>.",
|
||||
"boardChangeColorPopup-title": "Alterar Tela de Fundo",
|
||||
"boardChangeColorPopup-title": "Alterar Imagem de Fundo do Quadro",
|
||||
"boardChangeTitlePopup-title": "Renomear Quadro",
|
||||
"boardChangeVisibilityPopup-title": "Alterar Visibilidade",
|
||||
"boardChangeWatchPopup-title": "Alterar observação",
|
||||
"boardMenuPopup-title": "Configurações do quadro",
|
||||
"boardChangeWatchPopup-title": "Alterar Observação",
|
||||
"boardMenuPopup-title": "Configurações do Quadro",
|
||||
"boards": "Quadros",
|
||||
"board-view": "Visão de quadro",
|
||||
"board-view": "Visão do Quadro",
|
||||
"board-view-cal": "Calendário",
|
||||
"board-view-swimlanes": "Pistas",
|
||||
"board-view-lists": "Listas",
|
||||
"bucket-example": "\"Bucket List\", por exemplo",
|
||||
"bucket-example": "\"Lista de Desejos\", por exemplo",
|
||||
"cancel": "Cancelar",
|
||||
"card-archived": "Este cartão está Arquivado.",
|
||||
"board-archived": "Este quadro está Arquivado.",
|
||||
"card-comments-title": "Este cartão possui %s comentários.",
|
||||
"card-delete-notice": "A exclusão será permanente. Perderá todas as ações associadas a este cartão.",
|
||||
"card-delete-pop": "Todas as ações serão excluídas da lista de Atividades e não poderá reabrir o cartão. Não há como desfazer.",
|
||||
"card-archived": "Este cartão no Arquivo.",
|
||||
"board-archived": "Este quadro está no Arquivo.",
|
||||
"card-comments-title": "Este cartão possui %s comentário.",
|
||||
"card-delete-notice": "A remoção será permanente. Perderá todas as acções associadas a este cartão.",
|
||||
"card-delete-pop": "Todas as acções serão removidas do feed de Actividade e não poderá reabrir o cartão. Não há como desfazer.",
|
||||
"card-delete-suggest-archive": "Pode mover um cartão para o Arquivo para removê-lo do quadro e preservar a atividade.",
|
||||
"card-due": "Data fim",
|
||||
"card-due-on": "Finaliza em",
|
||||
"card-due": "Data limite",
|
||||
"card-due-on": "Data limite em",
|
||||
"card-spent": "Tempo Gasto",
|
||||
"card-edit-attachments": "Editar anexos",
|
||||
"card-edit-custom-fields": "Editar campos personalizados",
|
||||
"card-edit-labels": "Editar etiquetas",
|
||||
"card-edit-members": "Editar membros",
|
||||
"card-labels-title": "Alterar etiquetas do cartão.",
|
||||
"card-labels-title": "Alterar as etiquetas do cartão.",
|
||||
"card-members-title": "Acrescentar ou remover membros do quadro deste cartão.",
|
||||
"card-start": "Data início",
|
||||
"card-start-on": "Começa em",
|
||||
"card-start": "Data de início",
|
||||
"card-start-on": "Inicia em",
|
||||
"cardAttachmentsPopup-title": "Anexar a partir de",
|
||||
"cardCustomField-datePopup-title": "Mudar data",
|
||||
"cardCustomField-datePopup-title": "Alterar a data",
|
||||
"cardCustomFieldsPopup-title": "Editar campos personalizados",
|
||||
"cardDeletePopup-title": "Excluir Cartão?",
|
||||
"cardDetailsActionsPopup-title": "Ações do cartão",
|
||||
"cardDeletePopup-title": "Apagar Cartão?",
|
||||
"cardDetailsActionsPopup-title": "Acções do Cartão",
|
||||
"cardLabelsPopup-title": "Etiquetas",
|
||||
"cardMembersPopup-title": "Membros",
|
||||
"cardMorePopup-title": "Mais",
|
||||
@@ -163,25 +163,25 @@
|
||||
"cards-count": "Cartões",
|
||||
"casSignIn": "Entrar com CAS",
|
||||
"cardType-card": "Cartão",
|
||||
"cardType-linkedCard": "Cartão ligado",
|
||||
"cardType-linkedBoard": "Quadro ligado",
|
||||
"cardType-linkedCard": "Cartão Ligado",
|
||||
"cardType-linkedBoard": "Quadro Ligado",
|
||||
"change": "Alterar",
|
||||
"change-avatar": "Alterar Avatar",
|
||||
"change-password": "Alterar Senha",
|
||||
"change-permissions": "Alterar permissões",
|
||||
"change-settings": "Altera configurações",
|
||||
"changeAvatarPopup-title": "Alterar Avatar",
|
||||
"changeLanguagePopup-title": "Alterar Idioma",
|
||||
"changePasswordPopup-title": "Alterar Senha",
|
||||
"changePermissionsPopup-title": "Alterar Permissões",
|
||||
"changeSettingsPopup-title": "Altera configurações",
|
||||
"change-avatar": "Alterar o Avatar",
|
||||
"change-password": "Alterar a Senha",
|
||||
"change-permissions": "Alterar as permissões",
|
||||
"change-settings": "Alterar as Configurações",
|
||||
"changeAvatarPopup-title": "Alterar o Avatar",
|
||||
"changeLanguagePopup-title": "Alterar o Idioma",
|
||||
"changePasswordPopup-title": "Alterar a Senha",
|
||||
"changePermissionsPopup-title": "Alterar as Permissões",
|
||||
"changeSettingsPopup-title": "Alterar as Configurações",
|
||||
"subtasks": "Sub-tarefas",
|
||||
"checklists": "Listas de verificação",
|
||||
"click-to-star": "Marcar quadro como favorito.",
|
||||
"click-to-unstar": "Remover quadro dos favoritos.",
|
||||
"click-to-star": "Clique para marcar este quadro como favorito.",
|
||||
"click-to-unstar": "Clique para remover este quadro dos favoritos.",
|
||||
"clipboard": "Área de Transferência ou arraste e solte",
|
||||
"close": "Fechar",
|
||||
"close-board": "Fechar Quadro",
|
||||
"close-board": "Fechar o Quadro",
|
||||
"close-board-pop": "Poderá restaurar o quadro clicando no botão “Arquivo” a partir do cabeçalho do Início.",
|
||||
"color-black": "preto",
|
||||
"color-blue": "azul",
|
||||
@@ -209,105 +209,105 @@
|
||||
"color-white": "branco",
|
||||
"color-yellow": "amarelo",
|
||||
"unset-color": "Remover",
|
||||
"comment": "Comentário",
|
||||
"comment-placeholder": "Escrever Comentário",
|
||||
"comment-only": "Somente comentários",
|
||||
"comment": "Comentar",
|
||||
"comment-placeholder": "Escrever o Comentário",
|
||||
"comment-only": "Apenas comentários",
|
||||
"comment-only-desc": "Pode comentar apenas em cartões.",
|
||||
"no-comments": "Sem comentários",
|
||||
"no-comments-desc": "Sem visualização de comentários e atividades.",
|
||||
"no-comments-desc": "Não pode ver comentários nem actividades.",
|
||||
"computer": "Computador",
|
||||
"confirm-subtask-delete-dialog": "Tem certeza que deseja excluir a sub-tarefa?",
|
||||
"confirm-checklist-delete-dialog": "Tem certeza que quer excluir a lista de verificação?",
|
||||
"copy-card-link-to-clipboard": "Copiar link do cartão para a área de transferência",
|
||||
"confirm-subtask-delete-dialog": "Tem certeza que deseja apagar a sub-tarefa?",
|
||||
"confirm-checklist-delete-dialog": "Tem certeza que quer apagar a lista de verificação?",
|
||||
"copy-card-link-to-clipboard": "Copiar a ligação do cartão para a área de transferência",
|
||||
"linkCardPopup-title": "Ligar Cartão",
|
||||
"searchElementPopup-title": "Buscar",
|
||||
"searchElementPopup-title": "Procurar",
|
||||
"copyCardPopup-title": "Copiar o cartão",
|
||||
"copyChecklistToManyCardsPopup-title": "Copiar modelo de lista de verificação para vários cartões",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Títulos e descrições do cartão de destino neste formato JSON",
|
||||
"copyChecklistToManyCardsPopup-title": "Copiar o Modelo de Lista de Verificação para Vários Cartões",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Títulos e Descrições de Cartões de Destino neste formato JSON",
|
||||
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Título do primeiro cartão\", \"description\":\"Descrição do primeiro cartão\"}, {\"title\":\"Título do segundo cartão\",\"description\":\"Descrição do segundo cartão\"},{\"title\":\"Título do último cartão\",\"description\":\"Descrição do último cartão\"} ]",
|
||||
"create": "Criar",
|
||||
"createBoardPopup-title": "Criar Quadro",
|
||||
"chooseBoardSourcePopup-title": "Importar quadro",
|
||||
"createLabelPopup-title": "Criar Etiqueta",
|
||||
"createCustomField": "Criar campo",
|
||||
"createCustomFieldPopup-title": "Criar campo",
|
||||
"current": "atual",
|
||||
"custom-field-delete-pop": "Não existe desfazer. Isso irá excluir o campo personalizado de todos os cartões e destruir seu histórico",
|
||||
"custom-field-checkbox": "Caixa de seleção",
|
||||
"createCustomField": "Criar Campo",
|
||||
"createCustomFieldPopup-title": "Criar Campo",
|
||||
"current": "actual",
|
||||
"custom-field-delete-pop": "Não existe desfazer. Isto irá remover este campo personalizado de todos os cartões e destruir o seu histórico",
|
||||
"custom-field-checkbox": "Caixa de selecção",
|
||||
"custom-field-date": "Data",
|
||||
"custom-field-dropdown": "Lista suspensa",
|
||||
"custom-field-dropdown": "Lista Suspensa",
|
||||
"custom-field-dropdown-none": "(nada)",
|
||||
"custom-field-dropdown-options": "Lista de opções",
|
||||
"custom-field-dropdown-options": "Opções da Lista",
|
||||
"custom-field-dropdown-options-placeholder": "Pressione enter para adicionar mais opções",
|
||||
"custom-field-dropdown-unknown": "(desconhecido)",
|
||||
"custom-field-number": "Número",
|
||||
"custom-field-text": "Texto",
|
||||
"custom-fields": "Campos personalizados",
|
||||
"custom-fields": "Campos Personalizados",
|
||||
"date": "Data",
|
||||
"decline": "Rejeitar",
|
||||
"default-avatar": "Avatar padrão",
|
||||
"delete": "Excluir",
|
||||
"deleteCustomFieldPopup-title": "Excluir campo personalizado?",
|
||||
"deleteLabelPopup-title": "Excluir Etiqueta?",
|
||||
"default-avatar": "Avatar por omissão",
|
||||
"delete": "Apagar",
|
||||
"deleteCustomFieldPopup-title": "Apagar o Campo Personalizado?",
|
||||
"deleteLabelPopup-title": "Apagar a Etiqueta?",
|
||||
"description": "Descrição",
|
||||
"disambiguateMultiLabelPopup-title": "Desambiguar ações de etiquetas",
|
||||
"disambiguateMultiMemberPopup-title": "Desambiguar ações de membros",
|
||||
"disambiguateMultiLabelPopup-title": "Desambiguar Acção da Etiqueta",
|
||||
"disambiguateMultiMemberPopup-title": "Desambiguar Acção do Membro",
|
||||
"discard": "Descartar",
|
||||
"done": "Feito",
|
||||
"download": "Baixar",
|
||||
"download": "Descarregar",
|
||||
"edit": "Editar",
|
||||
"edit-avatar": "Alterar Avatar",
|
||||
"edit-profile": "Editar Perfil",
|
||||
"edit-wip-limit": "Editar Limite WIP",
|
||||
"soft-wip-limit": "Limite de WIP",
|
||||
"editCardStartDatePopup-title": "Altera data de início",
|
||||
"editCardDueDatePopup-title": "Altera data fim",
|
||||
"editCustomFieldPopup-title": "Editar campo",
|
||||
"editCardSpentTimePopup-title": "Editar tempo gasto",
|
||||
"editLabelPopup-title": "Alterar Etiqueta",
|
||||
"editNotificationPopup-title": "Editar Notificações",
|
||||
"editProfilePopup-title": "Editar Perfil",
|
||||
"edit-avatar": "Alterar o Avatar",
|
||||
"edit-profile": "Editar o Perfil",
|
||||
"edit-wip-limit": "Editar o Limite WIP",
|
||||
"soft-wip-limit": "Limite Suave de WIP",
|
||||
"editCardStartDatePopup-title": "Alterar a data de início",
|
||||
"editCardDueDatePopup-title": "Alterar a data limite",
|
||||
"editCustomFieldPopup-title": "Editar Campo",
|
||||
"editCardSpentTimePopup-title": "Alterar o tempo gasto",
|
||||
"editLabelPopup-title": "Alterar a Etiqueta",
|
||||
"editNotificationPopup-title": "Editar a Notificação",
|
||||
"editProfilePopup-title": "Editar o Perfil",
|
||||
"email": "E-mail",
|
||||
"email-enrollAccount-subject": "Uma conta foi criada para si em __siteName__",
|
||||
"email-enrollAccount-text": "Olá __user__\npara começar a utilizar o serviço basta clicar no link abaixo.\n__url__\nMuito Obrigado.",
|
||||
"email-fail": "Falhou ao enviar e-mail",
|
||||
"email-fail-text": "Erro ao tentar enviar e-mail",
|
||||
"email-enrollAccount-text": "Olá __user__\nPara começar a utilizar o serviço, basta clicar na ligação abaixo.\n__url__\nObrigado.",
|
||||
"email-fail": "Falhou a enviar o e-mail",
|
||||
"email-fail-text": "Erro a tentar enviar o e-mail",
|
||||
"email-invalid": "E-mail inválido",
|
||||
"email-invite": "Convite via E-mail",
|
||||
"email-invite-subject": "__inviter__ lhe enviou um convite",
|
||||
"email-invite-text": "Caro __user__\n__inviter__ convidou-o para se juntar ao quadro \"__board__\" como colaborador.\nPor favor prossiga através do link abaixo:\n__url__\nMuito obrigado.",
|
||||
"email-invite": "Convidar via E-mail",
|
||||
"email-invite-subject": "__inviter__ enviou-lhe um convite",
|
||||
"email-invite-text": "Caro __user__\n__inviter__ convidou-o para se juntar ao quadro \"__board__\" para colaborar.\nPor favor prossiga através da ligação abaixo:\n__url__\nObrigado.",
|
||||
"email-resetPassword-subject": "Redefina sua senha em __siteName__",
|
||||
"email-resetPassword-text": "Olá __user__\nPara redefinir sua senha, por favor clique no link abaixo.\n__url__\nMuito obrigado.",
|
||||
"email-resetPassword-text": "Olá __user__\nPara redefinir a sua senha, por favor clique na ligação abaixo.\n__url__\nObrigado.",
|
||||
"email-sent": "E-mail enviado",
|
||||
"email-verifyEmail-subject": "Verifique seu endereço de e-mail em __siteName__",
|
||||
"email-verifyEmail-text": "Olá __user__\nPara verificar sua conta de e-mail, clique no link abaixo.\n__url__\nObrigado.",
|
||||
"email-verifyEmail-subject": "Verifique o seu endereço de e-mail em __siteName__",
|
||||
"email-verifyEmail-text": "Olá __user__\nPara verificar a sua conta de e-mail, clique na ligação abaixo.\n__url__\nObrigado.",
|
||||
"enable-wip-limit": "Ativar Limite WIP",
|
||||
"error-board-doesNotExist": "Este quadro não existe",
|
||||
"error-board-notAdmin": "Precisa ser administrador desse quadro para fazer isto",
|
||||
"error-board-notAMember": "Precisa ser um membro desse quadro para fazer isto",
|
||||
"error-json-malformed": "Seu texto não é um JSON válido",
|
||||
"error-json-schema": "Seu JSON não inclui as informações no formato correto",
|
||||
"error-board-notAdmin": "Precisa de ser administrador deste quadro para fazer isso",
|
||||
"error-board-notAMember": "Precisa de ser um membro deste quadro para fazer isso",
|
||||
"error-json-malformed": "O seu texto não é um JSON válido",
|
||||
"error-json-schema": "O seu JSON não inclui as informações apropriadas no formato correto",
|
||||
"error-list-doesNotExist": "Esta lista não existe",
|
||||
"error-user-doesNotExist": "Este utilizador não existe",
|
||||
"error-user-notAllowSelf": "Não pode convidar a si mesmo",
|
||||
"error-user-notAllowSelf": "Não se pode convidar a si mesmo",
|
||||
"error-user-notCreated": "Este utilizador não foi criado",
|
||||
"error-username-taken": "Esse nome de utilizador já existe",
|
||||
"error-email-taken": "E-mail já está em uso",
|
||||
"error-email-taken": "Endereço de e-mail já está em uso",
|
||||
"export-board": "Exportar quadro",
|
||||
"filter": "Filtrar",
|
||||
"filter-cards": "Filtrar Cartões",
|
||||
"filter-clear": "Limpar filtro",
|
||||
"filter-no-label": "Sem etiquetas",
|
||||
"filter-no-member": "Sem membros",
|
||||
"filter-no-custom-fields": "Não há campos personalizados",
|
||||
"filter-on": "Filtro está ativo",
|
||||
"filter-no-custom-fields": "Sem Campos Personalizados",
|
||||
"filter-on": "Filtro está activo",
|
||||
"filter-on-desc": "Está a filtrar cartões neste quadro. Clique aqui para editar o filtro.",
|
||||
"filter-to-selection": "Filtrar esta seleção",
|
||||
"advanced-filter-label": "Filtro avançado",
|
||||
"advanced-filter-description": "Filtros avançados permitem escrever uma \"string\" contendo os seguintes operadores: == != <= >= && || (). Um espaço é utilizado como separador entre os operadores. Pode filtrar para todos os campos personalizados escrevendo os nomes e valores. Exemplo: Campo1 == Valor1. Nota^Se o campo ou valor tiver espaços precisa encapsular eles em citações sozinhas. Exemplo: Campo1 == Eu\\sou. Também pode combinar múltiplas condições. Exemplo: C1 == V1 || C1 == V2. Normalmente todos os operadores são interpretados da esquerda para direita. Pode alterar a ordem colocando parênteses - como na expressão matemática. Exemplo: C1 == V1 && (C2 == V2 || C2 == V3). Também pode pesquisar campos de texto usando regex: C1 == /Tes.*/i",
|
||||
"filter-to-selection": "Filtrar esta selecção",
|
||||
"advanced-filter-label": "Filtro Avançado",
|
||||
"advanced-filter-description": "Filtro Avançado permite escrever uma \"string\" contendo os seguintes operadores: == != <= >= && || ( ). Um espaço é usado como separador entre Operadores. Pode filtrar em todos os Campos Personalizados escreventos os seus nomes e valores. Por Exemplo: Campo1 == Valor1. Nota: Se os campos ou valores contiverem espaços, tem de os encapsular em apóstrofes. Por Exemplo: 'Campo 1' == 'Valor 1'. Para que caracteres de controlo únicos (' \\/) sejam ignorados, pode usar \\. Por exemplo: Campo1 == I\\'m. Pode também combinar múltiplas condições. Por Exemplo: F1 == V1 || F1 == V2. Normalmente todos os operadores são interpretados da esquerda para a direita. Pode alterar a ordem inserindo parênteses. Por Exemplo: F1 == V1 && ( F2 == V2 || F2 == V3 ). Pode também procurar em campos de texto utilizando uma expressão regular: F1 == /Tes.*/i",
|
||||
"fullname": "Nome Completo",
|
||||
"header-logo-title": "Voltar para a lista de quadros.",
|
||||
"hide-system-messages": "Esconde mensagens de sistema",
|
||||
"header-logo-title": "Voltar para a sua lista de quadros.",
|
||||
"hide-system-messages": "Esconder mensagens de sistema",
|
||||
"headerBarCreateBoardPopup-title": "Criar Quadro",
|
||||
"home": "Início",
|
||||
"import": "Importar",
|
||||
@@ -316,67 +316,67 @@
|
||||
"import-board-c": "Importar quadro",
|
||||
"import-board-title-trello": "Importar quadro do Trello",
|
||||
"import-board-title-wekan": "Importar quadro a partir de exportação prévia",
|
||||
"import-sandstorm-backup-warning": "Não exclua os dados importados do quadro original exportado ou do Trello antes de verificar se esse item fecha e abre novamente, ou se receber o erro Quadro não encontrado, que significa perda de dados.",
|
||||
"import-sandstorm-warning": "O quadro importado irá excluir todos os dados existentes no quadro e irá sobrescrever com o quadro importado.",
|
||||
"import-sandstorm-backup-warning": "Não apague os dados importados do quadro original exportado ou do Trello antes de verificar se esse item fecha e abre novamente, ou se receber o erro Quadro não encontrado, que significa perda de dados.",
|
||||
"import-sandstorm-warning": "O quadro importado irá apagar todos os dados existentes no quadro e irá sobrescrever com o quadro importado.",
|
||||
"from-trello": "Do Trello",
|
||||
"from-wekan": "A partir de exportação prévia",
|
||||
"import-board-instruction-trello": "No seu quadro do Trello, vá em 'Menu', depois em 'Mais', 'Imprimir e Exportar', 'Exportar JSON', então copie o texto emitido",
|
||||
"import-board-instruction-wekan": "Em seu quadro vá para 'Menu', depois 'Exportar quadro' e copie o texto no arquivo baixado.",
|
||||
"import-board-instruction-trello": "No seu quadro do Trello, vá em 'Menu', depois em 'Mais', 'Imprimir e Exportar', 'Exportar JSON', e copie o texto resultante.",
|
||||
"import-board-instruction-wekan": "No seu quadro vá para 'Menu', depois 'Exportar quadro' e copie o texto no ficheiro descarregado.",
|
||||
"import-board-instruction-about-errors": "Se receber erros ao importar o quadro, às vezes a importação ainda funciona e o quadro está na página Todos os Quadros.",
|
||||
"import-json-placeholder": "Cole seus dados JSON válidos aqui",
|
||||
"import-map-members": "Mapear membros",
|
||||
"import-members-map": "Seu quadro importado possui alguns membros. Por favor, mapeie os membros que deseja importar para seus utilizadors",
|
||||
"import-show-user-mapping": "Revisar mapeamento dos membros",
|
||||
"import-members-map": "O seu quadro importado possui alguns membros. Por favor, mapeie os membros que deseja importar para seus utilizadores",
|
||||
"import-show-user-mapping": "Rever mapeamento dos membros",
|
||||
"import-user-select": "Escolha um utilizador existente que deseja usar como esse membro",
|
||||
"importMapMembersAddPopup-title": "Selecione membro",
|
||||
"importMapMembersAddPopup-title": "Seleccione membro",
|
||||
"info": "Versão",
|
||||
"initials": "Iniciais",
|
||||
"invalid-date": "Data inválida",
|
||||
"invalid-time": "Hora inválida",
|
||||
"invalid-user": "Utilizador inválido",
|
||||
"joined": "juntou-se",
|
||||
"just-invited": "Já foi convidado para este quadro",
|
||||
"just-invited": "Acabou de ser convidado para este quadro",
|
||||
"keyboard-shortcuts": "Atalhos do teclado",
|
||||
"label-create": "Criar Etiqueta",
|
||||
"label-default": "%s etiqueta (padrão)",
|
||||
"label-delete-pop": "Não será possível recuperá-la. A etiqueta será excluída de todos os cartões e seu histórico será destruído.",
|
||||
"label-default": "%s etiqueta (omissão)",
|
||||
"label-delete-pop": "Não há como desfazer. A etiqueta será apagada de todos os cartões e o seu histórico será destruído.",
|
||||
"labels": "Etiquetas",
|
||||
"language": "Idioma",
|
||||
"last-admin-desc": "Não pode alterar funções porque deve existir pelo menos um administrador.",
|
||||
"leave-board": "Sair do Quadro",
|
||||
"leave-board-pop": "Tem a certeza de que pretende sair de __boardTitle__? Será removido de todos os cartões neste quadro.",
|
||||
"leaveBoardPopup-title": "Sair do Quadro?",
|
||||
"link-card": "Vincular a este cartão",
|
||||
"leaveBoardPopup-title": "Sair do Quadro ?",
|
||||
"link-card": "Ligar a este cartão",
|
||||
"list-archive-cards": "Move todos os cartões nesta lista para o Arquivo",
|
||||
"list-archive-cards-pop": "Isto removerá todos os cartões desta lista para o quadro. Para visualizar cartões arquivados e trazê-los de volta para o quadro, clique em “Menu” > “Arquivo”.",
|
||||
"list-move-cards": "Mover todos os cartões desta lista",
|
||||
"list-select-cards": "Selecionar todos os cartões nesta lista",
|
||||
"list-archive-cards-pop": "Isto irá remover todos os cartões nesta lista do quadro. Para ver os cartões no Arquivo e trazê-los de volta para o quadro, clique em “Menu” > “Arquivo”.",
|
||||
"list-move-cards": "Mover todos os cartões nesta lista",
|
||||
"list-select-cards": "Seleccionar todos os cartões nesta lista",
|
||||
"set-color-list": "Definir Cor",
|
||||
"listActionPopup-title": "Listar Ações",
|
||||
"swimlaneActionPopup-title": "Ações de Pista",
|
||||
"swimlaneActionPopup-title": "Acções de Pista",
|
||||
"swimlaneAddPopup-title": "Adicionar uma Pista abaixo",
|
||||
"listImportCardPopup-title": "Importe um cartão do Trello",
|
||||
"listMorePopup-title": "Mais",
|
||||
"link-list": "Vincular a esta lista",
|
||||
"list-delete-pop": "Todas as ações serão excluídas da lista de atividades e não poderá recuperar a lista. Não há como desfazer.",
|
||||
"list-delete-suggest-archive": "Pode mover uma lista para o Arquivo para removê-la do quadro e preservar a atividade.",
|
||||
"link-list": "Ligar a esta lista",
|
||||
"list-delete-pop": "Todas as acções serão removidas do feed de actividade e não poderá recuperar a lista. Não há como desfazer.",
|
||||
"list-delete-suggest-archive": "Pode mover uma lista para o Arquivo para a remover do quadro e preservar a actividade.",
|
||||
"lists": "Listas",
|
||||
"swimlanes": "Pistas",
|
||||
"log-out": "Sair",
|
||||
"log-out": "Terminar a Sessão",
|
||||
"log-in": "Entrar",
|
||||
"loginPopup-title": "Entrar",
|
||||
"memberMenuPopup-title": "Configuração de Membros",
|
||||
"memberMenuPopup-title": "Configuração dos Membros",
|
||||
"members": "Membros",
|
||||
"menu": "Menu",
|
||||
"move-selection": "Mover seleção",
|
||||
"moveCardPopup-title": "Mover Cartão",
|
||||
"moveCardToBottom-title": "Mover para o final",
|
||||
"moveCardToTop-title": "Mover para o topo",
|
||||
"moveSelectionPopup-title": "Mover seleção",
|
||||
"multi-selection": "Multi-Seleção",
|
||||
"multi-selection-on": "Multi-seleção está ativo",
|
||||
"muted": "Silenciar",
|
||||
"muted-info": "Nunca receberá qualquer notificação desse quadro",
|
||||
"move-selection": "Mover a selecção",
|
||||
"moveCardPopup-title": "Mover o Cartão",
|
||||
"moveCardToBottom-title": "Mover para o Fundo",
|
||||
"moveCardToTop-title": "Mover para o Topo",
|
||||
"moveSelectionPopup-title": "Mover a selecção",
|
||||
"multi-selection": "Selecção Múltipla",
|
||||
"multi-selection-on": "Selecção Múltipla está activa",
|
||||
"muted": "Silenciado",
|
||||
"muted-info": "Nunca será notificado de quaisquer alterações neste quadro",
|
||||
"my-boards": "Meus Quadros",
|
||||
"name": "Nome",
|
||||
"no-archived-cards": "Sem cartões no Arquivo.",
|
||||
@@ -385,29 +385,29 @@
|
||||
"no-results": "Nenhum resultado.",
|
||||
"normal": "Normal",
|
||||
"normal-desc": "Pode ver e editar cartões. Não pode alterar configurações.",
|
||||
"not-accepted-yet": "Convite ainda não aceito",
|
||||
"notify-participate": "Receber atualizações de qualquer cartão que criar ou participar como membro",
|
||||
"notify-watch": "Receber atualizações de qualquer quadro, lista ou cartões que estiver a observar",
|
||||
"not-accepted-yet": "Convite ainda não aceite",
|
||||
"notify-participate": "Receber actualizações de qualquer cartão que criar ou participar como membro",
|
||||
"notify-watch": "Receber actualizações de qualquer quadro, lista ou cartões que estiver a observar",
|
||||
"optional": "opcional",
|
||||
"or": "ou",
|
||||
"page-maybe-private": "Esta página pode ser privada. Poderá vê-la se estiver <a href='%s'>logado</a>.",
|
||||
"page-maybe-private": "Esta página pode ser privada. Poderá vê-la se <a href='%s'>iniciar a sessão</a>.",
|
||||
"page-not-found": "Página não encontrada.",
|
||||
"password": "Senha",
|
||||
"paste-or-dragdrop": "para colar, ou arraste e solte o arquivo da imagem para cá (somente imagens)",
|
||||
"paste-or-dragdrop": "para colar, ou arrastar e soltar o ficheiro da imagem para lá (somente imagens)",
|
||||
"participating": "Participando",
|
||||
"preview": "Pré-visualizar",
|
||||
"previewAttachedImagePopup-title": "Pré-visualizar",
|
||||
"previewClipboardImagePopup-title": "Pré-visualizar",
|
||||
"private": "Privado",
|
||||
"private-desc": "Este quadro é privado. Apenas seus membros podem acessar e editá-lo.",
|
||||
"private-desc": "Este quadro é privado. Apenas o membros do quadro o podem visualizar e editar.",
|
||||
"profile": "Perfil",
|
||||
"public": "Público",
|
||||
"public-desc": "Este quadro é público. Ele é visível a qualquer pessoa com o link e será exibido em motores de busca como o Google. Apenas os seus membros podem editá-lo.",
|
||||
"quick-access-description": "Clique na estrela para adicionar um atalho nesta barra.",
|
||||
"public-desc": "Este quadro é público. Está visível para qualquer pessoa com a ligação e será exibido em motores de busca como o Google. Apenas os membros do quadro o podem editar.",
|
||||
"quick-access-description": "Clique na estrela de um quadro para adicionar um atalho nesta barra.",
|
||||
"remove-cover": "Remover Capa",
|
||||
"remove-from-board": "Remover do Quadro",
|
||||
"remove-label": "Remover Etiqueta",
|
||||
"listDeletePopup-title": "Excluir Lista?",
|
||||
"listDeletePopup-title": "Apagar Lista ?",
|
||||
"remove-member": "Remover Membro",
|
||||
"remove-member-from-card": "Remover do Cartão",
|
||||
"remove-member-pop": "Remover __name__ (__username__) de __boardTitle__? O membro será removido de todos os cartões neste quadro e será notificado.",
|
||||
@@ -415,63 +415,63 @@
|
||||
"rename": "Renomear",
|
||||
"rename-board": "Renomear Quadro",
|
||||
"restore": "Restaurar",
|
||||
"save": "Salvar",
|
||||
"search": "Buscar",
|
||||
"save": "Guardar",
|
||||
"search": "Procurar",
|
||||
"rules": "Regras",
|
||||
"search-cards": "Pesquisa em títulos e descrições de cartões neste quadro",
|
||||
"search-example": "Texto para procurar",
|
||||
"select-color": "Selecionar Cor",
|
||||
"search-cards": "Pesquisar nos títulos e descrições dos cartões deste quadro",
|
||||
"search-example": "Texto a procurar?",
|
||||
"select-color": "Seleccionar Cor",
|
||||
"set-wip-limit-value": "Defina um limite máximo para o número de tarefas nesta lista",
|
||||
"setWipLimitPopup-title": "Definir Limite WIP",
|
||||
"shortcut-assign-self": "Atribuir a si o cartão atual",
|
||||
"shortcut-assign-self": "Atribuir a si o cartão actual",
|
||||
"shortcut-autocomplete-emoji": "Autocompletar emoji",
|
||||
"shortcut-autocomplete-members": "Preenchimento automático de membros",
|
||||
"shortcut-clear-filters": "Limpar todos filtros",
|
||||
"shortcut-close-dialog": "Fechar dialogo",
|
||||
"shortcut-filter-my-cards": "Filtrar meus cartões",
|
||||
"shortcut-show-shortcuts": "Mostrar lista de atalhos",
|
||||
"shortcut-toggle-filterbar": "Alternar barra de filtro",
|
||||
"shortcut-toggle-sidebar": "Fechar barra lateral.",
|
||||
"show-cards-minimum-count": "Mostrar contador de cartões se a lista tiver mais de",
|
||||
"sidebar-open": "Abrir barra lateral",
|
||||
"sidebar-close": "Fechar barra lateral",
|
||||
"shortcut-autocomplete-members": "Autocompletar membros",
|
||||
"shortcut-clear-filters": "Limpar todos os filtros",
|
||||
"shortcut-close-dialog": "Fechar Caixa de Dialogo",
|
||||
"shortcut-filter-my-cards": "Filtrar os meus cartões",
|
||||
"shortcut-show-shortcuts": "Mostrar esta lista de atalhos",
|
||||
"shortcut-toggle-filterbar": "Alternar a Barra Lateral de Filtros",
|
||||
"shortcut-toggle-sidebar": "Alternar a Barra Lateral do Quadro",
|
||||
"show-cards-minimum-count": "Mostrar contagem de cartões se a lista tiver mais de",
|
||||
"sidebar-open": "Abrir a Barra Lateral",
|
||||
"sidebar-close": "Fechar a Barra Lateral",
|
||||
"signupPopup-title": "Criar uma Conta",
|
||||
"star-board-title": "Clique para marcar este quadro como favorito. Ele aparecerá no topo na lista dos seus quadros.",
|
||||
"star-board-title": "Clique para marcar este quadro como favorito. O quadro irá aparecer no topo da sua lista de quadros.",
|
||||
"starred-boards": "Quadros Favoritos",
|
||||
"starred-boards-description": "Quadros favoritos aparecem no topo da lista dos seus quadros.",
|
||||
"subscribe": "Acompanhar",
|
||||
"team": "Equipe",
|
||||
"starred-boards-description": "Os quadros favoritos aparecem no topo da sua lista de quadros.",
|
||||
"subscribe": "Subscrever",
|
||||
"team": "Equipa",
|
||||
"this-board": "este quadro",
|
||||
"this-card": "este cartão",
|
||||
"spent-time-hours": "Tempo gasto (Horas)",
|
||||
"overtime-hours": "Tempo extras (Horas)",
|
||||
"overtime": "Tempo extras",
|
||||
"has-overtime-cards": "Tem cartões de horas extras",
|
||||
"has-spenttime-cards": "Gastou cartões de tempo",
|
||||
"spent-time-hours": "Tempo gasto (horas)",
|
||||
"overtime-hours": "Horas extra (horas)",
|
||||
"overtime": "Horas extra",
|
||||
"has-overtime-cards": "Tem cartões com horas extra",
|
||||
"has-spenttime-cards": "Tem cartões com tempo gasto",
|
||||
"time": "Tempo",
|
||||
"title": "Título",
|
||||
"tracking": "Rastreamento",
|
||||
"tracking-info": "Será notificado se houver qualquer alteração em cartões em que é o criador ou membro",
|
||||
"tracking": "A seguir",
|
||||
"tracking-info": "Será notificado de quaisquer alterações em cartões em que é o criador ou membro.",
|
||||
"type": "Tipo",
|
||||
"unassign-member": "Membro não associado",
|
||||
"unsaved-description": "Possui uma descrição não salva",
|
||||
"unassign-member": "Desatribuir membro",
|
||||
"unsaved-description": "Possui uma descrição não guardada.",
|
||||
"unwatch": "Deixar de observar",
|
||||
"upload": "Carregar",
|
||||
"upload-avatar": "Carregar um avatar",
|
||||
"uploaded-avatar": "Avatar carregado",
|
||||
"upload": "Enviar",
|
||||
"upload-avatar": "Enviar um avatar",
|
||||
"uploaded-avatar": "Enviado um avatar",
|
||||
"username": "Nome de utilizador",
|
||||
"view-it": "Visualizar",
|
||||
"warn-list-archived": "aviso: este cartão está em uma lista no Arquivo",
|
||||
"view-it": "Visualizá-lo",
|
||||
"warn-list-archived": "aviso: este cartão está numa lista no Arquivo",
|
||||
"watch": "Observar",
|
||||
"watching": "Observando",
|
||||
"watching-info": "Será notificado de qualquer alteração neste quadro",
|
||||
"watching-info": "Será notificado de quaisquer alterações neste quadro",
|
||||
"welcome-board": "Quadro de Boas Vindas",
|
||||
"welcome-swimlane": "Marco 1",
|
||||
"welcome-list1": "Básico",
|
||||
"welcome-list2": "Avançado",
|
||||
"card-templates-swimlane": "Modelos de cartão",
|
||||
"list-templates-swimlane": "Modelos de lista",
|
||||
"board-templates-swimlane": "Modelos de quadro",
|
||||
"card-templates-swimlane": "Modelos de Cartão",
|
||||
"list-templates-swimlane": "Modelos de Lista",
|
||||
"board-templates-swimlane": "Modelos de Quadro",
|
||||
"what-to-do": "O que gostaria de fazer?",
|
||||
"wipLimitErrorPopup-title": "Limite WIP Inválido",
|
||||
"wipLimitErrorPopup-dialog-pt1": "O número de tarefas nesta lista excede o limite WIP definido.",
|
||||
@@ -480,14 +480,14 @@
|
||||
"settings": "Configurações",
|
||||
"people": "Pessoas",
|
||||
"registration": "Registo",
|
||||
"disable-self-registration": "Desabilitar Cadastrar-se",
|
||||
"invite": "Convite",
|
||||
"invite-people": "Convide Pessoas",
|
||||
"to-boards": "Para o/os quadro(s)",
|
||||
"email-addresses": "Endereço de E-mail",
|
||||
"smtp-host-description": "O endereço do servidor SMTP que envia seus e-mails.",
|
||||
"disable-self-registration": "Desabilitar Auto-Registo",
|
||||
"invite": "Convidar",
|
||||
"invite-people": "Convidar Pessoas",
|
||||
"to-boards": "Para o(s) quadro(s)",
|
||||
"email-addresses": "Endereços de E-mail",
|
||||
"smtp-host-description": "O endereço do servidor SMTP que envia os seus e-mails.",
|
||||
"smtp-port-description": "A porta que o servidor SMTP usa para enviar os e-mails.",
|
||||
"smtp-tls-description": "Habilitar suporte TLS para servidor SMTP",
|
||||
"smtp-tls-description": "Habilitar suporte TLS para o servidor SMTP",
|
||||
"smtp-host": "Servidor SMTP",
|
||||
"smtp-port": "Porta SMTP",
|
||||
"smtp-username": "Nome de utilizador",
|
||||
@@ -496,20 +496,20 @@
|
||||
"send-from": "De",
|
||||
"send-smtp-test": "Enviar um e-mail de teste para si mesmo",
|
||||
"invitation-code": "Código do Convite",
|
||||
"email-invite-register-subject": "__inviter__ lhe enviou um convite",
|
||||
"email-invite-register-text": "Caro __user__,\n\n__inviter__ convida-o para o quadro Kanban para colaborações.\n\nPor favor, siga o link abaixo:\n__url__ \n\nE seu código de convite é: __icode__\n\nObrigado.",
|
||||
"email-smtp-test-subject": "E-mail de teste via SMTP",
|
||||
"email-invite-register-subject": "__inviter__ enviou-lhe um convite",
|
||||
"email-invite-register-text": "Caro __user__,\n\n__inviter__ convida-o para o quadro Kanban para colaborações.\n\nPor favor, siga a ligação abaixo:\n__url__ \n\nE seu código de convite é: __icode__\n\nObrigado.",
|
||||
"email-smtp-test-subject": "E-mail de Teste de SMTP",
|
||||
"email-smtp-test-text": "Enviou um e-mail com sucesso",
|
||||
"error-invitation-code-not-exist": "O código do convite não existe",
|
||||
"error-notAuthorized": "Não está autorizado à ver esta página.",
|
||||
"outgoing-webhooks": "Webhook de saída",
|
||||
"outgoingWebhooksPopup-title": "Webhook de saída",
|
||||
"error-notAuthorized": "Não tem autorização para ver esta página.",
|
||||
"outgoing-webhooks": "Webhooks de saída",
|
||||
"outgoingWebhooksPopup-title": "Webhooks de saída",
|
||||
"boardCardTitlePopup-title": "Filtro do Título do Cartão",
|
||||
"new-outgoing-webhook": "Novo Webhook de saída",
|
||||
"no-name": "(Desconhecido)",
|
||||
"Node_version": "Versão do Node",
|
||||
"OS_Arch": "Arquitetura do SO",
|
||||
"OS_Cpus": "Quantidade de CPUS do SO",
|
||||
"OS_Arch": "Arquitectura do SO",
|
||||
"OS_Cpus": "Quantidade de CPUs do SO",
|
||||
"OS_Freemem": "Memória Disponível do SO",
|
||||
"OS_Loadavg": "Carga Média do SO",
|
||||
"OS_Platform": "Plataforma do SO",
|
||||
@@ -527,69 +527,69 @@
|
||||
"yes": "Sim",
|
||||
"no": "Não",
|
||||
"accounts": "Contas",
|
||||
"accounts-allowEmailChange": "Permitir Mudança de e-mail",
|
||||
"accounts-allowUserNameChange": "Permitir alteração de nome de utilizador",
|
||||
"accounts-allowEmailChange": "Permitir Alteração do E-mail",
|
||||
"accounts-allowUserNameChange": "Permitir Alteração de Nome de Utilizador",
|
||||
"createdAt": "Criado em",
|
||||
"verified": "Verificado",
|
||||
"active": "Ativo",
|
||||
"active": "Activo",
|
||||
"card-received": "Recebido",
|
||||
"card-received-on": "Recebido em",
|
||||
"card-end": "Fim",
|
||||
"card-end-on": "Termina em",
|
||||
"editCardReceivedDatePopup-title": "Modificar data de recebimento",
|
||||
"editCardEndDatePopup-title": "Mudar data de fim",
|
||||
"editCardReceivedDatePopup-title": "Alterar data de recebimento",
|
||||
"editCardEndDatePopup-title": "Alterar data de fim",
|
||||
"setCardColorPopup-title": "Definir cor",
|
||||
"setCardActionsColorPopup-title": "Escolha uma cor",
|
||||
"setSwimlaneColorPopup-title": "Escolha uma cor",
|
||||
"setListColorPopup-title": "Escolha uma cor",
|
||||
"assigned-by": "Atribuído por",
|
||||
"requested-by": "Solicitado por",
|
||||
"board-delete-notice": "Excluir é permanente. Irá perder todas as listas, cartões e ações associados nesse quadro.",
|
||||
"delete-board-confirm-popup": "Todas as listas, cartões, etiquetas e atividades serão excluídos e não poderá recuperar o conteúdo do quadro. Não há como desfazer.",
|
||||
"boardDeletePopup-title": "Excluir quadro?",
|
||||
"delete-board": "Excluir quadro",
|
||||
"default-subtasks-board": "Sub-tarefas para quadro __board__",
|
||||
"default": "Padrão",
|
||||
"assigned-by": "Atribuído Por",
|
||||
"requested-by": "Solicitado Por",
|
||||
"board-delete-notice": "Apagar é permanente. Irá perder todas as listas, cartões e acções associadas a este quadro.",
|
||||
"delete-board-confirm-popup": "Todas as listas, cartões, etiquetas e actividades serão apagadas e não poderá recuperar o conteúdo do quadro. Não há como desfazer.",
|
||||
"boardDeletePopup-title": "Apagar Quadro?",
|
||||
"delete-board": "Apagar Quadro",
|
||||
"default-subtasks-board": "Sub-tarefas para o quadro __board__",
|
||||
"default": "Omissão",
|
||||
"queue": "Fila",
|
||||
"subtask-settings": "Configurações de sub-tarefas",
|
||||
"boardSubtaskSettingsPopup-title": "Configurações das sub-tarefas do quadro",
|
||||
"subtask-settings": "Configurações de Sub-tarefas",
|
||||
"boardSubtaskSettingsPopup-title": "Configurações das Sub-tarefas do Quadro",
|
||||
"show-subtasks-field": "Cartões podem ter sub-tarefas",
|
||||
"deposit-subtasks-board": "Inserir sub-tarefas a este quadro:",
|
||||
"deposit-subtasks-list": "Listas de sub-tarefas inseridas aqui:",
|
||||
"show-parent-in-minicard": "Mostrar Pai do mini cartão:",
|
||||
"prefix-with-full-path": "Prefixo com caminho completo",
|
||||
"prefix-with-parent": "Prefixo com Pai",
|
||||
"subtext-with-full-path": "Sub-texto com caminho completo",
|
||||
"subtext-with-parent": "Sub-texto com Pai",
|
||||
"change-card-parent": "Mudar Pai do cartão",
|
||||
"deposit-subtasks-board": "Depositar sub-tarefas neste quadro:",
|
||||
"deposit-subtasks-list": "Lista de destino para sub-tarefas depositadas aqui:",
|
||||
"show-parent-in-minicard": "Mostrar pai no mini-cartão:",
|
||||
"prefix-with-full-path": "Prefixar com o caminho completo",
|
||||
"prefix-with-parent": "Prefixar com o pai",
|
||||
"subtext-with-full-path": "Sub-texto com o caminho completo",
|
||||
"subtext-with-parent": "Sub-texto com o pai",
|
||||
"change-card-parent": "Alterar o pai do cartão",
|
||||
"parent-card": "Pai do cartão",
|
||||
"source-board": "Fonte do quadro",
|
||||
"no-parent": "Não mostrar Pai",
|
||||
"activity-added-label": "adicionada etiqueta '%s' para %s",
|
||||
"activity-removed-label": "removida etiqueta '%s' de %s",
|
||||
"activity-delete-attach": "excluído um anexo de %s",
|
||||
"activity-added-label-card": "adicionada etiqueta '%s'",
|
||||
"activity-removed-label-card": "removida etiqueta '%s'",
|
||||
"activity-delete-attach-card": "excluído um anexo",
|
||||
"activity-set-customfield": "definir campo personalizado '%s' para '%s' em %s",
|
||||
"activity-unset-customfield": "redefinir campo personalizado '%s' em %s",
|
||||
"source-board": "Quadro fonte",
|
||||
"no-parent": "Não mostrar o pai",
|
||||
"activity-added-label": "adicionou a etiqueta '%s' a %s",
|
||||
"activity-removed-label": "removeu a etiqueta '%s' de %s",
|
||||
"activity-delete-attach": "apagou um anexo de %s",
|
||||
"activity-added-label-card": "adicionou a etiqueta '%s'",
|
||||
"activity-removed-label-card": "removeu a etiqueta '%s'",
|
||||
"activity-delete-attach-card": "apagou um anexo",
|
||||
"activity-set-customfield": "definiu o campo personalizado '%s' para '%s' em %s",
|
||||
"activity-unset-customfield": "removeu o campo personalizado '%s' de %s",
|
||||
"r-rule": "Regra",
|
||||
"r-add-trigger": "Adicionar gatilho",
|
||||
"r-add-action": "Adicionar ação",
|
||||
"r-board-rules": "Quadro de regras",
|
||||
"r-add-action": "Adicionar acção",
|
||||
"r-board-rules": "Regras do quadro",
|
||||
"r-add-rule": "Adicionar regra",
|
||||
"r-view-rule": "Ver regra",
|
||||
"r-delete-rule": "Excluir regra",
|
||||
"r-delete-rule": "Apagar regra",
|
||||
"r-new-rule-name": "Título da nova regra",
|
||||
"r-no-rules": "Sem regras",
|
||||
"r-when-a-card": "Quando um cartão",
|
||||
"r-is": "é",
|
||||
"r-is-moved": "é movido",
|
||||
"r-added-to": "adicionado à",
|
||||
"r-added-to": "adicionado a",
|
||||
"r-removed-from": "Removido de",
|
||||
"r-the-board": "o quadro",
|
||||
"r-list": "lista",
|
||||
"set-filter": "Inserir Filtro",
|
||||
"set-filter": "Definir Filtro",
|
||||
"r-moved-to": "Movido para",
|
||||
"r-moved-from": "Movido de",
|
||||
"r-archived": "Movido para o Arquivo",
|
||||
@@ -597,24 +597,24 @@
|
||||
"r-a-card": "um cartão",
|
||||
"r-when-a-label-is": "Quando uma etiqueta é",
|
||||
"r-when-the-label-is": "Quando a etiqueta é",
|
||||
"r-list-name": "listar nome",
|
||||
"r-list-name": "listar o nome",
|
||||
"r-when-a-member": "Quando um membro é",
|
||||
"r-when-the-member": "Quando o membro",
|
||||
"r-name": "nome",
|
||||
"r-when-a-attach": "Quando um anexo",
|
||||
"r-when-a-checklist": "Quando a lista de verificação é",
|
||||
"r-when-the-checklist": "Quando a lista de verificação",
|
||||
"r-completed": "Completado",
|
||||
"r-made-incomplete": "Feito incompleto",
|
||||
"r-when-a-item": "Quando o item da lista de verificação é",
|
||||
"r-completed": "Completada",
|
||||
"r-made-incomplete": "Tornado incompleta",
|
||||
"r-when-a-item": "Quando um item de uma lista de verificação é",
|
||||
"r-when-the-item": "Quando o item da lista de verificação",
|
||||
"r-checked": "Marcado",
|
||||
"r-unchecked": "Desmarcado",
|
||||
"r-move-card-to": "Mover cartão para",
|
||||
"r-top-of": "Topo de",
|
||||
"r-bottom-of": "Final de",
|
||||
"r-its-list": "é lista",
|
||||
"r-archive": "Mover para Arquivo",
|
||||
"r-bottom-of": "Fundo de",
|
||||
"r-its-list": "a sua lista",
|
||||
"r-archive": "Mover para o Arquivo",
|
||||
"r-unarchive": "Restaurar do Arquivo",
|
||||
"r-card": "cartão",
|
||||
"r-add": "Novo",
|
||||
@@ -622,7 +622,7 @@
|
||||
"r-label": "etiqueta",
|
||||
"r-member": "membro",
|
||||
"r-remove-all": "Remover todos os membros do cartão",
|
||||
"r-set-color": "Definir cor para",
|
||||
"r-set-color": "Definir a cor para",
|
||||
"r-checklist": "lista de verificação",
|
||||
"r-check-all": "Marcar todos",
|
||||
"r-uncheck-all": "Desmarcar todos",
|
||||
@@ -637,13 +637,13 @@
|
||||
"r-rule-details": "Detalhes da regra",
|
||||
"r-d-move-to-top-gen": "Mover cartão para o topo da sua lista",
|
||||
"r-d-move-to-top-spec": "Mover cartão para o topo da lista",
|
||||
"r-d-move-to-bottom-gen": "Mover cartão para o final da sua lista",
|
||||
"r-d-move-to-bottom-spec": "Mover cartão para final da lista",
|
||||
"r-d-move-to-bottom-gen": "Mover cartão para o fundo da sua lista",
|
||||
"r-d-move-to-bottom-spec": "Mover cartão para fundo da lista",
|
||||
"r-d-send-email": "Enviar e-mail",
|
||||
"r-d-send-email-to": "para",
|
||||
"r-d-send-email-subject": "assunto",
|
||||
"r-d-send-email-message": "mensagem",
|
||||
"r-d-archive": "Mover cartão para Arquivo",
|
||||
"r-d-archive": "Mover cartão para o Arquivo",
|
||||
"r-d-unarchive": "Restaurar cartão do Arquivo",
|
||||
"r-d-add-label": "Adicionar etiqueta",
|
||||
"r-d-remove-label": "Remover etiqueta",
|
||||
@@ -665,9 +665,9 @@
|
||||
"r-with-items": "com os itens",
|
||||
"r-items-list": "item1,item2,item3",
|
||||
"r-add-swimlane": "Adicionar pista",
|
||||
"r-swimlane-name": "Nome da pista",
|
||||
"r-board-note": "Nota: deixe o campo vazio para corresponder à todos os valores possíveis",
|
||||
"r-checklist-note": "Nota: itens de Checklists devem ser escritos separados por vírgulas",
|
||||
"r-swimlane-name": "nome da pista",
|
||||
"r-board-note": "Nota: deixe o campo vazio para corresponder a todos os valores possíveis.",
|
||||
"r-checklist-note": "Nota: itens de listas de verificação devem ser escritos separados por vírgulas.",
|
||||
"r-when-a-card-is-moved": "Quando um cartão é movido de outra lista",
|
||||
"ldap": "LDAP",
|
||||
"oauth2": "OAuth2",
|
||||
@@ -680,14 +680,14 @@
|
||||
"add-custom-html-after-body-start": "Adicionar HTML Personalizado depois do início do <body>",
|
||||
"add-custom-html-before-body-end": "Adicionar HTML Personalizado antes do fim do </body>",
|
||||
"error-undefined": "Ocorreu um erro",
|
||||
"error-ldap-login": "Um erro ocorreu enquanto tentava entrar",
|
||||
"error-ldap-login": "Ocorreu um erro ocorreu enquanto tentava entrar",
|
||||
"display-authentication-method": "Mostrar Método de Autenticação",
|
||||
"default-authentication-method": "Método de Autenticação Padrão",
|
||||
"default-authentication-method": "Método de Autenticação por Omissão",
|
||||
"duplicate-board": "Duplicar Quadro",
|
||||
"people-number": "O número de pessoas é:",
|
||||
"swimlaneDeletePopup-title": "Delete Swimlane ?",
|
||||
"swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
|
||||
"restore-all": "Restore all",
|
||||
"delete-all": "Delete all",
|
||||
"loading": "Loading, please wait."
|
||||
"swimlaneDeletePopup-title": "Apagar Pista ?",
|
||||
"swimlane-delete-pop": "Todas as acções serão removidas do feed de actividade e não será possível recuperar a pista. Não há como desfazer.",
|
||||
"restore-all": "Restaurar todos",
|
||||
"delete-all": "Apagar todos",
|
||||
"loading": "A carregar, por favor aguarde."
|
||||
}
|
||||
+17
-17
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"accept": "Прийняти",
|
||||
"act-activity-notify": "Сповіщення діяльності",
|
||||
"act-activity-notify": "Сповіщення активності",
|
||||
"act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
@@ -17,7 +17,7 @@
|
||||
"act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-createBoard": "Створити Коробко",
|
||||
"act-createBoard": "Дошку __board__створено",
|
||||
"act-createSwimlane": "created swimlane __swimlane__ to board __board__",
|
||||
"act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-createCustomField": "created custom field __customField__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
@@ -39,26 +39,26 @@
|
||||
"act-withBoardTitle": "__board__",
|
||||
"act-withCardTitle": "[__board__] __card__",
|
||||
"actions": "Дії",
|
||||
"activities": "Діяльність",
|
||||
"activity": "Активність",
|
||||
"activity-added": "додав %s до %s",
|
||||
"activities": "Діяльності",
|
||||
"activity": "Діяльність",
|
||||
"activity-added": "%s додано до %s",
|
||||
"activity-archived": "%s перенесено до архіву",
|
||||
"activity-attached": "прикріпив %s до %s",
|
||||
"activity-created": "створив %s",
|
||||
"activity-customfield-created": "створив налаштовуване поле",
|
||||
"activity-excluded": "виключено %s з %s",
|
||||
"activity-imported": "імпортовано %s до %s з %s",
|
||||
"activity-imported-board": "імпортовано %s з %s",
|
||||
"activity-joined": "приєднався %s",
|
||||
"activity-moved": "переміщений %s з %s до %s",
|
||||
"activity-attached": "%s прикріплено до %s",
|
||||
"activity-created": "%sстворено",
|
||||
"activity-customfield-created": "Створено спеціальне поле",
|
||||
"activity-excluded": "%s виключено з %s",
|
||||
"activity-imported": "%s імпортовано до %s з %s",
|
||||
"activity-imported-board": "%s імпортовано з %s",
|
||||
"activity-joined": "%s приєднано",
|
||||
"activity-moved": "%s переміщено з %s до %s",
|
||||
"activity-on": "%s",
|
||||
"activity-removed": "видалив %s з %s",
|
||||
"activity-sent": "відправив %s до %s",
|
||||
"activity-removed": "%s видалено з %s",
|
||||
"activity-sent": "%s відправлено до %s",
|
||||
"activity-unjoined": "unjoined %s",
|
||||
"activity-subtask-added": "додав підзадачу до %s",
|
||||
"activity-subtask-added": "Додано підзадачу до %s",
|
||||
"activity-checked-item": "checked %s in checklist %s of %s",
|
||||
"activity-unchecked-item": "unchecked %s in checklist %s of %s",
|
||||
"activity-checklist-added": "додав список до %s",
|
||||
"activity-checklist-added": "Додано контрольний список до %s",
|
||||
"activity-checklist-removed": "removed a checklist from %s",
|
||||
"activity-checklist-completed": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"activity-checklist-uncompleted": "uncompleted the checklist %s of %s",
|
||||
|
||||
+12
-12
@@ -17,17 +17,17 @@
|
||||
"act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-createBoard": "created board __board__",
|
||||
"act-createBoard": "新增看板 __board__ ",
|
||||
"act-createSwimlane": "created swimlane __swimlane__ to board __board__",
|
||||
"act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-createCustomField": "created custom field __customField__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-createList": "added list __list__ to board __board__",
|
||||
"act-createList": "新增清單__list__至看板__board__",
|
||||
"act-addBoardMember": "added member __member__ to board __board__",
|
||||
"act-archivedBoard": "Board __board__ moved to Archive",
|
||||
"act-archivedBoard": "看板 __board__ 已被封存",
|
||||
"act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive",
|
||||
"act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive",
|
||||
"act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive",
|
||||
"act-importBoard": "imported board __board__",
|
||||
"act-importBoard": "看板 __board__ 已匯入",
|
||||
"act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__",
|
||||
"act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
@@ -379,8 +379,8 @@
|
||||
"muted-info": "您將不會收到有關這個看板的任何訊息",
|
||||
"my-boards": "我的看板",
|
||||
"name": "名稱",
|
||||
"no-archived-cards": "No cards in Archive.",
|
||||
"no-archived-lists": "No lists in Archive.",
|
||||
"no-archived-cards": "沒有封存的卡片",
|
||||
"no-archived-lists": "沒有封存的清單",
|
||||
"no-archived-swimlanes": "No swimlanes in Archive.",
|
||||
"no-results": "無結果",
|
||||
"normal": "普通",
|
||||
@@ -417,7 +417,7 @@
|
||||
"restore": "還原",
|
||||
"save": "儲存",
|
||||
"search": "搜尋",
|
||||
"rules": "Rules",
|
||||
"rules": "規則",
|
||||
"search-cards": "Search from card titles and descriptions on this board",
|
||||
"search-example": "Text to search for?",
|
||||
"select-color": "選擇顏色",
|
||||
@@ -443,16 +443,16 @@
|
||||
"team": "團隊",
|
||||
"this-board": "這個看板",
|
||||
"this-card": "這個卡片",
|
||||
"spent-time-hours": "Spent time (hours)",
|
||||
"overtime-hours": "Overtime (hours)",
|
||||
"overtime": "Overtime",
|
||||
"spent-time-hours": "耗費時間 (小時)",
|
||||
"overtime-hours": "超時 (小時)",
|
||||
"overtime": "超時",
|
||||
"has-overtime-cards": "Has overtime cards",
|
||||
"has-spenttime-cards": "Has spent time cards",
|
||||
"time": "時間",
|
||||
"title": "標題",
|
||||
"tracking": "追蹤",
|
||||
"tracking-info": "你將會收到與你有關的卡片的所有變更通知",
|
||||
"type": "Type",
|
||||
"type": "類型",
|
||||
"unassign-member": "取消分配成員",
|
||||
"unsaved-description": "未儲存的描述",
|
||||
"unwatch": "取消觀察",
|
||||
@@ -461,7 +461,7 @@
|
||||
"uploaded-avatar": "大頭貼已經上傳",
|
||||
"username": "使用者名稱",
|
||||
"view-it": "檢視",
|
||||
"warn-list-archived": "warning: this card is in an list at Archive",
|
||||
"warn-list-archived": "警告: 卡片位在封存的清單中",
|
||||
"watch": "觀察",
|
||||
"watching": "觀察中",
|
||||
"watching-info": "你將會收到關於這個看板所有的變更通知",
|
||||
|
||||
@@ -166,7 +166,8 @@ if (Meteor.isServer) {
|
||||
}
|
||||
if (activity.attachmentId) {
|
||||
const attachment = activity.attachment();
|
||||
params.attachment = attachment._id;
|
||||
params.attachment = attachment.original.name;
|
||||
params.attachmentId = attachment._id;
|
||||
}
|
||||
if (activity.checklistId) {
|
||||
const checklist = activity.checklist();
|
||||
|
||||
@@ -88,18 +88,22 @@ if (Meteor.isServer) {
|
||||
}
|
||||
});
|
||||
|
||||
Attachments.files.after.remove((userId, doc) => {
|
||||
Activities.remove({
|
||||
attachmentId: doc._id,
|
||||
});
|
||||
Attachments.files.before.remove((userId, doc) => {
|
||||
Activities.insert({
|
||||
userId,
|
||||
type: 'card',
|
||||
activityType: 'deleteAttachment',
|
||||
attachmentId: doc._id,
|
||||
boardId: doc.boardId,
|
||||
cardId: doc.cardId,
|
||||
listId: doc.listId,
|
||||
swimlaneId: doc.swimlaneId,
|
||||
});
|
||||
});
|
||||
|
||||
Attachments.files.after.remove((userId, doc) => {
|
||||
Activities.remove({
|
||||
attachmentId: doc._id,
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -1685,6 +1685,7 @@ if (Meteor.isServer) {
|
||||
* @param {string} boardId the board ID of the new card
|
||||
* @param {string} listId the list ID of the new card
|
||||
* @param {string} authorID the user ID of the person owning the card
|
||||
* @param {string} parentId the parent ID of the new card
|
||||
* @param {string} title the title of the new card
|
||||
* @param {string} description the description of the new card
|
||||
* @param {string} swimlaneId the swimlane ID of the new card
|
||||
@@ -1695,6 +1696,7 @@ if (Meteor.isServer) {
|
||||
Authentication.checkUserId(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
const paramListId = req.params.listId;
|
||||
const paramParentId = req.params.parentId;
|
||||
const currentCards = Cards.find({
|
||||
listId: paramListId,
|
||||
archived: false,
|
||||
@@ -1708,6 +1710,7 @@ if (Meteor.isServer) {
|
||||
title: req.body.title,
|
||||
boardId: paramBoardId,
|
||||
listId: paramListId,
|
||||
parentId: paramParentId,
|
||||
description: req.body.description,
|
||||
userId: req.body.authorId,
|
||||
swimlaneId: req.body.swimlaneId,
|
||||
@@ -1761,6 +1764,7 @@ if (Meteor.isServer) {
|
||||
* @param {string} [listId] the new list ID of the card (move operation)
|
||||
* @param {string} [description] the new description of the card
|
||||
* @param {string} [authorId] change the owner of the card
|
||||
* @param {string} [parentId] change the parent of the card
|
||||
* @param {string} [labelIds] the new list of label IDs attached to the card
|
||||
* @param {string} [swimlaneId] the new swimlane ID of the card
|
||||
* @param {string} [members] the new list of member IDs attached to the card
|
||||
@@ -1817,6 +1821,19 @@ if (Meteor.isServer) {
|
||||
}, paramListId);
|
||||
|
||||
}
|
||||
if (req.body.hasOwnProperty('parentId')) {
|
||||
const newParentId = req.body.parentId;
|
||||
Cards.direct.update({
|
||||
_id: paramCardId,
|
||||
listId: paramListId,
|
||||
boardId: paramBoardId,
|
||||
archived: false,
|
||||
}, {
|
||||
$set: {
|
||||
parentId: newParentId,
|
||||
},
|
||||
});
|
||||
}
|
||||
if (req.body.hasOwnProperty('description')) {
|
||||
const newDescription = req.body.description;
|
||||
Cards.direct.update({
|
||||
|
||||
+15
-8
@@ -6,27 +6,34 @@ if (Meteor.isServer) {
|
||||
// `ApiRoutes.path('boards/export', boardId)``
|
||||
// on the client instead of copy/pasting the route path manually between the
|
||||
// client and the server.
|
||||
/*
|
||||
* This route is used to export the board FROM THE APPLICATION.
|
||||
* If user is already logged-in, pass loginToken as param "authToken":
|
||||
* '/api/boards/:boardId/export?authToken=:token'
|
||||
/**
|
||||
* @operation export
|
||||
* @tag Boards
|
||||
*
|
||||
* @summary This route is used to export the board.
|
||||
*
|
||||
* @description If user is already logged-in, pass loginToken as param
|
||||
* "authToken": '/api/boards/:boardId/export?authToken=:token'
|
||||
*
|
||||
* See https://blog.kayla.com.au/server-side-route-authentication-in-meteor/
|
||||
* for detailed explanations
|
||||
*
|
||||
* @param {string} boardId the ID of the board we are exporting
|
||||
* @param {string} authToken the loginToken
|
||||
*/
|
||||
|
||||
|
||||
JsonRoutes.add('get', '/api/boards/:boardId/export', function(req, res) {
|
||||
const boardId = req.params.boardId;
|
||||
let user = null;
|
||||
// todo XXX for real API, first look for token in Authentication: header
|
||||
// then fallback to parameter
|
||||
|
||||
const loginToken = req.query.authToken;
|
||||
if (loginToken) {
|
||||
const hashToken = Accounts._hashLoginToken(loginToken);
|
||||
user = Meteor.users.findOne({
|
||||
'services.resume.loginTokens.hashedToken': hashToken,
|
||||
});
|
||||
} else if (!Meteor.settings.public.sandstorm) {
|
||||
Authentication.checkUserId(req.userId);
|
||||
user = Users.findOne({ _id: req.userId, isAdmin: true });
|
||||
}
|
||||
|
||||
const exporter = new Exporter(boardId);
|
||||
|
||||
@@ -678,7 +678,7 @@ def parse_schemas(schemas_dir):
|
||||
data = ''.join(f.readlines())
|
||||
try:
|
||||
# if the file failed, it's likely it doesn't contain a schema
|
||||
program = esprima.parseScript(data, options={'comment': True, 'loc': True})
|
||||
program = esprima.parseModule(data, options={'comment': True, 'loc': True})
|
||||
except:
|
||||
continue
|
||||
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "wekan",
|
||||
"version": "v2.69.0",
|
||||
"version": "v2.76.0",
|
||||
"description": "Open-Source kanban",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
||||
@@ -81,7 +81,12 @@ Meteor.loginWithCas = function(options, callback) {
|
||||
// check auth on server.
|
||||
Accounts.callLoginMethod({
|
||||
methodArguments: [{ cas: { credentialToken: credentialToken } }],
|
||||
userCallback: callback
|
||||
userCallback: err => {
|
||||
// Fix redirect bug after login successfully
|
||||
if (!err) {
|
||||
window.location.href = '/';
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}, 100);
|
||||
|
||||
@@ -71,14 +71,37 @@ class CAS {
|
||||
callback({message: 'Empty response.'});
|
||||
}
|
||||
if (result['cas:serviceResponse']['cas:authenticationSuccess']) {
|
||||
var userData = {
|
||||
const userData = {
|
||||
id: result['cas:serviceResponse']['cas:authenticationSuccess'][0]['cas:user'][0].toLowerCase(),
|
||||
}
|
||||
const attributes = result['cas:serviceResponse']['cas:authenticationSuccess'][0]['cas:attributes'][0];
|
||||
for (var fieldName in attributes) {
|
||||
userData[fieldName] = attributes[fieldName][0];
|
||||
};
|
||||
callback(undefined, true, userData);
|
||||
const attributes = result['cas:serviceResponse']['cas:authenticationSuccess'][0]['cas:attributes'][0];
|
||||
|
||||
// Check allowed ldap groups if exist (array only)
|
||||
// example cas settings : "allowedLdapGroups" : ["wekan", "admin"],
|
||||
let findedGroup = false;
|
||||
const allowedLdapGroups = Meteor.settings.cas.allowedLdapGroups || false;
|
||||
for (const fieldName in attributes) {
|
||||
if (allowedLdapGroups && fieldName === 'cas:memberOf') {
|
||||
for (const groups in attributes[fieldName]) {
|
||||
const str = attributes[fieldName][groups];
|
||||
if (!Array.isArray(allowedLdapGroups)) {
|
||||
callback({message: 'Settings "allowedLdapGroups" must be an array'});
|
||||
}
|
||||
for (const allowedLdapGroup in allowedLdapGroups) {
|
||||
if (str.search(`cn=${allowedLdapGroups[allowedLdapGroup]}`) >= 0) {
|
||||
findedGroup = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
userData[fieldName] = attributes[fieldName][0];
|
||||
}
|
||||
|
||||
if (allowedLdapGroups && !findedGroup) {
|
||||
callback({message: 'Group not finded.'}, false);
|
||||
} else {
|
||||
callback(undefined, true, userData);
|
||||
}
|
||||
} else {
|
||||
callback(undefined, false);
|
||||
}
|
||||
|
||||
@@ -179,6 +179,15 @@ Accounts.registerLoginHandler('ldap', function(loginRequest) {
|
||||
},
|
||||
};
|
||||
|
||||
if (LDAP.settings_get('LDAP_SYNC_ADMIN_STATUS') === true) {
|
||||
log_debug('Updating admin status');
|
||||
const targetGroups = LDAP.settings_get('LDAP_SYNC_ADMIN_GROUPS').split(',');
|
||||
const groups = ldap.getUserGroups(username, ldapUser).filter((value) => targetGroups.includes(value));
|
||||
|
||||
user.isAdmin = groups.length > 0;
|
||||
Meteor.users.update({_id: user._id}, {$set: {isAdmin: user.isAdmin}});
|
||||
}
|
||||
|
||||
if( LDAP.settings_get('LDAP_SYNC_GROUP_ROLES') === true ) {
|
||||
log_debug('Updating Groups/Roles');
|
||||
const groups = ldap.getUserGroups(username, ldapUser);
|
||||
@@ -217,6 +226,15 @@ Accounts.registerLoginHandler('ldap', function(loginRequest) {
|
||||
|
||||
const result = addLdapUser(ldapUser, username, loginRequest.ldapPass);
|
||||
|
||||
if (LDAP.settings_get('LDAP_SYNC_ADMIN_STATUS') === true) {
|
||||
log_debug('Updating admin status');
|
||||
const targetGroups = LDAP.settings_get('LDAP_SYNC_ADMIN_GROUPS').split(',');
|
||||
const groups = ldap.getUserGroups(username, ldapUser).filter((value) => targetGroups.includes(value));
|
||||
|
||||
result.isAdmin = groups.length > 0;
|
||||
Meteor.users.update({_id: result.userId}, {$set: {isAdmin: result.isAdmin}});
|
||||
}
|
||||
|
||||
if( LDAP.settings_get('LDAP_SYNC_GROUP_ROLES') === true ) {
|
||||
const groups = ldap.getUserGroups(username, ldapUser);
|
||||
if( groups.length > 0 ) {
|
||||
|
||||
@@ -18,10 +18,9 @@ Oidc.requestCredential = function (options, credentialRequestCompleteCallback) {
|
||||
new ServiceConfiguration.ConfigError('Service oidc not configured.'));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
var credentialToken = Random.secret();
|
||||
var loginStyle = OAuth._loginStyle('oidc', config, options);
|
||||
var scope = config.requestPermissions || ['openid', 'profile', 'email'];
|
||||
|
||||
// options
|
||||
options = options || {};
|
||||
@@ -29,7 +28,7 @@ Oidc.requestCredential = function (options, credentialRequestCompleteCallback) {
|
||||
options.response_type = options.response_type || 'code';
|
||||
options.redirect_uri = OAuth._redirectUri('oidc', config);
|
||||
options.state = OAuth._stateParam(loginStyle, credentialToken, options.redirectUrl);
|
||||
options.scope = scope.join(' ');
|
||||
options.scope = config.requestPermissions || 'openid profile email';
|
||||
|
||||
if (config.loginStyle && config.loginStyle == 'popup') {
|
||||
options.display = 'popup';
|
||||
|
||||
@@ -49,7 +49,12 @@ if (Meteor.release) {
|
||||
var getToken = function (query) {
|
||||
var debug = process.env.DEBUG || false;
|
||||
var config = getConfiguration();
|
||||
var serverTokenEndpoint = config.serverUrl + config.tokenEndpoint;
|
||||
if(config.tokenEndpoint.includes('https://')){
|
||||
var serverTokenEndpoint = config.tokenEndpoint;
|
||||
}else{
|
||||
var serverTokenEndpoint = config.serverUrl + config.tokenEndpoint;
|
||||
}
|
||||
var requestPermissions = config.requestPermissions;
|
||||
var response;
|
||||
|
||||
try {
|
||||
@@ -66,6 +71,7 @@ var getToken = function (query) {
|
||||
client_secret: OAuth.openSecret(config.secret),
|
||||
redirect_uri: OAuth._redirectUri('oidc', config),
|
||||
grant_type: 'authorization_code',
|
||||
scope: requestPermissions,
|
||||
state: query.state
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,6 +38,10 @@
|
||||
#---------------------------------------------
|
||||
# CORS: Set Access-Control-Allow-Origin header. Example: *
|
||||
#export CORS=*
|
||||
# To enable the Set Access-Control-Allow-Headers header. "Authorization,Content-Type" is required for cross-origin use of the API.
|
||||
#export CORS_ALLOW_HEADERS=Authorization,Content-Type
|
||||
# To enable the Set Access-Control-Expose-Headers header. This is not needed for typical CORS situations. Example: *
|
||||
#export CORS_EXPOSE_HEADERS=*
|
||||
#---------------------------------------------
|
||||
## Optional: Integration with Matomo https://matomo.org that is installed to your server
|
||||
## The address of the server where Matomo is hosted:
|
||||
@@ -81,6 +85,10 @@
|
||||
#export OAUTH2_AUTH_ENDPOINT=/oauth2/v2.0/authorize
|
||||
#export OAUTH2_USERINFO_ENDPOINT=https://graph.microsoft.com/oidc/userinfo
|
||||
#export OAUTH2_TOKEN_ENDPOINT=/oauth2/v2.0/token
|
||||
# OAUTH2 ID Token Whitelist Fields.
|
||||
#export OAUTH2_ID_TOKEN_WHITELIST_FIELDS=[]
|
||||
# OAUTH2 Request Permissions.
|
||||
#export OAUTH2_REQUEST_PERMISSIONS='openid profile email'
|
||||
# The claim name you want to map to the unique ID field:
|
||||
#export OAUTH2_ID_MAP=email
|
||||
# The claim name you want to map to the username field:
|
||||
|
||||
@@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = (
|
||||
appTitle = (defaultText = "Wekan"),
|
||||
# The name of the app as it is displayed to the user.
|
||||
|
||||
appVersion = 271,
|
||||
appVersion = 278,
|
||||
# Increment this for every release.
|
||||
|
||||
appMarketingVersion = (defaultText = "2.69.0~2019-05-11"),
|
||||
appMarketingVersion = (defaultText = "2.76.0~2019-06-11"),
|
||||
# Human-readable presentation of the app version.
|
||||
|
||||
minUpgradableAppVersion = 0,
|
||||
|
||||
@@ -76,8 +76,8 @@ Meteor.startup(() => {
|
||||
authorizationEndpoint: process.env.OAUTH2_AUTH_ENDPOINT,
|
||||
userinfoEndpoint: process.env.OAUTH2_USERINFO_ENDPOINT,
|
||||
tokenEndpoint: process.env.OAUTH2_TOKEN_ENDPOINT,
|
||||
idTokenWhitelistFields: [],
|
||||
requestPermissions: ['openid'],
|
||||
idTokenWhitelistFields: process.env.OAUTH2_ID_TOKEN_WHITELIST_FIELDS || [],
|
||||
requestPermissions: process.env.OAUTH2_REQUEST_PERMISSIONS || 'openid profile email',
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
@@ -7,5 +7,17 @@ Meteor.startup(() => {
|
||||
return next();
|
||||
});
|
||||
}
|
||||
if ( process.env.CORS_ALLOW_HEADERS ) {
|
||||
WebApp.rawConnectHandlers.use(function(req, res, next) {
|
||||
res.setHeader('Access-Control-Allow-Headers', process.env.CORS_ALLOW_HEADERS);
|
||||
return next();
|
||||
});
|
||||
}
|
||||
if ( process.env.CORS_EXPOSE_HEADERS ) {
|
||||
WebApp.rawConnectHandlers.use(function(req, res, next) {
|
||||
res.setHeader('Access-Control-Expose-Headers', process.env.CORS_EXPOSE_HEADERS);
|
||||
return next();
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
@@ -18,7 +18,7 @@ Meteor.methods({
|
||||
|
||||
// label activity did not work yet, see wekan/models/activities.js
|
||||
const quoteParams = _.clone(params);
|
||||
['card', 'list', 'oldList', 'board', 'oldBoard', 'comment', 'checklist', 'swimlane', 'oldSwimlane', 'label'].forEach((key) => {
|
||||
['card', 'list', 'oldList', 'board', 'oldBoard', 'comment', 'checklist', 'swimlane', 'oldSwimlane', 'label', 'attachment'].forEach((key) => {
|
||||
if (quoteParams[key]) quoteParams[key] = `"${params[key]}"`;
|
||||
});
|
||||
|
||||
|
||||
@@ -59,9 +59,12 @@ Meteor.publish('archivedBoards', function() {
|
||||
});
|
||||
});
|
||||
|
||||
Meteor.publishRelations('board', function(boardId) {
|
||||
// If isArchived = false, this will only return board elements which are not archived.
|
||||
// If isArchived = true, this will only return board elements which are archived.
|
||||
Meteor.publishRelations('board', function(boardId, isArchived) {
|
||||
this.unblock();
|
||||
check(boardId, String);
|
||||
check(isArchived, Boolean);
|
||||
const thisUserId = this.userId;
|
||||
|
||||
this.cursor(Boards.find({
|
||||
@@ -75,8 +78,8 @@ Meteor.publishRelations('board', function(boardId) {
|
||||
],
|
||||
// Sort required to ensure oplog usage
|
||||
}, { limit: 1, sort: { _id: 1 } }), function(boardId, board) {
|
||||
this.cursor(Lists.find({ boardId }));
|
||||
this.cursor(Swimlanes.find({ boardId }));
|
||||
this.cursor(Lists.find({ boardId, archived: isArchived }));
|
||||
this.cursor(Swimlanes.find({ boardId, archived: isArchived }));
|
||||
this.cursor(Integrations.find({ boardId }));
|
||||
this.cursor(CustomFields.find({ boardIds: {$in: [boardId]} }, { sort: { name: 1 } }));
|
||||
|
||||
@@ -115,8 +118,9 @@ Meteor.publishRelations('board', function(boardId) {
|
||||
parentCards.selector = (_ids) => ({ parentId: _ids });
|
||||
const boards = this.join(Boards);
|
||||
const subCards = this.join(Cards);
|
||||
subCards.selector = (_ids) => ({ archived: isArchived });
|
||||
|
||||
this.cursor(Cards.find({ boardId: {$in: [boardId, board.subtasksDefaultBoardId]}}), function(cardId, card) {
|
||||
this.cursor(Cards.find({ boardId: {$in: [boardId, board.subtasksDefaultBoardId]}, archived: isArchived }), function(cardId, card) {
|
||||
if (card.type === 'cardType-linkedCard') {
|
||||
const impCardId = card.linkedId;
|
||||
subCards.push(impCardId);
|
||||
|
||||
@@ -5,5 +5,5 @@ FastRender.onAllRoutes(function() {
|
||||
});
|
||||
|
||||
FastRender.route('/b/:id/:slug', function({ id }) {
|
||||
this.subscribe('board', id);
|
||||
this.subscribe('board', id, false);
|
||||
});
|
||||
+17
-1
@@ -3,7 +3,7 @@
|
||||
# All supported keys are defined here together with descriptions and default values
|
||||
|
||||
# list of supported keys
|
||||
keys="DEBUG MONGODB_BIND_UNIX_SOCKET MONGODB_BIND_IP MONGODB_PORT MAIL_URL MAIL_FROM ROOT_URL PORT DISABLE_MONGODB CADDY_ENABLED CADDY_BIND_PORT WITH_API ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW EMAIL_NOTIFICATION_TIMEOUT CORS MATOMO_ADDRESS MATOMO_SITE_ID MATOMO_DO_NOT_TRACK MATOMO_WITH_USERNAME BROWSER_POLICY_ENABLED TRUSTED_URL WEBHOOKS_ATTRIBUTES OAUTH2_ENABLED OAUTH2_LOGIN_STYLE OAUTH2_CLIENT_ID OAUTH2_SECRET OAUTH2_SERVER_URL OAUTH2_AUTH_ENDPOINT OAUTH2_USERINFO_ENDPOINT OAUTH2_TOKEN_ENDPOINT OAUTH2_ID_MAP OAUTH2_USERNAME_MAP OAUTH2_FULLNAME_MAP OAUTH2_EMAIL_MAP LDAP_ENABLE LDAP_PORT LDAP_HOST LDAP_BASEDN LDAP_LOGIN_FALLBACK LDAP_RECONNECT LDAP_TIMEOUT LDAP_IDLE_TIMEOUT LDAP_CONNECT_TIMEOUT LDAP_AUTHENTIFICATION LDAP_AUTHENTIFICATION_USERDN LDAP_AUTHENTIFICATION_PASSWORD LDAP_LOG_ENABLED LDAP_BACKGROUND_SYNC LDAP_BACKGROUND_SYNC_INTERVAL LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS LDAP_ENCRYPTION LDAP_CA_CERT LDAP_REJECT_UNAUTHORIZED LDAP_USER_AUTHENTICATION LDAP_USER_SEARCH_FILTER LDAP_USER_SEARCH_SCOPE LDAP_USER_SEARCH_FIELD LDAP_SEARCH_PAGE_SIZE LDAP_SEARCH_SIZE_LIMIT LDAP_GROUP_FILTER_ENABLE LDAP_GROUP_FILTER_OBJECTCLASS LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT LDAP_GROUP_FILTER_GROUP_NAME LDAP_UNIQUE_IDENTIFIER_FIELD LDAP_UTF8_NAMES_SLUGIFY LDAP_USERNAME_FIELD LDAP_FULLNAME_FIELD LDAP_MERGE_EXISTING_USERS LDAP_SYNC_USER_DATA LDAP_SYNC_USER_DATA_FIELDMAP LDAP_SYNC_GROUP_ROLES LDAP_DEFAULT_DOMAIN LDAP_EMAIL_MATCH_ENABLE LDAP_EMAIL_MATCH_REQUIRE LDAP_EMAIL_MATCH_VERIFIED LDAP_EMAIL_FIELD LDAP_SYNC_ADMIN_STATUS LDAP_SYNC_ADMIN_GROUPS HEADER_LOGIN_ID HEADER_LOGIN_FIRSTNAME HEADER_LOGIN_LASTNAME HEADER_LOGIN_EMAIL LOGOUT_WITH_TIMER LOGOUT_IN LOGOUT_ON_HOURS LOGOUT_ON_MINUTES DEFAULT_AUTHENTICATION_METHOD"
|
||||
keys="DEBUG MONGODB_BIND_UNIX_SOCKET MONGODB_BIND_IP MONGODB_PORT MAIL_URL MAIL_FROM ROOT_URL PORT DISABLE_MONGODB CADDY_ENABLED CADDY_BIND_PORT WITH_API ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW EMAIL_NOTIFICATION_TIMEOUT CORS CORS_ALLOW_HEADERS CORS_EXPOSE_HEADERS MATOMO_ADDRESS MATOMO_SITE_ID MATOMO_DO_NOT_TRACK MATOMO_WITH_USERNAME BROWSER_POLICY_ENABLED TRUSTED_URL WEBHOOKS_ATTRIBUTES OAUTH2_ENABLED OAUTH2_LOGIN_STYLE OAUTH2_CLIENT_ID OAUTH2_SECRET OAUTH2_SERVER_URL OAUTH2_AUTH_ENDPOINT OAUTH2_USERINFO_ENDPOINT OAUTH2_TOKEN_ENDPOINT OAUTH2_ID_MAP OAUTH2_USERNAME_MAP OAUTH2_FULLNAME_MAP OAUTH2_ID_TOKEN_WHITELIST_FIELDS OAUTH2_EMAIL_MAP OAUTH2_REQUEST_PERMISSIONS LDAP_ENABLE LDAP_PORT LDAP_HOST LDAP_BASEDN LDAP_LOGIN_FALLBACK LDAP_RECONNECT LDAP_TIMEOUT LDAP_IDLE_TIMEOUT LDAP_CONNECT_TIMEOUT LDAP_AUTHENTIFICATION LDAP_AUTHENTIFICATION_USERDN LDAP_AUTHENTIFICATION_PASSWORD LDAP_LOG_ENABLED LDAP_BACKGROUND_SYNC LDAP_BACKGROUND_SYNC_INTERVAL LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS LDAP_ENCRYPTION LDAP_CA_CERT LDAP_REJECT_UNAUTHORIZED LDAP_USER_AUTHENTICATION LDAP_USER_SEARCH_FILTER LDAP_USER_SEARCH_SCOPE LDAP_USER_SEARCH_FIELD LDAP_SEARCH_PAGE_SIZE LDAP_SEARCH_SIZE_LIMIT LDAP_GROUP_FILTER_ENABLE LDAP_GROUP_FILTER_OBJECTCLASS LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT LDAP_GROUP_FILTER_GROUP_NAME LDAP_UNIQUE_IDENTIFIER_FIELD LDAP_UTF8_NAMES_SLUGIFY LDAP_USERNAME_FIELD LDAP_FULLNAME_FIELD LDAP_MERGE_EXISTING_USERS LDAP_SYNC_USER_DATA LDAP_SYNC_USER_DATA_FIELDMAP LDAP_SYNC_GROUP_ROLES LDAP_DEFAULT_DOMAIN LDAP_EMAIL_MATCH_ENABLE LDAP_EMAIL_MATCH_REQUIRE LDAP_EMAIL_MATCH_VERIFIED LDAP_EMAIL_FIELD LDAP_SYNC_ADMIN_STATUS LDAP_SYNC_ADMIN_GROUPS HEADER_LOGIN_ID HEADER_LOGIN_FIRSTNAME HEADER_LOGIN_LASTNAME HEADER_LOGIN_EMAIL LOGOUT_WITH_TIMER LOGOUT_IN LOGOUT_ON_HOURS LOGOUT_ON_MINUTES DEFAULT_AUTHENTICATION_METHOD"
|
||||
|
||||
# default values
|
||||
DESCRIPTION_DEBUG="Debug OIDC OAuth2 etc. Example: sudo snap set wekan debug='true'"
|
||||
@@ -88,6 +88,14 @@ DESCRIPTION_CORS="Enable/disable CORS: Set Access-Control-Allow-Origin header. E
|
||||
DEFAULT_CORS=""
|
||||
KEY_CORS="cors"
|
||||
|
||||
DESCRIPTION_CORS_ALLOW_HEADERS="Set Access-Control-Allow-Headers header. \"Authorization,Content-Type\" is required for cross-origin use of the API."
|
||||
DEFAULT_CORS_ALLOW_HEADERS=""
|
||||
KEY_CORS_ALLOW_HEADERS="cors-allow-headers"
|
||||
|
||||
DESCRIPTION_EXPOSE_HEADERS="Set Access-Control-Expose-Headers header. This is not needed for typical CORS situations. Example: *"
|
||||
DEFAULT_CORS_EXPOSE_HEADERS=""
|
||||
KEY_CORS_EXPOSE_HEADERS="cors-expose-headers"
|
||||
|
||||
DESCRIPTION_MATOMO_ADDRESS="The address of the server where matomo is hosted"
|
||||
DEFAULT_MATOMO_ADDRESS=""
|
||||
KEY_MATOMO_ADDRESS="matomo-address"
|
||||
@@ -166,6 +174,14 @@ DESCRIPTION_OAUTH2_FULLNAME_MAP="OAuth2 Fullname Mapping. Example: name"
|
||||
DEFAULT_OAUTH2_FULLNAME_MAP=""
|
||||
KEY_OAUTH2_FULLNAME_MAP="oauth2-fullname-map"
|
||||
|
||||
DESCRIPTION_OAUTH2_ID_TOKEN_WHITELIST_FIELDS="OAuth2 ID Token Whitelist Fields. Example: []"
|
||||
DEFAULT_OAUTH2_ID_TOKEN_WHITELIST_FIELDS="[]"
|
||||
KEY_OAUTH2_ID_TOKEN_WHITELIST_FIELDS="oauth2-id-token-whitelist-fields"
|
||||
|
||||
DESCRIPTION_OAUTH2_REQUEST_PERMISSIONS="OAuth2 Request Permissions. Example: 'openid profile email'"
|
||||
DEFAULT_OAUTH2_REQUEST_PERMISSIONS="'openid profile email'"
|
||||
KEY_OAUTH2_REQUEST_PERMISSIONS="oauth2-request-permissions"
|
||||
|
||||
DESCRIPTION_OAUTH2_EMAIL_MAP="OAuth2 Email Mapping. Example: email"
|
||||
DEFAULT_OAUTH2_EMAIL_MAP=""
|
||||
KEY_OAUTH2_EMAIL_MAP="oauth2-email-map"
|
||||
|
||||
@@ -68,6 +68,16 @@ echo -e "\t$ snap set $SNAP_NAME cors='*'"
|
||||
echo -e "\t-Disable the CORS:"
|
||||
echo -e "\t$ snap set $SNAP_NAME cors=''"
|
||||
echo -e "\n"
|
||||
echo -e "To enable the Set Access-Control-Allow-Headers header. \"Authorization,Content-Type\" is required for cross-origin use of the API."
|
||||
echo -e "\t$ snap set $SNAP_NAME cors-allow-headers='Authorization,Content-Type'"
|
||||
echo -e "\t-Disable the Set Access-Control-Allow-Headers header. \"Authorization,Content-Type\" is required for cross-origin use of the API."
|
||||
echo -e "\t$ snap set $SNAP_NAME cors-allow-headers=''"
|
||||
echo -e "\n"
|
||||
echo -e "To enable the Set Access-Control-Expose-Headers header. This is not needed for typical CORS situations. Example: *"
|
||||
echo -e "\t$ snap set $SNAP_NAME cors-expose-headers='*'"
|
||||
echo -e "\t-Disable the Set Access-Control-Expose-Headers header. This is not needed for typical CORS situations. Example: ''"
|
||||
echo -e "\t$ snap set $SNAP_NAME cors-expose-headers=''"
|
||||
echo -e "\n"
|
||||
echo -e "Enable browser policy and allow one trusted URL that can have iframe that has Wekan embedded inside."
|
||||
echo -e "\t\t Setting this to false is not recommended, it also disables all other browser policy protections"
|
||||
echo -e "\t\t and allows all iframing etc. See wekan/server/policy.js"
|
||||
@@ -130,6 +140,18 @@ echo -e "\t$ snap set $SNAP_NAME oauth2-token-endpoint='/oauth/token'"
|
||||
echo -e "\t-Disable the OAuth2 Token Endpoint of Wekan:"
|
||||
echo -e "\t$ snap set $SNAP_NAME oauth2-token-endpoint=''"
|
||||
echo -e "\n"
|
||||
echo -e "OAuth2 ID Token Whitelist Fields."
|
||||
echo -e "To enable the OAuth2 ID Token Whitelist Fields of Wekan:"
|
||||
echo -e "\t$ snap set $SNAP_NAME oauth2-id-token-whitelist-fields='[]'"
|
||||
echo -e "\t-Disable the OAuth2 ID Token Whitelist Fields of Wekan:"
|
||||
echo -e "\t$ snap set $SNAP_NAME oauth2-id-token-whitelist-fields=''"
|
||||
echo -e "\n"
|
||||
echo -e "OAuth2 Request Permissions."
|
||||
echo -e "To enable the OAuth2 Request Permissions of Wekan:"
|
||||
echo -e "\t$ snap set $SNAP_NAME oauth2-request-permissions=\"'openid profile email'\""
|
||||
echo -e "\t-Disable the OAuth2 Request Permissions of Wekan:"
|
||||
echo -e "\t$ snap set $SNAP_NAME oauth2-request-permissions=''"
|
||||
echo -e "\n"
|
||||
echo -e "OAuth2 ID Mapping."
|
||||
echo -e "To enable the OAuth2 ID Mapping of Wekan:"
|
||||
echo -e "\t$ snap set $SNAP_NAME oauth2-id-map='username.uid'"
|
||||
|
||||
@@ -31,6 +31,13 @@ REM SET ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE=3
|
||||
REM SET ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD=60
|
||||
REM SET ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW=15
|
||||
|
||||
REM # CORS: Set Access-Control-Allow-Origin header. Example: *
|
||||
REM SET CORS=*
|
||||
REM # To enable the Set Access-Control-Allow-Headers header. "Authorization,Content-Type" is required for cross-origin use of the API.
|
||||
REM SET CORS_ALLOW_HEADERS=Authorization,Content-Type
|
||||
REM # To enable the Set Access-Control-Expose-Headers header. This is not needed for typical CORS situations. Example: *
|
||||
REM SET CORS_EXPOSE_HEADERS=*
|
||||
|
||||
REM # Optional: Integration with Matomo https://matomo.org that is installed to your server
|
||||
REM # The address of the server where Matomo is hosted.
|
||||
REM # example: - MATOMO_ADDRESS=https://example.com/matomo
|
||||
@@ -91,6 +98,25 @@ REM # OAuth2 Token Endpoint. Example: /oauth/token
|
||||
REM # example: OAUTH2_TOKEN_ENDPOINT=/oauth/token
|
||||
REM SET OAUTH2_TOKEN_ENDPOINT=
|
||||
|
||||
|
||||
REM # OAUTH2 ID Token Whitelist Fields.
|
||||
REM SET OAUTH2_ID_TOKEN_WHITELIST_FIELDS=[]
|
||||
|
||||
REM # OAUTH2 Request Permissions.
|
||||
REM SET OAUTH2_REQUEST_PERMISSIONS='openid profile email'
|
||||
|
||||
REM # OAuth2 ID Mapping
|
||||
REM SET OAUTH2_ID_MAP=
|
||||
|
||||
REM # OAuth2 Username Mapping
|
||||
REM SET OAUTH2_USERNAME_MAP=
|
||||
|
||||
REM # OAuth2 Fullname Mapping
|
||||
REM SET OAUTH2_FULLNAME_MAP=
|
||||
|
||||
REM # OAuth2 Email Mapping
|
||||
REM SET OAUTH2_EMAIL_MAP=
|
||||
|
||||
REM ------------------------------------------------------------
|
||||
|
||||
REM # LDAP_ENABLE : Enable or not the connection by the LDAP
|
||||
|
||||
@@ -56,6 +56,10 @@ function wekan_repo_check(){
|
||||
#---------------------------------------------
|
||||
# CORS: Set Access-Control-Allow-Origin header. Example: *
|
||||
#export CORS=*
|
||||
# To enable the Set Access-Control-Allow-Headers header. "Authorization,Content-Type" is required for cross-origin use of the API.
|
||||
#export CORS_ALLOW_HEADERS=Authorization,Content-Type
|
||||
# To enable the Set Access-Control-Expose-Headers header. This is not needed for typical CORS situations. Example: *
|
||||
#export CORS_EXPOSE_HEADERS=*
|
||||
#---------------------------------------------
|
||||
## Optional: Integration with Matomo https://matomo.org that is installed to your server
|
||||
## The address of the server where Matomo is hosted:
|
||||
@@ -141,6 +145,10 @@ function wekan_repo_check(){
|
||||
#export OAUTH2_USERINFO_ENDPOINT=/oauth/userinfo
|
||||
# OAuth2 Token Endpoint.
|
||||
#export OAUTH2_TOKEN_ENDPOINT=/oauth/token
|
||||
# OAUTH2 ID Token Whitelist Fields.
|
||||
#export OAUTH2_ID_TOKEN_WHITELIST_FIELDS=[]
|
||||
# OAUTH2 Request Permissions.
|
||||
#export OAUTH2_REQUEST_PERMISSIONS='openid profile email'
|
||||
# OAuth2 ID Mapping
|
||||
#export OAUTH2_ID_MAP=
|
||||
# OAuth2 Username Mapping
|
||||
|
||||
Reference in new issue
Block a user