diff options
42 files changed, 539 insertions, 313 deletions
diff --git a/client/components/boards/boardArchive.js b/client/components/boards/boardArchive.js index 35f795f3..6f62daaf 100644 --- a/client/components/boards/boardArchive.js +++ b/client/components/boards/boardArchive.js @@ -1,4 +1,4 @@ -Template.headerTitle.events({ +Template.boardHeaderBar.events({ 'click .js-open-archived-board'() { Modal.open('archivedBoards'); }, diff --git a/client/components/boards/boardHeader.jade b/client/components/boards/boardHeader.jade index f264a6d9..eb7ca984 100644 --- a/client/components/boards/boardHeader.jade +++ b/client/components/boards/boardHeader.jade @@ -1,4 +1,4 @@ -template(name="headerBoard") +template(name="boardHeaderBar") h1.header-board-menu with currentBoard a(class="{{#if currentUser.isBoardAdmin}}js-edit-board-title{{else}}is-disabled{{/if}}") @@ -125,4 +125,4 @@ template(name="boardChangeTitlePopup") template(name="archiveBoardPopup") p {{_ 'close-board-pop'}} - button.js-confirm.negate.full(type="submit") {{_ 'close'}} + button.js-confirm.negate.full(type="submit") {{_ 'archive'}} diff --git a/client/components/boards/boardHeader.js b/client/components/boards/boardHeader.js index 34204a46..b5a31754 100644 --- a/client/components/boards/boardHeader.js +++ b/client/components/boards/boardHeader.js @@ -50,7 +50,7 @@ Template.boardChangeTitlePopup.events({ BlazeComponent.extendComponent({ template() { - return 'headerBoard'; + return 'boardHeaderBar'; }, isStarred() { @@ -94,7 +94,7 @@ BlazeComponent.extendComponent({ }, }]; }, -}).register('headerBoard'); +}).register('boardHeaderBar'); BlazeComponent.extendComponent({ template() { diff --git a/client/components/boards/boardsList.jade b/client/components/boards/boardsList.jade index 7099cdc9..c11bb2df 100644 --- a/client/components/boards/boardsList.jade +++ b/client/components/boards/boardsList.jade @@ -23,3 +23,12 @@ template(name="boardList") p.board-list-item-desc= description li.js-add-board a.board-list-item.label {{_ 'add-board'}} + + +template(name="boardListHeaderBar") + h1 {{_ 'my-boards'}} + + .board-header-btns.right + a.board-header-btn.js-open-archived-board + i.fa.fa-archive + span {{_ 'archives'}} diff --git a/client/components/cards/cardDetails.jade b/client/components/cards/cardDetails.jade index 9d2cbec7..5746c92c 100644 --- a/client/components/cards/cardDetails.jade +++ b/client/components/cards/cardDetails.jade @@ -94,7 +94,7 @@ template(name="moveCardPopup") template(name="cardMembersPopup") ul.pop-over-list.js-card-member-list - each board.members + each board.activeMembers li.item(class="{{#if isCardMember}}active{{/if}}") a.name.js-select-member(href="#") +userAvatar(userId=user._id) diff --git a/client/components/cards/minicard.styl b/client/components/cards/minicard.styl index 1c27efff..47d160f4 100644 --- a/client/components/cards/minicard.styl +++ b/client/components/cards/minicard.styl @@ -133,5 +133,6 @@ margin: 0 padding: 0 max-height: 162px - min-height: 54px + min-height: 36px + margin-bottom: 20px overflow-y: auto diff --git a/client/components/lists/listBody.js b/client/components/lists/listBody.js index 36b60d06..c3a85614 100644 --- a/client/components/lists/listBody.js +++ b/client/components/lists/listBody.js @@ -57,6 +57,7 @@ BlazeComponent.extendComponent({ // We keep the form opened, empty it, and scroll to it. textarea.val('').focus(); + autosize.update(textarea); if (position === 'bottom') { this.scrollToBottom(); } @@ -180,13 +181,17 @@ BlazeComponent.extendComponent({ onRendered() { const editor = this; - this.$('textarea').escapeableTextComplete([ + const $textarea = this.$('textarea'); + + autosize($textarea); + + $textarea.escapeableTextComplete([ // User mentions { match: /\B@(\w*)$/, search(term, callback) { const currentBoard = Boards.findOne(Session.get('currentBoard')); - callback($.map(currentBoard.members, (member) => { + callback($.map(currentBoard.activeMembers(), (member) => { const user = Users.findOne(member.userId); return user.username.indexOf(term) === 0 ? user : null; })); diff --git a/client/components/lists/listHeader.jade b/client/components/lists/listHeader.jade index 72cd0fe9..750cf3a2 100644 --- a/client/components/lists/listHeader.jade +++ b/client/components/lists/listHeader.jade @@ -21,16 +21,11 @@ template(name="listActionPopup") li: a.js-add-card {{_ 'add-card'}} if cards.count li: a.js-select-cards {{_ 'list-select-cards'}} - li: a.js-move-cards {{_ 'list-move-cards'}} - li: a.js-archive-cards {{_ 'list-archive-cards'}} hr ul.pop-over-list li: a.js-import-card {{_ 'import-card'}} li: a.js-close-list {{_ 'archive-list'}} -template(name="listMoveCardsPopup") - +boardLists - template(name="boardLists") ul.pop-over-list each currentBoard.lists @@ -39,7 +34,3 @@ template(name="boardLists") a.disabled {{title}} ({{_ 'current'}}) else a.js-select-list= title - -template(name="listArchiveCardsPopup") - p {{_ 'list-archive-cards-pop'}} - input.js-confirm.negate.full(type="submit" value="{{_ 'archive-all'}}") diff --git a/client/components/lists/listHeader.js b/client/components/lists/listHeader.js index d660508a..5b7c5713 100644 --- a/client/components/lists/listHeader.js +++ b/client/components/lists/listHeader.js @@ -34,28 +34,9 @@ Template.listActionPopup.events({ Popup.close(); }, 'click .js-import-card': Popup.open('listImportCard'), - 'click .js-move-cards': Popup.open('listMoveCards'), - 'click .js-archive-cards': Popup.afterConfirm('listArchiveCards', function() { - this.allCards().forEach((card) => { - card.archive(); - }); - Popup.close(); - }), - 'click .js-close-list'(evt) { evt.preventDefault(); this.archive(); Popup.close(); }, }); - -Template.listMoveCardsPopup.events({ - 'click .js-select-list'() { - const fromList = Template.parentData(2).data; - const toList = this._id; - fromList.allCards().forEach((card) => { - card.move(toList); - }); - Popup.close(); - }, -}); diff --git a/client/components/main/editor.js b/client/components/main/editor.js index 82fce641..a30a5e1d 100644 --- a/client/components/main/editor.js +++ b/client/components/main/editor.js @@ -28,7 +28,7 @@ Template.editor.onRendered(() => { match: /\B@(\w*)$/, search(term, callback) { const currentBoard = Boards.findOne(Session.get('currentBoard')); - callback(currentBoard.members.map((member) => { + callback(currentBoard.activeMembers().map((member) => { const username = Users.findOne(member.userId).username; return username.includes(term) ? username : null; })); diff --git a/client/components/main/header.jade b/client/components/main/header.jade index 86dfd6a7..0d178250 100644 --- a/client/components/main/header.jade +++ b/client/components/main/header.jade @@ -32,10 +32,7 @@ template(name="header") current page. This bar is contextual based. If the user is not connected we display "sign in" and "log in" buttons. #header-main-bar(class="{{#if wrappedHeader}}wrapper{{/if}}") - if $.Session.get 'currentBoard' - +headerBoard - else if($eq currentRouteName 'home') - +headerTitle + +Template.dynamic(template=headerBar) //- On sandstorm, the logo shouldn't be clickable, because we only have one @@ -47,11 +44,3 @@ template(name="header") else a.wekan-logo(href="{{pathFor 'home'}}" title="{{_ 'header-logo-title'}}") img(src="{{pathFor '/wekan-logo-header.png'}}" alt="Wekan") - -template(name="headerTitle") - h1 {{_ 'my-boards'}} - - .board-header-btns.right - a.board-header-btn.js-open-archived-board - i.fa.fa-archive - span {{_ 'archives'}} diff --git a/client/components/main/header.js b/client/components/main/header.js index 30cb2d8f..d44fe76d 100644 --- a/client/components/main/header.js +++ b/client/components/main/header.js @@ -1,9 +1,4 @@ Template.header.helpers({ - // Reactively set the color of the page from the color of the current board. - headerTemplate() { - return 'headerBoard'; - }, - wrappedHeader() { return !Session.get('currentBoard'); }, diff --git a/client/components/main/header.styl b/client/components/main/header.styl index b66eb2da..6decf2df 100644 --- a/client/components/main/header.styl +++ b/client/components/main/header.styl @@ -85,6 +85,14 @@ float: left border-radius: 3px + a.fa, a i.fa + color: white + + .back-btn + font-size: 0.9em + margin-right: 10px + + .wekan-logo display: block margin: 3px auto 0 diff --git a/client/components/main/keyboardShortcuts.jade b/client/components/main/keyboardShortcuts.jade new file mode 100644 index 00000000..bde40819 --- /dev/null +++ b/client/components/main/keyboardShortcuts.jade @@ -0,0 +1,19 @@ +template(name="shortcutsHeaderBar") + h1 + a.back-btn(href="{{pathFor 'home'}}") + i.fa.fa-chevron-left + | {{_ 'keyboard-shortcuts'}} + +template(name="shortcutsModalTitle") + h2 + i.fa.fa-keyboard-o + | {{_ 'keyboard-shortcuts'}} + +template(name="keyboardShortcuts") + .wrapper.shortcuts-list + each mapping + .shortcuts-list-item + .shortcuts-list-item-keys + each keys + kbd= this + .shortcuts-list-item-action {{_ action}} diff --git a/client/components/main/keyboardShortcuts.tpl.jade b/client/components/main/keyboardShortcuts.tpl.jade deleted file mode 100644 index 5b5dae8b..00000000 --- a/client/components/main/keyboardShortcuts.tpl.jade +++ /dev/null @@ -1,11 +0,0 @@ -.wrapper.shortcuts-list - h2 - i.fa.fa-keyboard-o - | {{_ 'keyboard-shortcuts'}} - - each mapping - .shortcuts-list-item - .shortcuts-list-item-keys - each keys - kbd= this - .shortcuts-list-item-action {{_ action}} diff --git a/client/components/main/layouts.jade b/client/components/main/layouts.jade index 65b53f04..88d178f5 100644 --- a/client/components/main/layouts.jade +++ b/client/components/main/layouts.jade @@ -31,6 +31,7 @@ template(name="defaultLayout") .modal-content a.modal-close-btn.js-close-modal i.fa.fa-times-thin + +Template.dynamic(template=Modal.getHeaderName) +Template.dynamic(template=Modal.getTemplateName) template(name="notFound") diff --git a/client/components/main/layouts.styl b/client/components/main/layouts.styl index fcc94251..0e50dd55 100644 --- a/client/components/main/layouts.styl +++ b/client/components/main/layouts.styl @@ -31,6 +31,9 @@ body .sk-spinner margin-top: 30vh + > .wrapper + margin-top: 25px + #modal position: absolute top: 0 diff --git a/client/components/sidebar/sidebar.js b/client/components/sidebar/sidebar.js index 5b58dbd9..ec3ebcf6 100644 --- a/client/components/sidebar/sidebar.js +++ b/client/components/sidebar/sidebar.js @@ -279,7 +279,7 @@ BlazeComponent.extendComponent({ 'click .js-select-member'() { const userId = this.currentData()._id; const currentBoard = Boards.findOne(Session.get('currentBoard')); - if (currentBoard.memberIndex(userId)<0) { + if (!currentBoard.hasMember(userId)) { this.inviteUser(userId); } }, @@ -305,16 +305,12 @@ Template.changePermissionsPopup.events({ Template.changePermissionsPopup.helpers({ isAdmin() { - const user = Users.findOne(this.userId); - return user.isBoardAdmin(); + const currentBoard = Boards.findOne(Session.get('currentBoard')); + return currentBoard.hasAdmin(this.userId); }, isLastAdmin() { - const user = Users.findOne(this.userId); - if (!user.isBoardAdmin()) - return false; const currentBoard = Boards.findOne(Session.get('currentBoard')); - const nbAdmins = _.where(currentBoard.members, { isAdmin: true }).length; - return nbAdmins === 1; + return currentBoard.hasAdmin(this.userId) && (currentBoard.activeAdmins() === 1); }, }); diff --git a/client/components/sidebar/sidebarFilters.jade b/client/components/sidebar/sidebarFilters.jade index ef26ef76..2b326493 100644 --- a/client/components/sidebar/sidebarFilters.jade +++ b/client/components/sidebar/sidebarFilters.jade @@ -18,17 +18,16 @@ template(name="filterSidebar") i.fa.fa-check hr ul.sidebar-list - each currentBoard.members - if isActive - with getUser userId - li(class="{{#if Filter.members.isSelected _id}}active{{/if}}") - a.name.js-toggle-member-filter - +userAvatar(userId=this._id) - span.sidebar-list-item-description - = profile.fullname - | (<span class="username">{{ username }}</span>) - if Filter.members.isSelected _id - i.fa.fa-check + each currentBoard.activeMembers + with getUser userId + li(class="{{#if Filter.members.isSelected _id}}active{{/if}}") + a.name.js-toggle-member-filter + +userAvatar(userId=this._id) + span.sidebar-list-item-description + = profile.fullname + | (<span class="username">{{ username }}</span>) + if Filter.members.isSelected _id + i.fa.fa-check if Filter.isActive hr a.sidebar-btn.js-clear-all @@ -55,20 +54,22 @@ template(name="multiselectionSidebar") i.fa.fa-ellipsis-h hr ul.sidebar-list - each currentBoard.members - if isActive - with getUser userId - li(class="{{#if Filter.members.isSelected _id}}active{{/if}}") - a.name.js-toggle-member-multiselection - +userAvatar(userId=this._id) - span.sidebar-list-item-description - = profile.fullname - | (<span class="username">{{ username }}</span>) - if allSelectedElementHave 'member' _id - i.fa.fa-check - else if someSelectedElementHave 'member' _id - i.fa.fa-ellipsis-h + each currentBoard.activeMembers + with getUser userId + li(class="{{#if Filter.members.isSelected _id}}active{{/if}}") + a.name.js-toggle-member-multiselection + +userAvatar(userId=this._id) + span.sidebar-list-item-description + = profile.fullname + | (<span class="username">{{ username }}</span>) + if allSelectedElementHave 'member' _id + i.fa.fa-check + else if someSelectedElementHave 'member' _id + i.fa.fa-ellipsis-h hr + a.sidebar-btn.js-move-selection + i.fa.fa-share + span {{_ 'move-selection'}} a.sidebar-btn.js-archive-selection i.fa.fa-archive span {{_ 'archive-selection'}} @@ -82,3 +83,7 @@ template(name="disambiguateMultiMemberPopup") p {{_ 'what-to-do'}} button.wide.js-unassign-member {{_ 'unassign-member'}} button.wide.js-assign-member {{_ 'assign-member'}} + +template(name="moveSelectionPopup") + +boardLists + diff --git a/client/components/sidebar/sidebarFilters.js b/client/components/sidebar/sidebarFilters.js index bdecd63e..ba4e4df9 100644 --- a/client/components/sidebar/sidebarFilters.js +++ b/client/components/sidebar/sidebarFilters.js @@ -93,8 +93,10 @@ BlazeComponent.extendComponent({ return popup.call(this.currentData(), evt); } }, + 'click .js-move-selection': Popup.open('moveSelection'), 'click .js-archive-selection'() { mutateSelectedCards('archive'); + EscapeActions.executeUpTo('multiselection'); }, }]; }, @@ -121,3 +123,10 @@ Template.disambiguateMultiMemberPopup.events({ Popup.close(); }, }); + +Template.moveSelectionPopup.events({ + 'click .js-select-list'() { + mutateSelectedCards('move', this._id); + EscapeActions.executeUpTo('multiselection'); + }, +}); diff --git a/client/config/router.js b/client/config/router.js index 0a6958d0..ddd69db4 100644 --- a/client/config/router.js +++ b/client/config/router.js @@ -13,7 +13,10 @@ FlowRouter.route('/', { Filter.reset(); EscapeActions.executeAll(); - BlazeLayout.render('defaultLayout', { content: 'boardList' }); + BlazeLayout.render('defaultLayout', { + headerBar: 'boardListHeaderBar', + content: 'boardList', + }); }, }); @@ -33,7 +36,10 @@ FlowRouter.route('/b/:id/:slug', { EscapeActions.executeUpTo('popup-close'); } - BlazeLayout.render('defaultLayout', { content: 'board' }); + BlazeLayout.render('defaultLayout', { + headerBar: 'boardHeaderBar', + content: 'board', + }); }, }); @@ -45,7 +51,10 @@ FlowRouter.route('/b/:boardId/:slug/:cardId', { Session.set('currentBoard', params.boardId); Session.set('currentCard', params.cardId); - BlazeLayout.render('defaultLayout', { content: 'board' }); + BlazeLayout.render('defaultLayout', { + headerBar: 'boardHeaderBar', + content: 'board', + }); }, }); @@ -58,11 +67,14 @@ FlowRouter.route('/shortcuts', { if (previousPath) { Modal.open(shortcutsTemplate, { + header: 'shortcutsModalTitle', onCloseGoTo: previousPath, }); } else { - // XXX There is currently no way to escape this page on Sandstorm - BlazeLayout.render('defaultLayout', { content: shortcutsTemplate }); + BlazeLayout.render('defaultLayout', { + headerBar: 'shortcutsHeaderBar', + content: shortcutsTemplate, + }); } }, }); diff --git a/client/lib/modal.js b/client/lib/modal.js index e6301cb5..1ca8804b 100644 --- a/client/lib/modal.js +++ b/client/lib/modal.js @@ -6,8 +6,14 @@ window.Modal = new class { this._onCloseGoTo = ''; } + getHeaderName() { + const currentModal = this._currentModal.get(); + return currentModal && currentModal.header; + } + getTemplateName() { - return this._currentModal.get(); + const currentModal = this._currentModal.get(); + return currentModal && currentModal.modalName; } isOpen() { @@ -21,8 +27,8 @@ window.Modal = new class { } } - open(modalName, { onCloseGoTo = ''} = {}) { - this._currentModal.set(modalName); + open(modalName, { header = '', onCloseGoTo = ''} = {}) { + this._currentModal.set({ header, modalName }); this._onCloseGoTo = onCloseGoTo; } }; diff --git a/i18n/ar.i18n.json b/i18n/ar.i18n.json index 0cbbf195..bd1ed38d 100644 --- a/i18n/ar.i18n.json +++ b/i18n/ar.i18n.json @@ -1,4 +1,5 @@ { + "accept": "Accept", "actions": "الإجراءات", "activities": "الأنشطة", "activity": "النشاط", @@ -36,7 +37,7 @@ "archive-card": "أرشف البطاقة", "archive-list": "أرشف هذه القائمة", "archive-selection": "أرشف المُحدّد", - "archiveBoardPopup-title": "غلق اللوحة ?", + "archiveBoardPopup-title": "Archive Board?", "archived-items": "عناصر في الأرشيف", "archives": "أرشيفات", "assign-member": "تعيين عضو", @@ -87,9 +88,10 @@ "changePermissionsPopup-title": "تعديل الصلاحيات", "click-to-star": "اضغط لإضافة اللوحة للمفضلة.", "click-to-unstar": "اضغط لحذف اللوحة من المفضلة.", + "clipboard": "Clipboard or drag & drop", "close": "غلق", "close-board": "غلق اللوحة", - "close-board-pop": "يمكنك إعادة فتح اللوحة بالنقر على عنصر اللوحات من القائمة الفوقية، ثم اختيار -مشاهدة اللوحات المغلقة- ثم ستجد اللوحة و يمكنك إعادة فتحها", + "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", "color-green": "green", "color-yellow": "yellow", "color-orange": "orange", @@ -107,6 +109,7 @@ "createBoardPopup-title": "إنشاء لوحة", "createLabelPopup-title": "إنشاء علامة", "current": "الحالي", + "decline": "Decline", "default-avatar": "صورة شخصية افتراضية", "delete": "حذف", "deleteLabelPopup-title": "حذف العلامة ?", @@ -114,6 +117,7 @@ "disambiguateMultiLabelPopup-title": "تحديد الإجراء على العلامة", "disambiguateMultiMemberPopup-title": "تحديد الإجراء على العضو", "discard": "التخلص منها", + "done": "Done", "download": "تنزيل", "edit": "تعديل", "edit-avatar": "تعديل الصورة الشخصية", @@ -121,10 +125,27 @@ "editLabelPopup-title": "تعديل العلامة", "editProfilePopup-title": "تعديل الملف الشخصي", "email": "البريد الإلكتروني", + "email-enrollAccount-subject": "An account created for you on __url__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __url__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-verifyEmail-subject": "Verify your email address on __url__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", "error-board-notAMember": "You need to be a member of this board to do that", "error-json-malformed": "Your text is not valid JSON", "error-json-schema": "Your JSON data does not include the proper information in the correct format", "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "This action on self is not allowed", + "error-user-notCreated": "This user is not created", "filter": "تصفية", "filter-cards": "تصفية البطاقات", "filter-clear": "مسح التصفية", @@ -140,9 +161,13 @@ "import-card": "Import a Trello card", "import-card-trello-instruction": "Go to a Trello card, select 'Share and more...' then 'Export JSON' and copy the resulting text", "import-json-placeholder": "Paste your valid JSON data here", + "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick the Wekan user you want to use as this member", "info": "معلومات", "initials": "أولية", "joined": "انضمّ", + "just-invited": "You are just invited to this board", "keyboard-shortcuts": "اختصار لوحة المفاتيح", "label-create": "إنشاء علامة جديدة", "label-default": "%s علامة (افتراضية)", @@ -157,12 +182,12 @@ "list-move-cards": "نقل بطاقات هذه القائمة", "list-select-cards": "تحديد بطاقات هذه القائمة", "listActionPopup-title": "قائمة الإجراءات", - "listArchiveCardsPopup-title": "أرشفة بطاقات القائمة ?", "listImportCardPopup-title": "Import a Trello card", - "listMoveCardsPopup-title": "نقل بطاقات القائمة", "lists": "القائمات", "log-out": "تسجيل الخروج", "loginPopup-title": "تسجيل الدخول", + "mapMembersPopup-title": "Map members", + "mapMembersAddPopup-title": "Select Wekan member", "memberMenuPopup-title": "أفضليات الأعضاء", "members": "أعضاء", "menu": "القائمة", @@ -176,11 +201,16 @@ "no-results": "لا توجد نتائج", "normal": "عادي", "normal-desc": "يمكن مشاهدة و تعديل البطاقات. لا يمكن تغيير إعدادات الضبط.", + "not-accepted-yet": "Invitation not accepted yet", "optional": "اختياري", "or": "or", "page-maybe-private": "قدتكون هذه الصفحة خاصة . قد تستطيع مشاهدتها ب <a href='%s'>تسجيل الدخول</a>.", "page-not-found": "صفحة غير موجودة", "password": "كلمة المرور", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "preview": "Preview", + "previewClipboardImagePopup-title": "Preview", + "previewAttachedImagePopup-title": "Preview", "private": "خاص", "private-desc": "هذه اللوحة خاصة . لا يسمح إلا للأعضاء .", "profile": "ملف شخصي", @@ -220,6 +250,7 @@ "title": "عنوان", "unassign-member": "إلغاء تعيين العضو", "unsaved-description": "لديك وصف غير محفوظ", + "upload": "Upload", "upload-avatar": "رفع صورة شخصية", "uploaded-avatar": "تم رفع الصورة الشخصية", "username": "اسم المستخدم", diff --git a/i18n/ca.i18n.json b/i18n/ca.i18n.json index fae76861..e5b5878a 100644 --- a/i18n/ca.i18n.json +++ b/i18n/ca.i18n.json @@ -1,4 +1,5 @@ { + "accept": "Accept", "actions": "Accions", "activities": "Activitats", "activity": "Activitat", @@ -36,7 +37,7 @@ "archive-card": "Arxiva fitxa", "archive-list": "Arxiva aquesta llista", "archive-selection": "Arxiva selecció", - "archiveBoardPopup-title": "Tanca el tauler", + "archiveBoardPopup-title": "Archive Board?", "archived-items": "Elements arxivats", "archives": "Arxivats", "assign-member": "Assignar membre", @@ -87,9 +88,10 @@ "changePermissionsPopup-title": "Canvia permisos", "click-to-star": "Fes clic per destacar aquest tauler.", "click-to-unstar": "Fes clic per deixar de destacar aquest tauler.", + "clipboard": "Clipboard or drag & drop", "close": "Tanca", "close-board": "Tanca tauler", - "close-board-pop": "Podeu tornar a obrir el tauler fent clic al menú \"Taulers\" de la capçalera, seleccionar \"Veure Taulers Tancats \", cercar el tauler i fer clic a \"Tornar a obrir \".", + "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", "color-green": "green", "color-yellow": "yellow", "color-orange": "orange", @@ -107,6 +109,7 @@ "createBoardPopup-title": "Crea tauler", "createLabelPopup-title": "Crea etiqueta", "current": "Actual", + "decline": "Decline", "default-avatar": "Avatar per defecte", "delete": "Esborra", "deleteLabelPopup-title": "Esborra etiqueta", @@ -114,6 +117,7 @@ "disambiguateMultiLabelPopup-title": "Desfe l'ambigüitat en les etiquetes", "disambiguateMultiMemberPopup-title": "Desfe l'ambigüitat en els membres", "discard": "Descarta", + "done": "Done", "download": "Descarrega", "edit": "Edita", "edit-avatar": "Canvia Avatar", @@ -121,10 +125,27 @@ "editLabelPopup-title": "Canvia etiqueta", "editProfilePopup-title": "Edita teu Perfil", "email": "Correu electrònic", + "email-enrollAccount-subject": "An account created for you on __url__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __url__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-verifyEmail-subject": "Verify your email address on __url__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", "error-board-notAMember": "You need to be a member of this board to do that", "error-json-malformed": "Your text is not valid JSON", "error-json-schema": "Your JSON data does not include the proper information in the correct format", "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "This action on self is not allowed", + "error-user-notCreated": "This user is not created", "filter": "Filtre", "filter-cards": "Fitxes de filtre", "filter-clear": "Elimina filtre", @@ -140,9 +161,13 @@ "import-card": "Import a Trello card", "import-card-trello-instruction": "Go to a Trello card, select 'Share and more...' then 'Export JSON' and copy the resulting text", "import-json-placeholder": "Paste your valid JSON data here", + "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick the Wekan user you want to use as this member", "info": "Informacions", "initials": "Inicials", "joined": "s'ha unit", + "just-invited": "You are just invited to this board", "keyboard-shortcuts": "Dreceres de teclat", "label-create": "Crea una etiqueta nova", "label-default": "%s etiqueta (per defecte)", @@ -157,12 +182,12 @@ "list-move-cards": "Mou totes les fitxes d'aquesta llista", "list-select-cards": "Selecciona totes les fitxes d'aquesta llista", "listActionPopup-title": "Accions de la llista", - "listArchiveCardsPopup-title": "Arxivar totes les fitxes d'aquesta llista?", "listImportCardPopup-title": "Import a Trello card", - "listMoveCardsPopup-title": "Moure totes les fitxes de la llista", "lists": "Llistes", "log-out": "Finalitza la sessió", "loginPopup-title": "Inicia sessió", + "mapMembersPopup-title": "Map members", + "mapMembersAddPopup-title": "Select Wekan member", "memberMenuPopup-title": "Configura membres", "members": "Membres", "menu": "Menú", @@ -176,11 +201,16 @@ "no-results": "Sense resultats", "normal": "Normal", "normal-desc": "Podeu veure i editar fitxes. No podeu canviar la configuració.", + "not-accepted-yet": "Invitation not accepted yet", "optional": "opcional", "or": "or", "page-maybe-private": "Aquesta pàgina és privada. Per veure-la <a href='%s'> entra </a>.", "page-not-found": "Pàgina no trobada.", "password": "Contrasenya", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "preview": "Preview", + "previewClipboardImagePopup-title": "Preview", + "previewAttachedImagePopup-title": "Preview", "private": "Privat", "private-desc": "Aquest tauler és privat. Només les persones afegides al tauler poden veure´l i editar-lo.", "profile": "Perfil", @@ -220,6 +250,7 @@ "title": "Títol", "unassign-member": "Desassignar membre", "unsaved-description": "Tens una descripció sense desar.", + "upload": "Upload", "upload-avatar": "Actualitza avatar", "uploaded-avatar": "Avatar actualitzat", "username": "Nom d'Usuari", diff --git a/i18n/de.i18n.json b/i18n/de.i18n.json index bb18a335..b655b49a 100644 --- a/i18n/de.i18n.json +++ b/i18n/de.i18n.json @@ -1,4 +1,5 @@ { + "accept": "Accept", "actions": "Aktionen", "activities": "Aktivitäten", "activity": "Aktivität", @@ -36,7 +37,7 @@ "archive-card": "Karte archivieren", "archive-list": "Diese Liste archivieren", "archive-selection": "Auswahl archivieren", - "archiveBoardPopup-title": "Board schließen?", + "archiveBoardPopup-title": "Archive Board?", "archived-items": "Archivierte Einträge", "archives": "Archive", "assign-member": "Mitglied zuweisen", @@ -87,9 +88,10 @@ "changePermissionsPopup-title": "Ändere Berechtigungen", "click-to-star": "Klicke, um dem Board einen Stern zu geben.", "click-to-unstar": "Klicke, um den Stern zu entfernen.", + "clipboard": "Clipboard or drag & drop", "close": "Schließen", "close-board": "Board schließen", - "close-board-pop": "Du kannst das Board wiederherstellen, indem du auf den \"Boards\" Menüeintrag im der Kopfleiste klickst, \"Zeige geschlossene Boards an\" auswählst, dein Board suchst und auf \"Wiederherstellen\" klickst.", + "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", "color-green": "grün", "color-yellow": "gelb", "color-orange": "orange", @@ -107,6 +109,7 @@ "createBoardPopup-title": "Erstelle ein Board", "createLabelPopup-title": "Label erstellen", "current": "aktuell", + "decline": "Decline", "default-avatar": "Standard Profilbild", "delete": "Löschen", "deleteLabelPopup-title": "Label löschen?", @@ -114,6 +117,7 @@ "disambiguateMultiLabelPopup-title": "Labels vereinheitlichen", "disambiguateMultiMemberPopup-title": "Mitglieder vereinheitlichen", "discard": "Verwerfen", + "done": "Done", "download": "Download", "edit": "Bearbeiten", "edit-avatar": "Profilbild ändern", @@ -121,10 +125,27 @@ "editLabelPopup-title": "Ändere Label", "editProfilePopup-title": "Profil ändern", "email": "Email", + "email-enrollAccount-subject": "An account created for you on __url__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __url__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-verifyEmail-subject": "Verify your email address on __url__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", "error-board-notAMember": "You need to be a member of this board to do that", "error-json-malformed": "Your text is not valid JSON", "error-json-schema": "Your JSON data does not include the proper information in the correct format", "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "This action on self is not allowed", + "error-user-notCreated": "This user is not created", "filter": "Filter", "filter-cards": "Karten filtern", "filter-clear": "Filter entfernen", @@ -140,9 +161,13 @@ "import-card": "Import a Trello card", "import-card-trello-instruction": "Go to a Trello card, select 'Share and more...' then 'Export JSON' and copy the resulting text", "import-json-placeholder": "Paste your valid JSON data here", + "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick the Wekan user you want to use as this member", "info": "Informationen", "initials": "Initialien", "joined": "beigetreten", + "just-invited": "You are just invited to this board", "keyboard-shortcuts": "Tastaturkürzel", "label-create": "Neues Label erstellen.", "label-default": "%s Label (Standard)", @@ -157,12 +182,12 @@ "list-move-cards": "Alle Karten in dieser Liste verschieben", "list-select-cards": "Alle Karten in dieser Liste auswählen", "listActionPopup-title": "Listenaktionen", - "listArchiveCardsPopup-title": "Alle Karten in der Liste archivieren?", "listImportCardPopup-title": "Import a Trello card", - "listMoveCardsPopup-title": "Verschiebe alle Karten in dieser Liste", "lists": "Listen", "log-out": "Ausloggen", "loginPopup-title": "Einloggen", + "mapMembersPopup-title": "Map members", + "mapMembersAddPopup-title": "Select Wekan member", "memberMenuPopup-title": "Nutzereinstellungen", "members": "Mitglied", "menu": "Menü", @@ -176,11 +201,16 @@ "no-results": "Keine Ergebnisse", "normal": "Normal", "normal-desc": "Kann Karten anschauen und bearbeiten, aber keine Einstellungen ändern.", + "not-accepted-yet": "Invitation not accepted yet", "optional": "optional", "or": "oder", "page-maybe-private": "Diese Seite könnte privat sein. Vielleicht kannst du sie sehen, wenn du dich <a href='%s'>einloggst</a>.", "page-not-found": "Seite nicht gefunden.", "password": "Passwort", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "preview": "Preview", + "previewClipboardImagePopup-title": "Preview", + "previewAttachedImagePopup-title": "Preview", "private": "Privat", "private-desc": "Dieses Board ist privat. Nur Nutzer, die zu dem Board gehören, können es anschauen und bearbeiten.", "profile": "Profil", @@ -220,6 +250,7 @@ "title": "Titel", "unassign-member": "Mitglied abziehen", "unsaved-description": "Es gibt eine ungespeicherte Beschreibung.", + "upload": "Upload", "upload-avatar": "Profilbild hochladen", "uploaded-avatar": "Profilbild hochgeladen", "username": "Nutzername", diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index 238f9964..6cc43f03 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -37,7 +37,7 @@ "archive-card": "Archive Card", "archive-list": "Archive this list", "archive-selection": "Archive selection", - "archiveBoardPopup-title": "Close Board?", + "archiveBoardPopup-title": "Archive Board?", "archived-items": "Archived Items", "archives": "Archives", "assign-member": "Assign member", @@ -91,17 +91,17 @@ "clipboard" : "Clipboard or drag & drop", "close": "Close", "close-board": "Close Board", - "close-board-pop": "You can re-open the board by clicking the “Boards” menu from the header, selecting “View Closed Boards”, finding the board and clicking “Re-open”.", + "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", + "color-black": "black", + "color-blue": "blue", "color-green": "green", - "color-yellow": "yellow", + "color-lime": "lime", "color-orange": "orange", - "color-red": "red", + "color-pink": "pink", "color-purple": "purple", - "color-blue": "blue", + "color-red": "red", "color-sky": "sky", - "color-lime": "lime", - "color-pink": "pink", - "color-black": "black", + "color-yellow": "yellow", "comment": "Comment", "comment-placeholder": "Write a comment", "computer": "Computer", @@ -135,9 +135,9 @@ "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.\n", "email-resetPassword-subject": "Reset your password on __url__", "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.\n", + "email-sent": "Email sent", "email-verifyEmail-subject": "Verify your email address on __url__", "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.\n", - "email-sent": "Email sent", "error-board-doesNotExist": "This board does not exist", "error-board-notAdmin": "You need to be admin of this board to do that", "error-board-notAMember": "You need to be a member of this board to do that", @@ -184,18 +184,18 @@ "list-move-cards": "Move all cards in this list", "list-select-cards": "Select all cards in this list", "listActionPopup-title": "List Actions", - "listArchiveCardsPopup-title": "Archive All Cards in this List?", "listImportCardPopup-title": "Import a Trello card", - "listMoveCardsPopup-title": "Move All Cards in List", "lists": "Lists", "log-out": "Log Out", "loginPopup-title": "Log In", - "mapMembersPopup-title": "Map members", "mapMembersAddPopup-title": "Select Wekan member", + "mapMembersPopup-title": "Map members", "memberMenuPopup-title": "Member Settings", "members": "Members", "menu": "Menu", + "move-selection": "Move selection", "moveCardPopup-title": "Move Card", + "moveSelectionPopup-title": "Move selection", "multi-selection": "Multi-Selection", "multi-selection-on": "Multi-Selection is on", "my-boards": "My Boards", @@ -214,8 +214,8 @@ "password": "Password", "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", "preview": "Preview", - "previewClipboardImagePopup-title": "Preview", "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", "private": "Private", "private-desc": "This board is private. Only people added to the board can view and edit it.", "profile": "Profile", diff --git a/i18n/es.i18n.json b/i18n/es.i18n.json index 466e52cd..ba24547c 100644 --- a/i18n/es.i18n.json +++ b/i18n/es.i18n.json @@ -37,7 +37,7 @@ "archive-card": "Archive Card", "archive-list": "Archivar esta lista", "archive-selection": "Archive selection", - "archiveBoardPopup-title": "¿Cerrar el tablero?", + "archiveBoardPopup-title": "Archive Board?", "archived-items": "Items archivados", "archives": "Archives", "assign-member": "Assign member", @@ -91,7 +91,7 @@ "clipboard": "Clipboard or drag & drop", "close": "Cerrar", "close-board": "Cerrar el tablero", - "close-board-pop": "Para reabrir el tablero haz clic en el menú \"Tableros\" de la cabecera, selecciona \"Ver Tableros Cerrados\", busca el tablero y haz clic en \"Reabrir\".", + "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", "color-green": "green", "color-yellow": "yellow", "color-orange": "orange", @@ -182,9 +182,7 @@ "list-move-cards": "Move all cards in this list", "list-select-cards": "Select all cards in this list", "listActionPopup-title": "Acciones de la lista", - "listArchiveCardsPopup-title": "¿Archivar todas las fichas de esta lista?", "listImportCardPopup-title": "Import a Trello card", - "listMoveCardsPopup-title": "Trasladar todas las fichas de la lista", "lists": "Lists", "log-out": "Finalizar la sesion", "loginPopup-title": "Iniciar sesion", diff --git a/i18n/fi.i18n.json b/i18n/fi.i18n.json index 1a0cdad5..9e1a6931 100644 --- a/i18n/fi.i18n.json +++ b/i18n/fi.i18n.json @@ -1,5 +1,5 @@ { - "accept": "Accept", + "accept": "Hyväksy", "actions": "Toimet", "activities": "Toimet", "activity": "Toiminta", @@ -8,14 +8,14 @@ "activity-attached": "liitetty %s kohteeseen %s", "activity-created": "luotu %s", "activity-excluded": "poistettu %s kohteesta %s", - "activity-imported": "imported %s into %s from %s", - "activity-imported-board": "imported %s from %s", + "activity-imported": "tuotu %s kohteeseen %s lähteestä %s", + "activity-imported-board": "tuotu %s lähteestä %s", "activity-joined": "liitytty kohteeseen %s", "activity-moved": "siirretty %s kohteesta %s kohteeseen %s", "activity-on": "kohteessa %s", "activity-removed": "poistettu %s kohteesta %s", "activity-sent": "lähetetty %s kohteeseen %s", - "activity-unjoined": "unjoined %s", + "activity-unjoined": "peruttu %s liityminen", "add": "Lisää", "add-attachment": "Lisää liitetiedosto", "add-board": "Lisää uusi taulu", @@ -37,7 +37,7 @@ "archive-card": "Arkistoi kortti", "archive-list": "Arkistoi tämä lista", "archive-selection": "Arkistoi valinta", - "archiveBoardPopup-title": "Sulje taulu?", + "archiveBoardPopup-title": "Archive Board?", "archived-items": "Arkistoidut kohteet", "archives": "Arkistot", "assign-member": "Valitse jäsen", @@ -56,7 +56,7 @@ "boardChangeColorPopup-title": "Vaihda taulun tausta", "boardChangeTitlePopup-title": "Nimeä taulu uudelleen", "boardChangeVisibilityPopup-title": "Vaihda näkyvyyttä", - "boardImportBoardPopup-title": "Import board from Trello", + "boardImportBoardPopup-title": "Tuo taulu Trellosta", "boardMenuPopup-title": "Taulu valikko", "boards": "Taulut", "bucket-example": "Kuten “Laatikko lista” esimerkiksi", @@ -78,7 +78,7 @@ "cardMembersPopup-title": "Jäsenet", "cardMorePopup-title": "Lisää", "cards": "Kortit", - "change": "Change", + "change": "Muuta", "change-avatar": "Vaihda profiilikuva", "change-password": "Vaihda salasana", "change-permissions": "Muuta oikeuksia", @@ -88,20 +88,20 @@ "changePermissionsPopup-title": "Vaihda oikeuksia", "click-to-star": "Klikkaa merkataksesi tämä taulu tähdellä.", "click-to-unstar": "Klikkaa poistaaksesi tähtimerkintä taululta.", - "clipboard": "Clipboard or drag & drop", + "clipboard": "Leikepöytä tai raahaa ja pudota", "close": "Sulje", "close-board": "Sulje taulu", - "close-board-pop": "Voit uudelleenavata taulun klikkaamalla “Taulut” valikkoa ylätunnisteesta, valitsemalla “Näytä suljetut taulut”, löytämällä taulu ja klikkaamalla “Uudelleenavaa”.", - "color-green": "green", - "color-yellow": "yellow", - "color-orange": "orange", - "color-red": "red", - "color-purple": "purple", - "color-blue": "blue", - "color-sky": "sky", + "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", + "color-green": "vihreä", + "color-yellow": "keltainen", + "color-orange": "oranssi", + "color-red": "punainen", + "color-purple": "violetti", + "color-blue": "sininen", + "color-sky": "taivas", "color-lime": "lime", - "color-pink": "pink", - "color-black": "black", + "color-pink": "vaaleanpunainen", + "color-black": "musta", "comment": "Kommentti", "comment-placeholder": "Kirjoita kommentti", "computer": "Tietokone", @@ -109,7 +109,7 @@ "createBoardPopup-title": "Luo taulu", "createLabelPopup-title": "Luo tunniste", "current": "nykyinen", - "decline": "Decline", + "decline": "Kieltäydy", "default-avatar": "Oletus profiilikuva", "delete": "Poista", "deleteLabelPopup-title": "Poista tunniste?", @@ -117,7 +117,7 @@ "disambiguateMultiLabelPopup-title": "Yksikäsitteistä tunniste toiminta", "disambiguateMultiMemberPopup-title": "Yksikäsitteistä jäsen toiminta", "discard": "Hylkää", - "done": "Done", + "done": "Valmis", "download": "Lataa", "edit": "Muokkaa", "edit-avatar": "Vaihda profiilikuva", @@ -125,13 +125,13 @@ "editLabelPopup-title": "Vaihda tunniste", "editProfilePopup-title": "Muokkaa profiilia", "email": "Sähköposti", - "email-enrollAccount-subject": "An account created for you on __url__", - "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", - "email-fail": "Sending email failed", - "email-invalid": "Invalid email", - "email-invite": "Invite via Email", - "email-invite-subject": "__inviter__ sent you an invitation", - "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-enrollAccount-subject": "Tili tehty sinulle osoitteessa __url__", + "email-enrollAccount-text": "Hei __user__,\n\nAlkaaksesi käyttämään palvelua, klikkaa vain allaolevaa linkkiä.\n\n__url__\n\nKiitos.", + "email-fail": "Sähköpostin lähettäminen epäonnistui", + "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 __url__", "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", "email-verifyEmail-subject": "Verify your email address on __url__", @@ -182,9 +182,7 @@ "list-move-cards": "Siirrä kaikki kortit tässä listassa", "list-select-cards": "Valitse kaikki kortit tässä listassa", "listActionPopup-title": "Listaa toimet", - "listArchiveCardsPopup-title": "Arkistoi kaikki kortit tässä listassa?", "listImportCardPopup-title": "Import a Trello card", - "listMoveCardsPopup-title": "Siirrä kaikki listan kortit", "lists": "Listat", "log-out": "Kirjaudu ulos", "loginPopup-title": "Kirjaudu sisään", diff --git a/i18n/fr.i18n.json b/i18n/fr.i18n.json index eabd58d2..0eeb19df 100644 --- a/i18n/fr.i18n.json +++ b/i18n/fr.i18n.json @@ -1,4 +1,5 @@ { + "accept": "Accepter", "actions": "Actions", "activities": "Activitées", "activity": "Activité", @@ -7,8 +8,8 @@ "activity-attached": "a attaché %s à %s", "activity-created": "a créé %s", "activity-excluded": "a exclu %s de %s", - "activity-imported": "imported %s into %s from %s", - "activity-imported-board": "imported %s from %s", + "activity-imported": "a importé %s vers %s depuis %s", + "activity-imported-board": "a importé %s depuis %s", "activity-joined": "a rejoint %s", "activity-moved": "a déplacé %s depuis %s vers %s", "activity-on": "sur %s", @@ -36,7 +37,7 @@ "archive-card": "Archiver la carte", "archive-list": "Archiver cette liste", "archive-selection": "Archiver la selection", - "archiveBoardPopup-title": "Fermer le tableau ?", + "archiveBoardPopup-title": "Archive Board?", "archived-items": "Éléments archivés", "archives": "Archives", "assign-member": "Assigner un membre", @@ -55,7 +56,7 @@ "boardChangeColorPopup-title": "Change la fond du tableau", "boardChangeTitlePopup-title": "Renommer le tableau", "boardChangeVisibilityPopup-title": "Changer la visibilité", - "boardImportBoardPopup-title": "Import board from Trello", + "boardImportBoardPopup-title": "Importer le tableau depuis Trello", "boardMenuPopup-title": "Menu du tableau", "boards": "Tableaux", "bucket-example": "Comme « todo list » par exemple", @@ -77,7 +78,7 @@ "cardMembersPopup-title": "Membres", "cardMorePopup-title": "Plus", "cards": "Cartes", - "change": "Change", + "change": "Changer", "change-avatar": "Changer l'avatar", "change-password": "Changer le mot de passe", "change-permissions": "Changer les permissions", @@ -87,19 +88,20 @@ "changePermissionsPopup-title": "Changer les permissions", "click-to-star": "Cliquez pour ajouter ce tableau aux favoris.", "click-to-unstar": "Cliquez pour retirer ce tableau des favoris.", + "clipboard": "Clipboard or drag & drop", "close": "Fermer", "close-board": "Fermer le tableau", - "close-board-pop": "Vous pouvez ré-ouvrir le tableau en cliquant sur le menu « Tableau » dans la barre d'en-tête, puis en sélection « Voir les tableaux fermés », en trouvant le tableau désiré puis en cliquant sur « Ré-ouvrir ».", - "color-green": "green", - "color-yellow": "yellow", + "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", + "color-green": "vert", + "color-yellow": "jaune", "color-orange": "orange", - "color-red": "red", - "color-purple": "purple", - "color-blue": "blue", - "color-sky": "sky", - "color-lime": "lime", - "color-pink": "pink", - "color-black": "black", + "color-red": "rouge", + "color-purple": "violet", + "color-blue": "bleu", + "color-sky": "ciel", + "color-lime": "citron vert", + "color-pink": "rose", + "color-black": "noir", "comment": "Commentaire", "comment-placeholder": "Rédiger un commentaire", "computer": "Ordinateur", @@ -107,6 +109,7 @@ "createBoardPopup-title": "Créer un tableau", "createLabelPopup-title": "Créer un étiquette", "current": "courant", + "decline": "Refuser", "default-avatar": "Avatar par défaut", "delete": "Supprimer", "deleteLabelPopup-title": "Supprimer l'étiquette ?", @@ -114,6 +117,7 @@ "disambiguateMultiLabelPopup-title": "Préciser l'action sur l'étiquette", "disambiguateMultiMemberPopup-title": "Préciser l'action sur le membre", "discard": "Mettre à la corbeille", + "done": "Fait", "download": "Télécharger", "edit": "Éditer", "edit-avatar": "Changer l'avatar", @@ -121,10 +125,27 @@ "editLabelPopup-title": "Changer l'étiquette", "editProfilePopup-title": "Éditer le profil", "email": "Email", + "email-enrollAccount-subject": "An account created for you on __url__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __url__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-verifyEmail-subject": "Verify your email address on __url__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", "error-board-notAMember": "You need to be a member of this board to do that", "error-json-malformed": "Your text is not valid JSON", "error-json-schema": "Your JSON data does not include the proper information in the correct format", "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "This action on self is not allowed", + "error-user-notCreated": "This user is not created", "filter": "Filtrer", "filter-cards": "Filtrer les cartes", "filter-clear": "Retirer les filtres", @@ -140,9 +161,13 @@ "import-card": "Import a Trello card", "import-card-trello-instruction": "Go to a Trello card, select 'Share and more...' then 'Export JSON' and copy the resulting text", "import-json-placeholder": "Paste your valid JSON data here", + "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick the Wekan user you want to use as this member", "info": "Infos", "initials": "Initiales", "joined": "a joint", + "just-invited": "You are just invited to this board", "keyboard-shortcuts": "Raccourcis clavier", "label-create": "Créer une nouvelle étiquette", "label-default": "%s label (default)", @@ -157,18 +182,18 @@ "list-move-cards": "Déplacer les cartes de cette liste", "list-select-cards": "Sélectionner les cartes de cette liste", "listActionPopup-title": "Liste des actions", - "listArchiveCardsPopup-title": "Archiver les cartes de la liste ?", "listImportCardPopup-title": "Import a Trello card", - "listMoveCardsPopup-title": "Déplacer les cartes de la liste", "lists": "Listes", "log-out": "Déconnexion", "loginPopup-title": "Connexion", + "mapMembersPopup-title": "Associer les membres", + "mapMembersAddPopup-title": "Sélectioner le membre Wekan", "memberMenuPopup-title": "Préférence de membre", "members": "Membres", "menu": "Menu", "moveCardPopup-title": "Déplacer la carte", "multi-selection": "Sélection multiple", - "multi-selection-on": "Multi-Selection is on", + "multi-selection-on": "Multi-Selection active", "my-boards": "Mes tableaux", "name": "Nom", "no-archived-cards": "Pas de carte archivée.", @@ -176,11 +201,16 @@ "no-results": "Pas de résultats", "normal": "Normal", "normal-desc": "Peut voir et éditer les cartes. Ne peut pas changer les paramètres.", + "not-accepted-yet": "L’invitation n’a pas encore été acceptée", "optional": "optionnel", - "or": "or", + "or": "ou", "page-maybe-private": "Cette page est peut-être privée. Vous pourrez peut-être la voir en vous <a href='%s'>connectant</a>.", "page-not-found": "Page non trouvée", "password": "Mot de passe", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "preview": "Preview", + "previewClipboardImagePopup-title": "Preview", + "previewAttachedImagePopup-title": "Preview", "private": "Privé", "private-desc": "Ce tableau est privé. Seul les membres peuvent y accéder.", "profile": "Profil", @@ -220,6 +250,7 @@ "title": "Titre", "unassign-member": "Retirer le membre", "unsaved-description": "Vous avez une description non sauvegardée", + "upload": "Upload", "upload-avatar": "Télécharger un avatar", "uploaded-avatar": "Avatar téléchargé", "username": "Nom d'utilisateur", diff --git a/i18n/it.i18n.json b/i18n/it.i18n.json index 1291e0df..f9c4c38b 100644 --- a/i18n/it.i18n.json +++ b/i18n/it.i18n.json @@ -1,4 +1,5 @@ { + "accept": "Accept", "actions": "Azioni", "activities": "Attività", "activity": "Attività", @@ -36,7 +37,7 @@ "archive-card": "Archivia scheda", "archive-list": "Archivia questa lista", "archive-selection": "Archivia selezione", - "archiveBoardPopup-title": "Chiudere la bacheca?", + "archiveBoardPopup-title": "Archive Board?", "archived-items": "Elementi archiviati", "archives": "Archives", "assign-member": "Assegna membri", @@ -87,9 +88,10 @@ "changePermissionsPopup-title": "Change Permissions", "click-to-star": "Click to star this board.", "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", "close": "Close", "close-board": "Close Board", - "close-board-pop": "You can re-open the board by clicking the “Boards” menu from the header, selecting “View Closed Boards”, finding the board and clicking “Re-open”.", + "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", "color-green": "green", "color-yellow": "yellow", "color-orange": "orange", @@ -107,6 +109,7 @@ "createBoardPopup-title": "Create Board", "createLabelPopup-title": "Create Label", "current": "current", + "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", "deleteLabelPopup-title": "Delete Label?", @@ -114,6 +117,7 @@ "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", "discard": "Discard", + "done": "Done", "download": "Download", "edit": "Edit", "edit-avatar": "Change Avatar", @@ -121,10 +125,27 @@ "editLabelPopup-title": "Change Label", "editProfilePopup-title": "Edit Profile", "email": "Email", + "email-enrollAccount-subject": "An account created for you on __url__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __url__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-verifyEmail-subject": "Verify your email address on __url__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", "error-board-notAMember": "You need to be a member of this board to do that", "error-json-malformed": "Your text is not valid JSON", "error-json-schema": "Your JSON data does not include the proper information in the correct format", "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "This action on self is not allowed", + "error-user-notCreated": "This user is not created", "filter": "Filter", "filter-cards": "Filter Cards", "filter-clear": "Clear filter", @@ -140,9 +161,13 @@ "import-card": "Import a Trello card", "import-card-trello-instruction": "Go to a Trello card, select 'Share and more...' then 'Export JSON' and copy the resulting text", "import-json-placeholder": "Paste your valid JSON data here", + "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick the Wekan user you want to use as this member", "info": "Infos", "initials": "Initials", "joined": "joined", + "just-invited": "You are just invited to this board", "keyboard-shortcuts": "Keyboard shortcuts", "label-create": "Create a new label", "label-default": "%s label (default)", @@ -157,12 +182,12 @@ "list-move-cards": "Move all cards in this list", "list-select-cards": "Select all cards in this list", "listActionPopup-title": "List Actions", - "listArchiveCardsPopup-title": "Archive All Cards in this List?", "listImportCardPopup-title": "Import a Trello card", - "listMoveCardsPopup-title": "Move All Cards in List", "lists": "Lists", "log-out": "Log Out", "loginPopup-title": "Log In", + "mapMembersPopup-title": "Map members", + "mapMembersAddPopup-title": "Select Wekan member", "memberMenuPopup-title": "Member Settings", "members": "Membr", "menu": "Menu", @@ -176,11 +201,16 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", "optional": "optional", "or": "or", "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", "page-not-found": "Page not found.", "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "preview": "Preview", + "previewClipboardImagePopup-title": "Preview", + "previewAttachedImagePopup-title": "Preview", "private": "Private", "private-desc": "This board is private. Only people added to the board can view and edit it.", "profile": "Profile", @@ -220,6 +250,7 @@ "title": "Title", "unassign-member": "Unassign member", "unsaved-description": "You have an unsaved description.", + "upload": "Upload", "upload-avatar": "Upload an avatar", "uploaded-avatar": "Uploaded an avatar", "username": "Username", diff --git a/i18n/ja.i18n.json b/i18n/ja.i18n.json index c346adfa..56602fee 100644 --- a/i18n/ja.i18n.json +++ b/i18n/ja.i18n.json @@ -37,7 +37,7 @@ "archive-card": "Archive Card", "archive-list": "このリストをアーカイブ", "archive-selection": "Archive selection", - "archiveBoardPopup-title": "ボードを閉じますか?", + "archiveBoardPopup-title": "Archive Board?", "archived-items": "アーカイブされたアイテム", "archives": "Archives", "assign-member": "Assign member", @@ -91,7 +91,7 @@ "clipboard": "Clipboard or drag & drop", "close": "閉じる", "close-board": "Close Board", - "close-board-pop": "ヘッダーの\"ボード\"メニューから\"閉じたボードを見る\"を選択し、そこでボードを選択して、\"ボードの再開\"をクリックすると、ボードを再度利用できるようになります。", + "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", "color-green": "green", "color-yellow": "yellow", "color-orange": "orange", @@ -182,9 +182,7 @@ "list-move-cards": "Move all cards in this list", "list-select-cards": "Select all cards in this list", "listActionPopup-title": "操作一覧", - "listArchiveCardsPopup-title": "このリスト内の善カードをアーカイブしますか?", "listImportCardPopup-title": "Import a Trello card", - "listMoveCardsPopup-title": "リスト内のすべてのカードを移動する", "lists": "Lists", "log-out": "ログアウト", "loginPopup-title": "ログイン", diff --git a/i18n/ko.i18n.json b/i18n/ko.i18n.json index 3baf3096..09dcab92 100644 --- a/i18n/ko.i18n.json +++ b/i18n/ko.i18n.json @@ -37,7 +37,7 @@ "archive-card": "Archive Card", "archive-list": "이 목록 보관", "archive-selection": "Archive selection", - "archiveBoardPopup-title": "보드를 닫습니까?", + "archiveBoardPopup-title": "Archive Board?", "archived-items": "보관된 아이템", "archives": "Archives", "assign-member": "Assign member", @@ -91,7 +91,7 @@ "clipboard": "Clipboard or drag & drop", "close": "닫기", "close-board": "Close Board", - "close-board-pop": "보드를 다시 열 수 있습니다. 상단 \"보드\" 메뉴를 클릭해 \"닫힌 보드 보기\"를 선택하여, 보드를 찾아 \"다시 열기\" 버튼을 클릭합니다.", + "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", "color-green": "green", "color-yellow": "yellow", "color-orange": "orange", @@ -182,9 +182,7 @@ "list-move-cards": "Move all cards in this list", "list-select-cards": "Select all cards in this list", "listActionPopup-title": "동작 목록", - "listArchiveCardsPopup-title": "목록에서 모든 카드를 보관합니까?", "listImportCardPopup-title": "Import a Trello card", - "listMoveCardsPopup-title": "목록에서 모든 카드 이동", "lists": "Lists", "log-out": "로그아웃", "loginPopup-title": "로그인", diff --git a/i18n/pt-BR.i18n.json b/i18n/pt-BR.i18n.json index 0a9e46e1..a1712a85 100644 --- a/i18n/pt-BR.i18n.json +++ b/i18n/pt-BR.i18n.json @@ -37,7 +37,7 @@ "archive-card": "Arquivar Cartão", "archive-list": "Arquivar esta lista", "archive-selection": "Arquivar seleção", - "archiveBoardPopup-title": "Fechar Quadro?", + "archiveBoardPopup-title": "Archive Board?", "archived-items": "Itens Arquivados", "archives": "Arquivos", "assign-member": "Atribuir Membro", @@ -91,7 +91,7 @@ "clipboard": "Clipboard or drag & drop", "close": "Fechar", "close-board": "Fechar Quadro", - "close-board-pop": "Você pode reabrir um quadro clicando em “Quadros” no menu no cabeçalho, selecionando “Exibir Quadros Fechados”, encontrando-o e clicando em “Reabrir”.", + "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", "color-green": "green", "color-yellow": "yellow", "color-orange": "orange", @@ -182,9 +182,7 @@ "list-move-cards": "Mover todos os cartões desta lista", "list-select-cards": "Selecionar todos os cartões nesta lista", "listActionPopup-title": "Listar Ações", - "listArchiveCardsPopup-title": "Arquivar Todos Os Cartões Nesta Lista?", "listImportCardPopup-title": "Import a Trello card", - "listMoveCardsPopup-title": "Mover Todos Os Cartões Nesta Lista", "lists": "Listas", "log-out": "Sair", "loginPopup-title": "Entrar", diff --git a/i18n/ru.i18n.json b/i18n/ru.i18n.json index 9528a3c9..68dd4dca 100644 --- a/i18n/ru.i18n.json +++ b/i18n/ru.i18n.json @@ -1,4 +1,5 @@ { + "accept": "Accept", "actions": "Действия", "activities": "Activities", "activity": "Активность", @@ -36,7 +37,7 @@ "archive-card": "Archive Card", "archive-list": "Архивировать список", "archive-selection": "Archive selection", - "archiveBoardPopup-title": "Закрыть доску?", + "archiveBoardPopup-title": "Archive Board?", "archived-items": "Объекты в архиве", "archives": "Archives", "assign-member": "Assign member", @@ -87,9 +88,10 @@ "changePermissionsPopup-title": "Изменить настройки доступа", "click-to-star": "Отметить как «Избранное»", "click-to-unstar": "Снять отметку", + "clipboard": "Clipboard or drag & drop", "close": "Закрыть", "close-board": "Close Board", - "close-board-pop": "Вы сможете снова открыть доску нажав кнопку \"Доски\" в верхнем меню и выбрав \"Показать скрытые доски\".", + "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", "color-green": "green", "color-yellow": "yellow", "color-orange": "orange", @@ -107,6 +109,7 @@ "createBoardPopup-title": "Создать доску", "createLabelPopup-title": "Создать метку", "current": "current", + "decline": "Decline", "default-avatar": "Default avatar", "delete": "Удалить", "deleteLabelPopup-title": "Удалить метку?", @@ -114,6 +117,7 @@ "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", "discard": "Discard", + "done": "Done", "download": "Скачать", "edit": "Редактировать", "edit-avatar": "Изменить аватар", @@ -121,10 +125,27 @@ "editLabelPopup-title": "Редактирование метки", "editProfilePopup-title": "Edit Profile", "email": "Эл.почта", + "email-enrollAccount-subject": "An account created for you on __url__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __url__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-verifyEmail-subject": "Verify your email address on __url__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", "error-board-notAMember": "You need to be a member of this board to do that", "error-json-malformed": "Your text is not valid JSON", "error-json-schema": "Your JSON data does not include the proper information in the correct format", "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "This action on self is not allowed", + "error-user-notCreated": "This user is not created", "filter": "Filter", "filter-cards": "Фильтр", "filter-clear": "Clear filter", @@ -140,9 +161,13 @@ "import-card": "Import a Trello card", "import-card-trello-instruction": "Go to a Trello card, select 'Share and more...' then 'Export JSON' and copy the resulting text", "import-json-placeholder": "Paste your valid JSON data here", + "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick the Wekan user you want to use as this member", "info": "Информация", "initials": "Initials", "joined": "вступил", + "just-invited": "You are just invited to this board", "keyboard-shortcuts": "Keyboard shortcuts", "label-create": "Создать метку", "label-default": "%s", @@ -157,12 +182,12 @@ "list-move-cards": "Move all cards in this list", "list-select-cards": "Select all cards in this list", "listActionPopup-title": "Список действий", - "listArchiveCardsPopup-title": "Архивировать все карточки в списке?", "listImportCardPopup-title": "Import a Trello card", - "listMoveCardsPopup-title": "Перенос карточек", "lists": "Lists", "log-out": "Выйти", "loginPopup-title": "Войти", + "mapMembersPopup-title": "Map members", + "mapMembersAddPopup-title": "Select Wekan member", "memberMenuPopup-title": "Member Settings", "members": "Участники", "menu": "Меню", @@ -176,11 +201,16 @@ "no-results": "Ничего не найдено", "normal": "Обычный", "normal-desc": "Может редактировать карточки. Не может управлять настройками.", + "not-accepted-yet": "Invitation not accepted yet", "optional": "не обязательно", "or": "or", "page-maybe-private": "Возможно, эта страница скрыта от незарегистрированных пользователей. Попробуйте <a href='%s'>войти на сайт</a>.", "page-not-found": "Страница не найдена.", "password": "Пароль", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "preview": "Preview", + "previewClipboardImagePopup-title": "Preview", + "previewAttachedImagePopup-title": "Preview", "private": "Закрытая", "private-desc": "Эта доска с ограниченным доступом. Только участники могут работать с ней.", "profile": "Профиль", @@ -220,6 +250,7 @@ "title": "Название", "unassign-member": "Unassign member", "unsaved-description": "You have an unsaved description.", + "upload": "Upload", "upload-avatar": "Upload an avatar", "uploaded-avatar": "Uploaded an avatar", "username": "Имя пользователя", diff --git a/i18n/tr.i18n.json b/i18n/tr.i18n.json index d4158947..a8bcdf36 100644 --- a/i18n/tr.i18n.json +++ b/i18n/tr.i18n.json @@ -37,7 +37,7 @@ "archive-card": "Archive Card", "archive-list": "Bu listeyi arşivle", "archive-selection": "Archive selection", - "archiveBoardPopup-title": "Pano Kapatılsın mı?", + "archiveBoardPopup-title": "Archive Board?", "archived-items": "Arşivlenmiş Öğeler", "archives": "Arşiv", "assign-member": "Assign member", @@ -91,7 +91,7 @@ "clipboard": "Clipboard or drag & drop", "close": "Kapat", "close-board": "Close Board", - "close-board-pop": "You can re-open the board by clicking the “Boards” menu from the header, selecting “View Closed Boards”, finding the board and clicking “Re-open”.", + "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", "color-green": "green", "color-yellow": "yellow", "color-orange": "orange", @@ -182,9 +182,7 @@ "list-move-cards": "Move all cards in this list", "list-select-cards": "Select all cards in this list", "listActionPopup-title": "Liste İşlemleri", - "listArchiveCardsPopup-title": "Bu Listedeki Tüm Kartlar Taşınsın mı?", "listImportCardPopup-title": "Import a Trello card", - "listMoveCardsPopup-title": "Listedeki Tüm Kartları Taşıma", "lists": "Lists", "log-out": "Oturum Kapat", "loginPopup-title": "Oturum Aç", diff --git a/i18n/zh-CN.i18n.json b/i18n/zh-CN.i18n.json index d26cd6b1..2180560e 100644 --- a/i18n/zh-CN.i18n.json +++ b/i18n/zh-CN.i18n.json @@ -1,10 +1,11 @@ { - "actions": "动作", + "accept": "接受", + "actions": "操作", "activities": "活动", "activity": "活动", "activity-added": "添加 %s 至 %s", - "activity-archived": "归档 %s", - "activity-attached": "附加 %s 至 %s", + "activity-archived": "删除 %s", + "activity-attached": "添加附件 %s 至 %s", "activity-created": "创建 %s", "activity-excluded": "排除 %s 从 %s", "activity-imported": "导入 %s 至 %s 从 %s 中", @@ -21,28 +22,28 @@ "add-card": "添加卡片", "add-cover": "添加封面", "add-label": "添加标签", - "add-list": "添加列表", + "add-list": "添加清单", "add-members": "添加成员", "added": "添加", "addMemberPopup-title": "成员", "admin": "管理员", "admin-desc": "可以浏览并编辑卡片,移除成员,并且更改该看板的设置", "all-boards": "全部看板", - "and-n-other-card": "和另外 __count__ 个卡片", - "and-n-other-card_plural": "和另外 __count__ 个卡片", - "archive": "归档", - "archive-all": "全部归档", - "archive-board": "归档看板", - "archive-card": "归档卡片", - "archive-list": "归档该列表", - "archive-selection": "归档选中内容", - "archiveBoardPopup-title": "关闭看板?", - "archived-items": "归档条目", - "archives": "归档", - "assign-member": "分配人员", + "and-n-other-card": "和其他 __count__ 个卡片", + "and-n-other-card_plural": "和其他 __count__ 个卡片", + "archive": "删除", + "archive-all": "全部删除", + "archive-board": "删除看板", + "archive-card": "删除卡片", + "archive-list": "删除该清单", + "archive-selection": "删除所选内容", + "archiveBoardPopup-title": "Archive Board?", + "archived-items": "回收箱", + "archives": "回收箱", + "assign-member": "分配成员", "attached": "附加", "attachment": "附件", - "attachment-delete-pop": "删除附件操作不可逆。", + "attachment-delete-pop": "删除附件的操作不可逆。", "attachmentDeletePopup-title": "删除附件?", "attachments": "附件", "avatar-too-big": "头像太大 (最大 70 Kb)", @@ -50,8 +51,8 @@ "board-change-color": "更改颜色", "board-nb-stars": "%s 星标", "board-not-found": "看板不存在", - "board-private-info": "该看板将被 <strong>私有化</strong>.", - "board-public-info": "该看板将 <strong>公开</strong>.", + "board-private-info": "该看板将被设为 <strong>私有</strong>.", + "board-public-info": "该看板将被设为 <strong>公开</strong>.", "boardChangeColorPopup-title": "修改看板背景", "boardChangeTitlePopup-title": "重命名看板", "boardChangeVisibilityPopup-title": "更改可视级别", @@ -60,18 +61,18 @@ "boards": "看板", "bucket-example": "例如 “目标清单”", "cancel": "取消", - "card-archived": "该卡片已被归档", - "card-comments-title": "该卡片拥有 %s 条评论", - "card-delete-notice": "删除操作不可恢复,你将会丢失该卡片的所有相关动作。", + "card-archived": "该卡片已被删除", + "card-comments-title": "该卡片有 %s 条评论", + "card-delete-notice": "彻底删除的操作不可恢复,你将会丢失该卡片相关的所有操作记录。", "card-delete-pop": "所有的动作将从活动动态中被移除且您将无法重新打开该卡片。此操作无法撤销。", - "card-delete-suggest-archive": "你可以通过归档一个卡片来将它从看板中移除且保留活动。", + "card-delete-suggest-archive": "你可以将卡片从看板中删除至回收箱,但保留相关活动。", "card-edit-attachments": "编辑附件", "card-edit-labels": "编辑标签", "card-edit-members": "编辑成员", "card-labels-title": "更改该卡片上的标签", "card-members-title": "在该卡片中添加或移除看板成员", - "cardAttachmentsPopup-title": "附件位置", - "cardDeletePopup-title": "删除卡片?", + "cardAttachmentsPopup-title": "附件来源", + "cardDeletePopup-title": "彻底删除卡片?", "cardDetailsActionsPopup-title": "卡片动作", "cardLabelsPopup-title": "标签", "cardMembersPopup-title": "成员", @@ -87,9 +88,10 @@ "changePermissionsPopup-title": "更改权限", "click-to-star": "点此来标记该看板", "click-to-unstar": "点此来去除该看板的标记", + "clipboard": "剪贴板或者拖放文件", "close": "关闭", "close-board": "关闭看板", - "close-board-pop": "你可以通过点击头部的\"看板\"菜单,选择\"浏览已关闭看板\",查找看板并且点击\"重开\"来重开看板。", + "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", "color-green": "绿色", "color-yellow": "黄色", "color-orange": "橙色", @@ -107,13 +109,15 @@ "createBoardPopup-title": "创建看板", "createLabelPopup-title": "创建标签", "current": "当前", + "decline": "拒绝", "default-avatar": "默认头像", - "delete": "删除", + "delete": "彻底删除", "deleteLabelPopup-title": "删除标签?", "description": "描述", "disambiguateMultiLabelPopup-title": "消除标签动作歧义", "disambiguateMultiMemberPopup-title": "消除会员动作歧义", "discard": "放弃", + "done": "完成", "download": "下载", "edit": "编辑", "edit-avatar": "更改头像", @@ -121,10 +125,27 @@ "editLabelPopup-title": "更改标签", "editProfilePopup-title": "编辑资料", "email": "邮箱", - "error-board-notAMember": "需要成为看板成员才能执行此动作", + "email-enrollAccount-subject": "已为您在 __url__ 创建帐号", + "email-enrollAccount-text": "尊敬的 __user__,\n\n点击下面的链接,即刻开始使用这项服务。\n\n__url__\n\n谢谢。", + "email-fail": "邮件发送失败", + "email-invalid": "邮件地址错误", + "email-invite": "发送邮件邀请", + "email-invite-subject": "__inviter__ 向您发出邀请", + "email-invite-text": "尊敬的 __user__,\n\n__inviter__ 邀请您加入看板 \"__board__\" 参与协作。\n\n请点击下面的链接访问看板:\n\n__url__\n\n谢谢。", + "email-resetPassword-subject": "重置您的 __url__ 密码", + "email-resetPassword-text": "尊敬的 __user__,\n\n点击下面的链接,重置您的密码:\n\n__url__\n\n谢谢。", + "email-verifyEmail-subject": "在 __url__ 验证您的邮件地址", + "email-verifyEmail-text": "尊敬的 __user__,\n\n点击下面的链接,验证您的邮件地址:\n\n__url__\n\n谢谢。", + "email-sent": "邮件已发送", + "error-board-doesNotExist": "该看板不存在", + "error-board-notAdmin": "需要成为管理员才能执行此操作", + "error-board-notAMember": "需要成为看板成员才能执行此操作", "error-json-malformed": "文本不是合法的 JSON", "error-json-schema": "JSON 数据没有用正确的格式包含合适的信息", "error-list-doesNotExist": "不存在此列表", + "error-user-doesNotExist": "该用户不存在", + "error-user-notAllowSelf": "不允许对自己执行此操作", + "error-user-notCreated": "该用户未能成功创建", "filter": "过滤", "filter-cards": "过滤卡片", "filter-clear": "清空过滤器", @@ -140,9 +161,13 @@ "import-card": "导入 Trello 卡片", "import-card-trello-instruction": "进入一个 Trello 卡片,选择“分享与更多”,然后选择 “导出为 JSON” 并且拷贝结果文本", "import-json-placeholder": "粘贴您有效的 JSON 数据至此", + "import-members-map": "您导入的看板有一些成员。请将您想导入的成员映射到 Wekan 用户。", + "import-show-user-mapping": "核对成员映射", + "import-user-select": "选择您想将此成员映射到的 Wekan 用户", "info": "信息", - "initials": "首字母", + "initials": "缩写", "joined": "关联", + "just-invited": "您刚刚被邀请加入此看板", "keyboard-shortcuts": "键盘快捷键", "label-create": "创建新标签", "label-default": "%s 标签 (默认)", @@ -152,17 +177,17 @@ "last-admin-desc": "你不能更改角色,因为至少需要一名管理员。", "leave-board": "离开面板", "link-card": "关联至该卡片", - "list-archive-cards": "归档列表中的所有卡片", - "list-archive-cards-pop": "这将会从本看板中移除该列表中的所有卡片。如果需要浏览已归档的卡片并且将其恢复至看板,请点击\"菜单\">\"归档项\"", - "list-move-cards": "移动列表中的所有卡片", - "list-select-cards": "选择列表中的所有卡片", - "listActionPopup-title": "列出动作", - "listArchiveCardsPopup-title": "归档该列表中的所有卡片?", + "list-archive-cards": "删除清单中的所有卡片", + "list-archive-cards-pop": "这将会从本看板中移除该清单中的所有卡片。如果需要浏览已删除的卡片并且将其恢复至看板,请点击\"菜单\">\"回收箱\"", + "list-move-cards": "移动清单中的所有卡片", + "list-select-cards": "选择清单中的所有卡片", + "listActionPopup-title": "清单操作", "listImportCardPopup-title": "导入 Trello 卡片", - "listMoveCardsPopup-title": "移动该列表的所有卡片", - "lists": "列表", + "lists": "清单", "log-out": "登出", "loginPopup-title": "登录", + "mapMembersPopup-title": "映射成员", + "mapMembersAddPopup-title": "选择 Wekan 成员", "memberMenuPopup-title": "成员设置", "members": "成员", "menu": "菜单", @@ -171,28 +196,33 @@ "multi-selection-on": "多选启用", "my-boards": "我的看板", "name": "名称", - "no-archived-cards": "无归档的卡片", - "no-archived-lists": "无归档的列表", + "no-archived-cards": "没有已删除的卡片", + "no-archived-lists": "没有已删除的清单", "no-results": "无结果", "normal": "普通", "normal-desc": "可以创建以及编辑卡片,无法更改设置。", + "not-accepted-yet": "邀请尚未接受", "optional": "可选", "or": "或", "page-maybe-private": "本页面被设为私有. 您必须 <a href='%s'>登录</a>以浏览其中内容。", "page-not-found": "页面不存在。", "password": "密码", + "paste-or-dragdrop": "从剪贴板粘贴,或者拖放文件到它上面 (仅限于图片)", + "preview": "预览", + "previewClipboardImagePopup-title": "预览", + "previewAttachedImagePopup-title": "预览", "private": "私有", - "private-desc": "该看板将被设为私有看板。只有该看板成员才可以进行查看和编辑。", + "private-desc": "该看板将被设为私有。只有该看板成员才可以进行查看和编辑。", "profile": "资料", - "public": "公共", - "public-desc": "该看板将被公共。任何人均可通过链接查看,并且将对Google和其他搜索引擎开放,只有添加至该看板的成员才可进行编辑。", - "quick-access-description": "星标一个看板来在该导航条中添加一个快捷方式", + "public": "公开", + "public-desc": "该看板将被公开。任何人均可通过链接查看,并且将对Google和其他搜索引擎开放。只有添加至该看板的成员才可进行编辑。", + "quick-access-description": "星标看板在导航条中添加快捷方式", "remove-cover": "移除封面", "remove-from-board": "从看板中删除", "remove-label": "移除标签", "remove-member": "移除成员", "remove-member-from-card": "从该卡片中移除", - "remove-member-pop": "欲从 __boardTitle__ 中移除 __name__ (__username__) ? 该成员将会从该看板的所有卡片中被移除,他将会收到一条提醒。", + "remove-member-pop": "确定从 __boardTitle__ 中移除 __name__ (__username__) 吗? 该成员将被从该看板的所有卡片中移除,同时他会收到一条提醒。", "removeMemberPopup-title": "删除成员?", "rename": "重命名", "rename-board": "重命名看板", @@ -220,10 +250,11 @@ "title": "标题", "unassign-member": "取消分配成员", "unsaved-description": "存在未保存的描述", + "upload": "上传", "upload-avatar": "上传头像", "uploaded-avatar": "头像已经上传", "username": "用户名", "view-it": "查看", - "warn-list-archived": "警告: 卡片位于一个归档列表", + "warn-list-archived": "警告: 该卡片位于已删除的清单中", "what-to-do": "要做什么?" }
\ No newline at end of file diff --git a/models/boards.js b/models/boards.js index b3d5b0d0..cdf83ce0 100644 --- a/models/boards.js +++ b/models/boards.js @@ -142,6 +142,14 @@ Boards.helpers({ return _.pluck(this.members, 'userId').indexOf(memberId); }, + hasMember(memberId) { + return !!_.findWhere(this.members, {userId: memberId, isActive: true}); + }, + + hasAdmin(memberId) { + return !!_.findWhere(this.members, {userId: memberId, isActive: true, isAdmin: true}); + }, + absoluteUrl() { return FlowRouter.path('board', { id: this._id, slug: this.slug }); }, @@ -213,34 +221,23 @@ Boards.mutations({ addMember(memberId) { const memberIndex = this.memberIndex(memberId); - if (memberIndex === -1) { - const xIndex = this.memberIndex('x'); - if (xIndex === -1) { - return { - $push: { - members: { - userId: memberId, - isAdmin: false, - isActive: true, - }, - }, - }; - } else { - return { - $set: { - [`members.${xIndex}.userId`]: memberId, - [`members.${xIndex}.isActive`]: true, - [`members.${xIndex}.isAdmin`]: false, - }, - }; - } - } else { + if (memberIndex >= 0) { return { $set: { [`members.${memberIndex}.isActive`]: true, }, }; } + + return { + $push: { + members: { + userId: memberId, + isAdmin: false, + isActive: true, + }, + }, + }; }, removeMember(memberId) { @@ -248,22 +245,20 @@ Boards.mutations({ // we do not allow the only one admin to be removed const allowRemove = (!this.members[memberIndex].isAdmin) || (this.activeAdmins().length > 1); - - if (allowRemove) { - return { - $set: { - [`members.${memberIndex}.userId`]: 'x', - [`members.${memberIndex}.isActive`]: false, - [`members.${memberIndex}.isAdmin`]: false, - }, - }; - } else { + if (!allowRemove) { return { $set: { [`members.${memberIndex}.isActive`]: true, }, }; } + + return { + $set: { + [`members.${memberIndex}.isActive`]: false, + [`members.${memberIndex}.isAdmin`]: false, + }, + }; }, setMemberPermission(memberId, isAdmin) { diff --git a/models/users.js b/models/users.js index 2c9ae380..cf4c4193 100644 --- a/models/users.js +++ b/models/users.js @@ -12,16 +12,12 @@ if (Meteor.isClient) { Users.helpers({ isBoardMember() { const board = Boards.findOne(Session.get('currentBoard')); - return board && - _.contains(_.pluck(board.members, 'userId'), this._id) && - _.where(board.members, {userId: this._id})[0].isActive; + return board && board.hasMember(this._id); }, isBoardAdmin() { const board = Boards.findOne(Session.get('currentBoard')); - return board && - this.isBoardMember(board) && - _.where(board.members, {userId: this._id})[0].isAdmin; + return board && board.hasAdmin(this._id); }, }); } diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp index 41c0bc65..81d05e29 100644 --- a/sandstorm-pkgdef.capnp +++ b/sandstorm-pkgdef.capnp @@ -25,7 +25,7 @@ const pkgdef :Spk.PackageDefinition = ( appVersion = 7, # Increment this for every release. - appMarketingVersion = (defaultText = "0.10.0-RC1"), + appMarketingVersion = (defaultText = "0.10-rc3"), # Human-readable presentation of the app version. minUpgradableAppVersion = 0, diff --git a/sandstorm.js b/sandstorm.js index a711a960..5148095f 100644 --- a/sandstorm.js +++ b/sandstorm.js @@ -3,24 +3,24 @@ const isSandstorm = Meteor.settings && Meteor.settings.public && Meteor.settings.public.sandstorm; -if (isSandstorm && Meteor.isServer) { - // In sandstorm we only have one board per sandstorm instance. Since we want - // to keep most of our code unchanged, we simply hard-code a board `_id` and - // redirect the user to this particular board. - const sandstormBoard = { - _id: 'sandstorm', - - // XXX Should be shared with the grain instance name. - title: 'Wekan', - slug: 'libreboard', - members: [], - - // Board access security is handled by sandstorm, so in our point of view we - // can alway assume that the board is public (unauthorized users won't be - // able to access it anyway). - permission: 'public', - }; +// In sandstorm we only have one board per sandstorm instance. Since we want to +// keep most of our code unchanged, we simply hard-code a board `_id` and +// redirect the user to this particular board. +const sandstormBoard = { + _id: 'sandstorm', + + // XXX Should be shared with the grain instance name. + title: 'Wekan', + slug: 'libreboard', + members: [], + + // Board access security is handled by sandstorm, so in our point of view we + // can alway assume that the board is public (unauthorized users won't be able + // to access it anyway). + permission: 'public', +}; +if (isSandstorm && Meteor.isServer) { function updateUserPermissions(userId, permissions) { const isActive = permissions.indexOf('participate') > -1; const isAdmin = permissions.indexOf('configure') > -1; @@ -142,6 +142,18 @@ if (isSandstorm && Meteor.isClient) { updateSandstormMetaData({ setTitle: DocHead.getTitle() }); }); + // Runtime redirection from the home page to the unique board -- since the + // home page contains a list of a single board it's not worth to display. + // + // XXX Hack. The home route is already defined at this point so we need to + // add the redirection trigger to the internal route object. + FlowRouter._routesMap.home._triggersEnter.push((context, redirect) => { + redirect(FlowRouter.path('board', { + id: sandstormBoard._id, + slug: sandstormBoard.slug, + })); + }); + // XXX Hack. `Meteor.absoluteUrl` doesn't work in Sandstorm, since every // session has a different URL whereas Meteor computes absoluteUrl based on // the ROOT_URL environment variable. So we overwrite this function on a diff --git a/server/lib/utils.js b/server/lib/utils.js index 3e141f06..b59671fb 100644 --- a/server/lib/utils.js +++ b/server/lib/utils.js @@ -1,8 +1,7 @@ allowIsBoardAdmin = function(userId, board) { - const admins = _.pluck(_.where(board.members, {isAdmin: true}), 'userId'); - return _.contains(admins, userId); + return board && board.hasAdmin(userId); }; allowIsBoardMember = function(userId, board) { - return _.contains(_.pluck(board.members, 'userId'), userId); + return board && board.hasMember(userId); }; diff --git a/server/publications/boards.js b/server/publications/boards.js index 814d1df8..ffb077e9 100644 --- a/server/publications/boards.js +++ b/server/publications/boards.js @@ -16,7 +16,7 @@ Meteor.publish('boards', function() { return Boards.find({ archived: false, $or: [ - { 'members.userId': this.userId }, + { members: { $elemMatch: { userId: this.userId, isActive: true }}}, { _id: { $in: starredBoards } }, ], }, { @@ -66,7 +66,7 @@ Meteor.publishComposite('board', function(boardId) { // it. $or: [ { permission: 'public' }, - { 'members.userId': this.userId }, + { members: { $elemMatch: { userId: this.userId, isActive: true }}}, ], }, { limit: 1 }); }, |