From c9e24ade2411966632b0c2cad91c44cc4ddfd766 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Wed, 13 Apr 2016 16:21:45 +0200 Subject: [PATCH 001/136] UI: Add link to keyboard shortcuts --- CHANGELOG.md | 1 + client/components/sidebar/sidebar.jade | 21 +++++++++++++-------- client/components/sidebar/sidebar.js | 3 +++ client/components/sidebar/sidebar.styl | 22 ++++++++++++++++++++-- 4 files changed, 37 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2409db22..684fba6fb 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ This release adds the following new features: * Add shortcuts to move cards to the top or the bottom of a list; * A new log-in button on the public board view to sign in, even if the board is published; +* New link to the keyboard shortcuts in the board sidebar; and fixes the following bugs: diff --git a/client/components/sidebar/sidebar.jade b/client/components/sidebar/sidebar.jade index 893b5164c..0702b7b9e 100644 --- a/client/components/sidebar/sidebar.jade +++ b/client/components/sidebar/sidebar.jade @@ -3,14 +3,19 @@ template(name="sidebar") a.sidebar-tongue.js-toggle-sidebar( class="{{#if isTongueHidden}}is-hidden{{/if}}") i.fa.fa-angle-left - .sidebar-content.js-board-sidebar-content.js-perfect-scrollbar - a.hide-btn.js-hide-sidebar - i.fa.fa-angle-right - unless isDefaultView - h2 - a.fa.fa-chevron-left.js-back-home - = getViewTitle - +Template.dynamic(template=getViewTemplate) + .sidebar-shadow + .sidebar-content.sidebar-shortcuts + a.board-header-btn.js-shortcuts + i.fa.fa-keyboard-o + span {{_ 'keyboard-shortcuts' }} + .sidebar-content.js-board-sidebar-content.js-perfect-scrollbar + a.hide-btn.js-hide-sidebar + i.fa.fa-angle-right + unless isDefaultView + h2 + a.fa.fa-chevron-left.js-back-home + = getViewTitle + +Template.dynamic(template=getViewTemplate) template(name='homeSidebar') +membersWidget diff --git a/client/components/sidebar/sidebar.js b/client/components/sidebar/sidebar.js index 0af32f8fe..2f66d738b 100644 --- a/client/components/sidebar/sidebar.js +++ b/client/components/sidebar/sidebar.js @@ -94,6 +94,9 @@ BlazeComponent.extendComponent({ 'click .js-hide-sidebar': this.hide, 'click .js-toggle-sidebar': this.toggle, 'click .js-back-home': this.setView, + 'click .js-shortcuts'() { + FlowRouter.go('shortcuts'); + }, }]; }, }).register('sidebar'); diff --git a/client/components/sidebar/sidebar.styl b/client/components/sidebar/sidebar.styl index 9007af594..95f1239b9 100644 --- a/client/components/sidebar/sidebar.styl +++ b/client/components/sidebar/sidebar.styl @@ -6,11 +6,19 @@ bottom: 0 right: 0 - .sidebar-content - padding: 12px + .sidebar-shadow + position: absolute + top: 0 + bottom: 0 + right: 0 + left: 0 background: darken(white, 3%) box-shadow: -10px 0px 5px -10px darken(white, 30%) z-index: 10 + + .sidebar-content + padding: 12px + margin-bottom: 1.6em position: absolute top: 0 bottom: 0 @@ -72,6 +80,16 @@ i.fa margin-right: 10px + .sidebar-shortcuts + margin: 0 + padding: 0 + top: auto + text-align: center + font-size: 0.8em + line-height: 1.6em + vertical-align: middle + color: darken(white, 40%) + .board-sidebar width: 248px right: -@width From e564e94c94d3588de72cd308863f5193c80816ff Mon Sep 17 00:00:00 2001 From: kamijin-fanta Date: Wed, 12 Oct 2016 10:02:09 +0900 Subject: [PATCH 002/136] UI: fix description link style. - apply underline - change text color on hover --- client/components/main/layouts.styl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/client/components/main/layouts.styl b/client/components/main/layouts.styl index 83d4d693e..24b1bc5e8 100644 --- a/client/components/main/layouts.styl +++ b/client/components/main/layouts.styl @@ -351,6 +351,11 @@ a background: darken(white, 13%) overflow-y: auto + a + text-decoration: underline + &:hover + color: #333 + .basicTabs-container .tabs-content-container padding: 0 padding-top: 15px From 2ae6a009f0be847e07936286f21530ef9be5bba4 Mon Sep 17 00:00:00 2001 From: kamijin-fanta Date: Wed, 12 Oct 2016 10:32:39 +0900 Subject: [PATCH 003/136] UI: fix font - Add YuGothic and Meiryo. because display of non english letter dirty. --- client/components/main/layouts.styl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/components/main/layouts.styl b/client/components/main/layouts.styl index 83d4d693e..c515eed07 100644 --- a/client/components/main/layouts.styl +++ b/client/components/main/layouts.styl @@ -3,7 +3,7 @@ global-reset() html, body, input, select, textarea, button - font: 14px Roboto, "Helvetica Neue", Arial, Helvetica, sans-serif + font: 14px Roboto, "Helvetica Neue", Arial, Helvetica, "Yu Gothic", "Meiryo", sans-serif line-height: 18px color: #4d4d4d From 21512526014d3379be3ede61d367f57d552fad49 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 20 Oct 2016 18:27:48 +0300 Subject: [PATCH 004/136] Update Wekan fork info to README --- README.md | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 7b3eea26c..e6a95623c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Wekan +# Wekan fork -[![Join the chat][gitter_badge]][gitter_chat] +[![Join the chat][rocket_badge]][gitter_chat] Wekan is an open-source and collaborative kanban board application. @@ -10,7 +10,7 @@ boards are an unbeatable tool to keep your things organized. They give you a visual overview of the current state of your project, and make you productive by allowing you to focus on the few items that matter the most. -[![Our roadmap is self-hosted on Wekan][screenshot]][roadmap] +[![Original Wekan's roadmap is self-hosted on Wekan][screenshot]][roadmap] Wekan supports most features you would expect of it including a real-time user interface, cards comments, member assignations, customizable labels, filtered @@ -18,31 +18,38 @@ views, and more. Since it is a free software, you don’t have to trust us with your data and can install Wekan on your own computer or server. In fact we encourage you to do -that by providing one-click installation on Heroku or [Sandstorm] -[sandstorm_market] platforms and verified [Docker][docker_image] images. You can -also install Wekan on the following Platforms: +that by providing one-click installation on various platforms. + +Currently you can install Wekan fork on the followin Platforms: [![Deploy][heroku_button]][heroku_deploy] -[![SignUp][indiehosters_button]][indiehosters_saas] [![Deploy to Scalingo][scalingo_button]][scalingo_deploy] [![Install on Cloudron][cloudron_button]][cloudron_install] -Wekan is released under the very permissive [MIT license](LICENSE), and made +These Platforms have not been tested yet, but are coming sometime, so links +don't work yet: + +[Docker][docker_image] +[Sandstorm][sandstorm_market] +[![SignUp][indiehosters_button]][indiehosters_saas] + +Wekan fork is released under the very permissive [MIT license](LICENSE), and made with [Meteor](https://www.meteor.com). -[Our roadmap is self-hosted on Wekan][roadmap] +Wekan fork roadmap is to first integrate existing pull requests, and then +plan for more. [screenshot]: http://i.imgur.com/cI4jW2h.png -[gitter_badge]: https://badges.gitter.im/Join%20Chat.svg -[gitter_chat]: https://gitter.im/wekan/wekan +[rocket_badge]: https://demo.rocket.chat/images/join-chat.svg +[rocket_chat]: https://chat.indie.host/channel/wekan [roadmap]: http://try.wekan.io/b/MeSsFJaSqeuo9M6bs/wekan-roadmap -[sandstorm_market]: https://oasis.sandstorm.io/appdemo/m86q05rdvj14yvn78ghaxynqz7u2svw6rnttptxx49g1785cdv1h -[docker_image]: https://hub.docker.com/r/mquandalle/wekan/ +[sandstorm_market]: https://oasis.sandstorm.io/appdemo/.... +[docker_image]: https://hub.docker.com/r/... [heroku_button]: https://www.herokucdn.com/deploy/button.png -[heroku_deploy]: https://heroku.com/deploy?template=https://github.com/wekan/wekan/tree/master +[heroku_deploy]: https://heroku.com/deploy?template=https://github.com/wefork/wekan/tree/master [indiehosters_button]: https://indie.host/signup.png [indiehosters_saas]: https://indiehosters.net/shop/product/wekan-20 [scalingo_button]: https://cdn.scalingo.com/deploy/button.svg -[scalingo_deploy]: https://my.scalingo.com/deploy?source=https://github.com/wekan/wekan#master +[scalingo_deploy]: https://my.scalingo.com/deploy?source=https://github.com/wefork/wekan#master [cloudron_button]: https://cloudron.io/img/button.svg [cloudron_install]: https://cloudron.io/button.html?app=io.wekan.cloudronapp From 9f3cbcbcb076cccfc1398a43552cb9b66bb20de9 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 20 Oct 2016 18:31:27 +0300 Subject: [PATCH 005/136] Try to fix Rocket.Chat badge. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e6a95623c..1b6adafa9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Wekan fork -[![Join the chat][rocket_badge]][gitter_chat] +[![Join the chat][rocket_badge]] Wekan is an open-source and collaborative kanban board application. From 1a3a878778ebc6acc511aedceba680a349127ab5 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 20 Oct 2016 18:35:41 +0300 Subject: [PATCH 006/136] Fix Rocket.Chat badge. --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 1b6adafa9..f62f818a1 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Wekan fork -[![Join the chat][rocket_badge]] +[![Join the chat](https://demo.rocket.chat/images/join-chat.svg)](https://chat.indie.host/channel/wekan) Wekan is an open-source and collaborative kanban board application. @@ -40,8 +40,6 @@ Wekan fork roadmap is to first integrate existing pull requests, and then plan for more. [screenshot]: http://i.imgur.com/cI4jW2h.png -[rocket_badge]: https://demo.rocket.chat/images/join-chat.svg -[rocket_chat]: https://chat.indie.host/channel/wekan [roadmap]: http://try.wekan.io/b/MeSsFJaSqeuo9M6bs/wekan-roadmap [sandstorm_market]: https://oasis.sandstorm.io/appdemo/.... [docker_image]: https://hub.docker.com/r/... From ed5a4be4f4a677015f82692e5b4da0763391ff4f Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 20 Oct 2016 18:49:09 +0300 Subject: [PATCH 007/136] Add link to Wekan fork announcement --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index f62f818a1..cb2bd4104 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ [![Join the chat](https://demo.rocket.chat/images/join-chat.svg)](https://chat.indie.host/channel/wekan) +[Wekan fork announcement](https://github.com/wekan/wekan/issues/640#issuecomment-255091832) + Wekan is an open-source and collaborative kanban board application. Whether you’re maintaining a personal todo list, planning your holidays with @@ -30,7 +32,9 @@ These Platforms have not been tested yet, but are coming sometime, so links don't work yet: [Docker][docker_image] + [Sandstorm][sandstorm_market] + [![SignUp][indiehosters_button]][indiehosters_saas] Wekan fork is released under the very permissive [MIT license](LICENSE), and made From 253c482b9cc12f3e678e69a303ffd7c30ed2a2b0 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 20 Oct 2016 21:01:30 +0300 Subject: [PATCH 008/136] Add link to roadmap --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index cb2bd4104..dadd5045a 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ [Wekan fork announcement](https://github.com/wekan/wekan/issues/640#issuecomment-255091832) +[Wekan fork roadmap is self-hosted on Wekan fork](https://wekan.indie.host/b/t2YaGmyXgNkppcFBq/wekan-fork-roadmap) + Wekan is an open-source and collaborative kanban board application. Whether you’re maintaining a personal todo list, planning your holidays with @@ -40,9 +42,6 @@ don't work yet: Wekan fork is released under the very permissive [MIT license](LICENSE), and made with [Meteor](https://www.meteor.com). -Wekan fork roadmap is to first integrate existing pull requests, and then -plan for more. - [screenshot]: http://i.imgur.com/cI4jW2h.png [roadmap]: http://try.wekan.io/b/MeSsFJaSqeuo9M6bs/wekan-roadmap [sandstorm_market]: https://oasis.sandstorm.io/appdemo/.... From b159e9b3d1b83b23ff858290f528cc68827c8177 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 20 Oct 2016 21:58:40 +0300 Subject: [PATCH 009/136] Update screenshot. Fix chat svg link. Fix typo. --- README.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index dadd5045a..ea2cc488e 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,8 @@ # Wekan fork -[![Join the chat](https://demo.rocket.chat/images/join-chat.svg)](https://chat.indie.host/channel/wekan) +[![Join the chat][rocket_badge]][rocket_chat] -[Wekan fork announcement](https://github.com/wekan/wekan/issues/640#issuecomment-255091832) - -[Wekan fork roadmap is self-hosted on Wekan fork](https://wekan.indie.host/b/t2YaGmyXgNkppcFBq/wekan-fork-roadmap) +[Wekan fork announcement][fork_announcement] Wekan is an open-source and collaborative kanban board application. @@ -14,7 +12,7 @@ boards are an unbeatable tool to keep your things organized. They give you a visual overview of the current state of your project, and make you productive by allowing you to focus on the few items that matter the most. -[![Original Wekan's roadmap is self-hosted on Wekan][screenshot]][roadmap] +[![Our roadmap is self-hosted on Wekan fork][screenshot]][roadmap] Wekan supports most features you would expect of it including a real-time user interface, cards comments, member assignations, customizable labels, filtered @@ -24,7 +22,7 @@ Since it is a free software, you don’t have to trust us with your data and can install Wekan on your own computer or server. In fact we encourage you to do that by providing one-click installation on various platforms. -Currently you can install Wekan fork on the followin Platforms: +Currently you can install Wekan fork on the following Platforms: [![Deploy][heroku_button]][heroku_deploy] [![Deploy to Scalingo][scalingo_button]][scalingo_deploy] @@ -42,8 +40,13 @@ don't work yet: Wekan fork is released under the very permissive [MIT license](LICENSE), and made with [Meteor](https://www.meteor.com). -[screenshot]: http://i.imgur.com/cI4jW2h.png -[roadmap]: http://try.wekan.io/b/MeSsFJaSqeuo9M6bs/wekan-roadmap +[Our roadmap is self-hosted on Wekan fork][roadmap] + +[fork_announcement]: https://github.com/wekan/wekan/issues/640#issuecomment-255091832 +[screenshot]: http://i.imgur.com/uNVJnBE.png +[rocket_badge]: https://chat.indie.host/images/join-chat.svg +[rocket_chat]: https://chat.indie.host/channel/wekan +[roadmap]: https://wekan.indie.host/b/t2YaGmyXgNkppcFBq/wekan-fork-roadmap [sandstorm_market]: https://oasis.sandstorm.io/appdemo/.... [docker_image]: https://hub.docker.com/r/... [heroku_button]: https://www.herokucdn.com/deploy/button.png From 8bbcbea235ef515862885e882a853fe5c37030cb Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 20 Oct 2016 22:06:32 +0300 Subject: [PATCH 010/136] Fix screenshot link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ea2cc488e..8b98c080c 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ with [Meteor](https://www.meteor.com). [Our roadmap is self-hosted on Wekan fork][roadmap] [fork_announcement]: https://github.com/wekan/wekan/issues/640#issuecomment-255091832 -[screenshot]: http://i.imgur.com/uNVJnBE.png +[screenshot]: http://i.imgur.com/uNVJnBe.png [rocket_badge]: https://chat.indie.host/images/join-chat.svg [rocket_chat]: https://chat.indie.host/channel/wekan [roadmap]: https://wekan.indie.host/b/t2YaGmyXgNkppcFBq/wekan-fork-roadmap From d874ce70f7e13ba4fef5b5271350b126aa16f3be Mon Sep 17 00:00:00 2001 From: Pierre Ozoux Date: Fri, 21 Oct 2016 15:57:19 +0100 Subject: [PATCH 011/136] Move back IndieHosters --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 8b98c080c..4f5f94104 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ that by providing one-click installation on various platforms. Currently you can install Wekan fork on the following Platforms: [![Deploy][heroku_button]][heroku_deploy] +[![SignUp][indiehosters_button]][indiehosters_saas] [![Deploy to Scalingo][scalingo_button]][scalingo_deploy] [![Install on Cloudron][cloudron_button]][cloudron_install] @@ -35,8 +36,6 @@ don't work yet: [Sandstorm][sandstorm_market] -[![SignUp][indiehosters_button]][indiehosters_saas] - Wekan fork is released under the very permissive [MIT license](LICENSE), and made with [Meteor](https://www.meteor.com). From eb618c891f50e59b54c5dadd6ceb4ba7e60bea59 Mon Sep 17 00:00:00 2001 From: Felix Michels Date: Wed, 26 Oct 2016 14:18:28 +0200 Subject: [PATCH 012/136] Method 'quitBoard' requires boardId but got board --- client/components/sidebar/sidebar.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/components/sidebar/sidebar.js b/client/components/sidebar/sidebar.js index 0af32f8fe..c45e384b7 100644 --- a/client/components/sidebar/sidebar.js +++ b/client/components/sidebar/sidebar.js @@ -134,8 +134,8 @@ Template.memberPopup.events({ Popup.close(); }), 'click .js-leave-member'() { - const currentBoard = Boards.findOne(Session.get('currentBoard')); - Meteor.call('quitBoard', currentBoard, (err, ret) => { + const boardId = Session.get('currentBoard'); + Meteor.call('quitBoard', boardId, (err, ret) => { if (!ret && ret) { Popup.close(); FlowRouter.go('home'); From 91f9cf12b7dfbdf7a7d2cfa53821964e3fbb9a04 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 1 Nov 2016 09:59:28 +0200 Subject: [PATCH 013/136] Add Debian Wheezy 64bit install doc by soohwa --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 4f5f94104..51f2a64f3 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,8 @@ that by providing one-click installation on various platforms. Currently you can install Wekan fork on the following Platforms: +[Debian Wheezy 64bit][debian_wheezy] + [![Deploy][heroku_button]][heroku_deploy] [![SignUp][indiehosters_button]][indiehosters_saas] [![Deploy to Scalingo][scalingo_button]][scalingo_deploy] @@ -56,3 +58,4 @@ with [Meteor](https://www.meteor.com). [scalingo_deploy]: https://my.scalingo.com/deploy?source=https://github.com/wefork/wekan#master [cloudron_button]: https://cloudron.io/img/button.svg [cloudron_install]: https://cloudron.io/button.html?app=io.wekan.cloudronapp +[debian_wheezy]: https://github.com/soohwa/sps/blob/master/example/docs/1/wekan.md From 87ce042c63b403780bcd5c5a50967925d433a1a1 Mon Sep 17 00:00:00 2001 From: Drew Fisher Date: Mon, 11 Jul 2016 15:20:10 -0700 Subject: [PATCH 014/136] Add SANDSTORM=1 to the environment under Sandstorm We add the SANDSTORM=1 environment variable to sandstorm-pkgdef.capnp so that accounts-sandstorm will ensure that it's the only loaded accounts package when running under Sandstorm. --- sandstorm-pkgdef.capnp | 1 + 1 file changed, 1 insertion(+) diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp index d9e7da3d7..17b27a8a9 100644 --- a/sandstorm-pkgdef.capnp +++ b/sandstorm-pkgdef.capnp @@ -184,6 +184,7 @@ const myCommand :Spk.Manifest.Command = ( environ = [ # Note that this defines the *entire* environment seen by your app. (key = "PATH", value = "/usr/local/bin:/usr/bin:/bin"), + (key = "SANDSTORM", value = "1"), (key = "METEOR_SETTINGS", value = "{\"public\": {\"sandstorm\": true}}") ] ); From 0f62fe0c6e5a151be0aa7baf60405ef2e878a0d8 Mon Sep 17 00:00:00 2001 From: Drew Fisher Date: Mon, 11 Jul 2016 15:21:19 -0700 Subject: [PATCH 015/136] Fix login on Sandstorm by not creating welcome boards This one is a pretty strange chain of events: * fetching /.sandstorm-login via accounts-sandstorm's rendezvous protocol causes a user to be created in the users collection * models/users.js has hooks to create a board and lists when a user is created * models/activities.js has a hook to create activity entries when a list is created * this hook does not handle not having no boardId, which results in attempting to run the hook with boardId: 'false'. 'false' does not have a title attribute, which causes the whole method call to throw an exception. * This makes the initial login fail. While there may be other bugs, the simple fix is to not create the board and lists when running under Sandstorm, where you only have one board anyway. --- models/users.js | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/models/users.js b/models/users.js index 790ee0a1f..bdc5ddfe8 100644 --- a/models/users.js +++ b/models/users.js @@ -1,3 +1,7 @@ +// Sandstorm context is detected using the METEOR_SETTINGS environment variable +// in the package definition. +const isSandstorm = Meteor.settings && Meteor.settings.public && + Meteor.settings.public.sandstorm; Users = Meteor.users; Users.attachSchema(new SimpleSchema({ @@ -394,24 +398,26 @@ if (Meteor.isServer) { return fakeUserId.get() || getUserId(); }; - Users.after.insert((userId, doc) => { - const fakeUser = { - extendAutoValueContext: { - userId: doc._id, - }, - }; + if (!isSandstorm) { + Users.after.insert((userId, doc) => { + const fakeUser = { + extendAutoValueContext: { + userId: doc._id, + }, + }; - fakeUserId.withValue(doc._id, () => { - // Insert the Welcome Board - Boards.insert({ - title: TAPi18n.__('welcome-board'), - permission: 'private', - }, fakeUser, (err, boardId) => { + fakeUserId.withValue(doc._id, () => { + // Insert the Welcome Board + Boards.insert({ + title: TAPi18n.__('welcome-board'), + permission: 'private', + }, fakeUser, (err, boardId) => { - ['welcome-list1', 'welcome-list2'].forEach((title) => { - Lists.insert({ title: TAPi18n.__(title), boardId }, fakeUser); + ['welcome-list1', 'welcome-list2'].forEach((title) => { + Lists.insert({ title: TAPi18n.__(title), boardId }, fakeUser); + }); }); }); }); - }); + } } From 9f4300d38b248a147ac0fdf39bb607ffed5bae7e Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Wed, 21 Sep 2016 11:16:07 -0400 Subject: [PATCH 016/136] Fix updating of permissions and profile. --- sandstorm.js | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/sandstorm.js b/sandstorm.js index e7a67f767..d1b7b300e 100644 --- a/sandstorm.js +++ b/sandstorm.js @@ -58,29 +58,6 @@ if (isSandstorm && Meteor.isServer) { Location: base + boardPath, }); res.end(); - - // `accounts-sandstorm` populate the Users collection when new users - // accesses the document, but in case a already known user comes back, we - // need to update his associated document to match the request HTTP headers - // informations. - // XXX We need to update this document even if the initial route is not `/`. - // Unfortuanlty I wasn't able to make the Webapp.rawConnectHandlers solution - // work. - const user = Users.findOne({ - 'services.sandstorm.id': req.headers['x-sandstorm-user-id'], - }); - if (user) { - // XXX At this point the user.services.sandstorm credentials haven't been - // updated, which mean that the user will have to restart the application - // a second time to see its updated name and avatar. - Users.update(user._id, { - $set: { - 'profile.fullname': user.services.sandstorm.name, - 'profile.avatarUrl': user.services.sandstorm.picture, - }, - }); - updateUserPermissions(user._id, user.services.sandstorm.permissions); - } }); // On the first launch of the instance a user is automatically created thanks @@ -126,6 +103,29 @@ if (isSandstorm && Meteor.isServer) { updateUserPermissions(doc._id, doc.services.sandstorm.permissions); }); + Meteor.startup(() => { + Users.find().observeChanges({ + changed(userId, fields) { + const sandstormData = (fields.services || {}).sandstorm || {}; + if (sandstormData.name) { + Users.update(userId, { + $set: { 'profile.fullname': sandstormData.name }, + }); + } + + if (sandstormData.picture) { + Users.update(userId, { + $set: { 'profile.avatarUrl': sandstormData.picture }, + }); + } + + if (sandstormData.permissions) { + updateUserPermissions(userId, sandstormData.permissions); + } + }, + }); + }); + // Wekan v0.8 didn’t implement the Sandstorm sharing model and instead kept // the visibility setting (“public” or “private”) in the UI as does the main // Meteor application. We need to enforce “public” visibility as the sharing From 1ad44de8c6774a7caee43eeecdafe1893234e890 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Mon, 26 Sep 2016 11:40:43 -0400 Subject: [PATCH 017/136] powerbox identity requests --- client/components/sidebar/sidebar.jade | 10 +- client/components/sidebar/sidebar.js | 3 + sandstorm.js | 144 +++++++++++++++++++++++++ 3 files changed, 153 insertions(+), 4 deletions(-) diff --git a/client/components/sidebar/sidebar.jade b/client/components/sidebar/sidebar.jade index 4f5586cbd..51600acfd 100644 --- a/client/components/sidebar/sidebar.jade +++ b/client/components/sidebar/sidebar.jade @@ -30,10 +30,12 @@ template(name="membersWidget") .board-widget-content each currentBoard.activeMembers +userAvatar(userId=this.userId showStatus=true) - unless isSandstorm - if currentUser.isBoardAdmin - a.member.add-member.js-manage-board-members - i.fa.fa-plus + if isSandstorm + a.member.add-member.sandstorm-powerbox-request-identity + i.fa.fa-plus + else if currentUser.isBoardAdmin + a.member.add-member.js-manage-board-members + i.fa.fa-plus .clearfix if isInvited hr diff --git a/client/components/sidebar/sidebar.js b/client/components/sidebar/sidebar.js index 0af32f8fe..f32a27c54 100644 --- a/client/components/sidebar/sidebar.js +++ b/client/components/sidebar/sidebar.js @@ -163,6 +163,9 @@ Template.membersWidget.helpers({ Template.membersWidget.events({ 'click .js-member': Popup.open('member'), 'click .js-manage-board-members': Popup.open('addMember'), + 'click .sandstorm-powerbox-request-identity'() { + window.sandstormRequestIdentity(); + }, 'click .js-member-invite-accept'() { const boardId = Session.get('currentBoard'); Meteor.user().removeInvite(boardId); diff --git a/sandstorm.js b/sandstorm.js index d1b7b300e..40a80dc65 100644 --- a/sandstorm.js +++ b/sandstorm.js @@ -21,6 +21,79 @@ const sandstormBoard = { }; if (isSandstorm && Meteor.isServer) { + const Capnp = require('capnp'); + const Powerbox = Capnp.importSystem('sandstorm/powerbox.capnp'); + const Identity = Capnp.importSystem('sandstorm/identity.capnp'); + const SandstormHttpBridge = + Capnp.importSystem('sandstorm/sandstorm-http-bridge.capnp').SandstormHttpBridge; + + let httpBridge = null; + + function getHttpBridge() { + if (!httpBridge) { + const capnpConnection = Capnp.connect('unix:/tmp/sandstorm-api'); + httpBridge = capnpConnection.restore(null, SandstormHttpBridge); + } + return httpBridge; + } + + Meteor.methods({ + sandstormClaimIdentityRequest(token, descriptor) { + check(token, String); + check(descriptor, String); + + const parsedDescriptor = Capnp.parse( + Powerbox.PowerboxDescriptor, + new Buffer(descriptor, 'base64'), + { packed: true }); + + const tag = Capnp.parse(Identity.Identity.PowerboxTag, parsedDescriptor.tags[0].value); + const permissions = []; + if (tag.permissions[1]) { + permissions.push('configure'); + } + + if (tag.permissions[0]) { + permissions.push('participate'); + } + + const sessionId = this.connection.sandstormSessionId(); + const httpBridge = getHttpBridge(); + const session = httpBridge.getSessionContext(sessionId).context; + const api = httpBridge.getSandstormApi(sessionId).api; + + Meteor.wrapAsync((done) => { + session.claimRequest(token).then((response) => { + const identity = response.cap.castAs(Identity.Identity); + const promises = [api.getIdentityId(identity), identity.getProfile()]; + return Promise.all(promises).then((responses) => { + const identityId = responses[0].id.toString('hex').slice(0, 32); + const profile = responses[1].profile; + return profile.picture.getUrl().then((response) => { + const sandstormInfo = { + id: identityId, + name: profile.displayName.defaultText, + permissions, + picture: `${response.protocol}://${response.hostPath}`, + preferredHandle: profile.preferredHandle, + pronouns: profile.pronouns, + }; + + const login = Accounts.updateOrCreateUserFromExternalService( + 'sandstorm', sandstormInfo, + { profile: { name: sandstormInfo.name, fullname: sandstormInfo.name } }); + + updateUserPermissions(login.userId, permissions); + done(); + }); + }); + }).catch((e) => { + done(e, null); + }); + })(); + }, + }); + function updateUserPermissions(userId, permissions) { const isActive = permissions.indexOf('participate') > -1; const isAdmin = permissions.indexOf('configure') > -1; @@ -137,6 +210,77 @@ if (isSandstorm && Meteor.isServer) { } if (isSandstorm && Meteor.isClient) { + let rpcCounter = 0; + const rpcs = {}; + + window.addEventListener('message', (event) => { + if (event.source === window) { + // Meteor likes to postmessage itself. + return; + } + + if ((event.source !== window.parent) || + typeof event.data !== 'object' || + typeof event.data.rpcId !== 'number') { + throw new Error(`got unexpected postMessage: ${event}`); + } + + const handler = rpcs[event.data.rpcId]; + if (!handler) { + throw new Error(`no such rpc ID for event ${event}`); + } + + delete rpcs[event.data.rpcId]; + handler(event.data); + }); + + function sendRpc(name, message) { + const id = rpcCounter++; + message.rpcId = id; + const obj = {}; + obj[name] = message; + window.parent.postMessage(obj, '*'); + return new Promise((resolve, reject) => { + rpcs[id] = (response) => { + if (response.error) { + reject(new Error(response.error)); + } else { + resolve(response); + } + }; + }); + } + + const powerboxDescriptors = { + identity: 'EAhQAQEAABEBF1EEAQH_GN1RqXqYhMAAQAERAREBAQ', + // Generated using the following code: + // + // Capnp.serializePacked( + // Powerbox.PowerboxDescriptor, + // { tags: [ { + // id: "13872380404802116888", + // value: Capnp.serialize(Identity.PowerboxTag, { permissions: [true, false] }) + // }]}).toString('base64') + // .replace(/\//g, "_") + // .replace(/\+/g, "-"); + }; + + function doRequest(serializedPowerboxDescriptor, onSuccess) { + return sendRpc('powerboxRequest', { + query: [serializedPowerboxDescriptor], + }).then((response) => { + if (!response.canceled) { + onSuccess(response); + } + }); + } + + window.sandstormRequestIdentity = function () { + doRequest(powerboxDescriptors.identity, (response) => { + Meteor.call('sandstormClaimIdentityRequest', response.token, response.descriptor); + }); + }; + // Since the Sandstorm grain is displayed in an iframe of the Sandstorm shell, // we need to explicitly expose meta data like the page title or the URL path // so that they could appear in the browser window. From 95680ef43abafd8d6cce9d879519bc8ba5091c8a Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Tue, 27 Sep 2016 10:49:02 -0400 Subject: [PATCH 018/136] only show 'add member' button to users who can edit the board --- client/components/sidebar/sidebar.jade | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/client/components/sidebar/sidebar.jade b/client/components/sidebar/sidebar.jade index 51600acfd..f3fdd1bce 100644 --- a/client/components/sidebar/sidebar.jade +++ b/client/components/sidebar/sidebar.jade @@ -31,8 +31,9 @@ template(name="membersWidget") each currentBoard.activeMembers +userAvatar(userId=this.userId showStatus=true) if isSandstorm - a.member.add-member.sandstorm-powerbox-request-identity - i.fa.fa-plus + if currentUser.isBoardMember + a.member.add-member.sandstorm-powerbox-request-identity + i.fa.fa-plus else if currentUser.isBoardAdmin a.member.add-member.js-manage-board-members i.fa.fa-plus From 4d6ab3094c842f42ef12b8eb1595e0f947b3f5a8 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Wed, 28 Sep 2016 13:40:54 -0400 Subject: [PATCH 019/136] Prevent the capnproto connection from getting garbage collected. --- sandstorm.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sandstorm.js b/sandstorm.js index 40a80dc65..b511155c5 100644 --- a/sandstorm.js +++ b/sandstorm.js @@ -28,10 +28,11 @@ if (isSandstorm && Meteor.isServer) { Capnp.importSystem('sandstorm/sandstorm-http-bridge.capnp').SandstormHttpBridge; let httpBridge = null; + let capnpConnection = null; function getHttpBridge() { if (!httpBridge) { - const capnpConnection = Capnp.connect('unix:/tmp/sandstorm-api'); + capnpConnection = Capnp.connect('unix:/tmp/sandstorm-api'); httpBridge = capnpConnection.restore(null, SandstormHttpBridge); } return httpBridge; From 349cdd4bf9b08f07a00d0576c78a3e71a18c1eb3 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Thu, 6 Oct 2016 13:55:58 -0400 Subject: [PATCH 020/136] Integration with Sandstorm events/notifications. --- sandstorm-pkgdef.capnp | 44 +++++++++++++++++- sandstorm.js | 103 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 144 insertions(+), 3 deletions(-) diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp index 17b27a8a9..2db5b6b6f 100644 --- a/sandstorm-pkgdef.capnp +++ b/sandstorm-pkgdef.capnp @@ -173,8 +173,48 @@ const pkgdef :Spk.PackageDefinition = ( # # XXX Administrators configuration options aren’t implemented yet, so this # role is currently useless. - )] - ) + )], + + eventTypes = [( + name = "addBoardMember", + verbPhrase = (defaultText = "added to board"), + ), ( + name = "createList", + verbPhrase = (defaultText = "created new list"), + ), ( + name = "archivedList", + verbPhrase = (defaultText = "archived list"), + ), ( + name = "restoredList", + verbPhrase = (defaultText = "restored list"), + ), ( + name = "createCard", + verbPhrase = (defaultText = "created new card"), + ), ( + name = "moveCard", + verbPhrase = (defaultText = "moved card"), + ), ( + name = "archivedCard", + verbPhrase = (defaultText = "archived card"), + ), ( + name = "restoredCard", + verbPhrase = (defaultText = "restored card"), + ), ( + name = "addComment", + verbPhrase = (defaultText = "added comment"), + ), ( + name = "addAttachement", + verbPhrase = (defaultText = "added attachment"), + ), ( + name = "joinMember", + verbPhrase = (defaultText = "added to card"), + ), ( + name = "unjoinMember", + verbPhrase = (defaultText = "removed from card"), + ), ], + ), + + saveIdentityCaps = true, ), ); diff --git a/sandstorm.js b/sandstorm.js index b511155c5..dc4a0796b 100644 --- a/sandstorm.js +++ b/sandstorm.js @@ -21,7 +21,9 @@ const sandstormBoard = { }; if (isSandstorm && Meteor.isServer) { + const fs = require('fs'); const Capnp = require('capnp'); + const Package = Capnp.importSystem('sandstorm/package.capnp'); const Powerbox = Capnp.importSystem('sandstorm/powerbox.capnp'); const Identity = Capnp.importSystem('sandstorm/identity.capnp'); const SandstormHttpBridge = @@ -30,6 +32,10 @@ if (isSandstorm && Meteor.isServer) { let httpBridge = null; let capnpConnection = null; + const bridgeConfig = Capnp.parse( + Package.BridgeConfig, + fs.readFileSync('/sandstorm-http-bridge-config')); + function getHttpBridge() { if (!httpBridge) { capnpConnection = Capnp.connect('unix:/tmp/sandstorm-api'); @@ -66,7 +72,8 @@ if (isSandstorm && Meteor.isServer) { Meteor.wrapAsync((done) => { session.claimRequest(token).then((response) => { const identity = response.cap.castAs(Identity.Identity); - const promises = [api.getIdentityId(identity), identity.getProfile()]; + const promises = [api.getIdentityId(identity), identity.getProfile(), + httpBridge.saveIdentity(identity)]; return Promise.all(promises).then((responses) => { const identityId = responses[0].id.toString('hex').slice(0, 32); const profile = responses[1].profile; @@ -95,6 +102,100 @@ if (isSandstorm && Meteor.isServer) { }, }); + function reportActivity(sessionId, path, type, users, caption) { + const httpBridge = getHttpBridge(); + const session = httpBridge.getSessionContext(sessionId).context; + Meteor.wrapAsync((done) => { + return Promise.all(users.map((user) => { + return httpBridge.getSavedIdentity(user.id).then((response) => { + return { identity: response.identity, + mentioned: !!user.mentioned, + subscribed: !!user.subscribed, + }; + }).catch(() => { + // Ignore identities that fail to restore. Probably they have lost access to the board. + }); + })).then((maybeUsers) => { + const users = maybeUsers.filter((u) => !!u); + const event = { path, type, users }; + if (caption) { + event.notification = { caption }; + } + + return session.activity(event); + }).then(() => done(), + (e) => done(e)); + })(); + } + + Meteor.startup(() => { + Activities.after.insert((userId, doc) => { + // HACK: We need the connection that's making the request in order to read the + // Sandstorm session ID. + const invocation = DDP._CurrentInvocation.get(); // eslint-disable-line no-undef + if (invocation) { + const sessionId = invocation.connection.sandstormSessionId(); + + const eventTypes = bridgeConfig.viewInfo.eventTypes; + + const defIdx = eventTypes.findIndex((def) => def.name === doc.activityType ); + if (defIdx >= 0) { + const users = {}; + function ensureUserListed(userId) { + if (!users[userId]) { + const user = Meteor.users.findOne(userId); + if (user) { + users[userId] = { id: user.services.sandstorm.id }; + } else { + return false; + } + } + return true; + } + + function mentionedUser(userId) { + if (ensureUserListed(userId)) { + users[userId].mentioned = true; + } + } + + function subscribedUser(userId) { + if (ensureUserListed(userId)) { + users[userId].subscribed = true; + } + } + + let path = ''; + let caption = null; + + if (doc.cardId) { + path = `b/sandstorm/libreboard/${doc.cardId}`; + Cards.findOne(doc.cardId).members.map(subscribedUser); + } + + if (doc.memberId) { + mentionedUser(doc.memberId); + } + + if (doc.activityType === 'addComment') { + const comment = CardComments.findOne(doc.commentId); + caption = { defaultText: comment.text }; + const activeMembers = + _.pluck(Boards.findOne(sandstormBoard._id).activeMembers(), 'userId'); + (comment.text.match(/\B@(\w*)/g) || []).forEach((username) => { + const user = Meteor.users.findOne({ username: username.slice(1)}); + if (user && activeMembers.indexOf(user._id) !== -1) { + mentionedUser(user._id); + } + }); + } + + reportActivity(sessionId, path, defIdx, _.values(users), caption); + } + } + }); + }); + function updateUserPermissions(userId, permissions) { const isActive = permissions.indexOf('participate') > -1; const isAdmin = permissions.indexOf('configure') > -1; From 43c180c247a82ed20b2bc9e2de493305f7f5a43b Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Sun, 9 Oct 2016 18:55:51 -0400 Subject: [PATCH 021/136] Make sure identities resolve before sending them to activity(). --- sandstorm.js | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/sandstorm.js b/sandstorm.js index dc4a0796b..5a800b242 100644 --- a/sandstorm.js +++ b/sandstorm.js @@ -108,12 +108,17 @@ if (isSandstorm && Meteor.isServer) { Meteor.wrapAsync((done) => { return Promise.all(users.map((user) => { return httpBridge.getSavedIdentity(user.id).then((response) => { - return { identity: response.identity, - mentioned: !!user.mentioned, - subscribed: !!user.subscribed, - }; - }).catch(() => { - // Ignore identities that fail to restore. Probably they have lost access to the board. + // Call getProfile() to make sure that the identity successfully resolves. + // (In C++ we would instead call whenResolved() here.) + const identity = response.identity; + return identity.getProfile().then(() => { + return { identity, + mentioned: !!user.mentioned, + subscribed: !!user.subscribed, + }; + }).catch(() => { + // Ignore identities that fail to resolve. Probably they have lost access to the board. + }); }); })).then((maybeUsers) => { const users = maybeUsers.filter((u) => !!u); From 33cfee8d5f58bbb03281a140d746ad37624fd252 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Mon, 7 Nov 2016 14:01:05 -0500 Subject: [PATCH 022/136] Update version and author information for new release on Sandstorm. Previously @mquandalle took care of packaging Wekan for Sandstorm, so he was listed as the sole author of the SPK. Since I'm now taking over packaging, this commit moves @mquandalle into the `upstreamAuthor` slot and adds me as the SPK author by using my email address for `contactEmail` and adding a pgp-signed statement that I am now an author. It also adds my public key to the `keyring` file. --- meta/dwrensha-pgp-sig | Bin 0 -> 430 bytes meta/keyring | Bin 3357 -> 4892 bytes sandstorm-pkgdef.capnp | 9 +++++---- 3 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 meta/dwrensha-pgp-sig diff --git a/meta/dwrensha-pgp-sig b/meta/dwrensha-pgp-sig new file mode 100644 index 0000000000000000000000000000000000000000..0ee50fa41c1bcfdc7b0b5002a20fc174f4683d52 GIT binary patch literal 430 zcmV;f0a5;=0h_?f%)rGM@Z`FMx3q66 zE=~cMvpf#7|5NE%z_R{NOQ2$IqIl5%309YaPgSlze&DDV^MwzSe5YINRh`+(QTZukOCi%?MfU`#e7HfB$(Ue&t#ym;CvxmgyHer}n+-{qO4Y z=y&L9Ue&lCkNN!5!{mhx zQEx4---uazC98U-fkCk2#d$nabS_%Ot4vNR)f85*)@yC{_v&)lxZ^-@ruj1S`Aw$| Y?N7St%+mOG!c)nDRd;gU%sf>J0DY_FTL1t6 literal 0 HcmV?d00001 diff --git a/meta/keyring b/meta/keyring index e34b146d450b90b0ae73edafebed08d9353dc778..b4d585339493ce196e53b729a5eede7d196f2764 100644 GIT binary patch delta 1555 zcma*mdpr{e0KoCRWVTyPWgf#M5l!TsmNZh`hI!?2oYd6TZCP!M^VrIBMQZY#OQDA( zVk_Y?r4o5X9_Kl;C)w{r!A?ziH(ga&mzPhvP8hsho-bOYVH%jsuP>|^Zhv4|9T*ZJ{nABb6&)8J5qsnfZhTY>8ebJM8i{=A^8 zqIl=LY}|*mIaAHTXF9D1u=ovq?iGs9ARVHU`lFm;$(4i+#!Vxikj7i^n-`-$S6BKx z>vQ2K`$1bnIH+9lTABWcwDKdikT=>!%1EqkpIz9aQs%}@-_EGHu%&9LX^LtGdRyFr zI(&C^@A{G6<>^T@!ts6QxqXeh6(|I2`@J{4?iXStr|MFV-QGrQuAir^(t#&$hP|B@ zdeC4`jKw(TaIGW5E!5V1cVqO1w~aI*A5~q;RyAY-^z% zK0_}ewiL$;)A);@`vlCx9FdLB8Ezb5Em8owvQ(C-F?Nw>T3e3jD>uMcz^L+O)WPWf zgD=a}*5$D>o{uYBQm;Bc4A!8Yz2(0CK;nocR|kG6`p14FN;ui$VTr8T=wuP4KFvZd z%6}xp&OO*g$)328P_B#BDmFrRND{5uR_*l{>VF63d=vfx?#K)|PG+*gPSUqh!~O#- z{hz?}cIB0TqPn5=*lx+{BN=n$>QbC9yJ8ONYUfv|RAtf;q;X3my#~u_VA$`~Tk+h_ z85&S?F|W&ut?K)=IZ}xhs}9=_a!69<^Z>HQ;ZF(AxKc#)f>M4I+-j}oHBFOz_`)38rW`Yh*yqpdogRLsNZxrC&xD(DvLRh>>ZrHCTKbL?8T+g zx8uGn(7VALDWqkS<_mGbif3vzp`Rfyhuvrcn;EDl&Py&A5b*)xNO zB!7LH2gE=${@zvP-(7$BXG_l4FHAtT?PESMpe%-mk`maH7J@d;w|%nK0H<;S|`s&PB4Q#i=o?(Z3b(GEEP>v!Y> zuoC@xxzfsf;Cv~?WCH9qXa+woVG_5I*7jj5nsh8 delta 9 QcmbQEHdku%e^yyu026HkTL1t6 diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp index 2db5b6b6f..80b761e2d 100644 --- a/sandstorm-pkgdef.capnp +++ b/sandstorm-pkgdef.capnp @@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = ( appTitle = (defaultText = "Wekan"), # The name of the app as it is displayed to the user. - appVersion = 12, + appVersion = 13, # Increment this for every release. - appMarketingVersion = (defaultText = "0.11.0-rc2"), + appMarketingVersion = (defaultText = "0.11.0~2016-11-07"), # Human-readable presentation of the app version. minUpgradableAppVersion = 0, @@ -63,8 +63,9 @@ const pkgdef :Spk.PackageDefinition = ( categories = [productivity, office], author = ( - contactEmail = "mquandalle@wekan.io", - pgpSignature = embed "meta/mquandalle-pgp-sig", + upstreamAuthor = "Maxime Quandalle", + contactEmail = "david@sandstorm.io", + pgpSignature = embed "meta/dwrensha-pgp-sig", ), pgpKeyring = embed "meta/keyring", From 89eb156529fb869312abc20544dbdfd843e3d88c Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Tue, 8 Nov 2016 09:47:36 -0500 Subject: [PATCH 023/136] Fix bug where share-by-powerbox could fail if the recipient's display name was the same as an existing user's handle. --- sandstorm-pkgdef.capnp | 4 ++-- sandstorm.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp index 80b761e2d..0aaaed56f 100644 --- a/sandstorm-pkgdef.capnp +++ b/sandstorm-pkgdef.capnp @@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = ( appTitle = (defaultText = "Wekan"), # The name of the app as it is displayed to the user. - appVersion = 13, + appVersion = 14, # Increment this for every release. - appMarketingVersion = (defaultText = "0.11.0~2016-11-07"), + appMarketingVersion = (defaultText = "0.11.0~2016-11-08"), # Human-readable presentation of the app version. minUpgradableAppVersion = 0, diff --git a/sandstorm.js b/sandstorm.js index 5a800b242..07007be16 100644 --- a/sandstorm.js +++ b/sandstorm.js @@ -89,7 +89,7 @@ if (isSandstorm && Meteor.isServer) { const login = Accounts.updateOrCreateUserFromExternalService( 'sandstorm', sandstormInfo, - { profile: { name: sandstormInfo.name, fullname: sandstormInfo.name } }); + { profile: { name: sandstormInfo.name } }); updateUserPermissions(login.userId, permissions); done(); From 300b40ed87fd3603a00888f83f19c588d2868273 Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Sun, 13 Nov 2016 17:23:49 +0100 Subject: [PATCH 024/136] UI: Fixed background on hover for labels in filter sidebar --- client/components/sidebar/sidebar.styl | 1 + 1 file changed, 1 insertion(+) diff --git a/client/components/sidebar/sidebar.styl b/client/components/sidebar/sidebar.styl index 9007af594..24abe9900 100644 --- a/client/components/sidebar/sidebar.styl +++ b/client/components/sidebar/sidebar.styl @@ -51,6 +51,7 @@ .member, .card-label margin-right: 7px + margin-top: 5px .sidebar-list-item-description flex: 1 From 5a23c962d2d2c8a4ef3f30a3b0965039808924e8 Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Sun, 13 Nov 2016 20:38:14 +0100 Subject: [PATCH 025/136] Filtering logic by empty labels/members --- client/lib/filter.js | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/client/lib/filter.js b/client/lib/filter.js index 743052848..656f5fe2d 100644 --- a/client/lib/filter.js +++ b/client/lib/filter.js @@ -61,7 +61,18 @@ class SetFilter { _getMongoSelector() { this._dep.depend(); - return { $in: this._selectedElements }; + return { $in: this._selectedElements } + } + + _getEmptySelector() { + this._dep.depend(); + let includeEmpty = false + this._selectedElements.forEach((el) => { + if (el == undefined) { + includeEmpty = true; + } + }); + return includeEmpty ? { $eq: [] } : null; } } @@ -95,16 +106,26 @@ Filter = { return {}; const filterSelector = {}; + const emptySelector = {}; + let includeEmptySelectors = false; this._fields.forEach((fieldName) => { const filter = this[fieldName]; - if (filter._isActive()) + if (filter._isActive()) { filterSelector[fieldName] = filter._getMongoSelector(); + emptySelector[fieldName] = filter._getEmptySelector(); + if (emptySelector[fieldName] != null) { + includeEmptySelectors = true; + } + } }); const exceptionsSelector = {_id: {$in: this._exceptions}}; this._exceptionsDep.depend(); - return {$or: [filterSelector, exceptionsSelector]}; + if (includeEmptySelectors) + return {$or: [filterSelector, exceptionsSelector, emptySelector]}; + else + return {$or: [filterSelector, exceptionsSelector]}; }, mongoSelector(additionalSelector) { From 5968792ad2d94291721fd0f95df6d66541150442 Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Sun, 13 Nov 2016 20:48:24 +0100 Subject: [PATCH 026/136] added buttons to support filtering by empty labels and members --- client/components/sidebar/sidebarFilters.jade | 12 ++++++++++++ i18n/en.i18n.json | 2 ++ 2 files changed, 14 insertions(+) diff --git a/client/components/sidebar/sidebarFilters.jade b/client/components/sidebar/sidebarFilters.jade index 2b3264937..0a7fbfb00 100644 --- a/client/components/sidebar/sidebarFilters.jade +++ b/client/components/sidebar/sidebarFilters.jade @@ -5,6 +5,12 @@ template(name="filterSidebar") ul.sidebar-list + li(class="{{#if Filter.labelIds.isSelected undefined}}active{{/if}}") + a.name.js-toggle-label-filter + span.sidebar-list-item-description + {{_ 'filter-no-label'}} + if Filter.labelIds.isSelected undefined + i.fa.fa-check each currentBoard.labels li a.name.js-toggle-label-filter @@ -18,6 +24,12 @@ template(name="filterSidebar") i.fa.fa-check hr ul.sidebar-list + li(class="{{#if Filter.members.isSelected undefined}}active{{/if}}") + a.name.js-toggle-member-filter + span.sidebar-list-item-description + {{_ 'filter-no-member'}} + if Filter.members.isSelected undefined + i.fa.fa-check each currentBoard.activeMembers with getUser userId li(class="{{#if Filter.members.isSelected _id}}active{{/if}}") diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index f9cf7e82e..c92d6a71a 100755 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -173,6 +173,8 @@ "filter": "Filter", "filter-cards": "Filter Cards", "filter-clear": "Clear filter", + "filter-no-label": "No label", + "filter-no-member": "No member", "filter-on": "Filter is on", "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", "filter-to-selection": "Filter to selection", From 7ad74eb1b5d6fbf9e2c7486a03368c9a2f4af1e4 Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Sun, 13 Nov 2016 20:54:50 +0100 Subject: [PATCH 027/136] forgotten semicolon --- client/lib/filter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/lib/filter.js b/client/lib/filter.js index 656f5fe2d..afa992ab4 100644 --- a/client/lib/filter.js +++ b/client/lib/filter.js @@ -61,7 +61,7 @@ class SetFilter { _getMongoSelector() { this._dep.depend(); - return { $in: this._selectedElements } + return { $in: this._selectedElements }; } _getEmptySelector() { From 4dc0ec07b8560d0814ed5cb72b2cac93722bb93c Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Sun, 13 Nov 2016 20:57:23 +0100 Subject: [PATCH 028/136] removed unused html span element --- client/components/sidebar/sidebarFilters.jade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/components/sidebar/sidebarFilters.jade b/client/components/sidebar/sidebarFilters.jade index 0a7fbfb00..deefde82b 100644 --- a/client/components/sidebar/sidebarFilters.jade +++ b/client/components/sidebar/sidebarFilters.jade @@ -8,7 +8,7 @@ template(name="filterSidebar") li(class="{{#if Filter.labelIds.isSelected undefined}}active{{/if}}") a.name.js-toggle-label-filter span.sidebar-list-item-description - {{_ 'filter-no-label'}} + {{_ 'filter-no-label'}} if Filter.labelIds.isSelected undefined i.fa.fa-check each currentBoard.labels @@ -27,7 +27,7 @@ template(name="filterSidebar") li(class="{{#if Filter.members.isSelected undefined}}active{{/if}}") a.name.js-toggle-member-filter span.sidebar-list-item-description - {{_ 'filter-no-member'}} + {{_ 'filter-no-member'}} if Filter.members.isSelected undefined i.fa.fa-check each currentBoard.activeMembers From 2f234953f678474c76de32a357be82f9f0dd4565 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 14 Nov 2016 17:58:24 +0200 Subject: [PATCH 029/136] Add travis build status badge. --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 51f2a64f3..c5fdeaa28 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Wekan fork [![Join the chat][rocket_badge]][rocket_chat] +[![Build Status][travis_badge][travis_status] [Wekan fork announcement][fork_announcement] @@ -59,3 +60,5 @@ with [Meteor](https://www.meteor.com). [cloudron_button]: https://cloudron.io/img/button.svg [cloudron_install]: https://cloudron.io/button.html?app=io.wekan.cloudronapp [debian_wheezy]: https://github.com/soohwa/sps/blob/master/example/docs/1/wekan.md +[travis_badge]: https://travis-ci.org/wefork/wekan.svg?branch=master +[travis_status]: https://travis-ci.org/wefork/wekan From 5657b6f8c76d615517953b6acb9e3481ec931e33 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 14 Nov 2016 18:01:45 +0200 Subject: [PATCH 030/136] Add travis build status badge. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c5fdeaa28..1a2ac5556 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Wekan fork [![Join the chat][rocket_badge]][rocket_chat] -[![Build Status][travis_badge][travis_status] +[![Build Status][travis_badge]][travis_status] [Wekan fork announcement][fork_announcement] From 74e41e420fd99703bd38a831f80f1cde7058d96f Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Tue, 15 Nov 2016 14:34:37 -0500 Subject: [PATCH 031/136] [sandstorm]: fix bug where an identity that fails to restore could not be added to a card --- sandstorm.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sandstorm.js b/sandstorm.js index 07007be16..dc5b10d62 100644 --- a/sandstorm.js +++ b/sandstorm.js @@ -116,9 +116,10 @@ if (isSandstorm && Meteor.isServer) { mentioned: !!user.mentioned, subscribed: !!user.subscribed, }; - }).catch(() => { - // Ignore identities that fail to resolve. Probably they have lost access to the board. }); + }).catch(() => { + // Ignore identities that fail to restore. Either they were added before we set + // `saveIdentityCaps` to true, or they have lost access to the board. }); })).then((maybeUsers) => { const users = maybeUsers.filter((u) => !!u); From 693053555547d417322973ccefc3ef63c5a0f743 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Tue, 15 Nov 2016 14:40:23 -0500 Subject: [PATCH 032/136] update Sandstorm metadata for bugfix release --- sandstorm-pkgdef.capnp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp index 0aaaed56f..5c0961f80 100644 --- a/sandstorm-pkgdef.capnp +++ b/sandstorm-pkgdef.capnp @@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = ( appTitle = (defaultText = "Wekan"), # The name of the app as it is displayed to the user. - appVersion = 14, + appVersion = 16, # Increment this for every release. - appMarketingVersion = (defaultText = "0.11.0~2016-11-08"), + appMarketingVersion = (defaultText = "0.11.0~2016-11-15"), # Human-readable presentation of the app version. minUpgradableAppVersion = 0, @@ -58,7 +58,7 @@ const pkgdef :Spk.PackageDefinition = ( ), website = "https://wekan.io", - codeUrl = "https://github.com/wekan/wekan", + codeUrl = "https://github.com/wefork/wekan", license = (openSource = mit), categories = [productivity, office], From 1c206d0d367cbb4b6aa2e350ce944397bd48b988 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Thu, 10 Nov 2016 10:10:06 -0500 Subject: [PATCH 033/136] Fix startup for clients using Finnish and Chinese. --- client/lib/i18n.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/client/lib/i18n.js b/client/lib/i18n.js index a03fb3982..b8b8609d7 100644 --- a/client/lib/i18n.js +++ b/client/lib/i18n.js @@ -14,8 +14,14 @@ Tracker.autorun(() => { if (language) { TAPi18n.setLanguage(language); - // XXX - const shortLanguage = language.split('-')[0]; - T9n.setLanguage(shortLanguage); + // For languages such as Finnish (Suomi) that are not supported by meteor-accounts-t9n, + // the following may throw an exception. On the initial run of this `autorun()` callback, + // such an exception could cause the entire app to fail to load. Therefore, we catch + // the exception and log it as an error. + try { + T9n.setLanguage(language); + } catch (e) { + console.error(e); + } } }); From f56c55e75c657d6348c4231779d410f4cdea7a04 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Mon, 14 Nov 2016 21:26:01 -0500 Subject: [PATCH 034/136] Wait until Meteor.startup() to set the language. --- client/lib/i18n.js | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/client/lib/i18n.js b/client/lib/i18n.js index b8b8609d7..f2709d157 100644 --- a/client/lib/i18n.js +++ b/client/lib/i18n.js @@ -2,26 +2,19 @@ // the language reactively. If the user is not connected we use the language // information provided by the browser, and default to english. -Tracker.autorun(() => { - const currentUser = Meteor.user(); - let language; - if (currentUser) { - language = currentUser.profile && currentUser.profile.language; - } else { - language = navigator.language || navigator.userLanguage; - } - - if (language) { - TAPi18n.setLanguage(language); - - // For languages such as Finnish (Suomi) that are not supported by meteor-accounts-t9n, - // the following may throw an exception. On the initial run of this `autorun()` callback, - // such an exception could cause the entire app to fail to load. Therefore, we catch - // the exception and log it as an error. - try { - T9n.setLanguage(language); - } catch (e) { - console.error(e); +Meteor.startup(() => { + Tracker.autorun(() => { + const currentUser = Meteor.user(); + let language; + if (currentUser) { + language = currentUser.profile && currentUser.profile.language; + } else { + language = navigator.language || navigator.userLanguage; } - } + + if (language) { + TAPi18n.setLanguage(language); + T9n.setLanguage(language); + } + }); }); From 4b248151c3b1fbb763b5d95cd729fc99828be382 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Mon, 14 Nov 2016 22:06:58 -0500 Subject: [PATCH 035/136] always fall back to navigator.language if user.profile.language is not set --- client/lib/i18n.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/lib/i18n.js b/client/lib/i18n.js index f2709d157..34a789e19 100644 --- a/client/lib/i18n.js +++ b/client/lib/i18n.js @@ -6,8 +6,8 @@ Meteor.startup(() => { Tracker.autorun(() => { const currentUser = Meteor.user(); let language; - if (currentUser) { - language = currentUser.profile && currentUser.profile.language; + if (currentUser && currentUser.profile && currentUser.profile.language) { + language = currentUser.profile.language; } else { language = navigator.language || navigator.userLanguage; } From 7e3173caea40ee31d93138e60a1f57589e05c15f Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Wed, 16 Nov 2016 11:52:48 +0200 Subject: [PATCH 036/136] Update screenshot. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1a2ac5556..25479911a 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ with [Meteor](https://www.meteor.com). [Our roadmap is self-hosted on Wekan fork][roadmap] [fork_announcement]: https://github.com/wekan/wekan/issues/640#issuecomment-255091832 -[screenshot]: http://i.imgur.com/uNVJnBe.png +[screenshot]: http://i.imgur.com/bPooC7s.png [rocket_badge]: https://chat.indie.host/images/join-chat.svg [rocket_chat]: https://chat.indie.host/channel/wekan [roadmap]: https://wekan.indie.host/b/t2YaGmyXgNkppcFBq/wekan-fork-roadmap From 3ce79582312f59e9401b7a7ddb9d05c9b971b96f Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Wed, 16 Nov 2016 08:41:29 -0500 Subject: [PATCH 037/136] Fix eslint regressions. --- client/lib/filter.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/lib/filter.js b/client/lib/filter.js index afa992ab4..8129776be 100644 --- a/client/lib/filter.js +++ b/client/lib/filter.js @@ -66,9 +66,9 @@ class SetFilter { _getEmptySelector() { this._dep.depend(); - let includeEmpty = false + let includeEmpty = false; this._selectedElements.forEach((el) => { - if (el == undefined) { + if (el === undefined) { includeEmpty = true; } }); @@ -113,7 +113,7 @@ Filter = { if (filter._isActive()) { filterSelector[fieldName] = filter._getMongoSelector(); emptySelector[fieldName] = filter._getEmptySelector(); - if (emptySelector[fieldName] != null) { + if (emptySelector[fieldName] !== null) { includeEmptySelectors = true; } } From d2646a58200293d08d9ed037d56a49a25022786c Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 17 Nov 2016 13:01:40 +0200 Subject: [PATCH 038/136] Update screenshot. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 25479911a..e40922d02 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ with [Meteor](https://www.meteor.com). [Our roadmap is self-hosted on Wekan fork][roadmap] [fork_announcement]: https://github.com/wekan/wekan/issues/640#issuecomment-255091832 -[screenshot]: http://i.imgur.com/bPooC7s.png +[screenshot]: http://i.imgur.com/hjKZry7.png [rocket_badge]: https://chat.indie.host/images/join-chat.svg [rocket_chat]: https://chat.indie.host/channel/wekan [roadmap]: https://wekan.indie.host/b/t2YaGmyXgNkppcFBq/wekan-fork-roadmap From 4d3a40bf4f2ddd39185dc2638465a4a9c57d5582 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 17 Nov 2016 15:09:12 +0200 Subject: [PATCH 039/136] Add link to Wekan fork FAQ. --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index e40922d02..5b7d5d3fd 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ [![Join the chat][rocket_badge]][rocket_chat] [![Build Status][travis_badge]][travis_status] +[Wekan fork FAQ][fork_faq] + [Wekan fork announcement][fork_announcement] Wekan is an open-source and collaborative kanban board application. @@ -44,6 +46,7 @@ with [Meteor](https://www.meteor.com). [Our roadmap is self-hosted on Wekan fork][roadmap] +[fork_faq]: https://github.com/wefork/wekan/wiki/Wekan-fork-FAQ [fork_announcement]: https://github.com/wekan/wekan/issues/640#issuecomment-255091832 [screenshot]: http://i.imgur.com/hjKZry7.png [rocket_badge]: https://chat.indie.host/images/join-chat.svg From 1ec72ba189b6ea33ebe8cae87b866b16706bdcc9 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 17 Nov 2016 15:16:45 +0200 Subject: [PATCH 040/136] Add link to Wekan fork FAQ. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5b7d5d3fd..38b23943f 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ with [Meteor](https://www.meteor.com). [Our roadmap is self-hosted on Wekan fork][roadmap] -[fork_faq]: https://github.com/wefork/wekan/wiki/Wekan-fork-FAQ +[fork_faq]: https://github.com/wefork/wekan/wiki/FAQ [fork_announcement]: https://github.com/wekan/wekan/issues/640#issuecomment-255091832 [screenshot]: http://i.imgur.com/hjKZry7.png [rocket_badge]: https://chat.indie.host/images/join-chat.svg From a635ac9818f72046bbc03b0e38ecdd3bc23eb77b Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 17 Nov 2016 16:16:27 +0200 Subject: [PATCH 041/136] Fix Travis badge to use devel branch. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 38b23943f..9ea5f2fb7 100644 --- a/README.md +++ b/README.md @@ -63,5 +63,5 @@ with [Meteor](https://www.meteor.com). [cloudron_button]: https://cloudron.io/img/button.svg [cloudron_install]: https://cloudron.io/button.html?app=io.wekan.cloudronapp [debian_wheezy]: https://github.com/soohwa/sps/blob/master/example/docs/1/wekan.md -[travis_badge]: https://travis-ci.org/wefork/wekan.svg?branch=master +[travis_badge]: https://travis-ci.org/wefork/wekan.svg?branch=devel [travis_status]: https://travis-ci.org/wefork/wekan From b89a0e2d4deb663df6310e0e84ea47247023f482 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Thu, 17 Nov 2016 09:19:49 -0500 Subject: [PATCH 042/136] Add a working 'try Wekan on Sandstorm' button. --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 38b23943f..a5704ca92 100644 --- a/README.md +++ b/README.md @@ -33,14 +33,13 @@ Currently you can install Wekan fork on the following Platforms: [![SignUp][indiehosters_button]][indiehosters_saas] [![Deploy to Scalingo][scalingo_button]][scalingo_deploy] [![Install on Cloudron][cloudron_button]][cloudron_install] +[![Try on Sandstorm][sandstorm_button]][sandstorm_appdemo] These Platforms have not been tested yet, but are coming sometime, so links don't work yet: [Docker][docker_image] -[Sandstorm][sandstorm_market] - Wekan fork is released under the very permissive [MIT license](LICENSE), and made with [Meteor](https://www.meteor.com). @@ -52,7 +51,8 @@ with [Meteor](https://www.meteor.com). [rocket_badge]: https://chat.indie.host/images/join-chat.svg [rocket_chat]: https://chat.indie.host/channel/wekan [roadmap]: https://wekan.indie.host/b/t2YaGmyXgNkppcFBq/wekan-fork-roadmap -[sandstorm_market]: https://oasis.sandstorm.io/appdemo/.... +[sandstorm_button]: https://img.shields.io/badge/try-Wekan%20on%20Sandstorm-783189.svg +[sandstorm_appdemo]: https://demo.sandstorm.io/appdemo/m86q05rdvj14yvn78ghaxynqz7u2svw6rnttptxx49g1785cdv1h [docker_image]: https://hub.docker.com/r/... [heroku_button]: https://www.herokucdn.com/deploy/button.png [heroku_deploy]: https://heroku.com/deploy?template=https://github.com/wefork/wekan/tree/master From 33913cf1ce9b5971144802060d1169143d2fec6b Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 17 Nov 2016 16:46:58 +0200 Subject: [PATCH 043/136] Update screenshot. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6305c9e53..c2b1243b4 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ with [Meteor](https://www.meteor.com). [fork_faq]: https://github.com/wefork/wekan/wiki/FAQ [fork_announcement]: https://github.com/wekan/wekan/issues/640#issuecomment-255091832 -[screenshot]: http://i.imgur.com/hjKZry7.png +[screenshot]: http://i.imgur.com/4N25GyU.png [rocket_badge]: https://chat.indie.host/images/join-chat.svg [rocket_chat]: https://chat.indie.host/channel/wekan [roadmap]: https://wekan.indie.host/b/t2YaGmyXgNkppcFBq/wekan-fork-roadmap From 94cdcff79f79079263056905f6a3f1128088e0a8 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 17 Nov 2016 17:17:18 +0200 Subject: [PATCH 044/136] Update screenshot. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c2b1243b4..756103bdc 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ with [Meteor](https://www.meteor.com). [fork_faq]: https://github.com/wefork/wekan/wiki/FAQ [fork_announcement]: https://github.com/wekan/wekan/issues/640#issuecomment-255091832 -[screenshot]: http://i.imgur.com/4N25GyU.png +[screenshot]: http://i.imgur.com/ShX2OTk.png [rocket_badge]: https://chat.indie.host/images/join-chat.svg [rocket_chat]: https://chat.indie.host/channel/wekan [roadmap]: https://wekan.indie.host/b/t2YaGmyXgNkppcFBq/wekan-fork-roadmap From d11f069b6076de8b81d8228f76a8cf0012f8ffad Mon Sep 17 00:00:00 2001 From: fmonthel Date: Thu, 17 Nov 2016 21:18:35 -0500 Subject: [PATCH 045/136] [ENH] Add index on CardId into Comments collection --- models/cardComments.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/models/cardComments.js b/models/cardComments.js index ce6edf3c0..ccad14f74 100644 --- a/models/cardComments.js +++ b/models/cardComments.js @@ -57,6 +57,12 @@ CardComments.helpers({ CardComments.hookOptions.after.update = { fetchPrevious: false }; if (Meteor.isServer) { + // Comments are often fetched within a card, so we create an index to make these + // queries more efficient. + Meteor.startup(() => { + CardComments._collection._ensureIndex({ cardId: 1, createdAt: -1 }); + }); + CardComments.after.insert((userId, doc) => { Activities.insert({ userId, From f71d2538fa15c9d8eb915d7b4dd9eb6a337d203d Mon Sep 17 00:00:00 2001 From: fmonthel Date: Thu, 17 Nov 2016 21:23:39 -0500 Subject: [PATCH 046/136] [ENH] Add index on CardId into Comments collection --- models/cardComments.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/models/cardComments.js b/models/cardComments.js index ccad14f74..2cadb65e5 100644 --- a/models/cardComments.js +++ b/models/cardComments.js @@ -57,10 +57,10 @@ CardComments.helpers({ CardComments.hookOptions.after.update = { fetchPrevious: false }; if (Meteor.isServer) { - // Comments are often fetched within a card, so we create an index to make these - // queries more efficient. - Meteor.startup(() => { - CardComments._collection._ensureIndex({ cardId: 1, createdAt: -1 }); + // Comments are often fetched within a card, so we create an index to make these + // queries more efficient. + Meteor.startup(() => { + CardComments._collection._ensureIndex({ cardId: 1, createdAt: -1 }); }); CardComments.after.insert((userId, doc) => { From 584ab26aee7e242913ea3f9d901fec0c950225f0 Mon Sep 17 00:00:00 2001 From: fmonthel Date: Thu, 17 Nov 2016 21:25:49 -0500 Subject: [PATCH 047/136] [ENH] Add index on CardId into Comments collection --- models/cardComments.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/cardComments.js b/models/cardComments.js index 2cadb65e5..070c148e9 100644 --- a/models/cardComments.js +++ b/models/cardComments.js @@ -62,7 +62,7 @@ if (Meteor.isServer) { Meteor.startup(() => { CardComments._collection._ensureIndex({ cardId: 1, createdAt: -1 }); }); - + CardComments.after.insert((userId, doc) => { Activities.insert({ userId, From 69fbd31abc5772f7d092caf501e536e88cdc0e2d Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Fri, 18 Nov 2016 23:18:16 +0100 Subject: [PATCH 048/136] Display message when user wants to choose existing username (Fixes: #16) --- client/components/users/userHeader.jade | 2 ++ client/components/users/userHeader.js | 15 +++++++++++---- i18n/en.i18n.json | 1 + 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/client/components/users/userHeader.jade b/client/components/users/userHeader.jade index a71e7fc7a..ce8cf1afb 100644 --- a/client/components/users/userHeader.jade +++ b/client/components/users/userHeader.jade @@ -27,6 +27,8 @@ template(name="editProfilePopup") input.js-profile-fullname(type="text" value=profile.fullname autofocus) label | {{_ 'username'}} + span.error.hide.username-taken + | {{_ 'error-username-taken'}} input.js-profile-username(type="text" value=username) label | {{_ 'initials'}} diff --git a/client/components/users/userHeader.js b/client/components/users/userHeader.js index 10fdf699f..e060c13a5 100644 --- a/client/components/users/userHeader.js +++ b/client/components/users/userHeader.js @@ -26,11 +26,18 @@ Template.editProfilePopup.events({ 'profile.fullname': fullname, 'profile.initials': initials, }}); - // XXX We should report the error to the user. + if (username !== Meteor.user().username) { - Meteor.call('setUsername', username); - } - Popup.back(); + Meteor.call('setUsername', username, function(error) { + const messageElement = tpl.$('.username-taken'); + if (error) { + messageElement.show(); + } else { + messageElement.hide(); + Popup.back(); + } + }); + } else Popup.back(); }, }); diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index c92d6a71a..54e6b3941 100755 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -169,6 +169,7 @@ "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", + "error-username-taken": "This username is already taken", "export-board": "Export board", "filter": "Filter", "filter-cards": "Filter Cards", From 828d34b70eeb4a86d9a18564e703a28001b4601e Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Fri, 18 Nov 2016 23:23:13 +0100 Subject: [PATCH 049/136] fixed indentation --- client/components/users/userHeader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/components/users/userHeader.js b/client/components/users/userHeader.js index e060c13a5..17d9eb5f2 100644 --- a/client/components/users/userHeader.js +++ b/client/components/users/userHeader.js @@ -31,7 +31,7 @@ Template.editProfilePopup.events({ Meteor.call('setUsername', username, function(error) { const messageElement = tpl.$('.username-taken'); if (error) { - messageElement.show(); + messageElement.show(); } else { messageElement.hide(); Popup.back(); From 8290dcb249fa9044a6d491c618dbe9c727d41214 Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Sat, 19 Nov 2016 19:02:33 +0100 Subject: [PATCH 050/136] New change settings option and possibility to hide system messagaes --- client/components/activities/activities.js | 4 +++- client/components/users/userHeader.jade | 17 +++++++++++++---- client/components/users/userHeader.js | 13 +++++++++++++ i18n/en.i18n.json | 3 +++ models/users.js | 21 +++++++++++++++++++++ server/publications/activities.js | 16 ++++++++-------- 6 files changed, 61 insertions(+), 13 deletions(-) diff --git a/client/components/activities/activities.js b/client/components/activities/activities.js index 0bd6a2723..6600849c5 100644 --- a/client/components/activities/activities.js +++ b/client/components/activities/activities.js @@ -12,10 +12,12 @@ BlazeComponent.extendComponent({ const capitalizedMode = Utils.capitalize(mode); const id = Session.get(`current${capitalizedMode}`); const limit = this.page.get() * activitiesPerPage; + const user = Meteor.user(); + const hideSystem = user ? user.hasHiddenSystemMessages() : false; if (id === null) return; - this.subscribe('activities', mode, id, limit, () => { + this.subscribe('activities', mode, id, limit, hideSystem, () => { this.loadNextPageLocked = false; // If the sibear peak hasn't increased, that mean that there are no more diff --git a/client/components/users/userHeader.jade b/client/components/users/userHeader.jade index a71e7fc7a..21c3c3823 100644 --- a/client/components/users/userHeader.jade +++ b/client/components/users/userHeader.jade @@ -12,10 +12,11 @@ template(name="memberMenuPopup") ul.pop-over-list with currentUser li: a.js-edit-profile {{_ 'edit-profile'}} - li: a.js-change-avatar {{_ 'edit-avatar'}} - li: a.js-change-password {{_ 'changePasswordPopup-title'}} - li: a.js-change-language {{_ 'changeLanguagePopup-title'}} - li: a.js-edit-notification {{_ 'editNotificationPopup-title'}} + li: a.js-change-settings {{_ 'change-settings'}} + li: a.js-change-avatar {{_ 'edit-avatar'}} + li: a.js-change-password {{_ 'changePasswordPopup-title'}} + li: a.js-change-language {{_ 'changeLanguagePopup-title'}} + li: a.js-edit-notification {{_ 'editNotificationPopup-title'}} hr ul.pop-over-list li: a.js-logout {{_ 'log-out'}} @@ -61,3 +62,11 @@ template(name="changeLanguagePopup") = name if isCurrentLanguage i.fa.fa-check + +template(name="changeSettingsPopup") + ul.pop-over-list + li + a.js-toggle-system-messages + | {{_ 'hide-system-messages'}} + if hiddenSystemMessages + i.fa.fa-check diff --git a/client/components/users/userHeader.js b/client/components/users/userHeader.js index 10fdf699f..a2682a5fc 100644 --- a/client/components/users/userHeader.js +++ b/client/components/users/userHeader.js @@ -5,6 +5,7 @@ Template.headerUserBar.events({ Template.memberMenuPopup.events({ 'click .js-edit-profile': Popup.open('editProfile'), + 'click .js-change-settings': Popup.open('changeSettings'), 'click .js-change-avatar': Popup.open('changeAvatar'), 'click .js-change-password': Popup.open('changePassword'), 'click .js-change-language': Popup.open('changeLanguage'), @@ -82,3 +83,15 @@ Template.changeLanguagePopup.events({ evt.preventDefault(); }, }); + +Template.changeSettingsPopup.helpers({ + hiddenSystemMessages() { + return Meteor.user().hasHiddenSystemMessages(); + } +}); + +Template.changeSettingsPopup.events({ + 'click .js-toggle-system-messages'(evt) { + Meteor.call('toggleSystemMessages'); + }, +}); diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index c92d6a71a..4697b536a 100755 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -104,10 +104,12 @@ "change-avatar": "Change Avatar", "change-password": "Change Password", "change-permissions": "Change permissions", + "change-settings": "Change Settings", "changeAvatarPopup-title": "Change Avatar", "changeLanguagePopup-title": "Change Language", "changePasswordPopup-title": "Change Password", "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", "click-to-star": "Click to star this board.", "click-to-unstar": "Click to unstar this board.", "clipboard" : "Clipboard or drag & drop", @@ -180,6 +182,7 @@ "filter-to-selection": "Filter to selection", "fullname": "Full Name", "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", "home": "Home", "import": "Import", "import-board": "import from Trello", diff --git a/models/users.js b/models/users.js index bdc5ddfe8..6c9ad2974 100644 --- a/models/users.js +++ b/models/users.js @@ -59,6 +59,10 @@ Users.attachSchema(new SimpleSchema({ type: String, optional: true, }, + 'profile.hiddenSystemMessages': { + type: Boolean, + optional: true + }, 'profile.initials': { type: String, optional: true, @@ -151,6 +155,11 @@ Users.helpers({ return _.contains(notifications, activityId); }, + hasHiddenSystemMessages() { + const profile = this.profile || {}; + return profile.hiddenSystemMessages || false; + }, + getEmailBuffer() { const {emailBuffer = []} = this.profile; return emailBuffer; @@ -231,6 +240,14 @@ Users.mutations({ this.addTag(tag); }, + toggleSystem(value = false) { + return { + $set: { + 'profile.hiddenSystemMessages': !value, + }, + }; + }, + addNotification(activityId) { return { $addToSet: { @@ -278,6 +295,10 @@ Meteor.methods({ Users.update(this.userId, {$set: { username }}); } }, + toggleSystemMessages() { + user = Meteor.user(); + user.toggleSystem(user.hasHiddenSystemMessages()); + }, }); if (Meteor.isServer) { diff --git a/server/publications/activities.js b/server/publications/activities.js index 38c61ebf0..eb5415cf5 100644 --- a/server/publications/activities.js +++ b/server/publications/activities.js @@ -3,17 +3,17 @@ // 2. The card activity tab // We use this publication to paginate for these two publications. -Meteor.publish('activities', (kind, id, limit) => { +Meteor.publish('activities', (kind, id, limit, hideSystem) => { check(kind, Match.Where((x) => { return ['board', 'card'].indexOf(x) !== -1; })); check(id, String); check(limit, Number); + check(hideSystem, Boolean); - return Activities.find({ - [`${kind}Id`]: id, - }, { - limit, - sort: {createdAt: -1}, - }); -}); + let selector = (hideSystem) ? {$and: [{activityType: 'addComment'}, {[`${kind}Id`]: id}]} : {[`${kind}Id`]: id}; + return Activities.find(selector, { + limit, + sort: {createdAt: -1}, + }); +}); \ No newline at end of file From 4359f66ecee8003f0fa625fd5e293ba38cc133e3 Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Sat, 19 Nov 2016 19:19:24 +0100 Subject: [PATCH 051/136] Fixed build --- client/components/users/userHeader.js | 4 ++-- models/users.js | 4 ++-- server/publications/activities.js | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/client/components/users/userHeader.js b/client/components/users/userHeader.js index a2682a5fc..1f2f1d9b8 100644 --- a/client/components/users/userHeader.js +++ b/client/components/users/userHeader.js @@ -87,11 +87,11 @@ Template.changeLanguagePopup.events({ Template.changeSettingsPopup.helpers({ hiddenSystemMessages() { return Meteor.user().hasHiddenSystemMessages(); - } + }, }); Template.changeSettingsPopup.events({ - 'click .js-toggle-system-messages'(evt) { + 'click .js-toggle-system-messages'() { Meteor.call('toggleSystemMessages'); }, }); diff --git a/models/users.js b/models/users.js index 6c9ad2974..a65a2566b 100644 --- a/models/users.js +++ b/models/users.js @@ -61,7 +61,7 @@ Users.attachSchema(new SimpleSchema({ }, 'profile.hiddenSystemMessages': { type: Boolean, - optional: true + optional: true, }, 'profile.initials': { type: String, @@ -296,7 +296,7 @@ Meteor.methods({ } }, toggleSystemMessages() { - user = Meteor.user(); + const user = Meteor.user(); user.toggleSystem(user.hasHiddenSystemMessages()); }, }); diff --git a/server/publications/activities.js b/server/publications/activities.js index eb5415cf5..14459bf8e 100644 --- a/server/publications/activities.js +++ b/server/publications/activities.js @@ -11,9 +11,9 @@ Meteor.publish('activities', (kind, id, limit, hideSystem) => { check(limit, Number); check(hideSystem, Boolean); - let selector = (hideSystem) ? {$and: [{activityType: 'addComment'}, {[`${kind}Id`]: id}]} : {[`${kind}Id`]: id}; + const selector = (hideSystem) ? {$and: [{activityType: 'addComment'}, {[`${kind}Id`]: id}]} : {[`${kind}Id`]: id}; return Activities.find(selector, { - limit, - sort: {createdAt: -1}, - }); -}); \ No newline at end of file + limit, + sort: {createdAt: -1}, + }); +}); From 89df0bda9bcdebea2a9129beafe653c38949ab29 Mon Sep 17 00:00:00 2001 From: shoetten Date: Fri, 29 Jan 2016 21:10:22 +0100 Subject: [PATCH 052/136] Adds start and due date to cards model. --- models/cards.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/models/cards.js b/models/cards.js index 84fbb6c27..9e7d58c8f 100644 --- a/models/cards.js +++ b/models/cards.js @@ -56,6 +56,14 @@ Cards.attachSchema(new SimpleSchema({ type: [String], optional: true, }, + startAt: { + type: Date, + optional: true, + }, + dueAt: { + type: Date, + optional: true, + }, // XXX Should probably be called `authorId`. Is it even needed since we have // the `members` field? userId: { @@ -207,6 +215,22 @@ Cards.mutations({ unsetCover() { return { $unset: { coverId: '' }}; }, + + setStart(startAt) { + return { $set: { startAt }}; + }, + + unsetStart() { + return { $unset: { startAt: '' }}; + }, + + setDue(dueAt) { + return { $set: { dueAt }}; + }, + + unsetDue() { + return { $unset: { dueAt: '' }}; + }, }); if (Meteor.isServer) { From 182c9af123c1f7e2fb7318d704f740f93a3da12f Mon Sep 17 00:00:00 2001 From: shoetten Date: Fri, 5 Feb 2016 20:09:21 +0100 Subject: [PATCH 053/136] add bootstrap-datepicker v1.5.1 as client lib --- client/lib/bootstrap-datepicker.js | 1918 ++++++++++++++++++++++++++ client/lib/bootstrap-datepicker3.css | 791 +++++++++++ 2 files changed, 2709 insertions(+) create mode 100644 client/lib/bootstrap-datepicker.js create mode 100644 client/lib/bootstrap-datepicker3.css diff --git a/client/lib/bootstrap-datepicker.js b/client/lib/bootstrap-datepicker.js new file mode 100644 index 000000000..fb56652e1 --- /dev/null +++ b/client/lib/bootstrap-datepicker.js @@ -0,0 +1,1918 @@ +/*! + * Datepicker for Bootstrap v1.5.1 (https://github.com/eternicode/bootstrap-datepicker) + * + * Copyright 2012 Stefan Petre + * Improvements by Andrew Rowls + * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) + */(function(factory){ + if (typeof define === "function" && define.amd) { + define(["jquery"], factory); + } else if (typeof exports === 'object') { + factory(require('jquery')); + } else { + factory(jQuery); + } +}(function($, undefined){ + + function UTCDate(){ + return new Date(Date.UTC.apply(Date, arguments)); + } + function UTCToday(){ + var today = new Date(); + return UTCDate(today.getFullYear(), today.getMonth(), today.getDate()); + } + function isUTCEquals(date1, date2) { + return ( + date1.getUTCFullYear() === date2.getUTCFullYear() && + date1.getUTCMonth() === date2.getUTCMonth() && + date1.getUTCDate() === date2.getUTCDate() + ); + } + function alias(method){ + return function(){ + return this[method].apply(this, arguments); + }; + } + function isValidDate(d) { + return d && !isNaN(d.getTime()); + } + + var DateArray = (function(){ + var extras = { + get: function(i){ + return this.slice(i)[0]; + }, + contains: function(d){ + // Array.indexOf is not cross-browser; + // $.inArray doesn't work with Dates + var val = d && d.valueOf(); + for (var i=0, l=this.length; i < l; i++) + if (this[i].valueOf() === val) + return i; + return -1; + }, + remove: function(i){ + this.splice(i,1); + }, + replace: function(new_array){ + if (!new_array) + return; + if (!$.isArray(new_array)) + new_array = [new_array]; + this.clear(); + this.push.apply(this, new_array); + }, + clear: function(){ + this.length = 0; + }, + copy: function(){ + var a = new DateArray(); + a.replace(this); + return a; + } + }; + + return function(){ + var a = []; + a.push.apply(a, arguments); + $.extend(a, extras); + return a; + }; + })(); + + + // Picker object + + var Datepicker = function(element, options){ + $(element).data('datepicker', this); + this._process_options(options); + + this.dates = new DateArray(); + this.viewDate = this.o.defaultViewDate; + this.focusDate = null; + + this.element = $(element); + this.isInline = false; + this.isInput = this.element.is('input'); + this.component = this.element.hasClass('date') ? this.element.find('.add-on, .input-group-addon, .btn') : false; + this.hasInput = this.component && this.element.find('input').length; + if (this.component && this.component.length === 0) + this.component = false; + + this.picker = $(DPGlobal.template); + this._buildEvents(); + this._attachEvents(); + + if (this.isInline){ + this.picker.addClass('datepicker-inline').appendTo(this.element); + } + else { + this.picker.addClass('datepicker-dropdown dropdown-menu'); + } + + if (this.o.rtl){ + this.picker.addClass('datepicker-rtl'); + } + + this.viewMode = this.o.startView; + + if (this.o.calendarWeeks) + this.picker.find('thead .datepicker-title, tfoot .today, tfoot .clear') + .attr('colspan', function(i, val){ + return parseInt(val) + 1; + }); + + this._allow_update = false; + + this.setStartDate(this._o.startDate); + this.setEndDate(this._o.endDate); + this.setDaysOfWeekDisabled(this.o.daysOfWeekDisabled); + this.setDaysOfWeekHighlighted(this.o.daysOfWeekHighlighted); + this.setDatesDisabled(this.o.datesDisabled); + + this.fillDow(); + this.fillMonths(); + + this._allow_update = true; + + this.update(); + this.showMode(); + + if (this.isInline){ + this.show(); + } + }; + + Datepicker.prototype = { + constructor: Datepicker, + + _process_options: function(opts){ + // Store raw options for reference + this._o = $.extend({}, this._o, opts); + // Processed options + var o = this.o = $.extend({}, this._o); + + // Check if "de-DE" style date is available, if not language should + // fallback to 2 letter code eg "de" + var lang = o.language; + if (!dates[lang]){ + lang = lang.split('-')[0]; + if (!dates[lang]) + lang = defaults.language; + } + o.language = lang; + + switch (o.startView){ + case 2: + case 'decade': + o.startView = 2; + break; + case 1: + case 'year': + o.startView = 1; + break; + default: + o.startView = 0; + } + + switch (o.minViewMode){ + case 1: + case 'months': + o.minViewMode = 1; + break; + case 2: + case 'years': + o.minViewMode = 2; + break; + default: + o.minViewMode = 0; + } + + switch (o.maxViewMode) { + case 0: + case 'days': + o.maxViewMode = 0; + break; + case 1: + case 'months': + o.maxViewMode = 1; + break; + default: + o.maxViewMode = 2; + } + + o.startView = Math.min(o.startView, o.maxViewMode); + o.startView = Math.max(o.startView, o.minViewMode); + + // true, false, or Number > 0 + if (o.multidate !== true){ + o.multidate = Number(o.multidate) || false; + if (o.multidate !== false) + o.multidate = Math.max(0, o.multidate); + } + o.multidateSeparator = String(o.multidateSeparator); + + o.weekStart %= 7; + o.weekEnd = (o.weekStart + 6) % 7; + + var format = DPGlobal.parseFormat(o.format); + if (o.startDate !== -Infinity){ + if (!!o.startDate){ + if (o.startDate instanceof Date) + o.startDate = this._local_to_utc(this._zero_time(o.startDate)); + else + o.startDate = DPGlobal.parseDate(o.startDate, format, o.language); + } + else { + o.startDate = -Infinity; + } + } + if (o.endDate !== Infinity){ + if (!!o.endDate){ + if (o.endDate instanceof Date) + o.endDate = this._local_to_utc(this._zero_time(o.endDate)); + else + o.endDate = DPGlobal.parseDate(o.endDate, format, o.language); + } + else { + o.endDate = Infinity; + } + } + + o.daysOfWeekDisabled = o.daysOfWeekDisabled||[]; + if (!$.isArray(o.daysOfWeekDisabled)) + o.daysOfWeekDisabled = o.daysOfWeekDisabled.split(/[,\s]*/); + o.daysOfWeekDisabled = $.map(o.daysOfWeekDisabled, function(d){ + return parseInt(d, 10); + }); + + o.daysOfWeekHighlighted = o.daysOfWeekHighlighted||[]; + if (!$.isArray(o.daysOfWeekHighlighted)) + o.daysOfWeekHighlighted = o.daysOfWeekHighlighted.split(/[,\s]*/); + o.daysOfWeekHighlighted = $.map(o.daysOfWeekHighlighted, function(d){ + return parseInt(d, 10); + }); + + o.datesDisabled = o.datesDisabled||[]; + if (!$.isArray(o.datesDisabled)) { + var datesDisabled = []; + datesDisabled.push(DPGlobal.parseDate(o.datesDisabled, format, o.language)); + o.datesDisabled = datesDisabled; + } + o.datesDisabled = $.map(o.datesDisabled,function(d){ + return DPGlobal.parseDate(d, format, o.language); + }); + + var plc = String(o.orientation).toLowerCase().split(/\s+/g), + _plc = o.orientation.toLowerCase(); + plc = $.grep(plc, function(word){ + return /^auto|left|right|top|bottom$/.test(word); + }); + o.orientation = {x: 'auto', y: 'auto'}; + if (!_plc || _plc === 'auto') + ; // no action + else if (plc.length === 1){ + switch (plc[0]){ + case 'top': + case 'bottom': + o.orientation.y = plc[0]; + break; + case 'left': + case 'right': + o.orientation.x = plc[0]; + break; + } + } + else { + _plc = $.grep(plc, function(word){ + return /^left|right$/.test(word); + }); + o.orientation.x = _plc[0] || 'auto'; + + _plc = $.grep(plc, function(word){ + return /^top|bottom$/.test(word); + }); + o.orientation.y = _plc[0] || 'auto'; + } + if (o.defaultViewDate) { + var year = o.defaultViewDate.year || new Date().getFullYear(); + var month = o.defaultViewDate.month || 0; + var day = o.defaultViewDate.day || 1; + o.defaultViewDate = UTCDate(year, month, day); + } else { + o.defaultViewDate = UTCToday(); + } + }, + _events: [], + _secondaryEvents: [], + _applyEvents: function(evs){ + for (var i=0, el, ch, ev; i < evs.length; i++){ + el = evs[i][0]; + if (evs[i].length === 2){ + ch = undefined; + ev = evs[i][1]; + } + else if (evs[i].length === 3){ + ch = evs[i][1]; + ev = evs[i][2]; + } + el.on(ev, ch); + } + }, + _unapplyEvents: function(evs){ + for (var i=0, el, ev, ch; i < evs.length; i++){ + el = evs[i][0]; + if (evs[i].length === 2){ + ch = undefined; + ev = evs[i][1]; + } + else if (evs[i].length === 3){ + ch = evs[i][1]; + ev = evs[i][2]; + } + el.off(ev, ch); + } + }, + _buildEvents: function(){ + var events = { + keyup: $.proxy(function(e){ + if ($.inArray(e.keyCode, [27, 37, 39, 38, 40, 32, 13, 9]) === -1) + this.update(); + }, this), + keydown: $.proxy(this.keydown, this), + paste: $.proxy(this.paste, this) + }; + + if (this.o.showOnFocus === true) { + events.focus = $.proxy(this.show, this); + } + + if (this.isInput) { // single input + this._events = [ + [this.element, events] + ]; + } + else if (this.component && this.hasInput) { // component: input + button + this._events = [ + // For components that are not readonly, allow keyboard nav + [this.element.find('input'), events], + [this.component, { + click: $.proxy(this.show, this) + }] + ]; + } + else if (this.element.is('div')){ // inline datepicker + this.isInline = true; + } + else { + this._events = [ + [this.element, { + click: $.proxy(this.show, this) + }] + ]; + } + this._events.push( + // Component: listen for blur on element descendants + [this.element, '*', { + blur: $.proxy(function(e){ + this._focused_from = e.target; + }, this) + }], + // Input: listen for blur on element + [this.element, { + blur: $.proxy(function(e){ + this._focused_from = e.target; + }, this) + }] + ); + + if (this.o.immediateUpdates) { + // Trigger input updates immediately on changed year/month + this._events.push([this.element, { + 'changeYear changeMonth': $.proxy(function(e){ + this.update(e.date); + }, this) + }]); + } + + this._secondaryEvents = [ + [this.picker, { + click: $.proxy(this.click, this) + }], + [$(window), { + resize: $.proxy(this.place, this) + }], + [$(document), { + mousedown: $.proxy(function(e){ + // Clicked outside the datepicker, hide it + if (!( + this.element.is(e.target) || + this.element.find(e.target).length || + this.picker.is(e.target) || + this.picker.find(e.target).length || + this.picker.hasClass('datepicker-inline') + )){ + this.hide(); + } + }, this) + }] + ]; + }, + _attachEvents: function(){ + this._detachEvents(); + this._applyEvents(this._events); + }, + _detachEvents: function(){ + this._unapplyEvents(this._events); + }, + _attachSecondaryEvents: function(){ + this._detachSecondaryEvents(); + this._applyEvents(this._secondaryEvents); + }, + _detachSecondaryEvents: function(){ + this._unapplyEvents(this._secondaryEvents); + }, + _trigger: function(event, altdate){ + var date = altdate || this.dates.get(-1), + local_date = this._utc_to_local(date); + + this.element.trigger({ + type: event, + date: local_date, + dates: $.map(this.dates, this._utc_to_local), + format: $.proxy(function(ix, format){ + if (arguments.length === 0){ + ix = this.dates.length - 1; + format = this.o.format; + } + else if (typeof ix === 'string'){ + format = ix; + ix = this.dates.length - 1; + } + format = format || this.o.format; + var date = this.dates.get(ix); + return DPGlobal.formatDate(date, format, this.o.language); + }, this) + }); + }, + + show: function(){ + var element = this.component ? this.element.find('input') : this.element; + if (element.attr('readonly') && this.o.enableOnReadonly === false) + return; + if (!this.isInline) + this.picker.appendTo(this.o.container); + this.place(); + this.picker.show(); + this._attachSecondaryEvents(); + this._trigger('show'); + if ((window.navigator.msMaxTouchPoints || 'ontouchstart' in document) && this.o.disableTouchKeyboard) { + $(this.element).blur(); + } + return this; + }, + + hide: function(){ + if (this.isInline) + return this; + if (!this.picker.is(':visible')) + return this; + this.focusDate = null; + this.picker.hide().detach(); + this._detachSecondaryEvents(); + this.viewMode = this.o.startView; + this.showMode(); + + if ( + this.o.forceParse && + ( + this.isInput && this.element.val() || + this.hasInput && this.element.find('input').val() + ) + ) + this.setValue(); + this._trigger('hide'); + return this; + }, + + remove: function(){ + this.hide(); + this._detachEvents(); + this._detachSecondaryEvents(); + this.picker.remove(); + delete this.element.data().datepicker; + if (!this.isInput){ + delete this.element.data().date; + } + return this; + }, + + paste: function(evt){ + var dateString; + if (evt.originalEvent.clipboardData && evt.originalEvent.clipboardData.types + && $.inArray('text/plain', evt.originalEvent.clipboardData.types) !== -1) { + dateString = evt.originalEvent.clipboardData.getData('text/plain'); + } + else if (window.clipboardData) { + dateString = window.clipboardData.getData('Text'); + } + else { + return; + } + this.setDate(dateString); + this.update(); + evt.preventDefault(); + }, + + _utc_to_local: function(utc){ + return utc && new Date(utc.getTime() + (utc.getTimezoneOffset()*60000)); + }, + _local_to_utc: function(local){ + return local && new Date(local.getTime() - (local.getTimezoneOffset()*60000)); + }, + _zero_time: function(local){ + return local && new Date(local.getFullYear(), local.getMonth(), local.getDate()); + }, + _zero_utc_time: function(utc){ + return utc && new Date(Date.UTC(utc.getUTCFullYear(), utc.getUTCMonth(), utc.getUTCDate())); + }, + + getDates: function(){ + return $.map(this.dates, this._utc_to_local); + }, + + getUTCDates: function(){ + return $.map(this.dates, function(d){ + return new Date(d); + }); + }, + + getDate: function(){ + return this._utc_to_local(this.getUTCDate()); + }, + + getUTCDate: function(){ + var selected_date = this.dates.get(-1); + if (typeof selected_date !== 'undefined') { + return new Date(selected_date); + } else { + return null; + } + }, + + clearDates: function(){ + var element; + if (this.isInput) { + element = this.element; + } else if (this.component) { + element = this.element.find('input'); + } + + if (element) { + element.val(''); + } + + this.update(); + this._trigger('changeDate'); + + if (this.o.autoclose) { + this.hide(); + } + }, + setDates: function(){ + var args = $.isArray(arguments[0]) ? arguments[0] : arguments; + this.update.apply(this, args); + this._trigger('changeDate'); + this.setValue(); + return this; + }, + + setUTCDates: function(){ + var args = $.isArray(arguments[0]) ? arguments[0] : arguments; + this.update.apply(this, $.map(args, this._utc_to_local)); + this._trigger('changeDate'); + this.setValue(); + return this; + }, + + setDate: alias('setDates'), + setUTCDate: alias('setUTCDates'), + + setValue: function(){ + var formatted = this.getFormattedDate(); + if (!this.isInput){ + if (this.component){ + this.element.find('input').val(formatted); + } + } + else { + this.element.val(formatted); + } + return this; + }, + + getFormattedDate: function(format){ + if (format === undefined) + format = this.o.format; + + var lang = this.o.language; + return $.map(this.dates, function(d){ + return DPGlobal.formatDate(d, format, lang); + }).join(this.o.multidateSeparator); + }, + + setStartDate: function(startDate){ + this._process_options({startDate: startDate}); + this.update(); + this.updateNavArrows(); + return this; + }, + + setEndDate: function(endDate){ + this._process_options({endDate: endDate}); + this.update(); + this.updateNavArrows(); + return this; + }, + + setDaysOfWeekDisabled: function(daysOfWeekDisabled){ + this._process_options({daysOfWeekDisabled: daysOfWeekDisabled}); + this.update(); + this.updateNavArrows(); + return this; + }, + + setDaysOfWeekHighlighted: function(daysOfWeekHighlighted){ + this._process_options({daysOfWeekHighlighted: daysOfWeekHighlighted}); + this.update(); + return this; + }, + + setDatesDisabled: function(datesDisabled){ + this._process_options({datesDisabled: datesDisabled}); + this.update(); + this.updateNavArrows(); + }, + + place: function(){ + if (this.isInline) + return this; + var calendarWidth = this.picker.outerWidth(), + calendarHeight = this.picker.outerHeight(), + visualPadding = 10, + container = $(this.o.container), + windowWidth = container.width(), + scrollTop = this.o.container === 'body' ? $(document).scrollTop() : container.scrollTop(), + appendOffset = container.offset(); + + var parentsZindex = []; + this.element.parents().each(function(){ + var itemZIndex = $(this).css('z-index'); + if (itemZIndex !== 'auto' && itemZIndex !== 0) parentsZindex.push(parseInt(itemZIndex)); + }); + var zIndex = Math.max.apply(Math, parentsZindex) + this.o.zIndexOffset; + var offset = this.component ? this.component.parent().offset() : this.element.offset(); + var height = this.component ? this.component.outerHeight(true) : this.element.outerHeight(false); + var width = this.component ? this.component.outerWidth(true) : this.element.outerWidth(false); + var left = offset.left - appendOffset.left, + top = offset.top - appendOffset.top; + + if (this.o.container !== 'body') { + top += scrollTop; + } + + this.picker.removeClass( + 'datepicker-orient-top datepicker-orient-bottom '+ + 'datepicker-orient-right datepicker-orient-left' + ); + + if (this.o.orientation.x !== 'auto'){ + this.picker.addClass('datepicker-orient-' + this.o.orientation.x); + if (this.o.orientation.x === 'right') + left -= calendarWidth - width; + } + // auto x orientation is best-placement: if it crosses a window + // edge, fudge it sideways + else { + if (offset.left < 0) { + // component is outside the window on the left side. Move it into visible range + this.picker.addClass('datepicker-orient-left'); + left -= offset.left - visualPadding; + } else if (left + calendarWidth > windowWidth) { + // the calendar passes the widow right edge. Align it to component right side + this.picker.addClass('datepicker-orient-right'); + left += width - calendarWidth; + } else { + // Default to left + this.picker.addClass('datepicker-orient-left'); + } + } + + // auto y orientation is best-situation: top or bottom, no fudging, + // decision based on which shows more of the calendar + var yorient = this.o.orientation.y, + top_overflow; + if (yorient === 'auto'){ + top_overflow = -scrollTop + top - calendarHeight; + yorient = top_overflow < 0 ? 'bottom' : 'top'; + } + + this.picker.addClass('datepicker-orient-' + yorient); + if (yorient === 'top') + top -= calendarHeight + parseInt(this.picker.css('padding-top')); + else + top += height; + + if (this.o.rtl) { + var right = windowWidth - (left + width); + this.picker.css({ + top: top, + right: right, + zIndex: zIndex + }); + } else { + this.picker.css({ + top: top, + left: left, + zIndex: zIndex + }); + } + return this; + }, + + _allow_update: true, + update: function(){ + if (!this._allow_update) + return this; + + var oldDates = this.dates.copy(), + dates = [], + fromArgs = false; + if (arguments.length){ + $.each(arguments, $.proxy(function(i, date){ + if (date instanceof Date) + date = this._local_to_utc(date); + dates.push(date); + }, this)); + fromArgs = true; + } + else { + dates = this.isInput + ? this.element.val() + : this.element.data('date') || this.element.find('input').val(); + if (dates && this.o.multidate) + dates = dates.split(this.o.multidateSeparator); + else + dates = [dates]; + delete this.element.data().date; + } + + dates = $.map(dates, $.proxy(function(date){ + return DPGlobal.parseDate(date, this.o.format, this.o.language); + }, this)); + dates = $.grep(dates, $.proxy(function(date){ + return ( + !this.dateWithinRange(date) || + !date + ); + }, this), true); + this.dates.replace(dates); + + if (this.dates.length) + this.viewDate = new Date(this.dates.get(-1)); + else if (this.viewDate < this.o.startDate) + this.viewDate = new Date(this.o.startDate); + else if (this.viewDate > this.o.endDate) + this.viewDate = new Date(this.o.endDate); + else + this.viewDate = this.o.defaultViewDate; + + if (fromArgs){ + // setting date by clicking + this.setValue(); + } + else if (dates.length){ + // setting date by typing + if (String(oldDates) !== String(this.dates)) + this._trigger('changeDate'); + } + if (!this.dates.length && oldDates.length) + this._trigger('clearDate'); + + this.fill(); + this.element.change(); + return this; + }, + + fillDow: function(){ + var dowCnt = this.o.weekStart, + html = ''; + if (this.o.calendarWeeks){ + this.picker.find('.datepicker-days .datepicker-switch') + .attr('colspan', function(i, val){ + return parseInt(val) + 1; + }); + html += ' '; + } + while (dowCnt < this.o.weekStart + 7){ + html += ''+dates[this.o.language].daysMin[(dowCnt++)%7]+''; + } + html += ''; + this.picker.find('.datepicker-days thead').append(html); + }, + + fillMonths: function(){ + var html = '', + i = 0; + while (i < 12){ + html += ''+dates[this.o.language].monthsShort[i++]+''; + } + this.picker.find('.datepicker-months td').html(html); + }, + + setRange: function(range){ + if (!range || !range.length) + delete this.range; + else + this.range = $.map(range, function(d){ + return d.valueOf(); + }); + this.fill(); + }, + + getClassNames: function(date){ + var cls = [], + year = this.viewDate.getUTCFullYear(), + month = this.viewDate.getUTCMonth(), + today = new Date(); + if (date.getUTCFullYear() < year || (date.getUTCFullYear() === year && date.getUTCMonth() < month)){ + cls.push('old'); + } + else if (date.getUTCFullYear() > year || (date.getUTCFullYear() === year && date.getUTCMonth() > month)){ + cls.push('new'); + } + if (this.focusDate && date.valueOf() === this.focusDate.valueOf()) + cls.push('focused'); + // Compare internal UTC date with local today, not UTC today + if (this.o.todayHighlight && + date.getUTCFullYear() === today.getFullYear() && + date.getUTCMonth() === today.getMonth() && + date.getUTCDate() === today.getDate()){ + cls.push('today'); + } + if (this.dates.contains(date) !== -1) + cls.push('active'); + if (!this.dateWithinRange(date) || this.dateIsDisabled(date)){ + cls.push('disabled'); + } + if ($.inArray(date.getUTCDay(), this.o.daysOfWeekHighlighted) !== -1){ + cls.push('highlighted'); + } + + if (this.range){ + if (date > this.range[0] && date < this.range[this.range.length-1]){ + cls.push('range'); + } + if ($.inArray(date.valueOf(), this.range) !== -1){ + cls.push('selected'); + } + if (date.valueOf() === this.range[0]){ + cls.push('range-start'); + } + if (date.valueOf() === this.range[this.range.length-1]){ + cls.push('range-end'); + } + } + return cls; + }, + + fill: function(){ + var d = new Date(this.viewDate), + year = d.getUTCFullYear(), + month = d.getUTCMonth(), + startYear = this.o.startDate !== -Infinity ? this.o.startDate.getUTCFullYear() : -Infinity, + startMonth = this.o.startDate !== -Infinity ? this.o.startDate.getUTCMonth() : -Infinity, + endYear = this.o.endDate !== Infinity ? this.o.endDate.getUTCFullYear() : Infinity, + endMonth = this.o.endDate !== Infinity ? this.o.endDate.getUTCMonth() : Infinity, + todaytxt = dates[this.o.language].today || dates['en'].today || '', + cleartxt = dates[this.o.language].clear || dates['en'].clear || '', + titleFormat = dates[this.o.language].titleFormat || dates['en'].titleFormat, + tooltip; + if (isNaN(year) || isNaN(month)) + return; + this.picker.find('.datepicker-days thead .datepicker-switch') + .text(DPGlobal.formatDate(new UTCDate(year, month), titleFormat, this.o.language)); + this.picker.find('tfoot .today') + .text(todaytxt) + .toggle(this.o.todayBtn !== false); + this.picker.find('tfoot .clear') + .text(cleartxt) + .toggle(this.o.clearBtn !== false); + this.picker.find('thead .datepicker-title') + .text(this.o.title) + .toggle(this.o.title !== ''); + this.updateNavArrows(); + this.fillMonths(); + var prevMonth = UTCDate(year, month-1, 28), + day = DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth()); + prevMonth.setUTCDate(day); + prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.o.weekStart + 7)%7); + var nextMonth = new Date(prevMonth); + if (prevMonth.getUTCFullYear() < 100){ + nextMonth.setUTCFullYear(prevMonth.getUTCFullYear()); + } + nextMonth.setUTCDate(nextMonth.getUTCDate() + 42); + nextMonth = nextMonth.valueOf(); + var html = []; + var clsName; + while (prevMonth.valueOf() < nextMonth){ + if (prevMonth.getUTCDay() === this.o.weekStart){ + html.push(''); + if (this.o.calendarWeeks){ + // ISO 8601: First week contains first thursday. + // ISO also states week starts on Monday, but we can be more abstract here. + var + // Start of current week: based on weekstart/current date + ws = new Date(+prevMonth + (this.o.weekStart - prevMonth.getUTCDay() - 7) % 7 * 864e5), + // Thursday of this week + th = new Date(Number(ws) + (7 + 4 - ws.getUTCDay()) % 7 * 864e5), + // First Thursday of year, year from thursday + yth = new Date(Number(yth = UTCDate(th.getUTCFullYear(), 0, 1)) + (7 + 4 - yth.getUTCDay())%7*864e5), + // Calendar week: ms between thursdays, div ms per day, div 7 days + calWeek = (th - yth) / 864e5 / 7 + 1; + html.push(''+ calWeek +''); + + } + } + clsName = this.getClassNames(prevMonth); + clsName.push('day'); + + if (this.o.beforeShowDay !== $.noop){ + var before = this.o.beforeShowDay(this._utc_to_local(prevMonth)); + if (before === undefined) + before = {}; + else if (typeof(before) === 'boolean') + before = {enabled: before}; + else if (typeof(before) === 'string') + before = {classes: before}; + if (before.enabled === false) + clsName.push('disabled'); + if (before.classes) + clsName = clsName.concat(before.classes.split(/\s+/)); + if (before.tooltip) + tooltip = before.tooltip; + } + + clsName = $.unique(clsName); + html.push(''+prevMonth.getUTCDate() + ''); + tooltip = null; + if (prevMonth.getUTCDay() === this.o.weekEnd){ + html.push(''); + } + prevMonth.setUTCDate(prevMonth.getUTCDate()+1); + } + this.picker.find('.datepicker-days tbody').empty().append(html.join('')); + + var monthsTitle = dates[this.o.language].monthsTitle || dates['en'].monthsTitle || 'Months'; + var months = this.picker.find('.datepicker-months') + .find('.datepicker-switch') + .text(this.o.maxViewMode < 2 ? monthsTitle : year) + .end() + .find('span').removeClass('active'); + + $.each(this.dates, function(i, d){ + if (d.getUTCFullYear() === year) + months.eq(d.getUTCMonth()).addClass('active'); + }); + + if (year < startYear || year > endYear){ + months.addClass('disabled'); + } + if (year === startYear){ + months.slice(0, startMonth).addClass('disabled'); + } + if (year === endYear){ + months.slice(endMonth+1).addClass('disabled'); + } + + if (this.o.beforeShowMonth !== $.noop){ + var that = this; + $.each(months, function(i, month){ + if (!$(month).hasClass('disabled')) { + var moDate = new Date(year, i, 1); + var before = that.o.beforeShowMonth(moDate); + if (before === false) + $(month).addClass('disabled'); + } + }); + } + + html = ''; + year = parseInt(year/10, 10) * 10; + var yearCont = this.picker.find('.datepicker-years') + .find('.datepicker-switch') + .text(year + '-' + (year + 9)) + .end() + .find('td'); + year -= 1; + var years = $.map(this.dates, function(d){ + return d.getUTCFullYear(); + }), + classes; + for (var i = -1; i < 11; i++){ + classes = ['year']; + tooltip = null; + + if (i === -1) + classes.push('old'); + else if (i === 10) + classes.push('new'); + if ($.inArray(year, years) !== -1) + classes.push('active'); + if (year < startYear || year > endYear) + classes.push('disabled'); + + if (this.o.beforeShowYear !== $.noop) { + var yrBefore = this.o.beforeShowYear(new Date(year, 0, 1)); + if (yrBefore === undefined) + yrBefore = {}; + else if (typeof(yrBefore) === 'boolean') + yrBefore = {enabled: yrBefore}; + else if (typeof(yrBefore) === 'string') + yrBefore = {classes: yrBefore}; + if (yrBefore.enabled === false) + classes.push('disabled'); + if (yrBefore.classes) + classes = classes.concat(yrBefore.classes.split(/\s+/)); + if (yrBefore.tooltip) + tooltip = yrBefore.tooltip; + } + + html += '' + year + ''; + year += 1; + } + yearCont.html(html); + }, + + updateNavArrows: function(){ + if (!this._allow_update) + return; + + var d = new Date(this.viewDate), + year = d.getUTCFullYear(), + month = d.getUTCMonth(); + switch (this.viewMode){ + case 0: + if (this.o.startDate !== -Infinity && year <= this.o.startDate.getUTCFullYear() && month <= this.o.startDate.getUTCMonth()){ + this.picker.find('.prev').css({visibility: 'hidden'}); + } + else { + this.picker.find('.prev').css({visibility: 'visible'}); + } + if (this.o.endDate !== Infinity && year >= this.o.endDate.getUTCFullYear() && month >= this.o.endDate.getUTCMonth()){ + this.picker.find('.next').css({visibility: 'hidden'}); + } + else { + this.picker.find('.next').css({visibility: 'visible'}); + } + break; + case 1: + case 2: + if (this.o.startDate !== -Infinity && year <= this.o.startDate.getUTCFullYear() || this.o.maxViewMode < 2){ + this.picker.find('.prev').css({visibility: 'hidden'}); + } + else { + this.picker.find('.prev').css({visibility: 'visible'}); + } + if (this.o.endDate !== Infinity && year >= this.o.endDate.getUTCFullYear() || this.o.maxViewMode < 2){ + this.picker.find('.next').css({visibility: 'hidden'}); + } + else { + this.picker.find('.next').css({visibility: 'visible'}); + } + break; + } + }, + + click: function(e){ + e.preventDefault(); + e.stopPropagation(); + var target = $(e.target).closest('span, td, th'), + year, month, day; + if (target.length === 1){ + switch (target[0].nodeName.toLowerCase()){ + case 'th': + switch (target[0].className){ + case 'datepicker-switch': + this.showMode(1); + break; + case 'prev': + case 'next': + var dir = DPGlobal.modes[this.viewMode].navStep * (target[0].className === 'prev' ? -1 : 1); + switch (this.viewMode){ + case 0: + this.viewDate = this.moveMonth(this.viewDate, dir); + this._trigger('changeMonth', this.viewDate); + break; + case 1: + case 2: + this.viewDate = this.moveYear(this.viewDate, dir); + if (this.viewMode === 1) + this._trigger('changeYear', this.viewDate); + break; + } + this.fill(); + break; + case 'today': + this.showMode(-2); + var which = this.o.todayBtn === 'linked' ? null : 'view'; + this._setDate(UTCToday(), which); + break; + case 'clear': + this.clearDates(); + break; + } + break; + case 'span': + if (!target.hasClass('disabled')){ + this.viewDate.setUTCDate(1); + if (target.hasClass('month')){ + day = 1; + month = target.parent().find('span').index(target); + year = this.viewDate.getUTCFullYear(); + this.viewDate.setUTCMonth(month); + this._trigger('changeMonth', this.viewDate); + if (this.o.minViewMode === 1){ + this._setDate(UTCDate(year, month, day)); + this.showMode(); + } else { + this.showMode(-1); + } + } + else { + day = 1; + month = 0; + year = parseInt(target.text(), 10)||0; + this.viewDate.setUTCFullYear(year); + this._trigger('changeYear', this.viewDate); + if (this.o.minViewMode === 2){ + this._setDate(UTCDate(year, month, day)); + } + this.showMode(-1); + } + this.fill(); + } + break; + case 'td': + if (target.hasClass('day') && !target.hasClass('disabled')){ + day = parseInt(target.text(), 10)||1; + year = this.viewDate.getUTCFullYear(); + month = this.viewDate.getUTCMonth(); + if (target.hasClass('old')){ + if (month === 0){ + month = 11; + year -= 1; + } + else { + month -= 1; + } + } + else if (target.hasClass('new')){ + if (month === 11){ + month = 0; + year += 1; + } + else { + month += 1; + } + } + this._setDate(UTCDate(year, month, day)); + } + break; + } + } + if (this.picker.is(':visible') && this._focused_from){ + $(this._focused_from).focus(); + } + delete this._focused_from; + }, + + _toggle_multidate: function(date){ + var ix = this.dates.contains(date); + if (!date){ + this.dates.clear(); + } + + if (ix !== -1){ + if (this.o.multidate === true || this.o.multidate > 1 || this.o.toggleActive){ + this.dates.remove(ix); + } + } else if (this.o.multidate === false) { + this.dates.clear(); + this.dates.push(date); + } + else { + this.dates.push(date); + } + + if (typeof this.o.multidate === 'number') + while (this.dates.length > this.o.multidate) + this.dates.remove(0); + }, + + _setDate: function(date, which){ + if (!which || which === 'date') + this._toggle_multidate(date && new Date(date)); + if (!which || which === 'view') + this.viewDate = date && new Date(date); + + this.fill(); + this.setValue(); + if (!which || which !== 'view') { + this._trigger('changeDate'); + } + var element; + if (this.isInput){ + element = this.element; + } + else if (this.component){ + element = this.element.find('input'); + } + if (element){ + element.change(); + } + if (this.o.autoclose && (!which || which === 'date')){ + this.hide(); + } + }, + + moveDay: function(date, dir){ + var newDate = new Date(date); + newDate.setUTCDate(date.getUTCDate() + dir); + + return newDate; + }, + + moveWeek: function(date, dir){ + return this.moveDay(date, dir * 7); + }, + + moveMonth: function(date, dir){ + if (!isValidDate(date)) + return this.o.defaultViewDate; + if (!dir) + return date; + var new_date = new Date(date.valueOf()), + day = new_date.getUTCDate(), + month = new_date.getUTCMonth(), + mag = Math.abs(dir), + new_month, test; + dir = dir > 0 ? 1 : -1; + if (mag === 1){ + test = dir === -1 + // If going back one month, make sure month is not current month + // (eg, Mar 31 -> Feb 31 == Feb 28, not Mar 02) + ? function(){ + return new_date.getUTCMonth() === month; + } + // If going forward one month, make sure month is as expected + // (eg, Jan 31 -> Feb 31 == Feb 28, not Mar 02) + : function(){ + return new_date.getUTCMonth() !== new_month; + }; + new_month = month + dir; + new_date.setUTCMonth(new_month); + // Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11 + if (new_month < 0 || new_month > 11) + new_month = (new_month + 12) % 12; + } + else { + // For magnitudes >1, move one month at a time... + for (var i=0; i < mag; i++) + // ...which might decrease the day (eg, Jan 31 to Feb 28, etc)... + new_date = this.moveMonth(new_date, dir); + // ...then reset the day, keeping it in the new month + new_month = new_date.getUTCMonth(); + new_date.setUTCDate(day); + test = function(){ + return new_month !== new_date.getUTCMonth(); + }; + } + // Common date-resetting loop -- if date is beyond end of month, make it + // end of month + while (test()){ + new_date.setUTCDate(--day); + new_date.setUTCMonth(new_month); + } + return new_date; + }, + + moveYear: function(date, dir){ + return this.moveMonth(date, dir*12); + }, + + moveAvailableDate: function(date, dir, fn){ + do { + date = this[fn](date, dir); + + if (!this.dateWithinRange(date)) + return false; + + fn = 'moveDay'; + } + while (this.dateIsDisabled(date)); + + return date; + }, + + weekOfDateIsDisabled: function(date){ + return $.inArray(date.getUTCDay(), this.o.daysOfWeekDisabled) !== -1; + }, + + dateIsDisabled: function(date){ + return ( + this.weekOfDateIsDisabled(date) || + $.grep(this.o.datesDisabled, function(d){ + return isUTCEquals(date, d); + }).length > 0 + ); + }, + + dateWithinRange: function(date){ + return date >= this.o.startDate && date <= this.o.endDate; + }, + + keydown: function(e){ + if (!this.picker.is(':visible')){ + if (e.keyCode === 40 || e.keyCode === 27) { // allow down to re-show picker + this.show(); + e.stopPropagation(); + } + return; + } + var dateChanged = false, + dir, newViewDate, + focusDate = this.focusDate || this.viewDate; + switch (e.keyCode){ + case 27: // escape + if (this.focusDate){ + this.focusDate = null; + this.viewDate = this.dates.get(-1) || this.viewDate; + this.fill(); + } + else + this.hide(); + e.preventDefault(); + e.stopPropagation(); + break; + case 37: // left + case 38: // up + case 39: // right + case 40: // down + if (!this.o.keyboardNavigation || this.o.daysOfWeekDisabled.length === 7) + break; + dir = e.keyCode === 37 || e.keyCode === 38 ? -1 : 1; + if (e.ctrlKey){ + newViewDate = this.moveAvailableDate(focusDate, dir, 'moveYear'); + + if (newViewDate) + this._trigger('changeYear', this.viewDate); + } + else if (e.shiftKey){ + newViewDate = this.moveAvailableDate(focusDate, dir, 'moveMonth'); + + if (newViewDate) + this._trigger('changeMonth', this.viewDate); + } + else if (e.keyCode === 37 || e.keyCode === 39){ + newViewDate = this.moveAvailableDate(focusDate, dir, 'moveDay'); + } + else if (!this.weekOfDateIsDisabled(focusDate)){ + newViewDate = this.moveAvailableDate(focusDate, dir, 'moveWeek'); + } + if (newViewDate){ + this.focusDate = this.viewDate = newViewDate; + this.setValue(); + this.fill(); + e.preventDefault(); + } + break; + case 13: // enter + if (!this.o.forceParse) + break; + focusDate = this.focusDate || this.dates.get(-1) || this.viewDate; + if (this.o.keyboardNavigation) { + this._toggle_multidate(focusDate); + dateChanged = true; + } + this.focusDate = null; + this.viewDate = this.dates.get(-1) || this.viewDate; + this.setValue(); + this.fill(); + if (this.picker.is(':visible')){ + e.preventDefault(); + e.stopPropagation(); + if (this.o.autoclose) + this.hide(); + } + break; + case 9: // tab + this.focusDate = null; + this.viewDate = this.dates.get(-1) || this.viewDate; + this.fill(); + this.hide(); + break; + } + if (dateChanged){ + if (this.dates.length) + this._trigger('changeDate'); + else + this._trigger('clearDate'); + var element; + if (this.isInput){ + element = this.element; + } + else if (this.component){ + element = this.element.find('input'); + } + if (element){ + element.change(); + } + } + }, + + showMode: function(dir){ + if (dir){ + this.viewMode = Math.max(this.o.minViewMode, Math.min(this.o.maxViewMode, this.viewMode + dir)); + } + this.picker + .children('div') + .hide() + .filter('.datepicker-' + DPGlobal.modes[this.viewMode].clsName) + .show(); + this.updateNavArrows(); + } + }; + + var DateRangePicker = function(element, options){ + $(element).data('datepicker', this); + this.element = $(element); + this.inputs = $.map(options.inputs, function(i){ + return i.jquery ? i[0] : i; + }); + delete options.inputs; + + datepickerPlugin.call($(this.inputs), options) + .on('changeDate', $.proxy(this.dateUpdated, this)); + + this.pickers = $.map(this.inputs, function(i){ + return $(i).data('datepicker'); + }); + this.updateDates(); + }; + DateRangePicker.prototype = { + updateDates: function(){ + this.dates = $.map(this.pickers, function(i){ + return i.getUTCDate(); + }); + this.updateRanges(); + }, + updateRanges: function(){ + var range = $.map(this.dates, function(d){ + return d.valueOf(); + }); + $.each(this.pickers, function(i, p){ + p.setRange(range); + }); + }, + dateUpdated: function(e){ + // `this.updating` is a workaround for preventing infinite recursion + // between `changeDate` triggering and `setUTCDate` calling. Until + // there is a better mechanism. + if (this.updating) + return; + this.updating = true; + + var dp = $(e.target).data('datepicker'); + + if (typeof(dp) === "undefined") { + return; + } + + var new_date = dp.getUTCDate(), + i = $.inArray(e.target, this.inputs), + j = i - 1, + k = i + 1, + l = this.inputs.length; + if (i === -1) + return; + + $.each(this.pickers, function(i, p){ + if (!p.getUTCDate()) + p.setUTCDate(new_date); + }); + + if (new_date < this.dates[j]){ + // Date being moved earlier/left + while (j >= 0 && new_date < this.dates[j]){ + this.pickers[j--].setUTCDate(new_date); + } + } + else if (new_date > this.dates[k]){ + // Date being moved later/right + while (k < l && new_date > this.dates[k]){ + this.pickers[k++].setUTCDate(new_date); + } + } + this.updateDates(); + + delete this.updating; + }, + remove: function(){ + $.map(this.pickers, function(p){ p.remove(); }); + delete this.element.data().datepicker; + } + }; + + function opts_from_el(el, prefix){ + // Derive options from element data-attrs + var data = $(el).data(), + out = {}, inkey, + replace = new RegExp('^' + prefix.toLowerCase() + '([A-Z])'); + prefix = new RegExp('^' + prefix.toLowerCase()); + function re_lower(_,a){ + return a.toLowerCase(); + } + for (var key in data) + if (prefix.test(key)){ + inkey = key.replace(replace, re_lower); + out[inkey] = data[key]; + } + return out; + } + + function opts_from_locale(lang){ + // Derive options from locale plugins + var out = {}; + // Check if "de-DE" style date is available, if not language should + // fallback to 2 letter code eg "de" + if (!dates[lang]){ + lang = lang.split('-')[0]; + if (!dates[lang]) + return; + } + var d = dates[lang]; + $.each(locale_opts, function(i,k){ + if (k in d) + out[k] = d[k]; + }); + return out; + } + + var old = $.fn.datepicker; + var datepickerPlugin = function(option){ + var args = Array.apply(null, arguments); + args.shift(); + var internal_return; + this.each(function(){ + var $this = $(this), + data = $this.data('datepicker'), + options = typeof option === 'object' && option; + if (!data){ + var elopts = opts_from_el(this, 'date'), + // Preliminary otions + xopts = $.extend({}, defaults, elopts, options), + locopts = opts_from_locale(xopts.language), + // Options priority: js args, data-attrs, locales, defaults + opts = $.extend({}, defaults, locopts, elopts, options); + if ($this.hasClass('input-daterange') || opts.inputs){ + $.extend(opts, { + inputs: opts.inputs || $this.find('input').toArray() + }); + data = new DateRangePicker(this, opts); + } + else { + data = new Datepicker(this, opts); + } + $this.data('datepicker', data); + } + if (typeof option === 'string' && typeof data[option] === 'function'){ + internal_return = data[option].apply(data, args); + } + }); + + if ( + internal_return === undefined || + internal_return instanceof Datepicker || + internal_return instanceof DateRangePicker + ) + return this; + + if (this.length > 1) + throw new Error('Using only allowed for the collection of a single element (' + option + ' function)'); + else + return internal_return; + }; + $.fn.datepicker = datepickerPlugin; + + var defaults = $.fn.datepicker.defaults = { + autoclose: false, + beforeShowDay: $.noop, + beforeShowMonth: $.noop, + beforeShowYear: $.noop, + calendarWeeks: false, + clearBtn: false, + toggleActive: false, + daysOfWeekDisabled: [], + daysOfWeekHighlighted: [], + datesDisabled: [], + endDate: Infinity, + forceParse: true, + format: 'mm/dd/yyyy', + keyboardNavigation: true, + language: 'en', + minViewMode: 0, + maxViewMode: 2, + multidate: false, + multidateSeparator: ',', + orientation: "auto", + rtl: false, + startDate: -Infinity, + startView: 0, + todayBtn: false, + todayHighlight: false, + weekStart: 0, + disableTouchKeyboard: false, + enableOnReadonly: true, + showOnFocus: true, + zIndexOffset: 10, + container: 'body', + immediateUpdates: false, + title: '' + }; + var locale_opts = $.fn.datepicker.locale_opts = [ + 'format', + 'rtl', + 'weekStart' + ]; + $.fn.datepicker.Constructor = Datepicker; + var dates = $.fn.datepicker.dates = { + en: { + days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + today: "Today", + clear: "Clear", + titleFormat: "MM yyyy" + } + }; + + var DPGlobal = { + modes: [ + { + clsName: 'days', + navFnc: 'Month', + navStep: 1 + }, + { + clsName: 'months', + navFnc: 'FullYear', + navStep: 1 + }, + { + clsName: 'years', + navFnc: 'FullYear', + navStep: 10 + }], + isLeapYear: function(year){ + return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)); + }, + getDaysInMonth: function(year, month){ + return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]; + }, + validParts: /dd?|DD?|mm?|MM?|yy(?:yy)?/g, + nonpunctuation: /[^ -\/:-@\[\u3400-\u9fff-`{-~\t\n\r]+/g, + parseFormat: function(format){ + if (typeof format.toValue === 'function' && typeof format.toDisplay === 'function') + return format; + // IE treats \0 as a string end in inputs (truncating the value), + // so it's a bad format delimiter, anyway + var separators = format.replace(this.validParts, '\0').split('\0'), + parts = format.match(this.validParts); + if (!separators || !separators.length || !parts || parts.length === 0){ + throw new Error("Invalid date format."); + } + return {separators: separators, parts: parts}; + }, + parseDate: function(date, format, language){ + if (!date) + return undefined; + if (date instanceof Date) + return date; + if (typeof format === 'string') + format = DPGlobal.parseFormat(format); + if (format.toValue) + return format.toValue(date, format, language); + var part_re = /([\-+]\d+)([dmwy])/, + parts = date.match(/([\-+]\d+)([dmwy])/g), + fn_map = { + d: 'moveDay', + m: 'moveMonth', + w: 'moveWeek', + y: 'moveYear' + }, + part, dir, i, fn; + if (/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/.test(date)){ + date = new Date(); + for (i=0; i < parts.length; i++){ + part = part_re.exec(parts[i]); + dir = parseInt(part[1]); + fn = fn_map[part[2]]; + date = Datepicker.prototype[fn](date, dir); + } + return UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()); + } + parts = date && date.match(this.nonpunctuation) || []; + date = new Date(); + var parsed = {}, + setters_order = ['yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'd', 'dd'], + setters_map = { + yyyy: function(d,v){ + return d.setUTCFullYear(v); + }, + yy: function(d,v){ + return d.setUTCFullYear(2000+v); + }, + m: function(d,v){ + if (isNaN(d)) + return d; + v -= 1; + while (v < 0) v += 12; + v %= 12; + d.setUTCMonth(v); + while (d.getUTCMonth() !== v) + d.setUTCDate(d.getUTCDate()-1); + return d; + }, + d: function(d,v){ + return d.setUTCDate(v); + } + }, + val, filtered; + setters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m']; + setters_map['dd'] = setters_map['d']; + date = UTCToday(); + var fparts = format.parts.slice(); + // Remove noop parts + if (parts.length !== fparts.length){ + fparts = $(fparts).filter(function(i,p){ + return $.inArray(p, setters_order) !== -1; + }).toArray(); + } + // Process remainder + function match_part(){ + var m = this.slice(0, parts[i].length), + p = parts[i].slice(0, m.length); + return m.toLowerCase() === p.toLowerCase(); + } + if (parts.length === fparts.length){ + var cnt; + for (i=0, cnt = fparts.length; i < cnt; i++){ + val = parseInt(parts[i], 10); + part = fparts[i]; + if (isNaN(val)){ + switch (part){ + case 'MM': + filtered = $(dates[language].months).filter(match_part); + val = $.inArray(filtered[0], dates[language].months) + 1; + break; + case 'M': + filtered = $(dates[language].monthsShort).filter(match_part); + val = $.inArray(filtered[0], dates[language].monthsShort) + 1; + break; + } + } + parsed[part] = val; + } + var _date, s; + for (i=0; i < setters_order.length; i++){ + s = setters_order[i]; + if (s in parsed && !isNaN(parsed[s])){ + _date = new Date(date); + setters_map[s](_date, parsed[s]); + if (!isNaN(_date)) + date = _date; + } + } + } + return date; + }, + formatDate: function(date, format, language){ + if (!date) + return ''; + if (typeof format === 'string') + format = DPGlobal.parseFormat(format); + if (format.toDisplay) + return format.toDisplay(date, format, language); + var val = { + d: date.getUTCDate(), + D: dates[language].daysShort[date.getUTCDay()], + DD: dates[language].days[date.getUTCDay()], + m: date.getUTCMonth() + 1, + M: dates[language].monthsShort[date.getUTCMonth()], + MM: dates[language].months[date.getUTCMonth()], + yy: date.getUTCFullYear().toString().substring(2), + yyyy: date.getUTCFullYear() + }; + val.dd = (val.d < 10 ? '0' : '') + val.d; + val.mm = (val.m < 10 ? '0' : '') + val.m; + date = []; + var seps = $.extend([], format.separators); + for (var i=0, cnt = format.parts.length; i <= cnt; i++){ + if (seps.length) + date.push(seps.shift()); + date.push(val[format.parts[i]]); + } + return date.join(''); + }, + headTemplate: ''+ + ''+ + ''+ + ''+ + ''+ + '«'+ + ''+ + '»'+ + ''+ + '', + contTemplate: '', + footTemplate: ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + '' + }; + DPGlobal.template = '
'+ + '
'+ + ''+ + DPGlobal.headTemplate+ + ''+ + DPGlobal.footTemplate+ + '
'+ + '
'+ + '
'+ + ''+ + DPGlobal.headTemplate+ + DPGlobal.contTemplate+ + DPGlobal.footTemplate+ + '
'+ + '
'+ + '
'+ + ''+ + DPGlobal.headTemplate+ + DPGlobal.contTemplate+ + DPGlobal.footTemplate+ + '
'+ + '
'+ + '
'; + + $.fn.datepicker.DPGlobal = DPGlobal; + + + /* DATEPICKER NO CONFLICT + * =================== */ + + $.fn.datepicker.noConflict = function(){ + $.fn.datepicker = old; + return this; + }; + + /* DATEPICKER VERSION + * =================== */ + $.fn.datepicker.version = '1.5.1'; + + /* DATEPICKER DATA-API + * ================== */ + + $(document).on( + 'focus.datepicker.data-api click.datepicker.data-api', + '[data-provide="datepicker"]', + function(e){ + var $this = $(this); + if ($this.data('datepicker')) + return; + e.preventDefault(); + // component click requires us to explicitly show it + datepickerPlugin.call($this, 'show'); + } + ); + $(function(){ + datepickerPlugin.call($('[data-provide="datepicker-inline"]')); + }); + +})); diff --git a/client/lib/bootstrap-datepicker3.css b/client/lib/bootstrap-datepicker3.css new file mode 100644 index 000000000..3238d2631 --- /dev/null +++ b/client/lib/bootstrap-datepicker3.css @@ -0,0 +1,791 @@ +/*! + * Datepicker for Bootstrap v1.5.1 (https://github.com/eternicode/bootstrap-datepicker) + * + * Copyright 2012 Stefan Petre + * Improvements by Andrew Rowls + * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) + */ +.datepicker { + border-radius: 4px; + direction: ltr; +} +.datepicker-inline { + width: 220px; +} +.datepicker.datepicker-rtl { + direction: rtl; +} +.datepicker.datepicker-rtl table tr td span { + float: right; +} +.datepicker-dropdown { + top: 0; + left: 0; + padding: 4px; +} +.datepicker-dropdown:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid rgba(0, 0, 0, 0.15); + border-top: 0; + border-bottom-color: rgba(0, 0, 0, 0.2); + position: absolute; +} +.datepicker-dropdown:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-top: 0; + position: absolute; +} +.datepicker-dropdown.datepicker-orient-left:before { + left: 6px; +} +.datepicker-dropdown.datepicker-orient-left:after { + left: 7px; +} +.datepicker-dropdown.datepicker-orient-right:before { + right: 6px; +} +.datepicker-dropdown.datepicker-orient-right:after { + right: 7px; +} +.datepicker-dropdown.datepicker-orient-bottom:before { + top: -7px; +} +.datepicker-dropdown.datepicker-orient-bottom:after { + top: -6px; +} +.datepicker-dropdown.datepicker-orient-top:before { + bottom: -7px; + border-bottom: 0; + border-top: 7px solid rgba(0, 0, 0, 0.15); +} +.datepicker-dropdown.datepicker-orient-top:after { + bottom: -6px; + border-bottom: 0; + border-top: 6px solid #ffffff; +} +.datepicker > div { + display: none; +} +.datepicker table { + margin: 0; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.datepicker table tr td, +.datepicker table tr th { + text-align: center; + width: 30px; + height: 30px; + border-radius: 4px; + border: none; +} +.table-striped .datepicker table tr td, +.table-striped .datepicker table tr th { + background-color: transparent; +} +.datepicker table tr td.old, +.datepicker table tr td.new { + color: #999999; +} +.datepicker table tr td.day:hover, +.datepicker table tr td.focused { + background: #eeeeee; + cursor: pointer; +} +.datepicker table tr td.disabled, +.datepicker table tr td.disabled:hover { + background: none; + color: #999999; + cursor: default; +} +.datepicker table tr td.highlighted { + color: #000000; + background-color: #d9edf7; + border-color: #85c5e5; + border-radius: 0; +} +.datepicker table tr td.highlighted:focus, +.datepicker table tr td.highlighted.focus { + color: #000000; + background-color: #afd9ee; + border-color: #298fc2; +} +.datepicker table tr td.highlighted:hover { + color: #000000; + background-color: #afd9ee; + border-color: #52addb; +} +.datepicker table tr td.highlighted:active, +.datepicker table tr td.highlighted.active, +.open > .dropdown-toggle.datepicker table tr td.highlighted { + color: #000000; + background-color: #afd9ee; + border-color: #52addb; +} +.datepicker table tr td.highlighted:active:hover, +.datepicker table tr td.highlighted.active:hover, +.open > .dropdown-toggle.datepicker table tr td.highlighted:hover, +.datepicker table tr td.highlighted:active:focus, +.datepicker table tr td.highlighted.active:focus, +.open > .dropdown-toggle.datepicker table tr td.highlighted:focus, +.datepicker table tr td.highlighted:active.focus, +.datepicker table tr td.highlighted.active.focus, +.open > .dropdown-toggle.datepicker table tr td.highlighted.focus { + color: #000000; + background-color: #91cbe8; + border-color: #298fc2; +} +.datepicker table tr td.highlighted:active, +.datepicker table tr td.highlighted.active, +.open > .dropdown-toggle.datepicker table tr td.highlighted { + background-image: none; +} +.datepicker table tr td.highlighted.disabled:hover, +.datepicker table tr td.highlighted[disabled]:hover, +fieldset[disabled] .datepicker table tr td.highlighted:hover, +.datepicker table tr td.highlighted.disabled:focus, +.datepicker table tr td.highlighted[disabled]:focus, +fieldset[disabled] .datepicker table tr td.highlighted:focus, +.datepicker table tr td.highlighted.disabled.focus, +.datepicker table tr td.highlighted[disabled].focus, +fieldset[disabled] .datepicker table tr td.highlighted.focus { + background-color: #d9edf7; + border-color: #85c5e5; +} +.datepicker table tr td.highlighted.focused { + background: #afd9ee; +} +.datepicker table tr td.highlighted.disabled, +.datepicker table tr td.highlighted.disabled:active { + background: #d9edf7; + color: #999999; +} +.datepicker table tr td.today { + color: #000000; + background-color: #ffdb99; + border-color: #ffb733; +} +.datepicker table tr td.today:focus, +.datepicker table tr td.today.focus { + color: #000000; + background-color: #ffc966; + border-color: #b37400; +} +.datepicker table tr td.today:hover { + color: #000000; + background-color: #ffc966; + border-color: #f59e00; +} +.datepicker table tr td.today:active, +.datepicker table tr td.today.active, +.open > .dropdown-toggle.datepicker table tr td.today { + color: #000000; + background-color: #ffc966; + border-color: #f59e00; +} +.datepicker table tr td.today:active:hover, +.datepicker table tr td.today.active:hover, +.open > .dropdown-toggle.datepicker table tr td.today:hover, +.datepicker table tr td.today:active:focus, +.datepicker table tr td.today.active:focus, +.open > .dropdown-toggle.datepicker table tr td.today:focus, +.datepicker table tr td.today:active.focus, +.datepicker table tr td.today.active.focus, +.open > .dropdown-toggle.datepicker table tr td.today.focus { + color: #000000; + background-color: #ffbc42; + border-color: #b37400; +} +.datepicker table tr td.today:active, +.datepicker table tr td.today.active, +.open > .dropdown-toggle.datepicker table tr td.today { + background-image: none; +} +.datepicker table tr td.today.disabled:hover, +.datepicker table tr td.today[disabled]:hover, +fieldset[disabled] .datepicker table tr td.today:hover, +.datepicker table tr td.today.disabled:focus, +.datepicker table tr td.today[disabled]:focus, +fieldset[disabled] .datepicker table tr td.today:focus, +.datepicker table tr td.today.disabled.focus, +.datepicker table tr td.today[disabled].focus, +fieldset[disabled] .datepicker table tr td.today.focus { + background-color: #ffdb99; + border-color: #ffb733; +} +.datepicker table tr td.today.focused { + background: #ffc966; +} +.datepicker table tr td.today.disabled, +.datepicker table tr td.today.disabled:active { + background: #ffdb99; + color: #999999; +} +.datepicker table tr td.range { + color: #000000; + background-color: #eeeeee; + border-color: #bbbbbb; + border-radius: 0; +} +.datepicker table tr td.range:focus, +.datepicker table tr td.range.focus { + color: #000000; + background-color: #d5d5d5; + border-color: #7c7c7c; +} +.datepicker table tr td.range:hover { + color: #000000; + background-color: #d5d5d5; + border-color: #9d9d9d; +} +.datepicker table tr td.range:active, +.datepicker table tr td.range.active, +.open > .dropdown-toggle.datepicker table tr td.range { + color: #000000; + background-color: #d5d5d5; + border-color: #9d9d9d; +} +.datepicker table tr td.range:active:hover, +.datepicker table tr td.range.active:hover, +.open > .dropdown-toggle.datepicker table tr td.range:hover, +.datepicker table tr td.range:active:focus, +.datepicker table tr td.range.active:focus, +.open > .dropdown-toggle.datepicker table tr td.range:focus, +.datepicker table tr td.range:active.focus, +.datepicker table tr td.range.active.focus, +.open > .dropdown-toggle.datepicker table tr td.range.focus { + color: #000000; + background-color: #c3c3c3; + border-color: #7c7c7c; +} +.datepicker table tr td.range:active, +.datepicker table tr td.range.active, +.open > .dropdown-toggle.datepicker table tr td.range { + background-image: none; +} +.datepicker table tr td.range.disabled:hover, +.datepicker table tr td.range[disabled]:hover, +fieldset[disabled] .datepicker table tr td.range:hover, +.datepicker table tr td.range.disabled:focus, +.datepicker table tr td.range[disabled]:focus, +fieldset[disabled] .datepicker table tr td.range:focus, +.datepicker table tr td.range.disabled.focus, +.datepicker table tr td.range[disabled].focus, +fieldset[disabled] .datepicker table tr td.range.focus { + background-color: #eeeeee; + border-color: #bbbbbb; +} +.datepicker table tr td.range.focused { + background: #d5d5d5; +} +.datepicker table tr td.range.disabled, +.datepicker table tr td.range.disabled:active { + background: #eeeeee; + color: #999999; +} +.datepicker table tr td.range.highlighted { + color: #000000; + background-color: #e4eef3; + border-color: #9dc1d3; +} +.datepicker table tr td.range.highlighted:focus, +.datepicker table tr td.range.highlighted.focus { + color: #000000; + background-color: #c1d7e3; + border-color: #4b88a6; +} +.datepicker table tr td.range.highlighted:hover { + color: #000000; + background-color: #c1d7e3; + border-color: #73a6c0; +} +.datepicker table tr td.range.highlighted:active, +.datepicker table tr td.range.highlighted.active, +.open > .dropdown-toggle.datepicker table tr td.range.highlighted { + color: #000000; + background-color: #c1d7e3; + border-color: #73a6c0; +} +.datepicker table tr td.range.highlighted:active:hover, +.datepicker table tr td.range.highlighted.active:hover, +.open > .dropdown-toggle.datepicker table tr td.range.highlighted:hover, +.datepicker table tr td.range.highlighted:active:focus, +.datepicker table tr td.range.highlighted.active:focus, +.open > .dropdown-toggle.datepicker table tr td.range.highlighted:focus, +.datepicker table tr td.range.highlighted:active.focus, +.datepicker table tr td.range.highlighted.active.focus, +.open > .dropdown-toggle.datepicker table tr td.range.highlighted.focus { + color: #000000; + background-color: #a8c8d8; + border-color: #4b88a6; +} +.datepicker table tr td.range.highlighted:active, +.datepicker table tr td.range.highlighted.active, +.open > .dropdown-toggle.datepicker table tr td.range.highlighted { + background-image: none; +} +.datepicker table tr td.range.highlighted.disabled:hover, +.datepicker table tr td.range.highlighted[disabled]:hover, +fieldset[disabled] .datepicker table tr td.range.highlighted:hover, +.datepicker table tr td.range.highlighted.disabled:focus, +.datepicker table tr td.range.highlighted[disabled]:focus, +fieldset[disabled] .datepicker table tr td.range.highlighted:focus, +.datepicker table tr td.range.highlighted.disabled.focus, +.datepicker table tr td.range.highlighted[disabled].focus, +fieldset[disabled] .datepicker table tr td.range.highlighted.focus { + background-color: #e4eef3; + border-color: #9dc1d3; +} +.datepicker table tr td.range.highlighted.focused { + background: #c1d7e3; +} +.datepicker table tr td.range.highlighted.disabled, +.datepicker table tr td.range.highlighted.disabled:active { + background: #e4eef3; + color: #999999; +} +.datepicker table tr td.range.today { + color: #000000; + background-color: #f7ca77; + border-color: #f1a417; +} +.datepicker table tr td.range.today:focus, +.datepicker table tr td.range.today.focus { + color: #000000; + background-color: #f4b747; + border-color: #815608; +} +.datepicker table tr td.range.today:hover { + color: #000000; + background-color: #f4b747; + border-color: #bf800c; +} +.datepicker table tr td.range.today:active, +.datepicker table tr td.range.today.active, +.open > .dropdown-toggle.datepicker table tr td.range.today { + color: #000000; + background-color: #f4b747; + border-color: #bf800c; +} +.datepicker table tr td.range.today:active:hover, +.datepicker table tr td.range.today.active:hover, +.open > .dropdown-toggle.datepicker table tr td.range.today:hover, +.datepicker table tr td.range.today:active:focus, +.datepicker table tr td.range.today.active:focus, +.open > .dropdown-toggle.datepicker table tr td.range.today:focus, +.datepicker table tr td.range.today:active.focus, +.datepicker table tr td.range.today.active.focus, +.open > .dropdown-toggle.datepicker table tr td.range.today.focus { + color: #000000; + background-color: #f2aa25; + border-color: #815608; +} +.datepicker table tr td.range.today:active, +.datepicker table tr td.range.today.active, +.open > .dropdown-toggle.datepicker table tr td.range.today { + background-image: none; +} +.datepicker table tr td.range.today.disabled:hover, +.datepicker table tr td.range.today[disabled]:hover, +fieldset[disabled] .datepicker table tr td.range.today:hover, +.datepicker table tr td.range.today.disabled:focus, +.datepicker table tr td.range.today[disabled]:focus, +fieldset[disabled] .datepicker table tr td.range.today:focus, +.datepicker table tr td.range.today.disabled.focus, +.datepicker table tr td.range.today[disabled].focus, +fieldset[disabled] .datepicker table tr td.range.today.focus { + background-color: #f7ca77; + border-color: #f1a417; +} +.datepicker table tr td.range.today.disabled, +.datepicker table tr td.range.today.disabled:active { + background: #f7ca77; + color: #999999; +} +.datepicker table tr td.selected, +.datepicker table tr td.selected.highlighted { + color: #ffffff; + background-color: #999999; + border-color: #555555; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker table tr td.selected:focus, +.datepicker table tr td.selected.highlighted:focus, +.datepicker table tr td.selected.focus, +.datepicker table tr td.selected.highlighted.focus { + color: #ffffff; + background-color: #808080; + border-color: #161616; +} +.datepicker table tr td.selected:hover, +.datepicker table tr td.selected.highlighted:hover { + color: #ffffff; + background-color: #808080; + border-color: #373737; +} +.datepicker table tr td.selected:active, +.datepicker table tr td.selected.highlighted:active, +.datepicker table tr td.selected.active, +.datepicker table tr td.selected.highlighted.active, +.open > .dropdown-toggle.datepicker table tr td.selected, +.open > .dropdown-toggle.datepicker table tr td.selected.highlighted { + color: #ffffff; + background-color: #808080; + border-color: #373737; +} +.datepicker table tr td.selected:active:hover, +.datepicker table tr td.selected.highlighted:active:hover, +.datepicker table tr td.selected.active:hover, +.datepicker table tr td.selected.highlighted.active:hover, +.open > .dropdown-toggle.datepicker table tr td.selected:hover, +.open > .dropdown-toggle.datepicker table tr td.selected.highlighted:hover, +.datepicker table tr td.selected:active:focus, +.datepicker table tr td.selected.highlighted:active:focus, +.datepicker table tr td.selected.active:focus, +.datepicker table tr td.selected.highlighted.active:focus, +.open > .dropdown-toggle.datepicker table tr td.selected:focus, +.open > .dropdown-toggle.datepicker table tr td.selected.highlighted:focus, +.datepicker table tr td.selected:active.focus, +.datepicker table tr td.selected.highlighted:active.focus, +.datepicker table tr td.selected.active.focus, +.datepicker table tr td.selected.highlighted.active.focus, +.open > .dropdown-toggle.datepicker table tr td.selected.focus, +.open > .dropdown-toggle.datepicker table tr td.selected.highlighted.focus { + color: #ffffff; + background-color: #6e6e6e; + border-color: #161616; +} +.datepicker table tr td.selected:active, +.datepicker table tr td.selected.highlighted:active, +.datepicker table tr td.selected.active, +.datepicker table tr td.selected.highlighted.active, +.open > .dropdown-toggle.datepicker table tr td.selected, +.open > .dropdown-toggle.datepicker table tr td.selected.highlighted { + background-image: none; +} +.datepicker table tr td.selected.disabled:hover, +.datepicker table tr td.selected.highlighted.disabled:hover, +.datepicker table tr td.selected[disabled]:hover, +.datepicker table tr td.selected.highlighted[disabled]:hover, +fieldset[disabled] .datepicker table tr td.selected:hover, +fieldset[disabled] .datepicker table tr td.selected.highlighted:hover, +.datepicker table tr td.selected.disabled:focus, +.datepicker table tr td.selected.highlighted.disabled:focus, +.datepicker table tr td.selected[disabled]:focus, +.datepicker table tr td.selected.highlighted[disabled]:focus, +fieldset[disabled] .datepicker table tr td.selected:focus, +fieldset[disabled] .datepicker table tr td.selected.highlighted:focus, +.datepicker table tr td.selected.disabled.focus, +.datepicker table tr td.selected.highlighted.disabled.focus, +.datepicker table tr td.selected[disabled].focus, +.datepicker table tr td.selected.highlighted[disabled].focus, +fieldset[disabled] .datepicker table tr td.selected.focus, +fieldset[disabled] .datepicker table tr td.selected.highlighted.focus { + background-color: #999999; + border-color: #555555; +} +.datepicker table tr td.active, +.datepicker table tr td.active.highlighted { + color: #ffffff; + background-color: #428bca; + border-color: #357ebd; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker table tr td.active:focus, +.datepicker table tr td.active.highlighted:focus, +.datepicker table tr td.active.focus, +.datepicker table tr td.active.highlighted.focus { + color: #ffffff; + background-color: #3071a9; + border-color: #193c5a; +} +.datepicker table tr td.active:hover, +.datepicker table tr td.active.highlighted:hover { + color: #ffffff; + background-color: #3071a9; + border-color: #285e8e; +} +.datepicker table tr td.active:active, +.datepicker table tr td.active.highlighted:active, +.datepicker table tr td.active.active, +.datepicker table tr td.active.highlighted.active, +.open > .dropdown-toggle.datepicker table tr td.active, +.open > .dropdown-toggle.datepicker table tr td.active.highlighted { + color: #ffffff; + background-color: #3071a9; + border-color: #285e8e; +} +.datepicker table tr td.active:active:hover, +.datepicker table tr td.active.highlighted:active:hover, +.datepicker table tr td.active.active:hover, +.datepicker table tr td.active.highlighted.active:hover, +.open > .dropdown-toggle.datepicker table tr td.active:hover, +.open > .dropdown-toggle.datepicker table tr td.active.highlighted:hover, +.datepicker table tr td.active:active:focus, +.datepicker table tr td.active.highlighted:active:focus, +.datepicker table tr td.active.active:focus, +.datepicker table tr td.active.highlighted.active:focus, +.open > .dropdown-toggle.datepicker table tr td.active:focus, +.open > .dropdown-toggle.datepicker table tr td.active.highlighted:focus, +.datepicker table tr td.active:active.focus, +.datepicker table tr td.active.highlighted:active.focus, +.datepicker table tr td.active.active.focus, +.datepicker table tr td.active.highlighted.active.focus, +.open > .dropdown-toggle.datepicker table tr td.active.focus, +.open > .dropdown-toggle.datepicker table tr td.active.highlighted.focus { + color: #ffffff; + background-color: #285e8e; + border-color: #193c5a; +} +.datepicker table tr td.active:active, +.datepicker table tr td.active.highlighted:active, +.datepicker table tr td.active.active, +.datepicker table tr td.active.highlighted.active, +.open > .dropdown-toggle.datepicker table tr td.active, +.open > .dropdown-toggle.datepicker table tr td.active.highlighted { + background-image: none; +} +.datepicker table tr td.active.disabled:hover, +.datepicker table tr td.active.highlighted.disabled:hover, +.datepicker table tr td.active[disabled]:hover, +.datepicker table tr td.active.highlighted[disabled]:hover, +fieldset[disabled] .datepicker table tr td.active:hover, +fieldset[disabled] .datepicker table tr td.active.highlighted:hover, +.datepicker table tr td.active.disabled:focus, +.datepicker table tr td.active.highlighted.disabled:focus, +.datepicker table tr td.active[disabled]:focus, +.datepicker table tr td.active.highlighted[disabled]:focus, +fieldset[disabled] .datepicker table tr td.active:focus, +fieldset[disabled] .datepicker table tr td.active.highlighted:focus, +.datepicker table tr td.active.disabled.focus, +.datepicker table tr td.active.highlighted.disabled.focus, +.datepicker table tr td.active[disabled].focus, +.datepicker table tr td.active.highlighted[disabled].focus, +fieldset[disabled] .datepicker table tr td.active.focus, +fieldset[disabled] .datepicker table tr td.active.highlighted.focus { + background-color: #428bca; + border-color: #357ebd; +} +.datepicker table tr td span { + display: block; + width: 23%; + height: 54px; + line-height: 54px; + float: left; + margin: 1%; + cursor: pointer; + border-radius: 4px; +} +.datepicker table tr td span:hover { + background: #eeeeee; +} +.datepicker table tr td span.disabled, +.datepicker table tr td span.disabled:hover { + background: none; + color: #999999; + cursor: default; +} +.datepicker table tr td span.active, +.datepicker table tr td span.active:hover, +.datepicker table tr td span.active.disabled, +.datepicker table tr td span.active.disabled:hover { + color: #ffffff; + background-color: #428bca; + border-color: #357ebd; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker table tr td span.active:focus, +.datepicker table tr td span.active:hover:focus, +.datepicker table tr td span.active.disabled:focus, +.datepicker table tr td span.active.disabled:hover:focus, +.datepicker table tr td span.active.focus, +.datepicker table tr td span.active:hover.focus, +.datepicker table tr td span.active.disabled.focus, +.datepicker table tr td span.active.disabled:hover.focus { + color: #ffffff; + background-color: #3071a9; + border-color: #193c5a; +} +.datepicker table tr td span.active:hover, +.datepicker table tr td span.active:hover:hover, +.datepicker table tr td span.active.disabled:hover, +.datepicker table tr td span.active.disabled:hover:hover { + color: #ffffff; + background-color: #3071a9; + border-color: #285e8e; +} +.datepicker table tr td span.active:active, +.datepicker table tr td span.active:hover:active, +.datepicker table tr td span.active.disabled:active, +.datepicker table tr td span.active.disabled:hover:active, +.datepicker table tr td span.active.active, +.datepicker table tr td span.active:hover.active, +.datepicker table tr td span.active.disabled.active, +.datepicker table tr td span.active.disabled:hover.active, +.open > .dropdown-toggle.datepicker table tr td span.active, +.open > .dropdown-toggle.datepicker table tr td span.active:hover, +.open > .dropdown-toggle.datepicker table tr td span.active.disabled, +.open > .dropdown-toggle.datepicker table tr td span.active.disabled:hover { + color: #ffffff; + background-color: #3071a9; + border-color: #285e8e; +} +.datepicker table tr td span.active:active:hover, +.datepicker table tr td span.active:hover:active:hover, +.datepicker table tr td span.active.disabled:active:hover, +.datepicker table tr td span.active.disabled:hover:active:hover, +.datepicker table tr td span.active.active:hover, +.datepicker table tr td span.active:hover.active:hover, +.datepicker table tr td span.active.disabled.active:hover, +.datepicker table tr td span.active.disabled:hover.active:hover, +.open > .dropdown-toggle.datepicker table tr td span.active:hover, +.open > .dropdown-toggle.datepicker table tr td span.active:hover:hover, +.open > .dropdown-toggle.datepicker table tr td span.active.disabled:hover, +.open > .dropdown-toggle.datepicker table tr td span.active.disabled:hover:hover, +.datepicker table tr td span.active:active:focus, +.datepicker table tr td span.active:hover:active:focus, +.datepicker table tr td span.active.disabled:active:focus, +.datepicker table tr td span.active.disabled:hover:active:focus, +.datepicker table tr td span.active.active:focus, +.datepicker table tr td span.active:hover.active:focus, +.datepicker table tr td span.active.disabled.active:focus, +.datepicker table tr td span.active.disabled:hover.active:focus, +.open > .dropdown-toggle.datepicker table tr td span.active:focus, +.open > .dropdown-toggle.datepicker table tr td span.active:hover:focus, +.open > .dropdown-toggle.datepicker table tr td span.active.disabled:focus, +.open > .dropdown-toggle.datepicker table tr td span.active.disabled:hover:focus, +.datepicker table tr td span.active:active.focus, +.datepicker table tr td span.active:hover:active.focus, +.datepicker table tr td span.active.disabled:active.focus, +.datepicker table tr td span.active.disabled:hover:active.focus, +.datepicker table tr td span.active.active.focus, +.datepicker table tr td span.active:hover.active.focus, +.datepicker table tr td span.active.disabled.active.focus, +.datepicker table tr td span.active.disabled:hover.active.focus, +.open > .dropdown-toggle.datepicker table tr td span.active.focus, +.open > .dropdown-toggle.datepicker table tr td span.active:hover.focus, +.open > .dropdown-toggle.datepicker table tr td span.active.disabled.focus, +.open > .dropdown-toggle.datepicker table tr td span.active.disabled:hover.focus { + color: #ffffff; + background-color: #285e8e; + border-color: #193c5a; +} +.datepicker table tr td span.active:active, +.datepicker table tr td span.active:hover:active, +.datepicker table tr td span.active.disabled:active, +.datepicker table tr td span.active.disabled:hover:active, +.datepicker table tr td span.active.active, +.datepicker table tr td span.active:hover.active, +.datepicker table tr td span.active.disabled.active, +.datepicker table tr td span.active.disabled:hover.active, +.open > .dropdown-toggle.datepicker table tr td span.active, +.open > .dropdown-toggle.datepicker table tr td span.active:hover, +.open > .dropdown-toggle.datepicker table tr td span.active.disabled, +.open > .dropdown-toggle.datepicker table tr td span.active.disabled:hover { + background-image: none; +} +.datepicker table tr td span.active.disabled:hover, +.datepicker table tr td span.active:hover.disabled:hover, +.datepicker table tr td span.active.disabled.disabled:hover, +.datepicker table tr td span.active.disabled:hover.disabled:hover, +.datepicker table tr td span.active[disabled]:hover, +.datepicker table tr td span.active:hover[disabled]:hover, +.datepicker table tr td span.active.disabled[disabled]:hover, +.datepicker table tr td span.active.disabled:hover[disabled]:hover, +fieldset[disabled] .datepicker table tr td span.active:hover, +fieldset[disabled] .datepicker table tr td span.active:hover:hover, +fieldset[disabled] .datepicker table tr td span.active.disabled:hover, +fieldset[disabled] .datepicker table tr td span.active.disabled:hover:hover, +.datepicker table tr td span.active.disabled:focus, +.datepicker table tr td span.active:hover.disabled:focus, +.datepicker table tr td span.active.disabled.disabled:focus, +.datepicker table tr td span.active.disabled:hover.disabled:focus, +.datepicker table tr td span.active[disabled]:focus, +.datepicker table tr td span.active:hover[disabled]:focus, +.datepicker table tr td span.active.disabled[disabled]:focus, +.datepicker table tr td span.active.disabled:hover[disabled]:focus, +fieldset[disabled] .datepicker table tr td span.active:focus, +fieldset[disabled] .datepicker table tr td span.active:hover:focus, +fieldset[disabled] .datepicker table tr td span.active.disabled:focus, +fieldset[disabled] .datepicker table tr td span.active.disabled:hover:focus, +.datepicker table tr td span.active.disabled.focus, +.datepicker table tr td span.active:hover.disabled.focus, +.datepicker table tr td span.active.disabled.disabled.focus, +.datepicker table tr td span.active.disabled:hover.disabled.focus, +.datepicker table tr td span.active[disabled].focus, +.datepicker table tr td span.active:hover[disabled].focus, +.datepicker table tr td span.active.disabled[disabled].focus, +.datepicker table tr td span.active.disabled:hover[disabled].focus, +fieldset[disabled] .datepicker table tr td span.active.focus, +fieldset[disabled] .datepicker table tr td span.active:hover.focus, +fieldset[disabled] .datepicker table tr td span.active.disabled.focus, +fieldset[disabled] .datepicker table tr td span.active.disabled:hover.focus { + background-color: #428bca; + border-color: #357ebd; +} +.datepicker table tr td span.old, +.datepicker table tr td span.new { + color: #999999; +} +.datepicker .datepicker-switch { + width: 145px; +} +.datepicker .datepicker-switch, +.datepicker .prev, +.datepicker .next, +.datepicker tfoot tr th { + cursor: pointer; +} +.datepicker .datepicker-switch:hover, +.datepicker .prev:hover, +.datepicker .next:hover, +.datepicker tfoot tr th:hover { + background: #eeeeee; +} +.datepicker .cw { + font-size: 10px; + width: 12px; + padding: 0 2px 0 5px; + vertical-align: middle; +} +.input-group.date .input-group-addon { + cursor: pointer; +} +.input-daterange { + width: 100%; +} +.input-daterange input { + text-align: center; +} +.input-daterange input:first-child { + border-radius: 3px 0 0 3px; +} +.input-daterange input:last-child { + border-radius: 0 3px 3px 0; +} +.input-daterange .input-group-addon { + width: auto; + min-width: 16px; + padding: 4px 5px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + text-shadow: 0 1px 0 #fff; + vertical-align: middle; + background-color: #eeeeee; + border: solid #cccccc; + border-width: 1px 0; + margin-left: -5px; + margin-right: -5px; +} From d4497d7aeb968dbb9f8c4b84fbcc0f7cc3668167 Mon Sep 17 00:00:00 2001 From: shoetten Date: Fri, 5 Feb 2016 20:23:09 +0100 Subject: [PATCH 054/136] Add basic start and due dates for cards. --- client/components/cards/cardDate.jade | 20 +++ client/components/cards/cardDate.js | 193 +++++++++++++++++++++++ client/components/cards/cardDate.styl | 50 ++++++ client/components/cards/cardDetails.jade | 13 ++ client/components/cards/cardDetails.js | 2 + client/components/cards/cardDetails.styl | 7 +- i18n/en.i18n.json | 6 + 7 files changed, 290 insertions(+), 1 deletion(-) create mode 100644 client/components/cards/cardDate.jade create mode 100644 client/components/cards/cardDate.js create mode 100644 client/components/cards/cardDate.styl diff --git a/client/components/cards/cardDate.jade b/client/components/cards/cardDate.jade new file mode 100644 index 000000000..ca0748796 --- /dev/null +++ b/client/components/cards/cardDate.jade @@ -0,0 +1,20 @@ +template(name="editCardDate") + .edit-card-date + form.edit-date + .fields + .left + label(for="date") {{_ 'date'}} + input.js-date-field#date(type="text" name="date" value=showDate placeholder=dateFormat autofocus) + .right + label(for="time") {{_ 'time'}} + input.js-time-field#time(type="text" name="time" value=showTime placeholder=timeFormat) + .js-datepicker + if error.get + .warning {{_ error.get}} + button.primary.wide.left.js-submit-date(type="submit") {{_ 'save'}} + button.js-delete-date.negate.wide.right.js-delete-date {{_ 'delete'}} + +template(name="dateBadge") + a.js-edit-date.card-date(title="{{showTitle}}") + time(datetime="{{showISODate}}") + | {{showDate}} diff --git a/client/components/cards/cardDate.js b/client/components/cards/cardDate.js new file mode 100644 index 000000000..4a24941d3 --- /dev/null +++ b/client/components/cards/cardDate.js @@ -0,0 +1,193 @@ +// Edit start & due dates +const EditCardDate = BlazeComponent.extendComponent({ + template() { + return 'editCardDate'; + }, + + onCreated() { + this.error = new ReactiveVar(''); + this.card = this.data(); + this.date = new ReactiveVar(moment.invalid()); + }, + + onRendered() { + let $picker = this.$('.js-datepicker').datepicker({ + todayHighlight: true, + todayBtn: 'linked', + language: TAPi18n.getLanguage() + }).on('changeDate', function(e) { + const localDate = moment(e.date).format('L'); + date.value = localDate; + this.error.set(''); + time.focus(); + }.bind(this)); + + if (this.date.get().isValid()) { + $picker.datepicker('update', this.date.get().toDate()); + } + }, + + showDate() { + if (this.date.get().isValid()) + return this.date.get().format('L'); + }, + showTime() { + if (this.date.get().isValid()) + return this.date.get().format('LT'); + }, + dateFormat() { + return moment.localeData().longDateFormat('L'); + }, + timeFormat() { + return moment.localeData().longDateFormat('LT'); + }, + + events() { + return [{ + 'keyup .js-date-field'(evt) { + // parse for localized date format in strict mode + const dateMoment = moment(date.value, 'L', true); + if (dateMoment.isValid()) { + this.error.set(''); + this.$('.js-datepicker').datepicker('update', dateMoment.toDate()); + } + }, + 'keyup .js-time-field'(evt) { + // parse for localized time format in strict mode + const dateMoment = moment(time.value, 'LT', true); + if (dateMoment.isValid()) { + this.error.set(''); + } + }, + 'submit .edit-date'(evt) { + evt.preventDefault(); + + // if no time was given, init with 12:00 + var time = evt.target.time.value || moment(new Date().setHours(12,0,0)).format('LT'); + + const dateString = evt.target.date.value + ' ' + time; + const newDate = moment.utc(dateString, 'L LT', true); + if (newDate.isValid()) { + this._storeDate(newDate.toDate()); + Popup.close(); + } + else { + this.error.set('invalid-date'); + evt.target.date.focus(); + } + }, + 'click .js-delete-date'(evt) { + evt.preventDefault(); + this._deleteDate(); + Popup.close(); + }, + }]; + }, +}); + +// editCardStartDatePopup +(class extends EditCardDate { + onCreated() { + super(); + if (this.data().startAt) { + this.date.set(moment.utc(this.data().startAt)); + } + } + + _storeDate(date) { + this.card.setStart(date); + } + + _deleteDate() { + this.card.unsetStart(); + } +}).register('editCardStartDatePopup'); + +// editCardDueDatePopup +(class extends EditCardDate { + onCreated() { + super(); + if (this.data().dueAt !== undefined) { + this.date.set(moment.utc(this.data().dueAt)); + } + } + + onRendered() { + super(); + if (moment.isDate(this.card.startAt)) { + this.$('.js-datepicker').datepicker('setStartDate', this.card.startAt); + } + } + + _storeDate(date) { + this.card.setDue(date); + } + + _deleteDate() { + this.card.unsetDue(); + } +}).register('editCardDueDatePopup'); + + + +// Display start & due dates +const CardDate = BlazeComponent.extendComponent({ + template() { + return 'dateBadge'; + }, + + onCreated() { + this.date = ReactiveVar(); + }, + + showDate() { + // this will start working once mquandalle:moment + // is updated to at least moment.js 2.10.5 + // until then, the date is displayed in the "L" format + return this.date.get().calendar(null, { + sameElse: 'llll' + }); + }, + + showTitle() { + return this.date.get().format('LLLL'); + }, + + showISODate() { + return this.date.get().toISOString(); + }, +}); + +// cardStartDate +(class extends CardDate { + onCreated() { + super(); + let self = this; + this.autorun(() => { + self.date.set(moment.utc(this.data().startAt)); + }); + } + + events() { + return super.events().concat({ + 'click .js-edit-date': Popup.open('editCardStartDate'), + }); + } +}).register('cardStartDate'); + +// cardDueDate +(class extends CardDate { + onCreated() { + super(); + let self = this; + this.autorun(() => { + self.date.set(moment.utc(this.data().dueAt)); + }); + } + + events() { + return super.events().concat({ + 'click .js-edit-date': Popup.open('editCardDueDate'), + }); + } +}).register('cardDueDate'); diff --git a/client/components/cards/cardDate.styl b/client/components/cards/cardDate.styl new file mode 100644 index 000000000..e9d56f792 --- /dev/null +++ b/client/components/cards/cardDate.styl @@ -0,0 +1,50 @@ +.edit-card-date + .fields + .left + width: 56% + .right + width: 38% + .datepicker + width: 100% + table + width: 100% + border: none + border-spacing: 0 + border-collapse: collapse + thead + background: none + td, th + box-sizing: border-box + + +.card-date + display: block + border-radius: 4px + padding: 1px 3px; + + background-color: #dbdbdb + &:hover, &.is-active + background-color: #b3b3b3 + + &.current + background-color: #42ca00 + &:hover, &.is-active + background-color: darken(#42ca00, 15) + + &.almost-due + background-color: #fad900 + &:hover, &.is-active + background-color: darken(#fad900, 15) + + &.due + background-color: #fa3f00 + &:hover, &.is-active + background-color: darken(#fa3f00, 15) + + time + &::before + font: normal normal normal 14px/1 FontAwesome + font-size: inherit + -webkit-font-smoothing: antialiased + content: "\f017" // clock symbol + margin-right: 0.3em \ No newline at end of file diff --git a/client/components/cards/cardDetails.jade b/client/components/cards/cardDetails.jade index 734fc7e37..69725d760 100644 --- a/client/components/cards/cardDetails.jade +++ b/client/components/cards/cardDetails.jade @@ -35,6 +35,17 @@ template(name="cardDetails") a.card-label.add-label.js-add-labels(title="{{_ 'card-labels-title'}}") i.fa.fa-plus + if startAt + .card-details-item.card-details-item-start + h3.card-details-item-title {{_ 'start-at'}} + +cardStartDate + + if dueAt + .card-details-item.card-details-item-due + h3.card-details-item-title {{_ 'due-at'}} + +cardDueDate + + //- XXX We should use "editable" to avoid repetiting ourselves if currentUser.isBoardMember h3.card-details-item-title {{_ 'description'}} @@ -91,6 +102,8 @@ template(name="cardDetailsActionsPopup") li: a.js-members {{_ 'card-edit-members'}} li: a.js-labels {{_ 'card-edit-labels'}} li: a.js-attachments {{_ 'card-edit-attachments'}} + li: a.js-start-date {{_ 'editCardStartDatePopup-title'}} + li: a.js-due-date {{_ 'editCardDueDatePopup-title'}} hr ul.pop-over-list li: a.js-move-card-to-top {{_ 'moveCardToTop-title'}} diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index b6f17c239..329809262 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -143,6 +143,8 @@ Template.cardDetailsActionsPopup.events({ 'click .js-members': Popup.open('cardMembers'), 'click .js-labels': Popup.open('cardLabels'), 'click .js-attachments': Popup.open('cardAttachments'), + 'click .js-start-date': Popup.open('editCardStartDate'), + 'click .js-due-date': Popup.open('editCardDueDate'), 'click .js-move-card': Popup.open('moveCard'), 'click .js-move-card-to-top'(evt) { evt.preventDefault(); diff --git a/client/components/cards/cardDetails.styl b/client/components/cards/cardDetails.styl index d7d295519..f209862c9 100644 --- a/client/components/cards/cardDetails.styl +++ b/client/components/cards/cardDetails.styl @@ -73,8 +73,13 @@ margin: 15px 0 .card-details-item + margin-right: 0.5em + &:last-child + margin-right: 0 &.card-details-item-labels, - &.card-details-item-members + &.card-details-item-members, + &.card-details-item-start, + &.card-details-item-due width: 50% flex-shrink: 1 diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index 6e2098c4f..fc7ae24bc 100755 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -133,6 +133,7 @@ "createBoardPopup-title": "Create Board", "createLabelPopup-title": "Create Label", "current": "current", + "date": "Date", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -143,9 +144,12 @@ "discard": "Discard", "done": "Done", "download": "Download", + "due-at": "Due", "edit": "Edit", "edit-avatar": "Change Avatar", "edit-profile": "Edit Profile", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", "editLabelPopup-title": "Change Label", "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", @@ -282,10 +286,12 @@ "star-board-title": "Click to star this board. It will show up at top of your boards list.", "starred-boards": "Starred Boards", "starred-boards-description": "Starred boards show up at the top of your boards list.", + "start-at": "Start", "subscribe": "Subscribe", "team": "Team", "this-board": "this board", "this-card": "this card", + "time": "Time", "title": "Title", "tracking": "Tracking", "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", From 7b5d08afd143baa835ecc40eab115d353e5d87dd Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Mon, 21 Nov 2016 22:49:53 -0500 Subject: [PATCH 055/136] fix bug where old users could see broken presence indicators on new users --- server/publications/boards.js | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/server/publications/boards.js b/server/publications/boards.js index cd3ef2383..fd3525520 100644 --- a/server/publications/boards.js +++ b/server/publications/boards.js @@ -99,20 +99,21 @@ Meteor.publishRelations('board', function(boardId) { this.cursor(Attachments.find({ cardId })); }); - // Board members. This publication also includes former board members that - // aren't members anymore but may have some activities attached to them in - // the history. - // - this.cursor(Users.find({ - _id: { $in: _.pluck(board.members, 'userId') }, - }, { fields: { - 'username': 1, - 'profile.fullname': 1, - 'profile.avatarUrl': 1, - }}), function(userId) { - // Presence indicators - this.cursor(presences.find({ userId })); - }); + if (board.members) { + // Board members. This publication also includes former board members that + // aren't members anymore but may have some activities attached to them in + // the history. + this.cursor(Users.find({ + _id: { $in: _.pluck(board.members, 'userId') }, + }, { fields: { + 'username': 1, + 'profile.fullname': 1, + 'profile.avatarUrl': 1, + }}), function(userId) { + // Presence indicators + this.cursor(presences.find({ userId })); + }); + } }); return this.ready(); From be47357cd4c88072c5ab5ebdfb790d06d92691ae Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Tue, 22 Nov 2016 10:34:31 -0500 Subject: [PATCH 056/136] don't chain the presences cursor on the users cursor --- server/publications/boards.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/server/publications/boards.js b/server/publications/boards.js index fd3525520..896819787 100644 --- a/server/publications/boards.js +++ b/server/publications/boards.js @@ -60,6 +60,7 @@ Meteor.publish('archivedBoards', function() { Meteor.publishRelations('board', function(boardId) { check(boardId, String); + const thisUserId = this.userId; this.cursor(Boards.find({ _id: boardId, @@ -103,16 +104,20 @@ Meteor.publishRelations('board', function(boardId) { // Board members. This publication also includes former board members that // aren't members anymore but may have some activities attached to them in // the history. + const memberIds = _.pluck(board.members, 'userId'); + + // We omit the current user because the client should already have that data, + // and sending it triggers a subtle bug: + // https://github.com/wefork/wekan/issues/15 this.cursor(Users.find({ - _id: { $in: _.pluck(board.members, 'userId') }, + _id: { $in: _.without(memberIds, thisUserId)}, }, { fields: { 'username': 1, 'profile.fullname': 1, 'profile.avatarUrl': 1, - }}), function(userId) { - // Presence indicators - this.cursor(presences.find({ userId })); - }); + }})); + + this.cursor(presences.find({ userId: { $in: memberIds } })); } }); From 80b93ce7117326464b55a76a9efbeeff36f28248 Mon Sep 17 00:00:00 2001 From: shoetten Date: Fri, 5 Feb 2016 21:01:43 +0100 Subject: [PATCH 057/136] Display start and due dates in minicards. --- client/components/cards/cardDate.js | 24 ++++++++++++++++++------ client/components/cards/minicard.jade | 6 ++++++ client/components/cards/minicard.styl | 5 ++++- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/client/components/cards/cardDate.js b/client/components/cards/cardDate.js index 4a24941d3..4152d6181 100644 --- a/client/components/cards/cardDate.js +++ b/client/components/cards/cardDate.js @@ -158,8 +158,7 @@ const CardDate = BlazeComponent.extendComponent({ }, }); -// cardStartDate -(class extends CardDate { +class CardStartDate extends CardDate { onCreated() { super(); let self = this; @@ -173,10 +172,10 @@ const CardDate = BlazeComponent.extendComponent({ 'click .js-edit-date': Popup.open('editCardStartDate'), }); } -}).register('cardStartDate'); +} +CardStartDate.register('cardStartDate'); -// cardDueDate -(class extends CardDate { +class CardDueDate extends CardDate { onCreated() { super(); let self = this; @@ -190,4 +189,17 @@ const CardDate = BlazeComponent.extendComponent({ 'click .js-edit-date': Popup.open('editCardDueDate'), }); } -}).register('cardDueDate'); +} +CardDueDate.register('cardDueDate'); + +(class extends CardStartDate { + showDate() { + return this.date.get().format('l'); + } +}).register('minicardStartDate'); + +(class extends CardDueDate { + showDate() { + return this.date.get().format('l'); + } +}).register('minicardDueDate'); diff --git a/client/components/cards/minicard.jade b/client/components/cards/minicard.jade index 1dfd2f8e3..edc7d2d39 100644 --- a/client/components/cards/minicard.jade +++ b/client/components/cards/minicard.jade @@ -23,3 +23,9 @@ template(name="minicard") .badge span.badge-icon.fa.fa-paperclip span.badge-text= attachments.count + if startAt + .badge + +minicardStartDate + if dueAt + .badge + +minicardDueDate diff --git a/client/components/cards/minicard.styl b/client/components/cards/minicard.styl index 0f6f8ad27..a61f60675 100644 --- a/client/components/cards/minicard.styl +++ b/client/components/cards/minicard.styl @@ -91,10 +91,13 @@ margin-right: 11px margin-bottom: 3px font-size: 0.9em + + &:last-of-type + margin-right: 0 .badge-icon, .badge-text - vertical-align: top + vertical-align: middle .badge-text font-size: 0.9em From 5dd554b99960ebd3ac599fa5afc52838c8b7155f Mon Sep 17 00:00:00 2001 From: shoetten Date: Fri, 5 Feb 2016 22:35:56 +0100 Subject: [PATCH 058/136] Color highlight start and due dates with correct timezone handling. --- client/components/cards/cardDate.jade | 2 +- client/components/cards/cardDate.js | 41 ++++++++++++++++++--------- client/components/cards/cardDate.styl | 12 ++++++-- 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/client/components/cards/cardDate.jade b/client/components/cards/cardDate.jade index ca0748796..a2a28bbd6 100644 --- a/client/components/cards/cardDate.jade +++ b/client/components/cards/cardDate.jade @@ -15,6 +15,6 @@ template(name="editCardDate") button.js-delete-date.negate.wide.right.js-delete-date {{_ 'delete'}} template(name="dateBadge") - a.js-edit-date.card-date(title="{{showTitle}}") + a.js-edit-date.card-date(title="{{showTitle}}" class="{{classes}}") time(datetime="{{showISODate}}") | {{showDate}} diff --git a/client/components/cards/cardDate.js b/client/components/cards/cardDate.js index 4152d6181..6bdfaa1bc 100644 --- a/client/components/cards/cardDate.js +++ b/client/components/cards/cardDate.js @@ -16,8 +16,7 @@ const EditCardDate = BlazeComponent.extendComponent({ todayBtn: 'linked', language: TAPi18n.getLanguage() }).on('changeDate', function(e) { - const localDate = moment(e.date).format('L'); - date.value = localDate; + date.value = moment(e.date).format('L'); this.error.set(''); time.focus(); }.bind(this)); @@ -66,7 +65,7 @@ const EditCardDate = BlazeComponent.extendComponent({ var time = evt.target.time.value || moment(new Date().setHours(12,0,0)).format('LT'); const dateString = evt.target.date.value + ' ' + time; - const newDate = moment.utc(dateString, 'L LT', true); + const newDate = moment(dateString, 'L LT', true); if (newDate.isValid()) { this._storeDate(newDate.toDate()); Popup.close(); @@ -89,9 +88,7 @@ const EditCardDate = BlazeComponent.extendComponent({ (class extends EditCardDate { onCreated() { super(); - if (this.data().startAt) { - this.date.set(moment.utc(this.data().startAt)); - } + this.data().startAt && this.date.set(moment(this.data().startAt)); } _storeDate(date) { @@ -107,9 +104,7 @@ const EditCardDate = BlazeComponent.extendComponent({ (class extends EditCardDate { onCreated() { super(); - if (this.data().dueAt !== undefined) { - this.date.set(moment.utc(this.data().dueAt)); - } + this.data().dueAt && this.date.set(moment(this.data().dueAt)); } onRendered() { @@ -129,7 +124,6 @@ const EditCardDate = BlazeComponent.extendComponent({ }).register('editCardDueDatePopup'); - // Display start & due dates const CardDate = BlazeComponent.extendComponent({ template() { @@ -137,7 +131,12 @@ const CardDate = BlazeComponent.extendComponent({ }, onCreated() { - this.date = ReactiveVar(); + let self = this; + self.date = ReactiveVar(); + self.now = ReactiveVar(moment()); + Meteor.setInterval(() => { + self.now.set(moment()); + }, 60000); }, showDate() { @@ -163,10 +162,17 @@ class CardStartDate extends CardDate { super(); let self = this; this.autorun(() => { - self.date.set(moment.utc(this.data().startAt)); + self.date.set(moment(this.data().startAt)); }); } + classes() { + if (this.date.get().isBefore(this.now.get(), 'minute') && + this.now.get().isBefore(this.data().dueAt)) { + return 'current'; + } + } + events() { return super.events().concat({ 'click .js-edit-date': Popup.open('editCardStartDate'), @@ -180,10 +186,19 @@ class CardDueDate extends CardDate { super(); let self = this; this.autorun(() => { - self.date.set(moment.utc(this.data().dueAt)); + self.date.set(moment(this.data().dueAt)); }); } + classes() { + if (this.now.get().diff(this.date.get(), 'days') >= 2) + return 'long-overdue'; + else if (this.now.get().diff(this.date.get(), 'minute') >= 0) + return 'due'; + else if (this.now.get().diff(this.date.get(), 'days') >= -1) + return 'almost-due'; + } + events() { return super.events().concat({ 'click .js-edit-date': Popup.open('editCardDueDate'), diff --git a/client/components/cards/cardDate.styl b/client/components/cards/cardDate.styl index e9d56f792..ab1822075 100644 --- a/client/components/cards/cardDate.styl +++ b/client/components/cards/cardDate.styl @@ -26,20 +26,28 @@ &:hover, &.is-active background-color: #b3b3b3 + &.current, &.almost-due, &.due, &.long-overdue + color: #fff + &.current background-color: #42ca00 &:hover, &.is-active background-color: darken(#42ca00, 15) &.almost-due - background-color: #fad900 + background-color: #edc909 &:hover, &.is-active - background-color: darken(#fad900, 15) + background-color: darken(#edc909, 10) &.due background-color: #fa3f00 &:hover, &.is-active background-color: darken(#fa3f00, 15) + + &.long-overdue + background-color: #fd5d47 + &:hover, &.is-active + background-color: darken(#fd5d47, 7) time &::before From aa5ed6e48466b2ed3dc83696a6e18d7997b1c01e Mon Sep 17 00:00:00 2001 From: shoetten Date: Wed, 10 Feb 2016 15:51:55 +0100 Subject: [PATCH 059/136] Update translations and title of date badges. --- client/components/cards/cardDate.js | 12 ++++++++---- client/components/cards/cardDate.styl | 6 +++--- client/components/cards/cardDetails.jade | 4 ++-- i18n/en.i18n.json | 7 +++++-- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/client/components/cards/cardDate.js b/client/components/cards/cardDate.js index 6bdfaa1bc..10bc54ffa 100644 --- a/client/components/cards/cardDate.js +++ b/client/components/cards/cardDate.js @@ -148,10 +148,6 @@ const CardDate = BlazeComponent.extendComponent({ }); }, - showTitle() { - return this.date.get().format('LLLL'); - }, - showISODate() { return this.date.get().toISOString(); }, @@ -173,6 +169,10 @@ class CardStartDate extends CardDate { } } + showTitle() { + return TAPi18n.__('card-start-on') + ' ' + this.date.get().format('LLLL'); + } + events() { return super.events().concat({ 'click .js-edit-date': Popup.open('editCardStartDate'), @@ -199,6 +199,10 @@ class CardDueDate extends CardDate { return 'almost-due'; } + showTitle() { + return TAPi18n.__('card-due-on') + ' ' + this.date.get().format('LLLL'); + } + events() { return super.events().concat({ 'click .js-edit-date': Popup.open('editCardDueDate'), diff --git a/client/components/cards/cardDate.styl b/client/components/cards/cardDate.styl index ab1822075..51acdaab4 100644 --- a/client/components/cards/cardDate.styl +++ b/client/components/cards/cardDate.styl @@ -30,9 +30,9 @@ color: #fff &.current - background-color: #42ca00 + background-color: #5ba639 &:hover, &.is-active - background-color: darken(#42ca00, 15) + background-color: darken(#5ba639, 10) &.almost-due background-color: #edc909 @@ -42,7 +42,7 @@ &.due background-color: #fa3f00 &:hover, &.is-active - background-color: darken(#fa3f00, 15) + background-color: darken(#fa3f00, 10) &.long-overdue background-color: #fd5d47 diff --git a/client/components/cards/cardDetails.jade b/client/components/cards/cardDetails.jade index 69725d760..f4212d838 100644 --- a/client/components/cards/cardDetails.jade +++ b/client/components/cards/cardDetails.jade @@ -37,12 +37,12 @@ template(name="cardDetails") if startAt .card-details-item.card-details-item-start - h3.card-details-item-title {{_ 'start-at'}} + h3.card-details-item-title {{_ 'card-start'}} +cardStartDate if dueAt .card-details-item.card-details-item-due - h3.card-details-item-title {{_ 'due-at'}} + h3.card-details-item-title {{_ 'card-due'}} +cardDueDate diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index fc7ae24bc..83ff2975c 100755 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -88,11 +88,15 @@ "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.", + "card-due": "Due", + "card-due-on": "Due on", "card-edit-attachments": "Edit attachments", "card-edit-labels": "Edit labels", "card-edit-members": "Edit members", "card-labels-title": "Change the labels for the card.", "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", "cardAttachmentsPopup-title": "Attach From", "cardDeletePopup-title": "Delete Card?", "cardDetailsActionsPopup-title": "Card Actions", @@ -144,7 +148,6 @@ "discard": "Discard", "done": "Done", "download": "Download", - "due-at": "Due", "edit": "Edit", "edit-avatar": "Change Avatar", "edit-profile": "Edit Profile", @@ -201,6 +204,7 @@ "importMapMembersAddPopup-title": "Select Wekan member", "info": "Infos", "initials": "Initials", + "invalid-date": "Invalid date", "joined": "joined", "just-invited": "You are just invited to this board", "keyboard-shortcuts": "Keyboard shortcuts", @@ -286,7 +290,6 @@ "star-board-title": "Click to star this board. It will show up at top of your boards list.", "starred-boards": "Starred Boards", "starred-boards-description": "Starred boards show up at the top of your boards list.", - "start-at": "Start", "subscribe": "Subscribe", "team": "Team", "this-board": "this board", From 6064393ad339333f02ce90fa1814ea47c18e78c2 Mon Sep 17 00:00:00 2001 From: shoetten Date: Thu, 11 Feb 2016 15:02:26 +0100 Subject: [PATCH 060/136] Refactor code based on eslint guidelines. --- client/components/cards/cardDate.js | 58 ++++++++++++++------------- client/components/cards/cardDate.styl | 2 +- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/client/components/cards/cardDate.js b/client/components/cards/cardDate.js index 10bc54ffa..f7cd502f4 100644 --- a/client/components/cards/cardDate.js +++ b/client/components/cards/cardDate.js @@ -11,14 +11,14 @@ const EditCardDate = BlazeComponent.extendComponent({ }, onRendered() { - let $picker = this.$('.js-datepicker').datepicker({ + const $picker = this.$('.js-datepicker').datepicker({ todayHighlight: true, todayBtn: 'linked', - language: TAPi18n.getLanguage() - }).on('changeDate', function(e) { - date.value = moment(e.date).format('L'); + language: TAPi18n.getLanguage(), + }).on('changeDate', function(evt) { + this.find('#date').value = moment(evt.date).format('L'); this.error.set(''); - time.focus(); + this.find('#time').focus(); }.bind(this)); if (this.date.get().isValid()) { @@ -29,10 +29,12 @@ const EditCardDate = BlazeComponent.extendComponent({ showDate() { if (this.date.get().isValid()) return this.date.get().format('L'); + return ''; }, showTime() { if (this.date.get().isValid()) return this.date.get().format('LT'); + return ''; }, dateFormat() { return moment.localeData().longDateFormat('L'); @@ -43,17 +45,17 @@ const EditCardDate = BlazeComponent.extendComponent({ events() { return [{ - 'keyup .js-date-field'(evt) { + 'keyup .js-date-field'() { // parse for localized date format in strict mode - const dateMoment = moment(date.value, 'L', true); + const dateMoment = moment(this.find('#date').value, 'L', true); if (dateMoment.isValid()) { this.error.set(''); this.$('.js-datepicker').datepicker('update', dateMoment.toDate()); } }, - 'keyup .js-time-field'(evt) { + 'keyup .js-time-field'() { // parse for localized time format in strict mode - const dateMoment = moment(time.value, 'LT', true); + const dateMoment = moment(this.find('#time').value, 'LT', true); if (dateMoment.isValid()) { this.error.set(''); } @@ -62,9 +64,9 @@ const EditCardDate = BlazeComponent.extendComponent({ evt.preventDefault(); // if no time was given, init with 12:00 - var time = evt.target.time.value || moment(new Date().setHours(12,0,0)).format('LT'); - - const dateString = evt.target.date.value + ' ' + time; + const time = evt.target.time.value || moment(new Date().setHours(12, 0, 0)).format('LT'); + + const dateString = `${evt.target.date.value} ${time}`; const newDate = moment(dateString, 'L LT', true); if (newDate.isValid()) { this._storeDate(newDate.toDate()); @@ -87,7 +89,7 @@ const EditCardDate = BlazeComponent.extendComponent({ // editCardStartDatePopup (class extends EditCardDate { onCreated() { - super(); + super.onCreated(); this.data().startAt && this.date.set(moment(this.data().startAt)); } @@ -103,12 +105,12 @@ const EditCardDate = BlazeComponent.extendComponent({ // editCardDueDatePopup (class extends EditCardDate { onCreated() { - super(); + super.onCreated(); this.data().dueAt && this.date.set(moment(this.data().dueAt)); } onRendered() { - super(); + super.onRendered(); if (moment.isDate(this.card.startAt)) { this.$('.js-datepicker').datepicker('setStartDate', this.card.startAt); } @@ -131,7 +133,7 @@ const CardDate = BlazeComponent.extendComponent({ }, onCreated() { - let self = this; + const self = this; self.date = ReactiveVar(); self.now = ReactiveVar(moment()); Meteor.setInterval(() => { @@ -144,7 +146,7 @@ const CardDate = BlazeComponent.extendComponent({ // is updated to at least moment.js 2.10.5 // until then, the date is displayed in the "L" format return this.date.get().calendar(null, { - sameElse: 'llll' + sameElse: 'llll', }); }, @@ -155,10 +157,10 @@ const CardDate = BlazeComponent.extendComponent({ class CardStartDate extends CardDate { onCreated() { - super(); - let self = this; - this.autorun(() => { - self.date.set(moment(this.data().startAt)); + super.onCreated(); + const self = this; + self.autorun(() => { + self.date.set(moment(self.data().startAt)); }); } @@ -167,10 +169,11 @@ class CardStartDate extends CardDate { this.now.get().isBefore(this.data().dueAt)) { return 'current'; } + return ''; } showTitle() { - return TAPi18n.__('card-start-on') + ' ' + this.date.get().format('LLLL'); + return `${TAPi18n.__('card-start-on')} ${this.date.get().format('LLLL')}`; } events() { @@ -183,10 +186,10 @@ CardStartDate.register('cardStartDate'); class CardDueDate extends CardDate { onCreated() { - super(); - let self = this; - this.autorun(() => { - self.date.set(moment(this.data().dueAt)); + super.onCreated(); + const self = this; + self.autorun(() => { + self.date.set(moment(self.data().dueAt)); }); } @@ -197,10 +200,11 @@ class CardDueDate extends CardDate { return 'due'; else if (this.now.get().diff(this.date.get(), 'days') >= -1) return 'almost-due'; + return ''; } showTitle() { - return TAPi18n.__('card-due-on') + ' ' + this.date.get().format('LLLL'); + return `${TAPi18n.__('card-due-on')} ${this.date.get().format('LLLL')}`; } events() { diff --git a/client/components/cards/cardDate.styl b/client/components/cards/cardDate.styl index 51acdaab4..1631baa58 100644 --- a/client/components/cards/cardDate.styl +++ b/client/components/cards/cardDate.styl @@ -20,7 +20,7 @@ .card-date display: block border-radius: 4px - padding: 1px 3px; + padding: 1px 3px background-color: #dbdbdb &:hover, &.is-active From 33b74a465e142c7a2b5d435dd35b7cea56a2d18b Mon Sep 17 00:00:00 2001 From: shoetten Date: Tue, 23 Feb 2016 15:21:36 +0100 Subject: [PATCH 061/136] Fix "can't set timers inside simulations error" when moving cards with start/due dates. --- client/components/cards/cardDate.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/components/cards/cardDate.js b/client/components/cards/cardDate.js index f7cd502f4..4d129e8e8 100644 --- a/client/components/cards/cardDate.js +++ b/client/components/cards/cardDate.js @@ -136,7 +136,7 @@ const CardDate = BlazeComponent.extendComponent({ const self = this; self.date = ReactiveVar(); self.now = ReactiveVar(moment()); - Meteor.setInterval(() => { + window.setInterval(() => { self.now.set(moment()); }, 60000); }, From de3be14d014f900358b118d91a1d90d849c6382c Mon Sep 17 00:00:00 2001 From: shoetten Date: Tue, 22 Nov 2016 21:26:25 +0100 Subject: [PATCH 062/136] Use atmosphere package of bootstrap-datepicker lib. --- .meteor/packages | 1 + .meteor/versions | 1 + client/lib/bootstrap-datepicker.js | 1918 -------------------------- client/lib/bootstrap-datepicker3.css | 791 ----------- 4 files changed, 2 insertions(+), 2709 deletions(-) delete mode 100644 client/lib/bootstrap-datepicker.js delete mode 100644 client/lib/bootstrap-datepicker3.css diff --git a/.meteor/packages b/.meteor/packages index e57bdb194..32d7389c4 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -75,3 +75,4 @@ seriousm:emoji-continued templates:tabs verron:autosize simple:json-routes +rajit:bootstrap3-datepicker diff --git a/.meteor/versions b/.meteor/versions index e1c0b9cf0..4ca2f7804 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -121,6 +121,7 @@ perak:markdown@1.0.5 promise@0.7.3 raix:eventemitter@0.1.3 raix:handlebar-helpers@0.2.5 +rajit:bootstrap3-datepicker@1.5.1 random@1.0.10 rate-limit@1.0.5 reactive-dict@1.1.8 diff --git a/client/lib/bootstrap-datepicker.js b/client/lib/bootstrap-datepicker.js deleted file mode 100644 index fb56652e1..000000000 --- a/client/lib/bootstrap-datepicker.js +++ /dev/null @@ -1,1918 +0,0 @@ -/*! - * Datepicker for Bootstrap v1.5.1 (https://github.com/eternicode/bootstrap-datepicker) - * - * Copyright 2012 Stefan Petre - * Improvements by Andrew Rowls - * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) - */(function(factory){ - if (typeof define === "function" && define.amd) { - define(["jquery"], factory); - } else if (typeof exports === 'object') { - factory(require('jquery')); - } else { - factory(jQuery); - } -}(function($, undefined){ - - function UTCDate(){ - return new Date(Date.UTC.apply(Date, arguments)); - } - function UTCToday(){ - var today = new Date(); - return UTCDate(today.getFullYear(), today.getMonth(), today.getDate()); - } - function isUTCEquals(date1, date2) { - return ( - date1.getUTCFullYear() === date2.getUTCFullYear() && - date1.getUTCMonth() === date2.getUTCMonth() && - date1.getUTCDate() === date2.getUTCDate() - ); - } - function alias(method){ - return function(){ - return this[method].apply(this, arguments); - }; - } - function isValidDate(d) { - return d && !isNaN(d.getTime()); - } - - var DateArray = (function(){ - var extras = { - get: function(i){ - return this.slice(i)[0]; - }, - contains: function(d){ - // Array.indexOf is not cross-browser; - // $.inArray doesn't work with Dates - var val = d && d.valueOf(); - for (var i=0, l=this.length; i < l; i++) - if (this[i].valueOf() === val) - return i; - return -1; - }, - remove: function(i){ - this.splice(i,1); - }, - replace: function(new_array){ - if (!new_array) - return; - if (!$.isArray(new_array)) - new_array = [new_array]; - this.clear(); - this.push.apply(this, new_array); - }, - clear: function(){ - this.length = 0; - }, - copy: function(){ - var a = new DateArray(); - a.replace(this); - return a; - } - }; - - return function(){ - var a = []; - a.push.apply(a, arguments); - $.extend(a, extras); - return a; - }; - })(); - - - // Picker object - - var Datepicker = function(element, options){ - $(element).data('datepicker', this); - this._process_options(options); - - this.dates = new DateArray(); - this.viewDate = this.o.defaultViewDate; - this.focusDate = null; - - this.element = $(element); - this.isInline = false; - this.isInput = this.element.is('input'); - this.component = this.element.hasClass('date') ? this.element.find('.add-on, .input-group-addon, .btn') : false; - this.hasInput = this.component && this.element.find('input').length; - if (this.component && this.component.length === 0) - this.component = false; - - this.picker = $(DPGlobal.template); - this._buildEvents(); - this._attachEvents(); - - if (this.isInline){ - this.picker.addClass('datepicker-inline').appendTo(this.element); - } - else { - this.picker.addClass('datepicker-dropdown dropdown-menu'); - } - - if (this.o.rtl){ - this.picker.addClass('datepicker-rtl'); - } - - this.viewMode = this.o.startView; - - if (this.o.calendarWeeks) - this.picker.find('thead .datepicker-title, tfoot .today, tfoot .clear') - .attr('colspan', function(i, val){ - return parseInt(val) + 1; - }); - - this._allow_update = false; - - this.setStartDate(this._o.startDate); - this.setEndDate(this._o.endDate); - this.setDaysOfWeekDisabled(this.o.daysOfWeekDisabled); - this.setDaysOfWeekHighlighted(this.o.daysOfWeekHighlighted); - this.setDatesDisabled(this.o.datesDisabled); - - this.fillDow(); - this.fillMonths(); - - this._allow_update = true; - - this.update(); - this.showMode(); - - if (this.isInline){ - this.show(); - } - }; - - Datepicker.prototype = { - constructor: Datepicker, - - _process_options: function(opts){ - // Store raw options for reference - this._o = $.extend({}, this._o, opts); - // Processed options - var o = this.o = $.extend({}, this._o); - - // Check if "de-DE" style date is available, if not language should - // fallback to 2 letter code eg "de" - var lang = o.language; - if (!dates[lang]){ - lang = lang.split('-')[0]; - if (!dates[lang]) - lang = defaults.language; - } - o.language = lang; - - switch (o.startView){ - case 2: - case 'decade': - o.startView = 2; - break; - case 1: - case 'year': - o.startView = 1; - break; - default: - o.startView = 0; - } - - switch (o.minViewMode){ - case 1: - case 'months': - o.minViewMode = 1; - break; - case 2: - case 'years': - o.minViewMode = 2; - break; - default: - o.minViewMode = 0; - } - - switch (o.maxViewMode) { - case 0: - case 'days': - o.maxViewMode = 0; - break; - case 1: - case 'months': - o.maxViewMode = 1; - break; - default: - o.maxViewMode = 2; - } - - o.startView = Math.min(o.startView, o.maxViewMode); - o.startView = Math.max(o.startView, o.minViewMode); - - // true, false, or Number > 0 - if (o.multidate !== true){ - o.multidate = Number(o.multidate) || false; - if (o.multidate !== false) - o.multidate = Math.max(0, o.multidate); - } - o.multidateSeparator = String(o.multidateSeparator); - - o.weekStart %= 7; - o.weekEnd = (o.weekStart + 6) % 7; - - var format = DPGlobal.parseFormat(o.format); - if (o.startDate !== -Infinity){ - if (!!o.startDate){ - if (o.startDate instanceof Date) - o.startDate = this._local_to_utc(this._zero_time(o.startDate)); - else - o.startDate = DPGlobal.parseDate(o.startDate, format, o.language); - } - else { - o.startDate = -Infinity; - } - } - if (o.endDate !== Infinity){ - if (!!o.endDate){ - if (o.endDate instanceof Date) - o.endDate = this._local_to_utc(this._zero_time(o.endDate)); - else - o.endDate = DPGlobal.parseDate(o.endDate, format, o.language); - } - else { - o.endDate = Infinity; - } - } - - o.daysOfWeekDisabled = o.daysOfWeekDisabled||[]; - if (!$.isArray(o.daysOfWeekDisabled)) - o.daysOfWeekDisabled = o.daysOfWeekDisabled.split(/[,\s]*/); - o.daysOfWeekDisabled = $.map(o.daysOfWeekDisabled, function(d){ - return parseInt(d, 10); - }); - - o.daysOfWeekHighlighted = o.daysOfWeekHighlighted||[]; - if (!$.isArray(o.daysOfWeekHighlighted)) - o.daysOfWeekHighlighted = o.daysOfWeekHighlighted.split(/[,\s]*/); - o.daysOfWeekHighlighted = $.map(o.daysOfWeekHighlighted, function(d){ - return parseInt(d, 10); - }); - - o.datesDisabled = o.datesDisabled||[]; - if (!$.isArray(o.datesDisabled)) { - var datesDisabled = []; - datesDisabled.push(DPGlobal.parseDate(o.datesDisabled, format, o.language)); - o.datesDisabled = datesDisabled; - } - o.datesDisabled = $.map(o.datesDisabled,function(d){ - return DPGlobal.parseDate(d, format, o.language); - }); - - var plc = String(o.orientation).toLowerCase().split(/\s+/g), - _plc = o.orientation.toLowerCase(); - plc = $.grep(plc, function(word){ - return /^auto|left|right|top|bottom$/.test(word); - }); - o.orientation = {x: 'auto', y: 'auto'}; - if (!_plc || _plc === 'auto') - ; // no action - else if (plc.length === 1){ - switch (plc[0]){ - case 'top': - case 'bottom': - o.orientation.y = plc[0]; - break; - case 'left': - case 'right': - o.orientation.x = plc[0]; - break; - } - } - else { - _plc = $.grep(plc, function(word){ - return /^left|right$/.test(word); - }); - o.orientation.x = _plc[0] || 'auto'; - - _plc = $.grep(plc, function(word){ - return /^top|bottom$/.test(word); - }); - o.orientation.y = _plc[0] || 'auto'; - } - if (o.defaultViewDate) { - var year = o.defaultViewDate.year || new Date().getFullYear(); - var month = o.defaultViewDate.month || 0; - var day = o.defaultViewDate.day || 1; - o.defaultViewDate = UTCDate(year, month, day); - } else { - o.defaultViewDate = UTCToday(); - } - }, - _events: [], - _secondaryEvents: [], - _applyEvents: function(evs){ - for (var i=0, el, ch, ev; i < evs.length; i++){ - el = evs[i][0]; - if (evs[i].length === 2){ - ch = undefined; - ev = evs[i][1]; - } - else if (evs[i].length === 3){ - ch = evs[i][1]; - ev = evs[i][2]; - } - el.on(ev, ch); - } - }, - _unapplyEvents: function(evs){ - for (var i=0, el, ev, ch; i < evs.length; i++){ - el = evs[i][0]; - if (evs[i].length === 2){ - ch = undefined; - ev = evs[i][1]; - } - else if (evs[i].length === 3){ - ch = evs[i][1]; - ev = evs[i][2]; - } - el.off(ev, ch); - } - }, - _buildEvents: function(){ - var events = { - keyup: $.proxy(function(e){ - if ($.inArray(e.keyCode, [27, 37, 39, 38, 40, 32, 13, 9]) === -1) - this.update(); - }, this), - keydown: $.proxy(this.keydown, this), - paste: $.proxy(this.paste, this) - }; - - if (this.o.showOnFocus === true) { - events.focus = $.proxy(this.show, this); - } - - if (this.isInput) { // single input - this._events = [ - [this.element, events] - ]; - } - else if (this.component && this.hasInput) { // component: input + button - this._events = [ - // For components that are not readonly, allow keyboard nav - [this.element.find('input'), events], - [this.component, { - click: $.proxy(this.show, this) - }] - ]; - } - else if (this.element.is('div')){ // inline datepicker - this.isInline = true; - } - else { - this._events = [ - [this.element, { - click: $.proxy(this.show, this) - }] - ]; - } - this._events.push( - // Component: listen for blur on element descendants - [this.element, '*', { - blur: $.proxy(function(e){ - this._focused_from = e.target; - }, this) - }], - // Input: listen for blur on element - [this.element, { - blur: $.proxy(function(e){ - this._focused_from = e.target; - }, this) - }] - ); - - if (this.o.immediateUpdates) { - // Trigger input updates immediately on changed year/month - this._events.push([this.element, { - 'changeYear changeMonth': $.proxy(function(e){ - this.update(e.date); - }, this) - }]); - } - - this._secondaryEvents = [ - [this.picker, { - click: $.proxy(this.click, this) - }], - [$(window), { - resize: $.proxy(this.place, this) - }], - [$(document), { - mousedown: $.proxy(function(e){ - // Clicked outside the datepicker, hide it - if (!( - this.element.is(e.target) || - this.element.find(e.target).length || - this.picker.is(e.target) || - this.picker.find(e.target).length || - this.picker.hasClass('datepicker-inline') - )){ - this.hide(); - } - }, this) - }] - ]; - }, - _attachEvents: function(){ - this._detachEvents(); - this._applyEvents(this._events); - }, - _detachEvents: function(){ - this._unapplyEvents(this._events); - }, - _attachSecondaryEvents: function(){ - this._detachSecondaryEvents(); - this._applyEvents(this._secondaryEvents); - }, - _detachSecondaryEvents: function(){ - this._unapplyEvents(this._secondaryEvents); - }, - _trigger: function(event, altdate){ - var date = altdate || this.dates.get(-1), - local_date = this._utc_to_local(date); - - this.element.trigger({ - type: event, - date: local_date, - dates: $.map(this.dates, this._utc_to_local), - format: $.proxy(function(ix, format){ - if (arguments.length === 0){ - ix = this.dates.length - 1; - format = this.o.format; - } - else if (typeof ix === 'string'){ - format = ix; - ix = this.dates.length - 1; - } - format = format || this.o.format; - var date = this.dates.get(ix); - return DPGlobal.formatDate(date, format, this.o.language); - }, this) - }); - }, - - show: function(){ - var element = this.component ? this.element.find('input') : this.element; - if (element.attr('readonly') && this.o.enableOnReadonly === false) - return; - if (!this.isInline) - this.picker.appendTo(this.o.container); - this.place(); - this.picker.show(); - this._attachSecondaryEvents(); - this._trigger('show'); - if ((window.navigator.msMaxTouchPoints || 'ontouchstart' in document) && this.o.disableTouchKeyboard) { - $(this.element).blur(); - } - return this; - }, - - hide: function(){ - if (this.isInline) - return this; - if (!this.picker.is(':visible')) - return this; - this.focusDate = null; - this.picker.hide().detach(); - this._detachSecondaryEvents(); - this.viewMode = this.o.startView; - this.showMode(); - - if ( - this.o.forceParse && - ( - this.isInput && this.element.val() || - this.hasInput && this.element.find('input').val() - ) - ) - this.setValue(); - this._trigger('hide'); - return this; - }, - - remove: function(){ - this.hide(); - this._detachEvents(); - this._detachSecondaryEvents(); - this.picker.remove(); - delete this.element.data().datepicker; - if (!this.isInput){ - delete this.element.data().date; - } - return this; - }, - - paste: function(evt){ - var dateString; - if (evt.originalEvent.clipboardData && evt.originalEvent.clipboardData.types - && $.inArray('text/plain', evt.originalEvent.clipboardData.types) !== -1) { - dateString = evt.originalEvent.clipboardData.getData('text/plain'); - } - else if (window.clipboardData) { - dateString = window.clipboardData.getData('Text'); - } - else { - return; - } - this.setDate(dateString); - this.update(); - evt.preventDefault(); - }, - - _utc_to_local: function(utc){ - return utc && new Date(utc.getTime() + (utc.getTimezoneOffset()*60000)); - }, - _local_to_utc: function(local){ - return local && new Date(local.getTime() - (local.getTimezoneOffset()*60000)); - }, - _zero_time: function(local){ - return local && new Date(local.getFullYear(), local.getMonth(), local.getDate()); - }, - _zero_utc_time: function(utc){ - return utc && new Date(Date.UTC(utc.getUTCFullYear(), utc.getUTCMonth(), utc.getUTCDate())); - }, - - getDates: function(){ - return $.map(this.dates, this._utc_to_local); - }, - - getUTCDates: function(){ - return $.map(this.dates, function(d){ - return new Date(d); - }); - }, - - getDate: function(){ - return this._utc_to_local(this.getUTCDate()); - }, - - getUTCDate: function(){ - var selected_date = this.dates.get(-1); - if (typeof selected_date !== 'undefined') { - return new Date(selected_date); - } else { - return null; - } - }, - - clearDates: function(){ - var element; - if (this.isInput) { - element = this.element; - } else if (this.component) { - element = this.element.find('input'); - } - - if (element) { - element.val(''); - } - - this.update(); - this._trigger('changeDate'); - - if (this.o.autoclose) { - this.hide(); - } - }, - setDates: function(){ - var args = $.isArray(arguments[0]) ? arguments[0] : arguments; - this.update.apply(this, args); - this._trigger('changeDate'); - this.setValue(); - return this; - }, - - setUTCDates: function(){ - var args = $.isArray(arguments[0]) ? arguments[0] : arguments; - this.update.apply(this, $.map(args, this._utc_to_local)); - this._trigger('changeDate'); - this.setValue(); - return this; - }, - - setDate: alias('setDates'), - setUTCDate: alias('setUTCDates'), - - setValue: function(){ - var formatted = this.getFormattedDate(); - if (!this.isInput){ - if (this.component){ - this.element.find('input').val(formatted); - } - } - else { - this.element.val(formatted); - } - return this; - }, - - getFormattedDate: function(format){ - if (format === undefined) - format = this.o.format; - - var lang = this.o.language; - return $.map(this.dates, function(d){ - return DPGlobal.formatDate(d, format, lang); - }).join(this.o.multidateSeparator); - }, - - setStartDate: function(startDate){ - this._process_options({startDate: startDate}); - this.update(); - this.updateNavArrows(); - return this; - }, - - setEndDate: function(endDate){ - this._process_options({endDate: endDate}); - this.update(); - this.updateNavArrows(); - return this; - }, - - setDaysOfWeekDisabled: function(daysOfWeekDisabled){ - this._process_options({daysOfWeekDisabled: daysOfWeekDisabled}); - this.update(); - this.updateNavArrows(); - return this; - }, - - setDaysOfWeekHighlighted: function(daysOfWeekHighlighted){ - this._process_options({daysOfWeekHighlighted: daysOfWeekHighlighted}); - this.update(); - return this; - }, - - setDatesDisabled: function(datesDisabled){ - this._process_options({datesDisabled: datesDisabled}); - this.update(); - this.updateNavArrows(); - }, - - place: function(){ - if (this.isInline) - return this; - var calendarWidth = this.picker.outerWidth(), - calendarHeight = this.picker.outerHeight(), - visualPadding = 10, - container = $(this.o.container), - windowWidth = container.width(), - scrollTop = this.o.container === 'body' ? $(document).scrollTop() : container.scrollTop(), - appendOffset = container.offset(); - - var parentsZindex = []; - this.element.parents().each(function(){ - var itemZIndex = $(this).css('z-index'); - if (itemZIndex !== 'auto' && itemZIndex !== 0) parentsZindex.push(parseInt(itemZIndex)); - }); - var zIndex = Math.max.apply(Math, parentsZindex) + this.o.zIndexOffset; - var offset = this.component ? this.component.parent().offset() : this.element.offset(); - var height = this.component ? this.component.outerHeight(true) : this.element.outerHeight(false); - var width = this.component ? this.component.outerWidth(true) : this.element.outerWidth(false); - var left = offset.left - appendOffset.left, - top = offset.top - appendOffset.top; - - if (this.o.container !== 'body') { - top += scrollTop; - } - - this.picker.removeClass( - 'datepicker-orient-top datepicker-orient-bottom '+ - 'datepicker-orient-right datepicker-orient-left' - ); - - if (this.o.orientation.x !== 'auto'){ - this.picker.addClass('datepicker-orient-' + this.o.orientation.x); - if (this.o.orientation.x === 'right') - left -= calendarWidth - width; - } - // auto x orientation is best-placement: if it crosses a window - // edge, fudge it sideways - else { - if (offset.left < 0) { - // component is outside the window on the left side. Move it into visible range - this.picker.addClass('datepicker-orient-left'); - left -= offset.left - visualPadding; - } else if (left + calendarWidth > windowWidth) { - // the calendar passes the widow right edge. Align it to component right side - this.picker.addClass('datepicker-orient-right'); - left += width - calendarWidth; - } else { - // Default to left - this.picker.addClass('datepicker-orient-left'); - } - } - - // auto y orientation is best-situation: top or bottom, no fudging, - // decision based on which shows more of the calendar - var yorient = this.o.orientation.y, - top_overflow; - if (yorient === 'auto'){ - top_overflow = -scrollTop + top - calendarHeight; - yorient = top_overflow < 0 ? 'bottom' : 'top'; - } - - this.picker.addClass('datepicker-orient-' + yorient); - if (yorient === 'top') - top -= calendarHeight + parseInt(this.picker.css('padding-top')); - else - top += height; - - if (this.o.rtl) { - var right = windowWidth - (left + width); - this.picker.css({ - top: top, - right: right, - zIndex: zIndex - }); - } else { - this.picker.css({ - top: top, - left: left, - zIndex: zIndex - }); - } - return this; - }, - - _allow_update: true, - update: function(){ - if (!this._allow_update) - return this; - - var oldDates = this.dates.copy(), - dates = [], - fromArgs = false; - if (arguments.length){ - $.each(arguments, $.proxy(function(i, date){ - if (date instanceof Date) - date = this._local_to_utc(date); - dates.push(date); - }, this)); - fromArgs = true; - } - else { - dates = this.isInput - ? this.element.val() - : this.element.data('date') || this.element.find('input').val(); - if (dates && this.o.multidate) - dates = dates.split(this.o.multidateSeparator); - else - dates = [dates]; - delete this.element.data().date; - } - - dates = $.map(dates, $.proxy(function(date){ - return DPGlobal.parseDate(date, this.o.format, this.o.language); - }, this)); - dates = $.grep(dates, $.proxy(function(date){ - return ( - !this.dateWithinRange(date) || - !date - ); - }, this), true); - this.dates.replace(dates); - - if (this.dates.length) - this.viewDate = new Date(this.dates.get(-1)); - else if (this.viewDate < this.o.startDate) - this.viewDate = new Date(this.o.startDate); - else if (this.viewDate > this.o.endDate) - this.viewDate = new Date(this.o.endDate); - else - this.viewDate = this.o.defaultViewDate; - - if (fromArgs){ - // setting date by clicking - this.setValue(); - } - else if (dates.length){ - // setting date by typing - if (String(oldDates) !== String(this.dates)) - this._trigger('changeDate'); - } - if (!this.dates.length && oldDates.length) - this._trigger('clearDate'); - - this.fill(); - this.element.change(); - return this; - }, - - fillDow: function(){ - var dowCnt = this.o.weekStart, - html = ''; - if (this.o.calendarWeeks){ - this.picker.find('.datepicker-days .datepicker-switch') - .attr('colspan', function(i, val){ - return parseInt(val) + 1; - }); - html += ' '; - } - while (dowCnt < this.o.weekStart + 7){ - html += ''+dates[this.o.language].daysMin[(dowCnt++)%7]+''; - } - html += ''; - this.picker.find('.datepicker-days thead').append(html); - }, - - fillMonths: function(){ - var html = '', - i = 0; - while (i < 12){ - html += ''+dates[this.o.language].monthsShort[i++]+''; - } - this.picker.find('.datepicker-months td').html(html); - }, - - setRange: function(range){ - if (!range || !range.length) - delete this.range; - else - this.range = $.map(range, function(d){ - return d.valueOf(); - }); - this.fill(); - }, - - getClassNames: function(date){ - var cls = [], - year = this.viewDate.getUTCFullYear(), - month = this.viewDate.getUTCMonth(), - today = new Date(); - if (date.getUTCFullYear() < year || (date.getUTCFullYear() === year && date.getUTCMonth() < month)){ - cls.push('old'); - } - else if (date.getUTCFullYear() > year || (date.getUTCFullYear() === year && date.getUTCMonth() > month)){ - cls.push('new'); - } - if (this.focusDate && date.valueOf() === this.focusDate.valueOf()) - cls.push('focused'); - // Compare internal UTC date with local today, not UTC today - if (this.o.todayHighlight && - date.getUTCFullYear() === today.getFullYear() && - date.getUTCMonth() === today.getMonth() && - date.getUTCDate() === today.getDate()){ - cls.push('today'); - } - if (this.dates.contains(date) !== -1) - cls.push('active'); - if (!this.dateWithinRange(date) || this.dateIsDisabled(date)){ - cls.push('disabled'); - } - if ($.inArray(date.getUTCDay(), this.o.daysOfWeekHighlighted) !== -1){ - cls.push('highlighted'); - } - - if (this.range){ - if (date > this.range[0] && date < this.range[this.range.length-1]){ - cls.push('range'); - } - if ($.inArray(date.valueOf(), this.range) !== -1){ - cls.push('selected'); - } - if (date.valueOf() === this.range[0]){ - cls.push('range-start'); - } - if (date.valueOf() === this.range[this.range.length-1]){ - cls.push('range-end'); - } - } - return cls; - }, - - fill: function(){ - var d = new Date(this.viewDate), - year = d.getUTCFullYear(), - month = d.getUTCMonth(), - startYear = this.o.startDate !== -Infinity ? this.o.startDate.getUTCFullYear() : -Infinity, - startMonth = this.o.startDate !== -Infinity ? this.o.startDate.getUTCMonth() : -Infinity, - endYear = this.o.endDate !== Infinity ? this.o.endDate.getUTCFullYear() : Infinity, - endMonth = this.o.endDate !== Infinity ? this.o.endDate.getUTCMonth() : Infinity, - todaytxt = dates[this.o.language].today || dates['en'].today || '', - cleartxt = dates[this.o.language].clear || dates['en'].clear || '', - titleFormat = dates[this.o.language].titleFormat || dates['en'].titleFormat, - tooltip; - if (isNaN(year) || isNaN(month)) - return; - this.picker.find('.datepicker-days thead .datepicker-switch') - .text(DPGlobal.formatDate(new UTCDate(year, month), titleFormat, this.o.language)); - this.picker.find('tfoot .today') - .text(todaytxt) - .toggle(this.o.todayBtn !== false); - this.picker.find('tfoot .clear') - .text(cleartxt) - .toggle(this.o.clearBtn !== false); - this.picker.find('thead .datepicker-title') - .text(this.o.title) - .toggle(this.o.title !== ''); - this.updateNavArrows(); - this.fillMonths(); - var prevMonth = UTCDate(year, month-1, 28), - day = DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth()); - prevMonth.setUTCDate(day); - prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.o.weekStart + 7)%7); - var nextMonth = new Date(prevMonth); - if (prevMonth.getUTCFullYear() < 100){ - nextMonth.setUTCFullYear(prevMonth.getUTCFullYear()); - } - nextMonth.setUTCDate(nextMonth.getUTCDate() + 42); - nextMonth = nextMonth.valueOf(); - var html = []; - var clsName; - while (prevMonth.valueOf() < nextMonth){ - if (prevMonth.getUTCDay() === this.o.weekStart){ - html.push(''); - if (this.o.calendarWeeks){ - // ISO 8601: First week contains first thursday. - // ISO also states week starts on Monday, but we can be more abstract here. - var - // Start of current week: based on weekstart/current date - ws = new Date(+prevMonth + (this.o.weekStart - prevMonth.getUTCDay() - 7) % 7 * 864e5), - // Thursday of this week - th = new Date(Number(ws) + (7 + 4 - ws.getUTCDay()) % 7 * 864e5), - // First Thursday of year, year from thursday - yth = new Date(Number(yth = UTCDate(th.getUTCFullYear(), 0, 1)) + (7 + 4 - yth.getUTCDay())%7*864e5), - // Calendar week: ms between thursdays, div ms per day, div 7 days - calWeek = (th - yth) / 864e5 / 7 + 1; - html.push(''+ calWeek +''); - - } - } - clsName = this.getClassNames(prevMonth); - clsName.push('day'); - - if (this.o.beforeShowDay !== $.noop){ - var before = this.o.beforeShowDay(this._utc_to_local(prevMonth)); - if (before === undefined) - before = {}; - else if (typeof(before) === 'boolean') - before = {enabled: before}; - else if (typeof(before) === 'string') - before = {classes: before}; - if (before.enabled === false) - clsName.push('disabled'); - if (before.classes) - clsName = clsName.concat(before.classes.split(/\s+/)); - if (before.tooltip) - tooltip = before.tooltip; - } - - clsName = $.unique(clsName); - html.push(''+prevMonth.getUTCDate() + ''); - tooltip = null; - if (prevMonth.getUTCDay() === this.o.weekEnd){ - html.push(''); - } - prevMonth.setUTCDate(prevMonth.getUTCDate()+1); - } - this.picker.find('.datepicker-days tbody').empty().append(html.join('')); - - var monthsTitle = dates[this.o.language].monthsTitle || dates['en'].monthsTitle || 'Months'; - var months = this.picker.find('.datepicker-months') - .find('.datepicker-switch') - .text(this.o.maxViewMode < 2 ? monthsTitle : year) - .end() - .find('span').removeClass('active'); - - $.each(this.dates, function(i, d){ - if (d.getUTCFullYear() === year) - months.eq(d.getUTCMonth()).addClass('active'); - }); - - if (year < startYear || year > endYear){ - months.addClass('disabled'); - } - if (year === startYear){ - months.slice(0, startMonth).addClass('disabled'); - } - if (year === endYear){ - months.slice(endMonth+1).addClass('disabled'); - } - - if (this.o.beforeShowMonth !== $.noop){ - var that = this; - $.each(months, function(i, month){ - if (!$(month).hasClass('disabled')) { - var moDate = new Date(year, i, 1); - var before = that.o.beforeShowMonth(moDate); - if (before === false) - $(month).addClass('disabled'); - } - }); - } - - html = ''; - year = parseInt(year/10, 10) * 10; - var yearCont = this.picker.find('.datepicker-years') - .find('.datepicker-switch') - .text(year + '-' + (year + 9)) - .end() - .find('td'); - year -= 1; - var years = $.map(this.dates, function(d){ - return d.getUTCFullYear(); - }), - classes; - for (var i = -1; i < 11; i++){ - classes = ['year']; - tooltip = null; - - if (i === -1) - classes.push('old'); - else if (i === 10) - classes.push('new'); - if ($.inArray(year, years) !== -1) - classes.push('active'); - if (year < startYear || year > endYear) - classes.push('disabled'); - - if (this.o.beforeShowYear !== $.noop) { - var yrBefore = this.o.beforeShowYear(new Date(year, 0, 1)); - if (yrBefore === undefined) - yrBefore = {}; - else if (typeof(yrBefore) === 'boolean') - yrBefore = {enabled: yrBefore}; - else if (typeof(yrBefore) === 'string') - yrBefore = {classes: yrBefore}; - if (yrBefore.enabled === false) - classes.push('disabled'); - if (yrBefore.classes) - classes = classes.concat(yrBefore.classes.split(/\s+/)); - if (yrBefore.tooltip) - tooltip = yrBefore.tooltip; - } - - html += '' + year + ''; - year += 1; - } - yearCont.html(html); - }, - - updateNavArrows: function(){ - if (!this._allow_update) - return; - - var d = new Date(this.viewDate), - year = d.getUTCFullYear(), - month = d.getUTCMonth(); - switch (this.viewMode){ - case 0: - if (this.o.startDate !== -Infinity && year <= this.o.startDate.getUTCFullYear() && month <= this.o.startDate.getUTCMonth()){ - this.picker.find('.prev').css({visibility: 'hidden'}); - } - else { - this.picker.find('.prev').css({visibility: 'visible'}); - } - if (this.o.endDate !== Infinity && year >= this.o.endDate.getUTCFullYear() && month >= this.o.endDate.getUTCMonth()){ - this.picker.find('.next').css({visibility: 'hidden'}); - } - else { - this.picker.find('.next').css({visibility: 'visible'}); - } - break; - case 1: - case 2: - if (this.o.startDate !== -Infinity && year <= this.o.startDate.getUTCFullYear() || this.o.maxViewMode < 2){ - this.picker.find('.prev').css({visibility: 'hidden'}); - } - else { - this.picker.find('.prev').css({visibility: 'visible'}); - } - if (this.o.endDate !== Infinity && year >= this.o.endDate.getUTCFullYear() || this.o.maxViewMode < 2){ - this.picker.find('.next').css({visibility: 'hidden'}); - } - else { - this.picker.find('.next').css({visibility: 'visible'}); - } - break; - } - }, - - click: function(e){ - e.preventDefault(); - e.stopPropagation(); - var target = $(e.target).closest('span, td, th'), - year, month, day; - if (target.length === 1){ - switch (target[0].nodeName.toLowerCase()){ - case 'th': - switch (target[0].className){ - case 'datepicker-switch': - this.showMode(1); - break; - case 'prev': - case 'next': - var dir = DPGlobal.modes[this.viewMode].navStep * (target[0].className === 'prev' ? -1 : 1); - switch (this.viewMode){ - case 0: - this.viewDate = this.moveMonth(this.viewDate, dir); - this._trigger('changeMonth', this.viewDate); - break; - case 1: - case 2: - this.viewDate = this.moveYear(this.viewDate, dir); - if (this.viewMode === 1) - this._trigger('changeYear', this.viewDate); - break; - } - this.fill(); - break; - case 'today': - this.showMode(-2); - var which = this.o.todayBtn === 'linked' ? null : 'view'; - this._setDate(UTCToday(), which); - break; - case 'clear': - this.clearDates(); - break; - } - break; - case 'span': - if (!target.hasClass('disabled')){ - this.viewDate.setUTCDate(1); - if (target.hasClass('month')){ - day = 1; - month = target.parent().find('span').index(target); - year = this.viewDate.getUTCFullYear(); - this.viewDate.setUTCMonth(month); - this._trigger('changeMonth', this.viewDate); - if (this.o.minViewMode === 1){ - this._setDate(UTCDate(year, month, day)); - this.showMode(); - } else { - this.showMode(-1); - } - } - else { - day = 1; - month = 0; - year = parseInt(target.text(), 10)||0; - this.viewDate.setUTCFullYear(year); - this._trigger('changeYear', this.viewDate); - if (this.o.minViewMode === 2){ - this._setDate(UTCDate(year, month, day)); - } - this.showMode(-1); - } - this.fill(); - } - break; - case 'td': - if (target.hasClass('day') && !target.hasClass('disabled')){ - day = parseInt(target.text(), 10)||1; - year = this.viewDate.getUTCFullYear(); - month = this.viewDate.getUTCMonth(); - if (target.hasClass('old')){ - if (month === 0){ - month = 11; - year -= 1; - } - else { - month -= 1; - } - } - else if (target.hasClass('new')){ - if (month === 11){ - month = 0; - year += 1; - } - else { - month += 1; - } - } - this._setDate(UTCDate(year, month, day)); - } - break; - } - } - if (this.picker.is(':visible') && this._focused_from){ - $(this._focused_from).focus(); - } - delete this._focused_from; - }, - - _toggle_multidate: function(date){ - var ix = this.dates.contains(date); - if (!date){ - this.dates.clear(); - } - - if (ix !== -1){ - if (this.o.multidate === true || this.o.multidate > 1 || this.o.toggleActive){ - this.dates.remove(ix); - } - } else if (this.o.multidate === false) { - this.dates.clear(); - this.dates.push(date); - } - else { - this.dates.push(date); - } - - if (typeof this.o.multidate === 'number') - while (this.dates.length > this.o.multidate) - this.dates.remove(0); - }, - - _setDate: function(date, which){ - if (!which || which === 'date') - this._toggle_multidate(date && new Date(date)); - if (!which || which === 'view') - this.viewDate = date && new Date(date); - - this.fill(); - this.setValue(); - if (!which || which !== 'view') { - this._trigger('changeDate'); - } - var element; - if (this.isInput){ - element = this.element; - } - else if (this.component){ - element = this.element.find('input'); - } - if (element){ - element.change(); - } - if (this.o.autoclose && (!which || which === 'date')){ - this.hide(); - } - }, - - moveDay: function(date, dir){ - var newDate = new Date(date); - newDate.setUTCDate(date.getUTCDate() + dir); - - return newDate; - }, - - moveWeek: function(date, dir){ - return this.moveDay(date, dir * 7); - }, - - moveMonth: function(date, dir){ - if (!isValidDate(date)) - return this.o.defaultViewDate; - if (!dir) - return date; - var new_date = new Date(date.valueOf()), - day = new_date.getUTCDate(), - month = new_date.getUTCMonth(), - mag = Math.abs(dir), - new_month, test; - dir = dir > 0 ? 1 : -1; - if (mag === 1){ - test = dir === -1 - // If going back one month, make sure month is not current month - // (eg, Mar 31 -> Feb 31 == Feb 28, not Mar 02) - ? function(){ - return new_date.getUTCMonth() === month; - } - // If going forward one month, make sure month is as expected - // (eg, Jan 31 -> Feb 31 == Feb 28, not Mar 02) - : function(){ - return new_date.getUTCMonth() !== new_month; - }; - new_month = month + dir; - new_date.setUTCMonth(new_month); - // Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11 - if (new_month < 0 || new_month > 11) - new_month = (new_month + 12) % 12; - } - else { - // For magnitudes >1, move one month at a time... - for (var i=0; i < mag; i++) - // ...which might decrease the day (eg, Jan 31 to Feb 28, etc)... - new_date = this.moveMonth(new_date, dir); - // ...then reset the day, keeping it in the new month - new_month = new_date.getUTCMonth(); - new_date.setUTCDate(day); - test = function(){ - return new_month !== new_date.getUTCMonth(); - }; - } - // Common date-resetting loop -- if date is beyond end of month, make it - // end of month - while (test()){ - new_date.setUTCDate(--day); - new_date.setUTCMonth(new_month); - } - return new_date; - }, - - moveYear: function(date, dir){ - return this.moveMonth(date, dir*12); - }, - - moveAvailableDate: function(date, dir, fn){ - do { - date = this[fn](date, dir); - - if (!this.dateWithinRange(date)) - return false; - - fn = 'moveDay'; - } - while (this.dateIsDisabled(date)); - - return date; - }, - - weekOfDateIsDisabled: function(date){ - return $.inArray(date.getUTCDay(), this.o.daysOfWeekDisabled) !== -1; - }, - - dateIsDisabled: function(date){ - return ( - this.weekOfDateIsDisabled(date) || - $.grep(this.o.datesDisabled, function(d){ - return isUTCEquals(date, d); - }).length > 0 - ); - }, - - dateWithinRange: function(date){ - return date >= this.o.startDate && date <= this.o.endDate; - }, - - keydown: function(e){ - if (!this.picker.is(':visible')){ - if (e.keyCode === 40 || e.keyCode === 27) { // allow down to re-show picker - this.show(); - e.stopPropagation(); - } - return; - } - var dateChanged = false, - dir, newViewDate, - focusDate = this.focusDate || this.viewDate; - switch (e.keyCode){ - case 27: // escape - if (this.focusDate){ - this.focusDate = null; - this.viewDate = this.dates.get(-1) || this.viewDate; - this.fill(); - } - else - this.hide(); - e.preventDefault(); - e.stopPropagation(); - break; - case 37: // left - case 38: // up - case 39: // right - case 40: // down - if (!this.o.keyboardNavigation || this.o.daysOfWeekDisabled.length === 7) - break; - dir = e.keyCode === 37 || e.keyCode === 38 ? -1 : 1; - if (e.ctrlKey){ - newViewDate = this.moveAvailableDate(focusDate, dir, 'moveYear'); - - if (newViewDate) - this._trigger('changeYear', this.viewDate); - } - else if (e.shiftKey){ - newViewDate = this.moveAvailableDate(focusDate, dir, 'moveMonth'); - - if (newViewDate) - this._trigger('changeMonth', this.viewDate); - } - else if (e.keyCode === 37 || e.keyCode === 39){ - newViewDate = this.moveAvailableDate(focusDate, dir, 'moveDay'); - } - else if (!this.weekOfDateIsDisabled(focusDate)){ - newViewDate = this.moveAvailableDate(focusDate, dir, 'moveWeek'); - } - if (newViewDate){ - this.focusDate = this.viewDate = newViewDate; - this.setValue(); - this.fill(); - e.preventDefault(); - } - break; - case 13: // enter - if (!this.o.forceParse) - break; - focusDate = this.focusDate || this.dates.get(-1) || this.viewDate; - if (this.o.keyboardNavigation) { - this._toggle_multidate(focusDate); - dateChanged = true; - } - this.focusDate = null; - this.viewDate = this.dates.get(-1) || this.viewDate; - this.setValue(); - this.fill(); - if (this.picker.is(':visible')){ - e.preventDefault(); - e.stopPropagation(); - if (this.o.autoclose) - this.hide(); - } - break; - case 9: // tab - this.focusDate = null; - this.viewDate = this.dates.get(-1) || this.viewDate; - this.fill(); - this.hide(); - break; - } - if (dateChanged){ - if (this.dates.length) - this._trigger('changeDate'); - else - this._trigger('clearDate'); - var element; - if (this.isInput){ - element = this.element; - } - else if (this.component){ - element = this.element.find('input'); - } - if (element){ - element.change(); - } - } - }, - - showMode: function(dir){ - if (dir){ - this.viewMode = Math.max(this.o.minViewMode, Math.min(this.o.maxViewMode, this.viewMode + dir)); - } - this.picker - .children('div') - .hide() - .filter('.datepicker-' + DPGlobal.modes[this.viewMode].clsName) - .show(); - this.updateNavArrows(); - } - }; - - var DateRangePicker = function(element, options){ - $(element).data('datepicker', this); - this.element = $(element); - this.inputs = $.map(options.inputs, function(i){ - return i.jquery ? i[0] : i; - }); - delete options.inputs; - - datepickerPlugin.call($(this.inputs), options) - .on('changeDate', $.proxy(this.dateUpdated, this)); - - this.pickers = $.map(this.inputs, function(i){ - return $(i).data('datepicker'); - }); - this.updateDates(); - }; - DateRangePicker.prototype = { - updateDates: function(){ - this.dates = $.map(this.pickers, function(i){ - return i.getUTCDate(); - }); - this.updateRanges(); - }, - updateRanges: function(){ - var range = $.map(this.dates, function(d){ - return d.valueOf(); - }); - $.each(this.pickers, function(i, p){ - p.setRange(range); - }); - }, - dateUpdated: function(e){ - // `this.updating` is a workaround for preventing infinite recursion - // between `changeDate` triggering and `setUTCDate` calling. Until - // there is a better mechanism. - if (this.updating) - return; - this.updating = true; - - var dp = $(e.target).data('datepicker'); - - if (typeof(dp) === "undefined") { - return; - } - - var new_date = dp.getUTCDate(), - i = $.inArray(e.target, this.inputs), - j = i - 1, - k = i + 1, - l = this.inputs.length; - if (i === -1) - return; - - $.each(this.pickers, function(i, p){ - if (!p.getUTCDate()) - p.setUTCDate(new_date); - }); - - if (new_date < this.dates[j]){ - // Date being moved earlier/left - while (j >= 0 && new_date < this.dates[j]){ - this.pickers[j--].setUTCDate(new_date); - } - } - else if (new_date > this.dates[k]){ - // Date being moved later/right - while (k < l && new_date > this.dates[k]){ - this.pickers[k++].setUTCDate(new_date); - } - } - this.updateDates(); - - delete this.updating; - }, - remove: function(){ - $.map(this.pickers, function(p){ p.remove(); }); - delete this.element.data().datepicker; - } - }; - - function opts_from_el(el, prefix){ - // Derive options from element data-attrs - var data = $(el).data(), - out = {}, inkey, - replace = new RegExp('^' + prefix.toLowerCase() + '([A-Z])'); - prefix = new RegExp('^' + prefix.toLowerCase()); - function re_lower(_,a){ - return a.toLowerCase(); - } - for (var key in data) - if (prefix.test(key)){ - inkey = key.replace(replace, re_lower); - out[inkey] = data[key]; - } - return out; - } - - function opts_from_locale(lang){ - // Derive options from locale plugins - var out = {}; - // Check if "de-DE" style date is available, if not language should - // fallback to 2 letter code eg "de" - if (!dates[lang]){ - lang = lang.split('-')[0]; - if (!dates[lang]) - return; - } - var d = dates[lang]; - $.each(locale_opts, function(i,k){ - if (k in d) - out[k] = d[k]; - }); - return out; - } - - var old = $.fn.datepicker; - var datepickerPlugin = function(option){ - var args = Array.apply(null, arguments); - args.shift(); - var internal_return; - this.each(function(){ - var $this = $(this), - data = $this.data('datepicker'), - options = typeof option === 'object' && option; - if (!data){ - var elopts = opts_from_el(this, 'date'), - // Preliminary otions - xopts = $.extend({}, defaults, elopts, options), - locopts = opts_from_locale(xopts.language), - // Options priority: js args, data-attrs, locales, defaults - opts = $.extend({}, defaults, locopts, elopts, options); - if ($this.hasClass('input-daterange') || opts.inputs){ - $.extend(opts, { - inputs: opts.inputs || $this.find('input').toArray() - }); - data = new DateRangePicker(this, opts); - } - else { - data = new Datepicker(this, opts); - } - $this.data('datepicker', data); - } - if (typeof option === 'string' && typeof data[option] === 'function'){ - internal_return = data[option].apply(data, args); - } - }); - - if ( - internal_return === undefined || - internal_return instanceof Datepicker || - internal_return instanceof DateRangePicker - ) - return this; - - if (this.length > 1) - throw new Error('Using only allowed for the collection of a single element (' + option + ' function)'); - else - return internal_return; - }; - $.fn.datepicker = datepickerPlugin; - - var defaults = $.fn.datepicker.defaults = { - autoclose: false, - beforeShowDay: $.noop, - beforeShowMonth: $.noop, - beforeShowYear: $.noop, - calendarWeeks: false, - clearBtn: false, - toggleActive: false, - daysOfWeekDisabled: [], - daysOfWeekHighlighted: [], - datesDisabled: [], - endDate: Infinity, - forceParse: true, - format: 'mm/dd/yyyy', - keyboardNavigation: true, - language: 'en', - minViewMode: 0, - maxViewMode: 2, - multidate: false, - multidateSeparator: ',', - orientation: "auto", - rtl: false, - startDate: -Infinity, - startView: 0, - todayBtn: false, - todayHighlight: false, - weekStart: 0, - disableTouchKeyboard: false, - enableOnReadonly: true, - showOnFocus: true, - zIndexOffset: 10, - container: 'body', - immediateUpdates: false, - title: '' - }; - var locale_opts = $.fn.datepicker.locale_opts = [ - 'format', - 'rtl', - 'weekStart' - ]; - $.fn.datepicker.Constructor = Datepicker; - var dates = $.fn.datepicker.dates = { - en: { - days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], - daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], - daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], - months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], - monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], - today: "Today", - clear: "Clear", - titleFormat: "MM yyyy" - } - }; - - var DPGlobal = { - modes: [ - { - clsName: 'days', - navFnc: 'Month', - navStep: 1 - }, - { - clsName: 'months', - navFnc: 'FullYear', - navStep: 1 - }, - { - clsName: 'years', - navFnc: 'FullYear', - navStep: 10 - }], - isLeapYear: function(year){ - return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)); - }, - getDaysInMonth: function(year, month){ - return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]; - }, - validParts: /dd?|DD?|mm?|MM?|yy(?:yy)?/g, - nonpunctuation: /[^ -\/:-@\[\u3400-\u9fff-`{-~\t\n\r]+/g, - parseFormat: function(format){ - if (typeof format.toValue === 'function' && typeof format.toDisplay === 'function') - return format; - // IE treats \0 as a string end in inputs (truncating the value), - // so it's a bad format delimiter, anyway - var separators = format.replace(this.validParts, '\0').split('\0'), - parts = format.match(this.validParts); - if (!separators || !separators.length || !parts || parts.length === 0){ - throw new Error("Invalid date format."); - } - return {separators: separators, parts: parts}; - }, - parseDate: function(date, format, language){ - if (!date) - return undefined; - if (date instanceof Date) - return date; - if (typeof format === 'string') - format = DPGlobal.parseFormat(format); - if (format.toValue) - return format.toValue(date, format, language); - var part_re = /([\-+]\d+)([dmwy])/, - parts = date.match(/([\-+]\d+)([dmwy])/g), - fn_map = { - d: 'moveDay', - m: 'moveMonth', - w: 'moveWeek', - y: 'moveYear' - }, - part, dir, i, fn; - if (/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/.test(date)){ - date = new Date(); - for (i=0; i < parts.length; i++){ - part = part_re.exec(parts[i]); - dir = parseInt(part[1]); - fn = fn_map[part[2]]; - date = Datepicker.prototype[fn](date, dir); - } - return UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()); - } - parts = date && date.match(this.nonpunctuation) || []; - date = new Date(); - var parsed = {}, - setters_order = ['yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'd', 'dd'], - setters_map = { - yyyy: function(d,v){ - return d.setUTCFullYear(v); - }, - yy: function(d,v){ - return d.setUTCFullYear(2000+v); - }, - m: function(d,v){ - if (isNaN(d)) - return d; - v -= 1; - while (v < 0) v += 12; - v %= 12; - d.setUTCMonth(v); - while (d.getUTCMonth() !== v) - d.setUTCDate(d.getUTCDate()-1); - return d; - }, - d: function(d,v){ - return d.setUTCDate(v); - } - }, - val, filtered; - setters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m']; - setters_map['dd'] = setters_map['d']; - date = UTCToday(); - var fparts = format.parts.slice(); - // Remove noop parts - if (parts.length !== fparts.length){ - fparts = $(fparts).filter(function(i,p){ - return $.inArray(p, setters_order) !== -1; - }).toArray(); - } - // Process remainder - function match_part(){ - var m = this.slice(0, parts[i].length), - p = parts[i].slice(0, m.length); - return m.toLowerCase() === p.toLowerCase(); - } - if (parts.length === fparts.length){ - var cnt; - for (i=0, cnt = fparts.length; i < cnt; i++){ - val = parseInt(parts[i], 10); - part = fparts[i]; - if (isNaN(val)){ - switch (part){ - case 'MM': - filtered = $(dates[language].months).filter(match_part); - val = $.inArray(filtered[0], dates[language].months) + 1; - break; - case 'M': - filtered = $(dates[language].monthsShort).filter(match_part); - val = $.inArray(filtered[0], dates[language].monthsShort) + 1; - break; - } - } - parsed[part] = val; - } - var _date, s; - for (i=0; i < setters_order.length; i++){ - s = setters_order[i]; - if (s in parsed && !isNaN(parsed[s])){ - _date = new Date(date); - setters_map[s](_date, parsed[s]); - if (!isNaN(_date)) - date = _date; - } - } - } - return date; - }, - formatDate: function(date, format, language){ - if (!date) - return ''; - if (typeof format === 'string') - format = DPGlobal.parseFormat(format); - if (format.toDisplay) - return format.toDisplay(date, format, language); - var val = { - d: date.getUTCDate(), - D: dates[language].daysShort[date.getUTCDay()], - DD: dates[language].days[date.getUTCDay()], - m: date.getUTCMonth() + 1, - M: dates[language].monthsShort[date.getUTCMonth()], - MM: dates[language].months[date.getUTCMonth()], - yy: date.getUTCFullYear().toString().substring(2), - yyyy: date.getUTCFullYear() - }; - val.dd = (val.d < 10 ? '0' : '') + val.d; - val.mm = (val.m < 10 ? '0' : '') + val.m; - date = []; - var seps = $.extend([], format.separators); - for (var i=0, cnt = format.parts.length; i <= cnt; i++){ - if (seps.length) - date.push(seps.shift()); - date.push(val[format.parts[i]]); - } - return date.join(''); - }, - headTemplate: ''+ - ''+ - ''+ - ''+ - ''+ - '«'+ - ''+ - '»'+ - ''+ - '', - contTemplate: '', - footTemplate: ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - '' - }; - DPGlobal.template = '
'+ - '
'+ - ''+ - DPGlobal.headTemplate+ - ''+ - DPGlobal.footTemplate+ - '
'+ - '
'+ - '
'+ - ''+ - DPGlobal.headTemplate+ - DPGlobal.contTemplate+ - DPGlobal.footTemplate+ - '
'+ - '
'+ - '
'+ - ''+ - DPGlobal.headTemplate+ - DPGlobal.contTemplate+ - DPGlobal.footTemplate+ - '
'+ - '
'+ - '
'; - - $.fn.datepicker.DPGlobal = DPGlobal; - - - /* DATEPICKER NO CONFLICT - * =================== */ - - $.fn.datepicker.noConflict = function(){ - $.fn.datepicker = old; - return this; - }; - - /* DATEPICKER VERSION - * =================== */ - $.fn.datepicker.version = '1.5.1'; - - /* DATEPICKER DATA-API - * ================== */ - - $(document).on( - 'focus.datepicker.data-api click.datepicker.data-api', - '[data-provide="datepicker"]', - function(e){ - var $this = $(this); - if ($this.data('datepicker')) - return; - e.preventDefault(); - // component click requires us to explicitly show it - datepickerPlugin.call($this, 'show'); - } - ); - $(function(){ - datepickerPlugin.call($('[data-provide="datepicker-inline"]')); - }); - -})); diff --git a/client/lib/bootstrap-datepicker3.css b/client/lib/bootstrap-datepicker3.css deleted file mode 100644 index 3238d2631..000000000 --- a/client/lib/bootstrap-datepicker3.css +++ /dev/null @@ -1,791 +0,0 @@ -/*! - * Datepicker for Bootstrap v1.5.1 (https://github.com/eternicode/bootstrap-datepicker) - * - * Copyright 2012 Stefan Petre - * Improvements by Andrew Rowls - * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) - */ -.datepicker { - border-radius: 4px; - direction: ltr; -} -.datepicker-inline { - width: 220px; -} -.datepicker.datepicker-rtl { - direction: rtl; -} -.datepicker.datepicker-rtl table tr td span { - float: right; -} -.datepicker-dropdown { - top: 0; - left: 0; - padding: 4px; -} -.datepicker-dropdown:before { - content: ''; - display: inline-block; - border-left: 7px solid transparent; - border-right: 7px solid transparent; - border-bottom: 7px solid rgba(0, 0, 0, 0.15); - border-top: 0; - border-bottom-color: rgba(0, 0, 0, 0.2); - position: absolute; -} -.datepicker-dropdown:after { - content: ''; - display: inline-block; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-bottom: 6px solid #ffffff; - border-top: 0; - position: absolute; -} -.datepicker-dropdown.datepicker-orient-left:before { - left: 6px; -} -.datepicker-dropdown.datepicker-orient-left:after { - left: 7px; -} -.datepicker-dropdown.datepicker-orient-right:before { - right: 6px; -} -.datepicker-dropdown.datepicker-orient-right:after { - right: 7px; -} -.datepicker-dropdown.datepicker-orient-bottom:before { - top: -7px; -} -.datepicker-dropdown.datepicker-orient-bottom:after { - top: -6px; -} -.datepicker-dropdown.datepicker-orient-top:before { - bottom: -7px; - border-bottom: 0; - border-top: 7px solid rgba(0, 0, 0, 0.15); -} -.datepicker-dropdown.datepicker-orient-top:after { - bottom: -6px; - border-bottom: 0; - border-top: 6px solid #ffffff; -} -.datepicker > div { - display: none; -} -.datepicker table { - margin: 0; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.datepicker table tr td, -.datepicker table tr th { - text-align: center; - width: 30px; - height: 30px; - border-radius: 4px; - border: none; -} -.table-striped .datepicker table tr td, -.table-striped .datepicker table tr th { - background-color: transparent; -} -.datepicker table tr td.old, -.datepicker table tr td.new { - color: #999999; -} -.datepicker table tr td.day:hover, -.datepicker table tr td.focused { - background: #eeeeee; - cursor: pointer; -} -.datepicker table tr td.disabled, -.datepicker table tr td.disabled:hover { - background: none; - color: #999999; - cursor: default; -} -.datepicker table tr td.highlighted { - color: #000000; - background-color: #d9edf7; - border-color: #85c5e5; - border-radius: 0; -} -.datepicker table tr td.highlighted:focus, -.datepicker table tr td.highlighted.focus { - color: #000000; - background-color: #afd9ee; - border-color: #298fc2; -} -.datepicker table tr td.highlighted:hover { - color: #000000; - background-color: #afd9ee; - border-color: #52addb; -} -.datepicker table tr td.highlighted:active, -.datepicker table tr td.highlighted.active, -.open > .dropdown-toggle.datepicker table tr td.highlighted { - color: #000000; - background-color: #afd9ee; - border-color: #52addb; -} -.datepicker table tr td.highlighted:active:hover, -.datepicker table tr td.highlighted.active:hover, -.open > .dropdown-toggle.datepicker table tr td.highlighted:hover, -.datepicker table tr td.highlighted:active:focus, -.datepicker table tr td.highlighted.active:focus, -.open > .dropdown-toggle.datepicker table tr td.highlighted:focus, -.datepicker table tr td.highlighted:active.focus, -.datepicker table tr td.highlighted.active.focus, -.open > .dropdown-toggle.datepicker table tr td.highlighted.focus { - color: #000000; - background-color: #91cbe8; - border-color: #298fc2; -} -.datepicker table tr td.highlighted:active, -.datepicker table tr td.highlighted.active, -.open > .dropdown-toggle.datepicker table tr td.highlighted { - background-image: none; -} -.datepicker table tr td.highlighted.disabled:hover, -.datepicker table tr td.highlighted[disabled]:hover, -fieldset[disabled] .datepicker table tr td.highlighted:hover, -.datepicker table tr td.highlighted.disabled:focus, -.datepicker table tr td.highlighted[disabled]:focus, -fieldset[disabled] .datepicker table tr td.highlighted:focus, -.datepicker table tr td.highlighted.disabled.focus, -.datepicker table tr td.highlighted[disabled].focus, -fieldset[disabled] .datepicker table tr td.highlighted.focus { - background-color: #d9edf7; - border-color: #85c5e5; -} -.datepicker table tr td.highlighted.focused { - background: #afd9ee; -} -.datepicker table tr td.highlighted.disabled, -.datepicker table tr td.highlighted.disabled:active { - background: #d9edf7; - color: #999999; -} -.datepicker table tr td.today { - color: #000000; - background-color: #ffdb99; - border-color: #ffb733; -} -.datepicker table tr td.today:focus, -.datepicker table tr td.today.focus { - color: #000000; - background-color: #ffc966; - border-color: #b37400; -} -.datepicker table tr td.today:hover { - color: #000000; - background-color: #ffc966; - border-color: #f59e00; -} -.datepicker table tr td.today:active, -.datepicker table tr td.today.active, -.open > .dropdown-toggle.datepicker table tr td.today { - color: #000000; - background-color: #ffc966; - border-color: #f59e00; -} -.datepicker table tr td.today:active:hover, -.datepicker table tr td.today.active:hover, -.open > .dropdown-toggle.datepicker table tr td.today:hover, -.datepicker table tr td.today:active:focus, -.datepicker table tr td.today.active:focus, -.open > .dropdown-toggle.datepicker table tr td.today:focus, -.datepicker table tr td.today:active.focus, -.datepicker table tr td.today.active.focus, -.open > .dropdown-toggle.datepicker table tr td.today.focus { - color: #000000; - background-color: #ffbc42; - border-color: #b37400; -} -.datepicker table tr td.today:active, -.datepicker table tr td.today.active, -.open > .dropdown-toggle.datepicker table tr td.today { - background-image: none; -} -.datepicker table tr td.today.disabled:hover, -.datepicker table tr td.today[disabled]:hover, -fieldset[disabled] .datepicker table tr td.today:hover, -.datepicker table tr td.today.disabled:focus, -.datepicker table tr td.today[disabled]:focus, -fieldset[disabled] .datepicker table tr td.today:focus, -.datepicker table tr td.today.disabled.focus, -.datepicker table tr td.today[disabled].focus, -fieldset[disabled] .datepicker table tr td.today.focus { - background-color: #ffdb99; - border-color: #ffb733; -} -.datepicker table tr td.today.focused { - background: #ffc966; -} -.datepicker table tr td.today.disabled, -.datepicker table tr td.today.disabled:active { - background: #ffdb99; - color: #999999; -} -.datepicker table tr td.range { - color: #000000; - background-color: #eeeeee; - border-color: #bbbbbb; - border-radius: 0; -} -.datepicker table tr td.range:focus, -.datepicker table tr td.range.focus { - color: #000000; - background-color: #d5d5d5; - border-color: #7c7c7c; -} -.datepicker table tr td.range:hover { - color: #000000; - background-color: #d5d5d5; - border-color: #9d9d9d; -} -.datepicker table tr td.range:active, -.datepicker table tr td.range.active, -.open > .dropdown-toggle.datepicker table tr td.range { - color: #000000; - background-color: #d5d5d5; - border-color: #9d9d9d; -} -.datepicker table tr td.range:active:hover, -.datepicker table tr td.range.active:hover, -.open > .dropdown-toggle.datepicker table tr td.range:hover, -.datepicker table tr td.range:active:focus, -.datepicker table tr td.range.active:focus, -.open > .dropdown-toggle.datepicker table tr td.range:focus, -.datepicker table tr td.range:active.focus, -.datepicker table tr td.range.active.focus, -.open > .dropdown-toggle.datepicker table tr td.range.focus { - color: #000000; - background-color: #c3c3c3; - border-color: #7c7c7c; -} -.datepicker table tr td.range:active, -.datepicker table tr td.range.active, -.open > .dropdown-toggle.datepicker table tr td.range { - background-image: none; -} -.datepicker table tr td.range.disabled:hover, -.datepicker table tr td.range[disabled]:hover, -fieldset[disabled] .datepicker table tr td.range:hover, -.datepicker table tr td.range.disabled:focus, -.datepicker table tr td.range[disabled]:focus, -fieldset[disabled] .datepicker table tr td.range:focus, -.datepicker table tr td.range.disabled.focus, -.datepicker table tr td.range[disabled].focus, -fieldset[disabled] .datepicker table tr td.range.focus { - background-color: #eeeeee; - border-color: #bbbbbb; -} -.datepicker table tr td.range.focused { - background: #d5d5d5; -} -.datepicker table tr td.range.disabled, -.datepicker table tr td.range.disabled:active { - background: #eeeeee; - color: #999999; -} -.datepicker table tr td.range.highlighted { - color: #000000; - background-color: #e4eef3; - border-color: #9dc1d3; -} -.datepicker table tr td.range.highlighted:focus, -.datepicker table tr td.range.highlighted.focus { - color: #000000; - background-color: #c1d7e3; - border-color: #4b88a6; -} -.datepicker table tr td.range.highlighted:hover { - color: #000000; - background-color: #c1d7e3; - border-color: #73a6c0; -} -.datepicker table tr td.range.highlighted:active, -.datepicker table tr td.range.highlighted.active, -.open > .dropdown-toggle.datepicker table tr td.range.highlighted { - color: #000000; - background-color: #c1d7e3; - border-color: #73a6c0; -} -.datepicker table tr td.range.highlighted:active:hover, -.datepicker table tr td.range.highlighted.active:hover, -.open > .dropdown-toggle.datepicker table tr td.range.highlighted:hover, -.datepicker table tr td.range.highlighted:active:focus, -.datepicker table tr td.range.highlighted.active:focus, -.open > .dropdown-toggle.datepicker table tr td.range.highlighted:focus, -.datepicker table tr td.range.highlighted:active.focus, -.datepicker table tr td.range.highlighted.active.focus, -.open > .dropdown-toggle.datepicker table tr td.range.highlighted.focus { - color: #000000; - background-color: #a8c8d8; - border-color: #4b88a6; -} -.datepicker table tr td.range.highlighted:active, -.datepicker table tr td.range.highlighted.active, -.open > .dropdown-toggle.datepicker table tr td.range.highlighted { - background-image: none; -} -.datepicker table tr td.range.highlighted.disabled:hover, -.datepicker table tr td.range.highlighted[disabled]:hover, -fieldset[disabled] .datepicker table tr td.range.highlighted:hover, -.datepicker table tr td.range.highlighted.disabled:focus, -.datepicker table tr td.range.highlighted[disabled]:focus, -fieldset[disabled] .datepicker table tr td.range.highlighted:focus, -.datepicker table tr td.range.highlighted.disabled.focus, -.datepicker table tr td.range.highlighted[disabled].focus, -fieldset[disabled] .datepicker table tr td.range.highlighted.focus { - background-color: #e4eef3; - border-color: #9dc1d3; -} -.datepicker table tr td.range.highlighted.focused { - background: #c1d7e3; -} -.datepicker table tr td.range.highlighted.disabled, -.datepicker table tr td.range.highlighted.disabled:active { - background: #e4eef3; - color: #999999; -} -.datepicker table tr td.range.today { - color: #000000; - background-color: #f7ca77; - border-color: #f1a417; -} -.datepicker table tr td.range.today:focus, -.datepicker table tr td.range.today.focus { - color: #000000; - background-color: #f4b747; - border-color: #815608; -} -.datepicker table tr td.range.today:hover { - color: #000000; - background-color: #f4b747; - border-color: #bf800c; -} -.datepicker table tr td.range.today:active, -.datepicker table tr td.range.today.active, -.open > .dropdown-toggle.datepicker table tr td.range.today { - color: #000000; - background-color: #f4b747; - border-color: #bf800c; -} -.datepicker table tr td.range.today:active:hover, -.datepicker table tr td.range.today.active:hover, -.open > .dropdown-toggle.datepicker table tr td.range.today:hover, -.datepicker table tr td.range.today:active:focus, -.datepicker table tr td.range.today.active:focus, -.open > .dropdown-toggle.datepicker table tr td.range.today:focus, -.datepicker table tr td.range.today:active.focus, -.datepicker table tr td.range.today.active.focus, -.open > .dropdown-toggle.datepicker table tr td.range.today.focus { - color: #000000; - background-color: #f2aa25; - border-color: #815608; -} -.datepicker table tr td.range.today:active, -.datepicker table tr td.range.today.active, -.open > .dropdown-toggle.datepicker table tr td.range.today { - background-image: none; -} -.datepicker table tr td.range.today.disabled:hover, -.datepicker table tr td.range.today[disabled]:hover, -fieldset[disabled] .datepicker table tr td.range.today:hover, -.datepicker table tr td.range.today.disabled:focus, -.datepicker table tr td.range.today[disabled]:focus, -fieldset[disabled] .datepicker table tr td.range.today:focus, -.datepicker table tr td.range.today.disabled.focus, -.datepicker table tr td.range.today[disabled].focus, -fieldset[disabled] .datepicker table tr td.range.today.focus { - background-color: #f7ca77; - border-color: #f1a417; -} -.datepicker table tr td.range.today.disabled, -.datepicker table tr td.range.today.disabled:active { - background: #f7ca77; - color: #999999; -} -.datepicker table tr td.selected, -.datepicker table tr td.selected.highlighted { - color: #ffffff; - background-color: #999999; - border-color: #555555; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} -.datepicker table tr td.selected:focus, -.datepicker table tr td.selected.highlighted:focus, -.datepicker table tr td.selected.focus, -.datepicker table tr td.selected.highlighted.focus { - color: #ffffff; - background-color: #808080; - border-color: #161616; -} -.datepicker table tr td.selected:hover, -.datepicker table tr td.selected.highlighted:hover { - color: #ffffff; - background-color: #808080; - border-color: #373737; -} -.datepicker table tr td.selected:active, -.datepicker table tr td.selected.highlighted:active, -.datepicker table tr td.selected.active, -.datepicker table tr td.selected.highlighted.active, -.open > .dropdown-toggle.datepicker table tr td.selected, -.open > .dropdown-toggle.datepicker table tr td.selected.highlighted { - color: #ffffff; - background-color: #808080; - border-color: #373737; -} -.datepicker table tr td.selected:active:hover, -.datepicker table tr td.selected.highlighted:active:hover, -.datepicker table tr td.selected.active:hover, -.datepicker table tr td.selected.highlighted.active:hover, -.open > .dropdown-toggle.datepicker table tr td.selected:hover, -.open > .dropdown-toggle.datepicker table tr td.selected.highlighted:hover, -.datepicker table tr td.selected:active:focus, -.datepicker table tr td.selected.highlighted:active:focus, -.datepicker table tr td.selected.active:focus, -.datepicker table tr td.selected.highlighted.active:focus, -.open > .dropdown-toggle.datepicker table tr td.selected:focus, -.open > .dropdown-toggle.datepicker table tr td.selected.highlighted:focus, -.datepicker table tr td.selected:active.focus, -.datepicker table tr td.selected.highlighted:active.focus, -.datepicker table tr td.selected.active.focus, -.datepicker table tr td.selected.highlighted.active.focus, -.open > .dropdown-toggle.datepicker table tr td.selected.focus, -.open > .dropdown-toggle.datepicker table tr td.selected.highlighted.focus { - color: #ffffff; - background-color: #6e6e6e; - border-color: #161616; -} -.datepicker table tr td.selected:active, -.datepicker table tr td.selected.highlighted:active, -.datepicker table tr td.selected.active, -.datepicker table tr td.selected.highlighted.active, -.open > .dropdown-toggle.datepicker table tr td.selected, -.open > .dropdown-toggle.datepicker table tr td.selected.highlighted { - background-image: none; -} -.datepicker table tr td.selected.disabled:hover, -.datepicker table tr td.selected.highlighted.disabled:hover, -.datepicker table tr td.selected[disabled]:hover, -.datepicker table tr td.selected.highlighted[disabled]:hover, -fieldset[disabled] .datepicker table tr td.selected:hover, -fieldset[disabled] .datepicker table tr td.selected.highlighted:hover, -.datepicker table tr td.selected.disabled:focus, -.datepicker table tr td.selected.highlighted.disabled:focus, -.datepicker table tr td.selected[disabled]:focus, -.datepicker table tr td.selected.highlighted[disabled]:focus, -fieldset[disabled] .datepicker table tr td.selected:focus, -fieldset[disabled] .datepicker table tr td.selected.highlighted:focus, -.datepicker table tr td.selected.disabled.focus, -.datepicker table tr td.selected.highlighted.disabled.focus, -.datepicker table tr td.selected[disabled].focus, -.datepicker table tr td.selected.highlighted[disabled].focus, -fieldset[disabled] .datepicker table tr td.selected.focus, -fieldset[disabled] .datepicker table tr td.selected.highlighted.focus { - background-color: #999999; - border-color: #555555; -} -.datepicker table tr td.active, -.datepicker table tr td.active.highlighted { - color: #ffffff; - background-color: #428bca; - border-color: #357ebd; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} -.datepicker table tr td.active:focus, -.datepicker table tr td.active.highlighted:focus, -.datepicker table tr td.active.focus, -.datepicker table tr td.active.highlighted.focus { - color: #ffffff; - background-color: #3071a9; - border-color: #193c5a; -} -.datepicker table tr td.active:hover, -.datepicker table tr td.active.highlighted:hover { - color: #ffffff; - background-color: #3071a9; - border-color: #285e8e; -} -.datepicker table tr td.active:active, -.datepicker table tr td.active.highlighted:active, -.datepicker table tr td.active.active, -.datepicker table tr td.active.highlighted.active, -.open > .dropdown-toggle.datepicker table tr td.active, -.open > .dropdown-toggle.datepicker table tr td.active.highlighted { - color: #ffffff; - background-color: #3071a9; - border-color: #285e8e; -} -.datepicker table tr td.active:active:hover, -.datepicker table tr td.active.highlighted:active:hover, -.datepicker table tr td.active.active:hover, -.datepicker table tr td.active.highlighted.active:hover, -.open > .dropdown-toggle.datepicker table tr td.active:hover, -.open > .dropdown-toggle.datepicker table tr td.active.highlighted:hover, -.datepicker table tr td.active:active:focus, -.datepicker table tr td.active.highlighted:active:focus, -.datepicker table tr td.active.active:focus, -.datepicker table tr td.active.highlighted.active:focus, -.open > .dropdown-toggle.datepicker table tr td.active:focus, -.open > .dropdown-toggle.datepicker table tr td.active.highlighted:focus, -.datepicker table tr td.active:active.focus, -.datepicker table tr td.active.highlighted:active.focus, -.datepicker table tr td.active.active.focus, -.datepicker table tr td.active.highlighted.active.focus, -.open > .dropdown-toggle.datepicker table tr td.active.focus, -.open > .dropdown-toggle.datepicker table tr td.active.highlighted.focus { - color: #ffffff; - background-color: #285e8e; - border-color: #193c5a; -} -.datepicker table tr td.active:active, -.datepicker table tr td.active.highlighted:active, -.datepicker table tr td.active.active, -.datepicker table tr td.active.highlighted.active, -.open > .dropdown-toggle.datepicker table tr td.active, -.open > .dropdown-toggle.datepicker table tr td.active.highlighted { - background-image: none; -} -.datepicker table tr td.active.disabled:hover, -.datepicker table tr td.active.highlighted.disabled:hover, -.datepicker table tr td.active[disabled]:hover, -.datepicker table tr td.active.highlighted[disabled]:hover, -fieldset[disabled] .datepicker table tr td.active:hover, -fieldset[disabled] .datepicker table tr td.active.highlighted:hover, -.datepicker table tr td.active.disabled:focus, -.datepicker table tr td.active.highlighted.disabled:focus, -.datepicker table tr td.active[disabled]:focus, -.datepicker table tr td.active.highlighted[disabled]:focus, -fieldset[disabled] .datepicker table tr td.active:focus, -fieldset[disabled] .datepicker table tr td.active.highlighted:focus, -.datepicker table tr td.active.disabled.focus, -.datepicker table tr td.active.highlighted.disabled.focus, -.datepicker table tr td.active[disabled].focus, -.datepicker table tr td.active.highlighted[disabled].focus, -fieldset[disabled] .datepicker table tr td.active.focus, -fieldset[disabled] .datepicker table tr td.active.highlighted.focus { - background-color: #428bca; - border-color: #357ebd; -} -.datepicker table tr td span { - display: block; - width: 23%; - height: 54px; - line-height: 54px; - float: left; - margin: 1%; - cursor: pointer; - border-radius: 4px; -} -.datepicker table tr td span:hover { - background: #eeeeee; -} -.datepicker table tr td span.disabled, -.datepicker table tr td span.disabled:hover { - background: none; - color: #999999; - cursor: default; -} -.datepicker table tr td span.active, -.datepicker table tr td span.active:hover, -.datepicker table tr td span.active.disabled, -.datepicker table tr td span.active.disabled:hover { - color: #ffffff; - background-color: #428bca; - border-color: #357ebd; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} -.datepicker table tr td span.active:focus, -.datepicker table tr td span.active:hover:focus, -.datepicker table tr td span.active.disabled:focus, -.datepicker table tr td span.active.disabled:hover:focus, -.datepicker table tr td span.active.focus, -.datepicker table tr td span.active:hover.focus, -.datepicker table tr td span.active.disabled.focus, -.datepicker table tr td span.active.disabled:hover.focus { - color: #ffffff; - background-color: #3071a9; - border-color: #193c5a; -} -.datepicker table tr td span.active:hover, -.datepicker table tr td span.active:hover:hover, -.datepicker table tr td span.active.disabled:hover, -.datepicker table tr td span.active.disabled:hover:hover { - color: #ffffff; - background-color: #3071a9; - border-color: #285e8e; -} -.datepicker table tr td span.active:active, -.datepicker table tr td span.active:hover:active, -.datepicker table tr td span.active.disabled:active, -.datepicker table tr td span.active.disabled:hover:active, -.datepicker table tr td span.active.active, -.datepicker table tr td span.active:hover.active, -.datepicker table tr td span.active.disabled.active, -.datepicker table tr td span.active.disabled:hover.active, -.open > .dropdown-toggle.datepicker table tr td span.active, -.open > .dropdown-toggle.datepicker table tr td span.active:hover, -.open > .dropdown-toggle.datepicker table tr td span.active.disabled, -.open > .dropdown-toggle.datepicker table tr td span.active.disabled:hover { - color: #ffffff; - background-color: #3071a9; - border-color: #285e8e; -} -.datepicker table tr td span.active:active:hover, -.datepicker table tr td span.active:hover:active:hover, -.datepicker table tr td span.active.disabled:active:hover, -.datepicker table tr td span.active.disabled:hover:active:hover, -.datepicker table tr td span.active.active:hover, -.datepicker table tr td span.active:hover.active:hover, -.datepicker table tr td span.active.disabled.active:hover, -.datepicker table tr td span.active.disabled:hover.active:hover, -.open > .dropdown-toggle.datepicker table tr td span.active:hover, -.open > .dropdown-toggle.datepicker table tr td span.active:hover:hover, -.open > .dropdown-toggle.datepicker table tr td span.active.disabled:hover, -.open > .dropdown-toggle.datepicker table tr td span.active.disabled:hover:hover, -.datepicker table tr td span.active:active:focus, -.datepicker table tr td span.active:hover:active:focus, -.datepicker table tr td span.active.disabled:active:focus, -.datepicker table tr td span.active.disabled:hover:active:focus, -.datepicker table tr td span.active.active:focus, -.datepicker table tr td span.active:hover.active:focus, -.datepicker table tr td span.active.disabled.active:focus, -.datepicker table tr td span.active.disabled:hover.active:focus, -.open > .dropdown-toggle.datepicker table tr td span.active:focus, -.open > .dropdown-toggle.datepicker table tr td span.active:hover:focus, -.open > .dropdown-toggle.datepicker table tr td span.active.disabled:focus, -.open > .dropdown-toggle.datepicker table tr td span.active.disabled:hover:focus, -.datepicker table tr td span.active:active.focus, -.datepicker table tr td span.active:hover:active.focus, -.datepicker table tr td span.active.disabled:active.focus, -.datepicker table tr td span.active.disabled:hover:active.focus, -.datepicker table tr td span.active.active.focus, -.datepicker table tr td span.active:hover.active.focus, -.datepicker table tr td span.active.disabled.active.focus, -.datepicker table tr td span.active.disabled:hover.active.focus, -.open > .dropdown-toggle.datepicker table tr td span.active.focus, -.open > .dropdown-toggle.datepicker table tr td span.active:hover.focus, -.open > .dropdown-toggle.datepicker table tr td span.active.disabled.focus, -.open > .dropdown-toggle.datepicker table tr td span.active.disabled:hover.focus { - color: #ffffff; - background-color: #285e8e; - border-color: #193c5a; -} -.datepicker table tr td span.active:active, -.datepicker table tr td span.active:hover:active, -.datepicker table tr td span.active.disabled:active, -.datepicker table tr td span.active.disabled:hover:active, -.datepicker table tr td span.active.active, -.datepicker table tr td span.active:hover.active, -.datepicker table tr td span.active.disabled.active, -.datepicker table tr td span.active.disabled:hover.active, -.open > .dropdown-toggle.datepicker table tr td span.active, -.open > .dropdown-toggle.datepicker table tr td span.active:hover, -.open > .dropdown-toggle.datepicker table tr td span.active.disabled, -.open > .dropdown-toggle.datepicker table tr td span.active.disabled:hover { - background-image: none; -} -.datepicker table tr td span.active.disabled:hover, -.datepicker table tr td span.active:hover.disabled:hover, -.datepicker table tr td span.active.disabled.disabled:hover, -.datepicker table tr td span.active.disabled:hover.disabled:hover, -.datepicker table tr td span.active[disabled]:hover, -.datepicker table tr td span.active:hover[disabled]:hover, -.datepicker table tr td span.active.disabled[disabled]:hover, -.datepicker table tr td span.active.disabled:hover[disabled]:hover, -fieldset[disabled] .datepicker table tr td span.active:hover, -fieldset[disabled] .datepicker table tr td span.active:hover:hover, -fieldset[disabled] .datepicker table tr td span.active.disabled:hover, -fieldset[disabled] .datepicker table tr td span.active.disabled:hover:hover, -.datepicker table tr td span.active.disabled:focus, -.datepicker table tr td span.active:hover.disabled:focus, -.datepicker table tr td span.active.disabled.disabled:focus, -.datepicker table tr td span.active.disabled:hover.disabled:focus, -.datepicker table tr td span.active[disabled]:focus, -.datepicker table tr td span.active:hover[disabled]:focus, -.datepicker table tr td span.active.disabled[disabled]:focus, -.datepicker table tr td span.active.disabled:hover[disabled]:focus, -fieldset[disabled] .datepicker table tr td span.active:focus, -fieldset[disabled] .datepicker table tr td span.active:hover:focus, -fieldset[disabled] .datepicker table tr td span.active.disabled:focus, -fieldset[disabled] .datepicker table tr td span.active.disabled:hover:focus, -.datepicker table tr td span.active.disabled.focus, -.datepicker table tr td span.active:hover.disabled.focus, -.datepicker table tr td span.active.disabled.disabled.focus, -.datepicker table tr td span.active.disabled:hover.disabled.focus, -.datepicker table tr td span.active[disabled].focus, -.datepicker table tr td span.active:hover[disabled].focus, -.datepicker table tr td span.active.disabled[disabled].focus, -.datepicker table tr td span.active.disabled:hover[disabled].focus, -fieldset[disabled] .datepicker table tr td span.active.focus, -fieldset[disabled] .datepicker table tr td span.active:hover.focus, -fieldset[disabled] .datepicker table tr td span.active.disabled.focus, -fieldset[disabled] .datepicker table tr td span.active.disabled:hover.focus { - background-color: #428bca; - border-color: #357ebd; -} -.datepicker table tr td span.old, -.datepicker table tr td span.new { - color: #999999; -} -.datepicker .datepicker-switch { - width: 145px; -} -.datepicker .datepicker-switch, -.datepicker .prev, -.datepicker .next, -.datepicker tfoot tr th { - cursor: pointer; -} -.datepicker .datepicker-switch:hover, -.datepicker .prev:hover, -.datepicker .next:hover, -.datepicker tfoot tr th:hover { - background: #eeeeee; -} -.datepicker .cw { - font-size: 10px; - width: 12px; - padding: 0 2px 0 5px; - vertical-align: middle; -} -.input-group.date .input-group-addon { - cursor: pointer; -} -.input-daterange { - width: 100%; -} -.input-daterange input { - text-align: center; -} -.input-daterange input:first-child { - border-radius: 3px 0 0 3px; -} -.input-daterange input:last-child { - border-radius: 0 3px 3px 0; -} -.input-daterange .input-group-addon { - width: auto; - min-width: 16px; - padding: 4px 5px; - font-weight: normal; - line-height: 1.42857143; - text-align: center; - text-shadow: 0 1px 0 #fff; - vertical-align: middle; - background-color: #eeeeee; - border: solid #cccccc; - border-width: 1px 0; - margin-left: -5px; - margin-right: -5px; -} From cacaa0ee8c8811145df9a888ca5bce3c9178397d Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Tue, 22 Nov 2016 22:20:39 -0500 Subject: [PATCH 063/136] hack to avoid 'board not found' problem in Sandstorm --- sandstorm.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sandstorm.js b/sandstorm.js index dc5b10d62..3e04d79f6 100644 --- a/sandstorm.js +++ b/sandstorm.js @@ -428,6 +428,13 @@ if (isSandstorm && Meteor.isClient) { return url.replace(/^https?:\/\/127\.0\.0\.1:[0-9]{2,5}/, ''); }; Meteor.absoluteUrl.defaultOptions = _defaultOptions; + + // XXX Hack to fix https://github.com/wefork/wekan/issues/27 + // Sandstorm Wekan instances only ever have a single board, so there is no need + // to cache per-board subscriptions. + SubsManager.prototype.subscribe = function(...params) { + return Meteor.subscribe(...params); + }; } // We use this blaze helper in the UI to hide some templates that does not make From 6090ede8c98d98ba5d3664169cae4f2696ccd557 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Wed, 23 Nov 2016 20:57:33 -0500 Subject: [PATCH 064/136] set isLoaded to true on both transitionend and animationend --- client/components/cards/cardDetails.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index b6f17c239..303f16324 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -65,6 +65,9 @@ BlazeComponent.extendComponent({ [`${CSSEvents.transitionend} .js-card-details`]() { this.isLoaded.set(true); }, + [`${CSSEvents.animationend} .js-card-details`]() { + this.isLoaded.set(true); + }, }; return [{ From 606dbbbbf2e5ef4bccaadc4584d05c67d7148fc8 Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Fri, 25 Nov 2016 21:45:11 +0100 Subject: [PATCH 065/136] New option to set up minimum limit to show cards count for each list in board --- client/components/lists/listHeader.jade | 4 ++++ client/components/lists/listHeader.js | 8 ++++++++ client/components/main/layouts.styl | 6 ++++++ client/components/users/userHeader.jade | 5 +++++ client/components/users/userHeader.js | 11 +++++++++++ i18n/en.i18n.json | 2 ++ models/users.js | 17 +++++++++++++++++ 7 files changed, 53 insertions(+) diff --git a/client/components/lists/listHeader.jade b/client/components/lists/listHeader.jade index f9fe065ff..4171f824f 100644 --- a/client/components/lists/listHeader.jade +++ b/client/components/lists/listHeader.jade @@ -6,6 +6,10 @@ template(name="listHeader") h2.list-header-name( class="{{#if currentUser.isBoardMember}}js-open-inlined-form is-editable{{/if}}") = title + if showCardsCountForList cards.count + = cards.count + span.lowercase + | {{_ 'cards'}} if currentUser.isBoardMember if isWatching i.list-header-watch-icon.fa.fa-eye diff --git a/client/components/lists/listHeader.js b/client/components/lists/listHeader.js index c7ae8e629..4d468f213 100644 --- a/client/components/lists/listHeader.js +++ b/client/components/lists/listHeader.js @@ -13,6 +13,14 @@ BlazeComponent.extendComponent({ return list.findWatcher(Meteor.userId()); }, + limitToShowCardsCount() { + return Meteor.user().getLimitToShowCardsCount(); + }, + + showCardsCountForList(count) { + return count > this.limitToShowCardsCount(); + }, + events() { return [{ 'click .js-open-list-menu': Popup.open('listAction'), diff --git a/client/components/main/layouts.styl b/client/components/main/layouts.styl index 83d4d693e..138346449 100644 --- a/client/components/main/layouts.styl +++ b/client/components/main/layouts.styl @@ -1,3 +1,4 @@ + @import 'nib' global-reset() @@ -374,3 +375,8 @@ a .wrapper height: 100% margin: 0px + +.inline-input + height: 37px + margin: 8px 10px 0 0 + width: 50px diff --git a/client/components/users/userHeader.jade b/client/components/users/userHeader.jade index f7f6222a0..ad41e8aaa 100644 --- a/client/components/users/userHeader.jade +++ b/client/components/users/userHeader.jade @@ -72,3 +72,8 @@ template(name="changeSettingsPopup") | {{_ 'hide-system-messages'}} if hiddenSystemMessages i.fa.fa-check + li + label.bold + | {{_ 'show-cards-minimum-count'}} + input#show-cards-count-at.inline-input.left(type="number" value="#{showCardsCountAt}" min="1" max="99" onkeydown="return false") + input.js-apply-show-cards-at.left(type="submit" value="{{_ 'apply'}}") diff --git a/client/components/users/userHeader.js b/client/components/users/userHeader.js index 1c3903952..65b7e8c3c 100644 --- a/client/components/users/userHeader.js +++ b/client/components/users/userHeader.js @@ -95,10 +95,21 @@ Template.changeSettingsPopup.helpers({ hiddenSystemMessages() { return Meteor.user().hasHiddenSystemMessages(); }, + showCardsCountAt() { + return Meteor.user().getLimitToShowCardsCount(); + }, }); Template.changeSettingsPopup.events({ 'click .js-toggle-system-messages'() { Meteor.call('toggleSystemMessages'); }, + 'click .js-apply-show-cards-at'(evt, tpl) { + evt.preventDefault(); + const minLimit = parseInt(tpl.$('#show-cards-count-at').val()); + if (!isNaN(minLimit)) { + Meteor.call('changeLimitToShowCardsCount', minLimit); + Popup.back(); + } + }, }); diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index 6e2098c4f..141b6dfb7 100755 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -51,6 +51,7 @@ "all-boards": "All boards", "and-n-other-card": "And __count__ other card", "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", "archive": "Archive", "archive-all": "Archive All", @@ -278,6 +279,7 @@ "shortcut-show-shortcuts": "Bring up this shortcuts list", "shortcut-toggle-filterbar": "Toggle Filter Sidebar", "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", "signupPopup-title": "Create an Account", "star-board-title": "Click to star this board. It will show up at top of your boards list.", "starred-boards": "Starred Boards", diff --git a/models/users.js b/models/users.js index a65a2566b..278d069c0 100644 --- a/models/users.js +++ b/models/users.js @@ -79,6 +79,10 @@ Users.attachSchema(new SimpleSchema({ type: [String], optional: true, }, + 'profile.showCardsCountAt': { + type: Number, + optional: true, + }, 'profile.starredBoards': { type: [String], optional: true, @@ -180,6 +184,11 @@ Users.helpers({ } }, + getLimitToShowCardsCount() { + const profile = this.profile || {}; + return profile.showCardsCountAt; + }, + getName() { const profile = this.profile || {}; return profile.fullname || this.username; @@ -283,6 +292,10 @@ Users.mutations({ setAvatarUrl(avatarUrl) { return { $set: { 'profile.avatarUrl': avatarUrl }}; }, + + setShowCardsCountAt(limit) { + return { $set: { 'profile.showCardsCountAt': limit } }; + }, }); Meteor.methods({ @@ -299,6 +312,10 @@ Meteor.methods({ const user = Meteor.user(); user.toggleSystem(user.hasHiddenSystemMessages()); }, + changeLimitToShowCardsCount(limit) { + check(limit, Number); + Meteor.user().setShowCardsCountAt(limit); + } }); if (Meteor.isServer) { From 35778d26737c5ca1702c6c1f3ca1be0a90a9e8b8 Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Fri, 25 Nov 2016 21:53:18 +0100 Subject: [PATCH 066/136] fixed few overseights --- client/components/main/layouts.styl | 1 - client/components/users/userHeader.js | 2 +- models/users.js | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/client/components/main/layouts.styl b/client/components/main/layouts.styl index 138346449..38fd83ecc 100644 --- a/client/components/main/layouts.styl +++ b/client/components/main/layouts.styl @@ -1,4 +1,3 @@ - @import 'nib' global-reset() diff --git a/client/components/users/userHeader.js b/client/components/users/userHeader.js index 65b7e8c3c..98053ed16 100644 --- a/client/components/users/userHeader.js +++ b/client/components/users/userHeader.js @@ -106,7 +106,7 @@ Template.changeSettingsPopup.events({ }, 'click .js-apply-show-cards-at'(evt, tpl) { evt.preventDefault(); - const minLimit = parseInt(tpl.$('#show-cards-count-at').val()); + const minLimit = parseInt(tpl.$('#show-cards-count-at').val(), 10); if (!isNaN(minLimit)) { Meteor.call('changeLimitToShowCardsCount', minLimit); Popup.back(); diff --git a/models/users.js b/models/users.js index 278d069c0..58513231b 100644 --- a/models/users.js +++ b/models/users.js @@ -315,7 +315,7 @@ Meteor.methods({ changeLimitToShowCardsCount(limit) { check(limit, Number); Meteor.user().setShowCardsCountAt(limit); - } + }, }); if (Meteor.isServer) { From aa97867b3637b681e0b6dc5ffd4ec86bbc230fbd Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Mon, 28 Nov 2016 21:17:04 -0500 Subject: [PATCH 067/136] update Sandstorm metadata for release --- sandstorm-pkgdef.capnp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp index 5c0961f80..b70b3be62 100644 --- a/sandstorm-pkgdef.capnp +++ b/sandstorm-pkgdef.capnp @@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = ( appTitle = (defaultText = "Wekan"), # The name of the app as it is displayed to the user. - appVersion = 16, + appVersion = 17, # Increment this for every release. - appMarketingVersion = (defaultText = "0.11.0~2016-11-15"), + appMarketingVersion = (defaultText = "0.11.0~2016-11-28"), # Human-readable presentation of the app version. minUpgradableAppVersion = 0, From 4bbc6d8a7d62aa17e2e187e1bc1cb78d27e427f4 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Wed, 30 Nov 2016 22:28:05 +0200 Subject: [PATCH 068/136] Update platforms on README.md --- README.md | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 756103bdc..1caa0b593 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Since it is a free software, you don’t have to trust us with your data and can install Wekan on your own computer or server. In fact we encourage you to do that by providing one-click installation on various platforms. -Currently you can install Wekan fork on the following Platforms: +## Supported Platforms [Debian Wheezy 64bit][debian_wheezy] @@ -35,14 +35,38 @@ Currently you can install Wekan fork on the following Platforms: [![Install on Cloudron][cloudron_button]][cloudron_install] [![Try on Sandstorm][sandstorm_button]][sandstorm_appdemo] -These Platforms have not been tested yet, but are coming sometime, so links -don't work yet: +## Upcoming Platforms + +[Install from source][install_source] + +[Create Sandstorm .spk file from source][sandstorm_spk] [Docker][docker_image] +[Docker on SUSE Linux Enterprise Server 12 SP1][sles] + +[VirtualBox][virtualbox]: Needs to be updated for Wefork. + +Email to work on already working Heroku: Use 3rd party +email like SendGrid, update process.env.MAIL_URL , +change from email at Accounts.emailTeamplates.from , +new file in server folder called smtp.js on code +`Meteor.startup(function () });` . +TODO: Test and find a way to use API keys instead. + +Azure: Install from source. Azure endpoint needs to be added. Not tested yet. + +OpenShift: Not tested yet. + +Google Cloud: Needs info how to enable websockets. + +## License + Wekan fork is released under the very permissive [MIT license](LICENSE), and made with [Meteor](https://www.meteor.com). +## Roadmap + [Our roadmap is self-hosted on Wekan fork][roadmap] [fork_faq]: https://github.com/wefork/wekan/wiki/FAQ @@ -65,3 +89,8 @@ with [Meteor](https://www.meteor.com). [debian_wheezy]: https://github.com/soohwa/sps/blob/master/example/docs/1/wekan.md [travis_badge]: https://travis-ci.org/wefork/wekan.svg?branch=devel [travis_status]: https://travis-ci.org/wefork/wekan +[install_source]: https://github.com/wefork/wekan/wiki/Install-from-source +[sles]: https://github.com/wekan/wekan/wiki/Install-Wekan-Docker-on-SUSE-Linux-Enterprise-Server-12-SP1 +[virtualbox]: https://github.com/wekan/wekan/wiki/virtual-appliance +[sandstorm_spk]: https://github.com/wefork/wekan/issues/36 +[docker_image]: https://github.com/wefork/wekan/issues/33 From b75e5ef4c41d242345cc6d194ef0a964df3e14f7 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 1 Dec 2016 00:04:03 +0200 Subject: [PATCH 069/136] Add already committed features and bugfixes. --- CHANGELOG.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa4f3b024..abf3e324c 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,30 @@ +# v0.x Wekan fork upcoming release, already committed to devel branch + +This release adds the following new features: + +* Start- and Duedate for cards; +* Allow IE 11 to work; +* Option to hide system messages in the card; +* Option to setup minimum limit to show cards count + for each list in board; +* Option 'filter by empty' to filter by cards by 'no member' + and 'no label' properties; +* Speedup: Added MongoDB index on CardId into Comments collection. + +and fixes the following bugs: + +* Sandstorm: username handling, restore identity, eslint regressions, + board not found; +* Failure to load when navigator.language is Chinese or Finnish; +* Hover background for labels in filter sidebar. Now correctly + centered; +* Display message when user wants to choose existing username; +* Client sometimes fails to receive current user's profile; +* Old users could see broken presence indicatons on new users. + +Thanks to GitHub users dwrencha, fmonthel, mario-orlicky, pierreozoux, +shoetten, and xet7 for their contributions. + # v0.11 This release adds the following new features: From 2fd010b04d317a0b1745e734e81f46a5d4e6d5f0 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 1 Dec 2016 00:05:46 +0200 Subject: [PATCH 070/136] Fix typo. --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index abf3e324c..130af6d4a 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,7 +20,7 @@ and fixes the following bugs: centered; * Display message when user wants to choose existing username; * Client sometimes fails to receive current user's profile; -* Old users could see broken presence indicatons on new users. +* Old users could see broken presence indicators on new users. Thanks to GitHub users dwrencha, fmonthel, mario-orlicky, pierreozoux, shoetten, and xet7 for their contributions. From 8050c7c6c67b95e490c42b8cfd56521c8a36fd1e Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 13 Dec 2016 09:37:53 +0200 Subject: [PATCH 071/136] Update translations. --- .tx/config | 4 +- README.md | 3 + i18n/ar.i18n.json | 0 i18n/br.i18n.json | 263 +++++++++++++++++++++++++++++++++++++++++++ i18n/ca.i18n.json | 0 i18n/cmn.i18n.json | 263 +++++++++++++++++++++++++++++++++++++++++++ i18n/de.i18n.json | 0 i18n/en.i18n.json | 0 i18n/es.i18n.json | 0 i18n/fa_IR.i18n.json | 263 +++++++++++++++++++++++++++++++++++++++++++ i18n/fi.i18n.json | 0 i18n/fr.i18n.json | 0 i18n/it.i18n.json | 0 i18n/ja.i18n.json | 0 i18n/ko.i18n.json | 0 i18n/pt-BR.i18n.json | 0 i18n/ro_RO.i18n.json | 263 +++++++++++++++++++++++++++++++++++++++++++ i18n/ru.i18n.json | 0 i18n/sr.i18n.json | 263 +++++++++++++++++++++++++++++++++++++++++++ i18n/tr.i18n.json | 0 i18n/zh-CN.i18n.json | 0 21 files changed, 1320 insertions(+), 2 deletions(-) mode change 100755 => 100644 i18n/ar.i18n.json create mode 100644 i18n/br.i18n.json mode change 100755 => 100644 i18n/ca.i18n.json create mode 100644 i18n/cmn.i18n.json mode change 100755 => 100644 i18n/de.i18n.json mode change 100755 => 100644 i18n/en.i18n.json mode change 100755 => 100644 i18n/es.i18n.json create mode 100644 i18n/fa_IR.i18n.json mode change 100755 => 100644 i18n/fi.i18n.json mode change 100755 => 100644 i18n/fr.i18n.json mode change 100755 => 100644 i18n/it.i18n.json mode change 100755 => 100644 i18n/ja.i18n.json mode change 100755 => 100644 i18n/ko.i18n.json mode change 100755 => 100644 i18n/pt-BR.i18n.json create mode 100644 i18n/ro_RO.i18n.json mode change 100755 => 100644 i18n/ru.i18n.json create mode 100644 i18n/sr.i18n.json mode change 100755 => 100644 i18n/tr.i18n.json mode change 100755 => 100644 i18n/zh-CN.i18n.json diff --git a/.tx/config b/.tx/config index 9238fdd38..5027c7e63 100644 --- a/.tx/config +++ b/.tx/config @@ -41,7 +41,7 @@ host = https://www.transifex.com # or the other, so we need to do a Manual mapping. lang_map = es_ES: es-ES, fi_FI:fi, pt_BR:pt-BR, zh_CN:zh-CN, zh_TW: zh-TW -[wekan.application] +[wefork.application] file_filter = i18n/.i18n.json source_lang = en type = KEYVALUEJSON @@ -49,7 +49,7 @@ type = KEYVALUEJSON # We might have a dedicated second resource later to translate the “Welcome # Board” data. # -# [wekan.welcomeBoard] +# [wefork.welcomeBoard] # file_filter = private/welcomeBoard/.json # source_lang = en # type = KEYVALUEJSON diff --git a/README.md b/README.md index 1caa0b593..a25295481 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,8 @@ [Wekan fork announcement][fork_announcement] +[Translate Wekan fork at Transifex][translate_wefork] + Wekan is an open-source and collaborative kanban board application. Whether you’re maintaining a personal todo list, planning your holidays with @@ -94,3 +96,4 @@ with [Meteor](https://www.meteor.com). [virtualbox]: https://github.com/wekan/wekan/wiki/virtual-appliance [sandstorm_spk]: https://github.com/wefork/wekan/issues/36 [docker_image]: https://github.com/wefork/wekan/issues/33 +[translate_wefork]: https://www.transifex.com/wefork/wefork/ diff --git a/i18n/ar.i18n.json b/i18n/ar.i18n.json old mode 100755 new mode 100644 diff --git a/i18n/br.i18n.json b/i18n/br.i18n.json new file mode 100644 index 000000000..634e53694 --- /dev/null +++ b/i18n/br.i18n.json @@ -0,0 +1,263 @@ +{ + "accept": "Asantiñ", + "actions": "Oberoù", + "activities": "Oberiantizoù", + "activity": "Oberiantiz", + "activity-added": "%s ouzhpennet da %s", + "activity-archived": "%s diellaouet", + "activity-attached": "%s liammet ouzh %s", + "activity-created": "%s krouet", + "activity-excluded": "excluded %s from %s", + "activity-imported": "%s enporzhiet eus %s da %s", + "activity-imported-board": "%s enporzhiet da %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "add": "Ouzhpenn", + "add-attachment": "Add an attachment", + "add-board": "Add a new board", + "add-card": "Ouzhpenn ur gartenn", + "add-cover": "Ouzphenn ur golo", + "add-label": "Ouzhpenn an titl", + "add-list": "Ouzhpenn ur roll", + "add-members": "Ouzhpenn izili", + "added": "Ouzhpennet", + "addMemberPopup-title": "Izili", + "admin": "Merour", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "archive": "Archive", + "archive-all": "Archive All", + "archive-board": "Archive Board", + "archive-card": "Archive Card", + "archive-list": "Archive this list", + "archive-selection": "Archive selection", + "archiveBoardPopup-title": "Archive Board?", + "archived-items": "Archived Items", + "archives": "Archives", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "avatar-too-big": "The avatar is too large (70Kb max)", + "back": "Back", + "board-change-color": "Kemmañ al liv", + "board-nb-stars": "%s stered", + "board-not-found": "Board not found", + "board-private-info": "This board will be private.", + "board-public-info": "This board will be public.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardImportBoardPopup-title": "Import board from Trello", + "boardMenuPopup-title": "Board Menu", + "boards": "Boards", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is archived.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.", + "card-edit-attachments": "Edit attachments", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "cardAttachmentsPopup-title": "Attach From", + "cardDeletePopup-title": "Diverkañ ar gartenn ?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Izili", + "cardMorePopup-title": "Muioc’h", + "cards": "Kartennoù", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Kemmañ ger-tremen", + "change-permissions": "Change permissions", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Kemmañ ger-tremen", + "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 will be able to restore the board by clicking the “Archives” button from the home header.", + "color-black": "du", + "color-blue": "glas", + "color-green": "gwer", + "color-lime": "melen sitroñs", + "color-orange": "orañjez", + "color-pink": "roz", + "color-purple": "mouk", + "color-red": "ruz", + "color-sky": "pers", + "color-yellow": "melen", + "comment": "Comment", + "comment-placeholder": "Write a comment", + "computer": "Computer", + "create": "Krouiñ", + "createBoardPopup-title": "Create Board", + "createLabelPopup-title": "Create Label", + "current": "current", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Diverkañ", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Graet", + "download": "Download", + "edit": "Kemmañ", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "editLabelPopup-title": "Change Label", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "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", + "export-board": "Export board", + "filter": "Filter", + "filter-cards": "Filter Cards", + "filter-clear": "Clear filter", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "home": "Home", + "import": "Import", + "import-board": "import from Trello", + "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text", + "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)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Yezh", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "link-card": "Link to this card", + "list-archive-cards": "Archive all cards in this list", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view archived cards and bring them back to the board, click “Menu” > “Archived Items”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "listActionPopup-title": "List Actions", + "listImportCardPopup-title": "Import a Trello card", + "lists": "Lists", + "log-out": "Log Out", + "loginPopup-title": "Log In", + "mapMembersAddPopup-title": "Select Wekan member", + "mapMembersPopup-title": "Map members", + "memberMenuPopup-title": "Member Settings", + "members": "Izili", + "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", + "name": "Name", + "no-archived-cards": "No archived cards.", + "no-archived-lists": "No archived lists.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by logging in.", + "page-not-found": "Page not found.", + "password": "Ger-tremen", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove the label", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "select-color": "Select a color", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emojies": "Autocomplete emojies", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "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", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an archived list", + "what-to-do": "What do you want to do?" +} \ No newline at end of file diff --git a/i18n/ca.i18n.json b/i18n/ca.i18n.json old mode 100755 new mode 100644 diff --git a/i18n/cmn.i18n.json b/i18n/cmn.i18n.json new file mode 100644 index 000000000..a561db4b8 --- /dev/null +++ b/i18n/cmn.i18n.json @@ -0,0 +1,263 @@ +{ + "accept": "Accept", + "actions": "动作", + "activities": "活动", + "activity": "活动", + "activity-added": "添加 %s 至 %s", + "activity-archived": "已归档 %s", + "activity-attached": "附加 %s 至 %s", + "activity-created": "创建 %s", + "activity-excluded": "排除 %s 从 %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "加入 %s", + "activity-moved": "将 %s 从 %s 移到 %s", + "activity-on": "在 %s", + "activity-removed": "移除 %s 自 %s ", + "activity-sent": "发送 %s 至 %s", + "activity-unjoined": "unjoined %s", + "add": "添加", + "add-attachment": "Add an attachment", + "add-board": "Add a new board", + "add-card": "Add a card", + "add-cover": "Add Cover", + "add-label": "Add the label", + "add-list": "Add a list", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "archive": "Archive", + "archive-all": "Archive All", + "archive-board": "Archive Board", + "archive-card": "Archive Card", + "archive-list": "Archive this list", + "archive-selection": "Archive selection", + "archiveBoardPopup-title": "Archive Board?", + "archived-items": "Archived Items", + "archives": "Archives", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "avatar-too-big": "The avatar is too large (70Kb max)", + "back": "Back", + "board-change-color": "Change color", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be private.", + "board-public-info": "This board will be public.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardImportBoardPopup-title": "Import board from Trello", + "boardMenuPopup-title": "Board Menu", + "boards": "Boards", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is archived.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.", + "card-edit-attachments": "Edit attachments", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "cardAttachmentsPopup-title": "Attach From", + "cardDeletePopup-title": "Delete Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cards": "Cards", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "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 will be able to restore the board by clicking the “Archives” button from the home header.", + "color-black": "black", + "color-blue": "blue", + "color-green": "green", + "color-lime": "lime", + "color-orange": "orange", + "color-pink": "pink", + "color-purple": "purple", + "color-red": "red", + "color-sky": "sky", + "color-yellow": "yellow", + "comment": "Comment", + "comment-placeholder": "Write a comment", + "computer": "Computer", + "create": "Create", + "createBoardPopup-title": "Create Board", + "createLabelPopup-title": "Create Label", + "current": "current", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "editLabelPopup-title": "Change Label", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "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", + "export-board": "Export board", + "filter": "Filter", + "filter-cards": "Filter Cards", + "filter-clear": "Clear filter", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "home": "Home", + "import": "Import", + "import-board": "import from Trello", + "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text", + "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)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "link-card": "Link to this card", + "list-archive-cards": "Archive all cards in this list", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view archived cards and bring them back to the board, click “Menu” > “Archived Items”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "listActionPopup-title": "List Actions", + "listImportCardPopup-title": "Import a Trello card", + "lists": "Lists", + "log-out": "Log Out", + "loginPopup-title": "Log In", + "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", + "name": "Name", + "no-archived-cards": "No archived cards.", + "no-archived-lists": "No archived lists.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by logging in.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove the label", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "select-color": "Select a color", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emojies": "Autocomplete emojies", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "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", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an archived list", + "what-to-do": "What do you want to do?" +} \ No newline at end of file diff --git a/i18n/de.i18n.json b/i18n/de.i18n.json old mode 100755 new mode 100644 diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json old mode 100755 new mode 100644 diff --git a/i18n/es.i18n.json b/i18n/es.i18n.json old mode 100755 new mode 100644 diff --git a/i18n/fa_IR.i18n.json b/i18n/fa_IR.i18n.json new file mode 100644 index 000000000..c9d0b95b1 --- /dev/null +++ b/i18n/fa_IR.i18n.json @@ -0,0 +1,263 @@ +{ + "accept": "تایید", + "actions": "اعمال", + "activities": "فعالیت ها", + "activity": "فعالیت", + "activity-added": " %s به %s اضافه شد", + "activity-archived": "%s بایگانی شد", + "activity-attached": "%s به %s پیوست شد", + "activity-created": "%s ایجاد شد", + "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-unjoined": "جداسازی %s", + "add": "افزودن", + "add-attachment": "افزودن ضمیمه", + "add-board": "افزودن برد جدید", + "add-card": "افزودن کارت", + "add-cover": "افزودن کاور", + "add-label": "افزودن برچسب", + "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": "تعیین عضو", + "attached": "وابسته", + "attachment": "ضمائم", + "attachment-delete-pop": "حذف پیوست دایمی خواهد بود، بدون بازگشت", + "attachmentDeletePopup-title": "آیا می خواهید ضمیمه را حذف کنید؟", + "attachments": "ضمائم", + "avatar-too-big": "حجم تصویر انتخاب شده بیشتر از حد مجاز است .(حد مجاز 70Kb)", + "back": "بازگشت", + "board-change-color": "تغییر رنگ", + "board-nb-stars": "%s ستاره", + "board-not-found": "برد مورد نظر پیدا نشد", + "board-private-info": "این برد خصوصی خواهد بود.", + "board-public-info": "این برد عمومی خواهد بود.", + "boardChangeColorPopup-title": "تغییر پس زمینه برد", + "boardChangeTitlePopup-title": "تغییر نام برد", + "boardChangeVisibilityPopup-title": "تغغیر وضعیت نمایش", + "boardImportBoardPopup-title": "وارد کردن تخته ها از Trello", + "boardMenuPopup-title": "منوی برد", + "boards": "بردها", + "bucket-example": "مانند \"لیست سبدها\" برای مثال", + "cancel": "انصراف", + "card-archived": "این کارت بایگانی شده است.", + "card-comments-title": "این کارت دارای %s نظر می باشد.", + "card-delete-notice": "پاک کردن بطور کامل. شما تمامی اقدامات مربوطه را از دست خواهید داد.", + "card-delete-pop": "همه اقدامات ازاین پردازه (خوراک) حذف خواهد شد و امکان بازگشا کردن کارت وجود نخواهد داشت. هیچ امکان بازگشتی!", + "card-delete-suggest-archive": "شما می توانید یک کارت را بایگانی کرده با حفظ فعالیت های آن.", + "card-edit-attachments": "ویرایش ضمائم", + "card-edit-labels": "ویرایش برچسب", + "card-edit-members": "ویرایش اعضا", + "card-labels-title": "تغییر برچسب کارت", + "card-members-title": "افزودن یا حذف اعضا از کارت.", + "cardAttachmentsPopup-title": "ضمیمه از", + "cardDeletePopup-title": "آیا می خواهید کارت را حذف کنید؟", + "cardDetailsActionsPopup-title": "اعمال کارت", + "cardLabelsPopup-title": "برچسب ها", + "cardMembersPopup-title": "اعضا", + "cardMorePopup-title": "بیشتر", + "cards": "کارت ها", + "change": "تغییر", + "change-avatar": "تغییر آواتار", + "change-password": "تغییر کلمه عبور", + "change-permissions": "تغییر دسترسی ها", + "changeAvatarPopup-title": "تغییر آواتار", + "changeLanguagePopup-title": "تغییر زبان", + "changePasswordPopup-title": "تغییر کلمه عبور", + "changePermissionsPopup-title": "تغییر دسترسی ها", + "click-to-star": "جهت افزودن ستاره کلیک کنید .", + "click-to-unstar": "جهت کاهش ستاره کلیک کنید.", + "clipboard": "ذخیره در حافظه ویا بکش-رهاکن", + "close": "بستن", + "close-board": "بستن برد", + "close-board-pop": "شما می توانید با کلیک بر دکمه \"بایگانی\" از قسمت بالای خانه، تخته را بازگذاری نمایید.", + "color-black": "مشکی", + "color-blue": "آبی", + "color-green": "سبز\n", + "color-lime": "لیمویی", + "color-orange": "نارنجی", + "color-pink": "صورتی", + "color-purple": "بنفش", + "color-red": "قرمز", + "color-sky": "آبی آسمانی", + "color-yellow": "زرد", + "comment": "نظر", + "comment-placeholder": "ثبت یک نظر", + "computer": "کامپیوتر", + "create": "ایجاد", + "createBoardPopup-title": "ایجاد برد", + "createLabelPopup-title": "ایجاد برچسب", + "current": "جاری", + "decline": "رد", + "default-avatar": "آواتار پیش فرض", + "delete": "حذف", + "deleteLabelPopup-title": "آیا می خواهید برچسب را حذف کنید؟", + "description": "توضیحات", + "disambiguateMultiLabelPopup-title": "عمل ابهام زدایی از برچسب", + "disambiguateMultiMemberPopup-title": "عمل ابهام زدایی از کاربر", + "discard": "انصراف", + "done": "پایان", + "download": "دریافت", + "edit": "ویرایش", + "edit-avatar": "تغییر آواتار", + "edit-profile": "ویرایش پروفایل", + "editLabelPopup-title": "تغغیر برچسب", + "editProfilePopup-title": "ویرایش پروفایل", + "email": "ایمیل", + "email-enrollAccount-subject": "یک حساب کاربری برای شما در __siteName__ ایجاد شد", + "email-enrollAccount-text": "سلام __user__ \nبرای شروع به استفاده از این سرویس برروی کلیک روی لینک زیر کلیک نمایید،با تشکر \n__url__.", + "email-fail": "عدم موفقیت در ارسال نامه الکترونیکی", + "email-invalid": "پست الکترونیکی نادرست", + "email-invite": "دعوت از طریق نامه الکترونیکی", + "email-invite-subject": "__inviter__ برای شما دعوت نامه ارسال کرده است", + "email-invite-text": "__User__ عزیز\n __inviter__ شما را به عضویت تخته \"__board__\" برای همکاری دعوت کرده است.\nلطفا لینک زیر را دنبال کنید، باتشکر:\n__url__", + "email-resetPassword-subject": "تنظیم مجدد کلمه عبور در __siteName__", + "email-resetPassword-text": "سلام __user__\nجهت تنظیم مجدد کلمه عبور لینک زیر را دنبال نمایید، باتشکر:\n__url__", + "email-sent": "نامه الکترونیکی فرستاده شد", + "email-verifyEmail-subject": "تایید آدرس الکترونیکی شما در __siteName__", + "email-verifyEmail-text": "سلام __user__\nبه منظور تایید آدرس الکترونیکی حساب خود، لینک زیر را دنبال نمایید، باتشکر:\n__url__.", + "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": "این کاربر ایجاد نشده است", + "export-board": "انتقال به بیرون تخته", + "filter": "فیلتر", + "filter-cards": "صافی کارتها", + "filter-clear": "حذف فیلتر", + "filter-on": "صافی روشن است", + "filter-on-desc": "شما صافی برای کارتهای تخته را روشن کرده اید. جهت ویرایش کلیک نمایید.", + "filter-to-selection": "صافی برای موارد انتخابی", + "fullname": "نام و نام خانوادگی", + "header-logo-title": "بازگشت به صفحه تخته.", + "home": "خانه", + "import": "وارد کردن", + "import-board": "وارد کردن از ترلو", + "import-board-trello-instruction": "در Trello-ی خود به 'Menu'، 'More'، 'Print'، 'Export to JSON رفته و متن نهایی را دراینجا وارد نمایید.", + "import-card": "وارد کردن کارت Trello", + "import-card-trello-instruction": "به کارت Trello رفته و با انتخاب Share and more...' و 'Export JSON' متن نهایی را دراینجا وارد کنید", + "import-json-placeholder": "اطلاعات Json معتبر خود را اینجا وارد کنید.", + "import-members-map": "تخته خود وارد شده دارای برخی از اعضا می باشد. لطفا کاربرانی که باید وارد نرم افزار بشوند را مشخص کنید.", + "import-show-user-mapping": "بررسی نقشه کاربران", + "import-user-select": "کاربری از نرم افزار را که می خواهید بعنوان این عضو جایگزین شود را انتخاب کنید.", + "info": "اطلاعات", + "initials": "تخصیصات اولیه", + "joined": "متصل", + "just-invited": "هم اکنون، شما به این تخته دعوت شده اید.", + "keyboard-shortcuts": "میانبر کلیدها", + "label-create": "ایجاد برچسب جدید", + "label-default": "%s برچسب(پیش فرض)", + "label-delete-pop": "بدون برگشت. این حذفبرچسب را از هر کارت پاک خواهد کردو تاریخچه آن را نیز ازبین می برد.", + "labels": "برچسب ها", + "language": "زبان", + "last-admin-desc": "شما نمی توانید نقش را تغییر دهید چراکه باید حداقل یک مدیری وجود داشته باشد.", + "leave-board": "خروج از برد", + "link-card": "ارجاع به این کارت", + "list-archive-cards": "بایگانی تمامی کارتهای این لیست", + "list-archive-cards-pop": "این همه کارت ها در این لیست از تخته راحذف خواهد کرد. جهت مشاهده کارت های بایگانی و بازگرداندن آنها ، \"Menu\",\"Archived Item\" را کلیک کنید.", + "list-move-cards": "انتقال تمام کارت ها در این لیست", + "list-select-cards": "انتخاب تمام کارت ها در این لیست", + "listActionPopup-title": "لیست اقدامات", + "listImportCardPopup-title": "وارد کردن کارت Trello", + "lists": "لیست ها", + "log-out": "خروج", + "loginPopup-title": "ورود", + "mapMembersAddPopup-title": "انتخاب عضو Wekan", + "mapMembersPopup-title": "نقشه اعضا", + "memberMenuPopup-title": "تنظیمات اعضا", + "members": "اعضا", + "menu": "منو", + "move-selection": "حرکت مورد انتخاب شده", + "moveCardPopup-title": "حرکت کارت", + "moveSelectionPopup-title": "حرکت مورد انتخاب شده", + "multi-selection": "چند انتخابی", + "multi-selection-on": "چند انتخابی روشن است", + "my-boards": "بردهای من", + "name": "نام", + "no-archived-cards": "کارتی در بایگانی نیست", + "no-archived-lists": "لیستی در بایگانی نیست", + "no-results": "نتیجه ای ندارد", + "normal": "عادی", + "normal-desc": "امکان نمایش و تنظیم کارت بدون امکان تغییر تنظیمات", + "not-accepted-yet": "دعوت هنوز پذیرفته نشده است", + "optional": "انتخابی", + "or": "یا", + "page-maybe-private": "این صفحه ممکن است خصوصی باشد.شما باورود می توانید آنرا ملاحظه نمایید.", + "page-not-found": "صفحه پیدا نشد.", + "password": "کلمه عبور", + "paste-or-dragdrop": "جهت چسباندن، یا کشیدن-رهاسازی فایل تصویر به آن (تصویر)", + "preview": "نمایش", + "previewAttachedImagePopup-title": "نمایش", + "previewClipboardImagePopup-title": "نمایش", + "private": "خصوصی", + "private-desc": "این تخته خصوصی است. فقط تنها افراد اضافه شده به آن می توانند مشاهده و ویرایش کنند.", + "profile": "پروفایل", + "public": "عمومی", + "public-desc": "این تخته عمومی است. برای هر کسی با لینک ویا جستجو درموتورها مانند گوگل قابل مشاهده است . فقط افرادی که به آن اضافه شده اند امکان ویرایش دارند.", + "quick-access-description": "جهت افزودن یک تخته به اینجا،آنرا ستاره دار نمایید.", + "remove-cover": "حذف کاور", + "remove-from-board": "حذف از برد", + "remove-label": "حذف برچسب", + "remove-member": "حذف عضو", + "remove-member-from-card": "حذف از کارت", + "remove-member-pop": "آیا می خواهید __Name__ (__username__) را از __boardTitle__ حذف کنید? کاربر از تمام کارت ها در این تخته حذف خواهد شد و به آنها اطلاع رسانی خواهد شد.", + "removeMemberPopup-title": "آیا می خواهید کاربر را حذف کنید؟", + "rename": "تغغیر نام", + "rename-board": "تغییر نام برد", + "restore": "بازیابی", + "save": "ذخیره", + "search": "جستجو", + "select-color": "انتخاب رنگ", + "shortcut-assign-self": "اختصاص خود به کارت فعلی", + "shortcut-autocomplete-emojies": "تکمیل خودکار شکلک", + "shortcut-autocomplete-members": "تکمیل خودکار کاربرها", + "shortcut-clear-filters": "حذف تمامی فیلترها", + "shortcut-close-dialog": "بستن دیالوگ", + "shortcut-filter-my-cards": "کارت های من", + "shortcut-show-shortcuts": "بالا آوردن میانبر این لیست", + "shortcut-toggle-filterbar": "ضامن نوار صافی", + "shortcut-toggle-sidebar": "ضامن نوار تخته", + "signupPopup-title": "ایجاد یک اکانت", + "star-board-title": "جهت ستاره دار کردن تخته کلیک نمایی.این در بالای لیست تخته های شما نمایش داده خواهد شد.", + "starred-boards": "تخته های ستاره دار", + "starred-boards-description": "تخته های ستاره دار در بالای لیست تخته ها نمایش داده می شود.", + "subscribe": "عضوشدن", + "team": "تیم", + "this-board": "این برد", + "this-card": "این کارت", + "title": "عنوان", + "unassign-member": "عدم انتصاب کاربر ", + "unsaved-description": "شما توضیحات ذخیره نشده دارید.", + "upload": "ارسال", + "upload-avatar": "ارسال یک آواتار", + "uploaded-avatar": "آواتار ارسال شد", + "username": "نام کاربری", + "view-it": "مشاهده", + "warn-list-archived": "هشدار: این کارت در یک لیست بایگانی شده است", + "what-to-do": "چه کاری می خواهید انجام دهید؟" +} \ No newline at end of file diff --git a/i18n/fi.i18n.json b/i18n/fi.i18n.json old mode 100755 new mode 100644 diff --git a/i18n/fr.i18n.json b/i18n/fr.i18n.json old mode 100755 new mode 100644 diff --git a/i18n/it.i18n.json b/i18n/it.i18n.json old mode 100755 new mode 100644 diff --git a/i18n/ja.i18n.json b/i18n/ja.i18n.json old mode 100755 new mode 100644 diff --git a/i18n/ko.i18n.json b/i18n/ko.i18n.json old mode 100755 new mode 100644 diff --git a/i18n/pt-BR.i18n.json b/i18n/pt-BR.i18n.json old mode 100755 new mode 100644 diff --git a/i18n/ro_RO.i18n.json b/i18n/ro_RO.i18n.json new file mode 100644 index 000000000..04b5a455f --- /dev/null +++ b/i18n/ro_RO.i18n.json @@ -0,0 +1,263 @@ +{ + "accept": "Accept", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "archived %s", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "add": "Add", + "add-attachment": "Add an attachment", + "add-board": "Add a new board", + "add-card": "Add a card", + "add-cover": "Add Cover", + "add-label": "Add the label", + "add-list": "Add a list", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "archive": "Archive", + "archive-all": "Archive All", + "archive-board": "Archive Board", + "archive-card": "Archive Card", + "archive-list": "Archive this list", + "archive-selection": "Archive selection", + "archiveBoardPopup-title": "Archive Board?", + "archived-items": "Archived Items", + "archives": "Arhive", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Ataşament", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Ataşamente", + "avatar-too-big": "The avatar is too large (70Kb max)", + "back": "Înapoi", + "board-change-color": "Change color", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be private.", + "board-public-info": "This board will be public.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardImportBoardPopup-title": "Import board from Trello", + "boardMenuPopup-title": "Board Menu", + "boards": "Boards", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is archived.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.", + "card-edit-attachments": "Edit attachments", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "cardAttachmentsPopup-title": "Attach From", + "cardDeletePopup-title": "Delete Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cards": "Cards", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "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": "Închide", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", + "color-black": "black", + "color-blue": "blue", + "color-green": "green", + "color-lime": "lime", + "color-orange": "orange", + "color-pink": "pink", + "color-purple": "purple", + "color-red": "red", + "color-sky": "sky", + "color-yellow": "yellow", + "comment": "Comment", + "comment-placeholder": "Write a comment", + "computer": "Computer", + "create": "Create", + "createBoardPopup-title": "Create Board", + "createLabelPopup-title": "Create Label", + "current": "current", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "editLabelPopup-title": "Change Label", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "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", + "export-board": "Export board", + "filter": "Filter", + "filter-cards": "Filter Cards", + "filter-clear": "Clear filter", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "home": "Home", + "import": "Import", + "import-board": "import from Trello", + "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text", + "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": "Iniţiale", + "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)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "link-card": "Link to this card", + "list-archive-cards": "Archive all cards in this list", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view archived cards and bring them back to the board, click “Menu” > “Archived Items”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "listActionPopup-title": "List Actions", + "listImportCardPopup-title": "Import a Trello card", + "lists": "Liste", + "log-out": "Log Out", + "loginPopup-title": "Log In", + "mapMembersAddPopup-title": "Select Wekan member", + "mapMembersPopup-title": "Map members", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Meniu", + "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", + "name": "Nume", + "no-archived-cards": "No archived cards.", + "no-archived-lists": "No archived lists.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by logging in.", + "page-not-found": "Page not found.", + "password": "Parolă", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Privat", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profil", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove the label", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Salvează", + "search": "Caută", + "select-color": "Select a color", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emojies": "Autocomplete emojies", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "title": "Titlu", + "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", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an archived list", + "what-to-do": "Ce ai vrea sa faci?" +} \ No newline at end of file diff --git a/i18n/ru.i18n.json b/i18n/ru.i18n.json old mode 100755 new mode 100644 diff --git a/i18n/sr.i18n.json b/i18n/sr.i18n.json new file mode 100644 index 000000000..b7f004e4c --- /dev/null +++ b/i18n/sr.i18n.json @@ -0,0 +1,263 @@ +{ + "accept": "Prihvati", + "actions": "Akcije", + "activities": "Aktivnosti", + "activity": "Aktivnost", + "activity-added": "dodao %s u %s", + "activity-archived": "arhivirao %s", + "activity-attached": "prikačio %s u %s", + "activity-created": "kreirao %s", + "activity-excluded": "izuzmi %s iz %s", + "activity-imported": "uvezao %s u %s iz %s", + "activity-imported-board": "uvezao %s iz %s", + "activity-joined": "spojio %s", + "activity-moved": "premestio %s iz %s u %s", + "activity-on": "na %s", + "activity-removed": "uklonio %s iz %s", + "activity-sent": "poslao %s %s-u", + "activity-unjoined": "rastavio %s", + "add": "Dodaj", + "add-attachment": "Dodaj dokument", + "add-board": "Dodaj novu tablu", + "add-card": "Dodaj karticu", + "add-cover": "Dodaj zaglavlje", + "add-label": "Dodaj natpis", + "add-list": "Dodaj listu", + "add-members": "Dodaj Članove", + "added": "Dodao", + "addMemberPopup-title": "Članovi", + "admin": "Administrator", + "admin-desc": "Može da pregleda i menja kartice, uklanja članove i menja podešavanja table", + "all-boards": "Sve table", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "archive": "Arhiviraj", + "archive-all": "Arhiviraj sve", + "archive-board": "Arhiviraj tablu", + "archive-card": "Arhiviraj karticu", + "archive-list": "Arhiviraj ovu listu", + "archive-selection": "Arhiviraj izabrano", + "archiveBoardPopup-title": "Da arhiviram tablu ?", + "archived-items": "Arhivirane stavke", + "archives": "Arhive", + "assign-member": "Dodeli člana", + "attached": "Prikačeno", + "attachment": "Prikačeni dokument", + "attachment-delete-pop": "Brisanje prikačenog dokumenta je trajno. Ne postoji vraćanje obrisanog.", + "attachmentDeletePopup-title": "Obrisati prikačeni dokument ?", + "attachments": "Prikačeni dokumenti", + "avatar-too-big": "Avatar je prevelik (maksimum je 70Kb)", + "back": "Nazad", + "board-change-color": "Promeni boju", + "board-nb-stars": "%s zvezdice", + "board-not-found": "Tabla nije pronađena", + "board-private-info": "Ova tabla će biti privatna.", + "board-public-info": "Ova tabla će biti javna.", + "boardChangeColorPopup-title": "Promeni pozadinu table", + "boardChangeTitlePopup-title": "Preimenuj tablu", + "boardChangeVisibilityPopup-title": "Promeni Vidljivost", + "boardImportBoardPopup-title": "Uvezi table iz Trello-a", + "boardMenuPopup-title": "Meni table", + "boards": "Table", + "bucket-example": "Na primer \"Lista zadataka\"", + "cancel": "Otkaži", + "card-archived": "Ova kartica je arhivirana", + "card-comments-title": "Ova kartica ima %s komentar.", + "card-delete-notice": "Brisanje je trajno. Izgubićeš sve akcije povezane sa ovom karticom.", + "card-delete-pop": "Sve akcije će biti uklonjene sa liste aktivnosti i kartica neće moći biti ponovo otvorena. Nema vraćanja unazad.", + "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.", + "card-edit-attachments": "Uredi priloge", + "card-edit-labels": "Uredi natpise", + "card-edit-members": "Uredi članove", + "card-labels-title": "Promeni natpis na kartici.", + "card-members-title": "Dodaj ili ukloni članove table sa kartice.", + "cardAttachmentsPopup-title": "Attach From", + "cardDeletePopup-title": "Delete Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Članovi", + "cardMorePopup-title": "More", + "cards": "Cards", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "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 will be able to restore the board by clicking the “Archives” button from the home header.", + "color-black": "black", + "color-blue": "blue", + "color-green": "green", + "color-lime": "lime", + "color-orange": "orange", + "color-pink": "pink", + "color-purple": "purple", + "color-red": "red", + "color-sky": "sky", + "color-yellow": "yellow", + "comment": "Comment", + "comment-placeholder": "Write a comment", + "computer": "Computer", + "create": "Create", + "createBoardPopup-title": "Create Board", + "createLabelPopup-title": "Create Label", + "current": "current", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "editLabelPopup-title": "Change Label", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "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", + "export-board": "Export board", + "filter": "Filter", + "filter-cards": "Filter Cards", + "filter-clear": "Clear filter", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "home": "Home", + "import": "Import", + "import-board": "import from Trello", + "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text", + "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)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "link-card": "Link to this card", + "list-archive-cards": "Archive all cards in this list", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view archived cards and bring them back to the board, click “Menu” > “Archived Items”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "listActionPopup-title": "List Actions", + "listImportCardPopup-title": "Import a Trello card", + "lists": "Lists", + "log-out": "Log Out", + "loginPopup-title": "Log In", + "mapMembersAddPopup-title": "Select Wekan member", + "mapMembersPopup-title": "Map members", + "memberMenuPopup-title": "Member Settings", + "members": "Članovi", + "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", + "name": "Name", + "no-archived-cards": "No archived cards.", + "no-archived-lists": "No archived lists.", + "no-results": "Nema rezultata", + "normal": "Normalno", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "optional": "opciono", + "or": "ili", + "page-maybe-private": "This page may be private. You may be able to view it by logging in.", + "page-not-found": "Stranica nije pronađena.", + "password": "Lozinka", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "preview": "Prikaz", + "previewAttachedImagePopup-title": "Prikaz", + "previewClipboardImagePopup-title": "Prikaz", + "private": "Privatno", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profil", + "public": "Javno", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Ukloni iz table", + "remove-label": "Ukloni natpis", + "remove-member": "Ukloni člana", + "remove-member-from-card": "Ukloni iz kartice", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Ukloni člana ?", + "rename": "Preimenuj", + "rename-board": "Preimenuj tablu", + "restore": "Oporavi", + "save": "Snimi", + "search": "Pretraga", + "select-color": "Izaberi boju", + "shortcut-assign-self": "Pridruži sebe trenutnoj kartici", + "shortcut-autocomplete-emojies": "Sam popuni emodžije", + "shortcut-autocomplete-members": "Sam popuni članove", + "shortcut-clear-filters": "Očisti sve filtere", + "shortcut-close-dialog": "Zatvori dijalog", + "shortcut-filter-my-cards": "Filtriraj kartice", + "shortcut-show-shortcuts": "Prikaži ovu listu prečica", + "shortcut-toggle-filterbar": "Uključi ili isključi bočni meni filtera", + "shortcut-toggle-sidebar": "Uključi ili isključi bočni meni table", + "signupPopup-title": "Kreiraj nalog", + "star-board-title": "Klikni da označiš zvezdicom ovu tablu. Pokazaće se na vrhu tvoje liste tabli.", + "starred-boards": "Table sa zvezdicom", + "starred-boards-description": "Table sa zvezdicom se pokazuju na vrhu liste tabli.", + "subscribe": "Pretplati se", + "team": "Tim", + "this-board": "ova tabla", + "this-card": "ova kartica", + "title": "Naslov", + "unassign-member": "Unassign member", + "unsaved-description": "Imaš nesnimljen opis.", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "username": "Korisničko ime", + "view-it": "Pregledaj je", + "warn-list-archived": "upozorenje: ova kartica je u arhiviranoj listi", + "what-to-do": "Šta želiš da uradiš ?" +} \ No newline at end of file diff --git a/i18n/tr.i18n.json b/i18n/tr.i18n.json old mode 100755 new mode 100644 diff --git a/i18n/zh-CN.i18n.json b/i18n/zh-CN.i18n.json old mode 100755 new mode 100644 From 51002bed7406d490b7d5de359dc8371ef85cbeb1 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 13 Dec 2016 12:36:08 +0200 Subject: [PATCH 072/136] Update Chinese (Taiwan) translation. --- i18n/zh-TW.i18n.json | 84 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 70 insertions(+), 14 deletions(-) diff --git a/i18n/zh-TW.i18n.json b/i18n/zh-TW.i18n.json index 9479acd33..dc8380415 100644 --- a/i18n/zh-TW.i18n.json +++ b/i18n/zh-TW.i18n.json @@ -1,10 +1,30 @@ { "accept": "接受", + "act-activity-notify": "[Wekan] Activity Notification", + "act-addAttachment": "attached __attachment__ to __card__", + "act-addComment": "commented on __card__: __comment__", + "act-createBoard": "created __board__", + "act-createCard": "added __card__ to __list__", + "act-createList": "added __list__ to __board__", + "act-addBoardMember": "added __member__ to __board__", + "act-archivedBoard": "archived __board__", + "act-archivedCard": "archived __card__", + "act-archivedList": "archived __list__", + "act-importBoard": "imported __board__", + "act-importCard": "imported __card__", + "act-importList": "imported __list__", + "act-joinMember": "added __member__ to __card__", + "act-moveCard": "moved __card__ from __oldList__ to __list__", + "act-removeBoardMember": "removed __member__ from __board__", + "act-restoredCard": "restored __card__ to __board__", + "act-unjoinMember": "removed __member__ from __card__", + "act-withBoardTitle": "[Wekan] __board__", + "act-withCardTitle": "[__board__] __card__", "actions": "操作", "activities": "活動", "activity": "活動", "activity-added": "新增 %s 至 %s", - "activity-archived": "刪除 %s", + "activity-archived": "封存 %s", "activity-attached": "新增附件 %s 至 %s", "activity-created": "建立 %s", "activity-excluded": "排除 %s 從 %s", @@ -31,6 +51,8 @@ "all-boards": "全部看板", "and-n-other-card": "和其他 __count__ 個卡片", "and-n-other-card_plural": "和其他 __count__ 個卡片", + "apply": "送出", + "app-is-offline": "目前狀態為離線,若整重將會造成資料遺失", "archive": "刪除", "archive-all": "全部刪除", "archive-board": "刪除看板", @@ -38,14 +60,15 @@ "archive-list": "刪除該清單", "archive-selection": "刪除所選內容", "archiveBoardPopup-title": "確定要刪除看板嗎?", - "archived-items": "回收筒", - "archives": "回收筒", + "archived-items": "封存", + "archives": "封存", "assign-member": "分配成員", "attached": "附加", "attachment": "附件", "attachment-delete-pop": "刪除附件的操作無法還原。", "attachmentDeletePopup-title": "刪除附件?", "attachments": "附件", + "auto-watch": "新增看板時自動加入觀察", "avatar-too-big": "大頭貼太大 (最大 70 Kb)", "back": "返回", "board-change-color": "更改顏色", @@ -56,7 +79,7 @@ "boardChangeColorPopup-title": "修改看板背景", "boardChangeTitlePopup-title": "重新命名看板", "boardChangeVisibilityPopup-title": "更改可視級別", - "boardImportBoardPopup-title": "從 Trello 匯入看板", + "boardChangeWatchPopup-title": "更改觀察", "boardMenuPopup-title": "看板選單", "boards": "看板", "bucket-example": "例如 “目標清單”", @@ -66,11 +89,15 @@ "card-delete-notice": "徹底刪除的操作不可復原,你將會遺失該卡片相關的所有操作記錄。", "card-delete-pop": "所有的動作將從活動動態中被移除且您將無法重新打開該卡片。此操作無法復原。", "card-delete-suggest-archive": "你可以將卡片從看板中刪除至回收筒,但保留相關活動。", + "card-due": "到期", + "card-due-on": "到期", "card-edit-attachments": "編輯附件", "card-edit-labels": "編輯標籤", "card-edit-members": "編輯成員", "card-labels-title": "更改該卡片上的標籤", "card-members-title": "在該卡片中新增或移除看板成員", + "card-start": "開始", + "card-start-on": "開始", "cardAttachmentsPopup-title": "附件來源", "cardDeletePopup-title": "徹底刪除卡片?", "cardDetailsActionsPopup-title": "卡片動作", @@ -82,13 +109,15 @@ "change-avatar": "更改大頭貼", "change-password": "更改密碼", "change-permissions": "更改許可權", + "change-settings": "更改設定", "changeAvatarPopup-title": "更改大頭貼", "changeLanguagePopup-title": "更改語言", "changePasswordPopup-title": "更改密碼", - "changePermissionsPopup-title": "更改權限", + "changePermissionsPopup-title": "更改許可權", + "changeSettingsPopup-title": "更改設定", "click-to-star": "點此來標記該看板", "click-to-unstar": "點此來去除該看板的標記", - "clipboard": "剪貼簿貼上或者拖曳檔案", + "clipboard" : "剪貼簿貼上或者拖曳檔案", "close": "關閉", "close-board": "關閉看板", "close-board-pop": "您可以透過點選主介面上方的”回收筒“按鈕來還原看板。", @@ -109,6 +138,7 @@ "createBoardPopup-title": "建立看板", "createLabelPopup-title": "建立標籤", "current": "目前", + "date": "日期", "decline": "拒絕", "default-avatar": "預設大頭貼", "delete": "刪除", @@ -122,7 +152,10 @@ "edit": "編輯", "edit-avatar": "更改大頭貼", "edit-profile": "編輯資料", + "editCardStartDatePopup-title": "更改開始日期", + "editCardDueDatePopup-title": "更改到期日期", "editLabelPopup-title": "更改標籤", + "editNotificationPopup-title": "更改通知", "editProfilePopup-title": "編輯資料", "email": "電子郵件", "email-enrollAccount-subject": "您在 __siteName__ 的帳號已經建立", @@ -146,27 +179,33 @@ "error-user-doesNotExist": "該使用者不存在", "error-user-notAllowSelf": "不允許對自己執行此操作", "error-user-notCreated": "該使用者未能成功建立", + "error-username-taken": "這個使用者名稱已被使用", "export-board": "Export board", "filter": "過濾", "filter-cards": "過濾卡片", "filter-clear": "清空過濾條件", + "filter-no-label": "沒有標籤", + "filter-no-member": "沒有成員", "filter-on": "過濾條件啟用", "filter-on-desc": "你正在過濾該看板上的卡片,點此編輯過濾條件。", "filter-to-selection": "要選擇的過濾條件", "fullname": "全稱", "header-logo-title": "返回您的看板頁面", + "hide-system-messages": "隱藏系統訊息", "home": "首頁", "import": "匯入", - "import-board": "從 Trello 匯入", + "import-board": "匯入 Trello 資料", + "import-board-title": "匯入在 Trello 的看板", "import-board-trello-instruction": "在你的Trello看板中,點選“功能表”,然後選擇“更多”,“列印與匯出”,“匯出為 JSON” 並拷貝結果文本", - "import-card": "匯入 Trello 卡片", - "import-card-trello-instruction": "進入一個 Trello 卡片,選擇“分享與更多”,然後選擇 “匯出為 JSON” 並且拷貝結果文本", "import-json-placeholder": "貼上您有效的 JSON 資料至此", + "import-map-members": "Map members", "import-members-map": "您匯入的看板有一些成員。請將您想匯入的成員映射到 Wekan 使用者。", "import-show-user-mapping": "核對成員映射", "import-user-select": "選擇您想將此成員映射到的 Wekan 使用者", + "importMapMembersAddPopup-title": "選擇 Wekan 成員", "info": "資訊", "initials": "縮寫", + "invalid-date": "無效的日期", "joined": "關聯", "just-invited": "您剛剛被邀請加入此看板", "keyboard-shortcuts": "鍵盤快速鍵", @@ -186,17 +225,20 @@ "listImportCardPopup-title": "匯入 Trello 卡片", "lists": "清單", "log-out": "登出", + "log-in": "登入", "loginPopup-title": "登入", - "mapMembersAddPopup-title": "選擇 Wekan 成員", - "mapMembersPopup-title": "映射成員", "memberMenuPopup-title": "成員更改", "members": "成員", "menu": "選單", "move-selection": "移動被選擇的項目", "moveCardPopup-title": "移動卡片", - "moveSelectionPopup-title": "Move selection", + "moveCardToBottom-title": "移至最下面", + "moveCardToTop-title": "移至最上面", + "moveSelectionPopup-title": "移動選取的項目", "multi-selection": "多選", "multi-selection-on": "多選啟用", + "muted": "靜音", + "muted-info": "您將不會收到有關這個看板的任何訊息", "my-boards": "我的看板", "name": "名稱", "no-archived-cards": "沒有已刪除的卡片", @@ -205,12 +247,15 @@ "normal": "普通", "normal-desc": "可以建立以及編輯卡片,無法更改。", "not-accepted-yet": "邀請尚未接受", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", "optional": "選擇性的", "or": "或", "page-maybe-private": "本頁面被設為私有. 您必須 登入以瀏覽其中內容。", "page-not-found": "頁面不存在。", "password": "密碼", "paste-or-dragdrop": "從剪貼簿貼上,或者拖曳檔案到它上面 (僅限於圖片)", + "participating": "Participating", "preview": "預覽", "previewAttachedImagePopup-title": "預覽", "previewClipboardImagePopup-title": "預覽", @@ -234,7 +279,7 @@ "search": "搜尋", "select-color": "選擇顏色", "shortcut-assign-self": "分配目前卡片給自己", - "shortcut-autocomplete-emojies": "自動完成 emojis", + "shortcut-autocomplete-emoji": "自動完成表情符號", "shortcut-autocomplete-members": "自動補齊成員", "shortcut-clear-filters": "清空全部過濾條件", "shortcut-close-dialog": "關閉對話方塊", @@ -242,6 +287,7 @@ "shortcut-show-shortcuts": "顯示此快速鍵清單", "shortcut-toggle-filterbar": "切換過濾程式邊欄", "shortcut-toggle-sidebar": "切換面板邊欄", + "show-cards-minimum-count": "Show cards count if list contains more than", "signupPopup-title": "建立帳戶", "star-board-title": "點此標記該看板,它將會出現在您的看板列表上方。", "starred-boards": "已標記看板", @@ -250,14 +296,24 @@ "team": "團隊", "this-board": "這個看板", "this-card": "這個卡片", + "time": "時間", "title": "標題", + "tracking": "追蹤", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", "unassign-member": "取消分配成員", "unsaved-description": "未儲存的描述", + "unwatch": "取消觀察", "upload": "上傳", "upload-avatar": "上傳大頭貼", "uploaded-avatar": "大頭貼已經上傳", "username": "使用者名稱", "view-it": "檢視", "warn-list-archived": "警告: 該卡片位於已刪除的清單中", + "watch": "觀察", + "watching": "觀察中", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "歡迎進入看板", + "welcome-list1": "基本", + "welcome-list2": "進階", "what-to-do": "要做什麼?" -} \ No newline at end of file +} From 08ec85e3941a7e9464b5fcc38d5f5b6b32254bcb Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 13 Dec 2016 16:51:23 +0200 Subject: [PATCH 073/136] Update translations. --- .tx/config | 2 +- i18n/cmn.i18n.json | 263 ------------------------- i18n/{fa_IR.i18n.json => fa.i18n.json} | 0 i18n/fi.i18n.json | 94 +++++++-- i18n/{ro_RO.i18n.json => ro.i18n.json} | 0 5 files changed, 76 insertions(+), 283 deletions(-) delete mode 100644 i18n/cmn.i18n.json rename i18n/{fa_IR.i18n.json => fa.i18n.json} (100%) rename i18n/{ro_RO.i18n.json => ro.i18n.json} (100%) diff --git a/.tx/config b/.tx/config index 5027c7e63..1f95dacdc 100644 --- a/.tx/config +++ b/.tx/config @@ -39,7 +39,7 @@ host = https://www.transifex.com # tap:i18n requires us to use `-` separator in the language identifiers whereas # Transifex uses a `_` separator, without an option to customize it on one side # or the other, so we need to do a Manual mapping. -lang_map = es_ES: es-ES, fi_FI:fi, pt_BR:pt-BR, zh_CN:zh-CN, zh_TW: zh-TW +lang_map = es_ES:es-ES, fa_IR:fa-IR, pt_BR:pt-BR, zh_CN:zh-CN, zh_TW:zh-TW [wefork.application] file_filter = i18n/.i18n.json diff --git a/i18n/cmn.i18n.json b/i18n/cmn.i18n.json deleted file mode 100644 index a561db4b8..000000000 --- a/i18n/cmn.i18n.json +++ /dev/null @@ -1,263 +0,0 @@ -{ - "accept": "Accept", - "actions": "动作", - "activities": "活动", - "activity": "活动", - "activity-added": "添加 %s 至 %s", - "activity-archived": "已归档 %s", - "activity-attached": "附加 %s 至 %s", - "activity-created": "创建 %s", - "activity-excluded": "排除 %s 从 %s", - "activity-imported": "imported %s into %s from %s", - "activity-imported-board": "imported %s from %s", - "activity-joined": "加入 %s", - "activity-moved": "将 %s 从 %s 移到 %s", - "activity-on": "在 %s", - "activity-removed": "移除 %s 自 %s ", - "activity-sent": "发送 %s 至 %s", - "activity-unjoined": "unjoined %s", - "add": "添加", - "add-attachment": "Add an attachment", - "add-board": "Add a new board", - "add-card": "Add a card", - "add-cover": "Add Cover", - "add-label": "Add the label", - "add-list": "Add a list", - "add-members": "Add Members", - "added": "Added", - "addMemberPopup-title": "Members", - "admin": "Admin", - "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", - "all-boards": "All boards", - "and-n-other-card": "And __count__ other card", - "and-n-other-card_plural": "And __count__ other cards", - "archive": "Archive", - "archive-all": "Archive All", - "archive-board": "Archive Board", - "archive-card": "Archive Card", - "archive-list": "Archive this list", - "archive-selection": "Archive selection", - "archiveBoardPopup-title": "Archive Board?", - "archived-items": "Archived Items", - "archives": "Archives", - "assign-member": "Assign member", - "attached": "attached", - "attachment": "Attachment", - "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", - "attachmentDeletePopup-title": "Delete Attachment?", - "attachments": "Attachments", - "avatar-too-big": "The avatar is too large (70Kb max)", - "back": "Back", - "board-change-color": "Change color", - "board-nb-stars": "%s stars", - "board-not-found": "Board not found", - "board-private-info": "This board will be private.", - "board-public-info": "This board will be public.", - "boardChangeColorPopup-title": "Change Board Background", - "boardChangeTitlePopup-title": "Rename Board", - "boardChangeVisibilityPopup-title": "Change Visibility", - "boardImportBoardPopup-title": "Import board from Trello", - "boardMenuPopup-title": "Board Menu", - "boards": "Boards", - "bucket-example": "Like “Bucket List” for example", - "cancel": "Cancel", - "card-archived": "This card is archived.", - "card-comments-title": "This card has %s comment.", - "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", - "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", - "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.", - "card-edit-attachments": "Edit attachments", - "card-edit-labels": "Edit labels", - "card-edit-members": "Edit members", - "card-labels-title": "Change the labels for the card.", - "card-members-title": "Add or remove members of the board from the card.", - "cardAttachmentsPopup-title": "Attach From", - "cardDeletePopup-title": "Delete Card?", - "cardDetailsActionsPopup-title": "Card Actions", - "cardLabelsPopup-title": "Labels", - "cardMembersPopup-title": "Members", - "cardMorePopup-title": "More", - "cards": "Cards", - "change": "Change", - "change-avatar": "Change Avatar", - "change-password": "Change Password", - "change-permissions": "Change permissions", - "changeAvatarPopup-title": "Change Avatar", - "changeLanguagePopup-title": "Change Language", - "changePasswordPopup-title": "Change Password", - "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 will be able to restore the board by clicking the “Archives” button from the home header.", - "color-black": "black", - "color-blue": "blue", - "color-green": "green", - "color-lime": "lime", - "color-orange": "orange", - "color-pink": "pink", - "color-purple": "purple", - "color-red": "red", - "color-sky": "sky", - "color-yellow": "yellow", - "comment": "Comment", - "comment-placeholder": "Write a comment", - "computer": "Computer", - "create": "Create", - "createBoardPopup-title": "Create Board", - "createLabelPopup-title": "Create Label", - "current": "current", - "decline": "Decline", - "default-avatar": "Default avatar", - "delete": "Delete", - "deleteLabelPopup-title": "Delete Label?", - "description": "Description", - "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", - "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", - "discard": "Discard", - "done": "Done", - "download": "Download", - "edit": "Edit", - "edit-avatar": "Change Avatar", - "edit-profile": "Edit Profile", - "editLabelPopup-title": "Change Label", - "editProfilePopup-title": "Edit Profile", - "email": "Email", - "email-enrollAccount-subject": "An account created for you on __siteName__", - "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", - "email-fail": "Sending email failed", - "email-invalid": "Invalid email", - "email-invite": "Invite via Email", - "email-invite-subject": "__inviter__ sent you an invitation", - "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", - "email-resetPassword-subject": "Reset your password on __siteName__", - "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", - "email-sent": "Email sent", - "email-verifyEmail-subject": "Verify your email address on __siteName__", - "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", - "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", - "export-board": "Export board", - "filter": "Filter", - "filter-cards": "Filter Cards", - "filter-clear": "Clear filter", - "filter-on": "Filter is on", - "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", - "filter-to-selection": "Filter to selection", - "fullname": "Full Name", - "header-logo-title": "Go back to your boards page.", - "home": "Home", - "import": "Import", - "import-board": "import from Trello", - "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text", - "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)", - "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", - "labels": "Labels", - "language": "Language", - "last-admin-desc": "You can’t change roles because there must be at least one admin.", - "leave-board": "Leave Board", - "link-card": "Link to this card", - "list-archive-cards": "Archive all cards in this list", - "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view archived cards and bring them back to the board, click “Menu” > “Archived Items”.", - "list-move-cards": "Move all cards in this list", - "list-select-cards": "Select all cards in this list", - "listActionPopup-title": "List Actions", - "listImportCardPopup-title": "Import a Trello card", - "lists": "Lists", - "log-out": "Log Out", - "loginPopup-title": "Log In", - "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", - "name": "Name", - "no-archived-cards": "No archived cards.", - "no-archived-lists": "No archived lists.", - "no-results": "No results", - "normal": "Normal", - "normal-desc": "Can view and edit cards. Can't change settings.", - "not-accepted-yet": "Invitation not accepted yet", - "optional": "optional", - "or": "or", - "page-maybe-private": "This page may be private. You may be able to view it by logging in.", - "page-not-found": "Page not found.", - "password": "Password", - "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", - "preview": "Preview", - "previewAttachedImagePopup-title": "Preview", - "previewClipboardImagePopup-title": "Preview", - "private": "Private", - "private-desc": "This board is private. Only people added to the board can view and edit it.", - "profile": "Profile", - "public": "Public", - "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", - "quick-access-description": "Star a board to add a shortcut in this bar.", - "remove-cover": "Remove Cover", - "remove-from-board": "Remove from Board", - "remove-label": "Remove the label", - "remove-member": "Remove Member", - "remove-member-from-card": "Remove from Card", - "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", - "removeMemberPopup-title": "Remove Member?", - "rename": "Rename", - "rename-board": "Rename Board", - "restore": "Restore", - "save": "Save", - "search": "Search", - "select-color": "Select a color", - "shortcut-assign-self": "Assign yourself to current card", - "shortcut-autocomplete-emojies": "Autocomplete emojies", - "shortcut-autocomplete-members": "Autocomplete members", - "shortcut-clear-filters": "Clear all filters", - "shortcut-close-dialog": "Close Dialog", - "shortcut-filter-my-cards": "Filter my cards", - "shortcut-show-shortcuts": "Bring up this shortcuts list", - "shortcut-toggle-filterbar": "Toggle Filter Sidebar", - "shortcut-toggle-sidebar": "Toggle Board Sidebar", - "signupPopup-title": "Create an Account", - "star-board-title": "Click to star this board. It will show up at top of your boards list.", - "starred-boards": "Starred Boards", - "starred-boards-description": "Starred boards show up at the top of your boards list.", - "subscribe": "Subscribe", - "team": "Team", - "this-board": "this board", - "this-card": "this card", - "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", - "view-it": "View it", - "warn-list-archived": "warning: this card is in an archived list", - "what-to-do": "What do you want to do?" -} \ No newline at end of file diff --git a/i18n/fa_IR.i18n.json b/i18n/fa.i18n.json similarity index 100% rename from i18n/fa_IR.i18n.json rename to i18n/fa.i18n.json diff --git a/i18n/fi.i18n.json b/i18n/fi.i18n.json index caab4faff..e8ecb66f4 100644 --- a/i18n/fi.i18n.json +++ b/i18n/fi.i18n.json @@ -1,5 +1,25 @@ { "accept": "Hyväksy", + "act-activity-notify": "[Wekan] Toimintailmoitus", + "act-addAttachment": "liitetty __attachment__ kortille __card__", + "act-addComment": "kommentoitu __card__: __comment__", + "act-createBoard": "luotu __board__", + "act-createCard": "lisätty __card__ listalle __list__", + "act-createList": "lisätty __list__ taululle __board__", + "act-addBoardMember": "lisätty __member__ taululle __board__", + "act-archivedBoard": "arkistoitu __board__", + "act-archivedCard": "arkistoitu __card__", + "act-archivedList": "arkistoitu __list__", + "act-importBoard": "tuotu __board__", + "act-importCard": "tuotu __card__", + "act-importList": "tuotu __list__", + "act-joinMember": "lisätty __member__ kortille __card__", + "act-moveCard": "siirretty __card__ listalta __oldList__ listalle __list__", + "act-removeBoardMember": "poistettu __member__ taululta __board__", + "act-restoredCard": "palautettu __card__ taululle __board__", + "act-unjoinMember": "poistettu __member__ kortilta __card__", + "act-withBoardTitle": "[Wekan] __board__", + "act-withCardTitle": "[__board__] __card__", "actions": "Toimet", "activities": "Toimet", "activity": "Toiminta", @@ -31,6 +51,8 @@ "all-boards": "Kaikki taulut", "and-n-other-card": "Ja __count__ muu kortti", "and-n-other-card_plural": "Ja __count__ muuta korttia", + "apply": "Käytä", + "app-is-offline": "Sovellus ei ole tällä hetkellä linjoilla, sivun lataaminen uudelleen voi aiheuttaa muutettujen tietojen menettämisen.", "archive": "Arkistoi", "archive-all": "Arkistoi kaikki", "archive-board": "Arkistoi taulu", @@ -46,17 +68,18 @@ "attachment-delete-pop": "Liitetiedoston poistaminen on lopullista. Tätä ei pysty peruuttamaan.", "attachmentDeletePopup-title": "Poista liitetiedosto?", "attachments": "Liitetiedostot", + "auto-watch": "Automaattisesti seuraa tauluja kun ne on luotu", "avatar-too-big": "Profiilikuva on liian suuri (70Kb maksimi)", "back": "Takaisin", - "board-change-color": "Vaihda väri", + "board-change-color": "Muokkaa väriä", "board-nb-stars": "%s tähteä", "board-not-found": "Taulua ei löytynyt", "board-private-info": "Tämä taulu tulee olemaan yksityinen.", "board-public-info": "Tämä taulu tulee olemaan julkinen.", - "boardChangeColorPopup-title": "Vaihda taulun tausta", + "boardChangeColorPopup-title": "Muokkaa taulun taustaa", "boardChangeTitlePopup-title": "Nimeä taulu uudelleen", - "boardChangeVisibilityPopup-title": "Vaihda näkyvyyttä", - "boardImportBoardPopup-title": "Tuo taulu Trellosta", + "boardChangeVisibilityPopup-title": "Muokkaa näkyvyyttä", + "boardChangeWatchPopup-title": "Muokkaa seuraamista", "boardMenuPopup-title": "Taulu valikko", "boards": "Taulut", "bucket-example": "Kuten “Laatikko lista” esimerkiksi", @@ -66,11 +89,15 @@ "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-suggest-archive": "Voit arkistoida kortin poistaaksesi sen taululta ja säilyttääksesi toimet.", + "card-due": "Erääntyy", + "card-due-on": "Erääntyy", "card-edit-attachments": "Muokkaa liitetiedostoja", "card-edit-labels": "Muokkaa tunnisteita", "card-edit-members": "Muokkaa jäseniä", - "card-labels-title": "Vaihda kortin tunnisteita.", + "card-labels-title": "Muokkaa kortin tunnisteita.", "card-members-title": "Lisää tai poista taulun jäseniä tältä kortilta.", + "card-start": "Alkaa", + "card-start-on": "Alkaa", "cardAttachmentsPopup-title": "Liitä mistä", "cardDeletePopup-title": "Poista kortti?", "cardDetailsActionsPopup-title": "Kortti toimet", @@ -78,17 +105,19 @@ "cardMembersPopup-title": "Jäsenet", "cardMorePopup-title": "Lisää", "cards": "Kortit", - "change": "Muuta", - "change-avatar": "Vaihda profiilikuva", + "change": "Muokkaa", + "change-avatar": "Muokkaa profiilikuvaa", "change-password": "Vaihda salasana", - "change-permissions": "Muuta oikeuksia", - "changeAvatarPopup-title": "Vaihda profiilikuva", + "change-permissions": "Muokkaa oikeuksia", + "change-settings": "Muokkaa asetuksia", + "changeAvatarPopup-title": "Muokkaa profiilikuvaa", "changeLanguagePopup-title": "Vaihda kieltä", "changePasswordPopup-title": "Vaihda salasana", - "changePermissionsPopup-title": "Vaihda oikeuksia", + "changePermissionsPopup-title": "Muokkaa oikeuksia", + "changeSettingsPopup-title": "Muokkaa asetuksia", "click-to-star": "Klikkaa merkataksesi tämä taulu tähdellä.", "click-to-unstar": "Klikkaa poistaaksesi tähtimerkintä taululta.", - "clipboard": "Leikepöytä tai raahaa ja pudota", + "clipboard" : "Leikepöytä tai raahaa ja pudota", "close": "Sulje", "close-board": "Sulje taulu", "close-board-pop": "Voit palauttaa taulun klikkaamalla “Arkistot” painiketta kotiotsikosta.", @@ -109,6 +138,7 @@ "createBoardPopup-title": "Luo taulu", "createLabelPopup-title": "Luo tunniste", "current": "nykyinen", + "date": "Päivämäärä", "decline": "Kieltäydy", "default-avatar": "Oletus profiilikuva", "delete": "Poista", @@ -120,9 +150,12 @@ "done": "Valmis", "download": "Lataa", "edit": "Muokkaa", - "edit-avatar": "Vaihda profiilikuva", + "edit-avatar": "Muokkaa profiilikuvaa", "edit-profile": "Muokkaa profiilia", - "editLabelPopup-title": "Vaihda tunniste", + "editCardStartDatePopup-title": "Muokkaa aloituspäivää", + "editCardDueDatePopup-title": "Muokkaa eräpäivää", + "editLabelPopup-title": "Muokkaa tunnistetta", + "editNotificationPopup-title": "Muokkaa ilmoituksia", "editProfilePopup-title": "Muokkaa profiilia", "email": "Sähköposti", "email-enrollAccount-subject": "An account created for you on __siteName__", @@ -146,27 +179,33 @@ "error-user-doesNotExist": "Tätä käyttäjää ei ole olemassa", "error-user-notAllowSelf": "Tämä toiminto itseäsi kohtaan ei ole sallittu", "error-user-notCreated": "Tätä käyttäjää ei ole luotu", + "error-username-taken": "Tämä käyttäjätunnus on jo käytössä", "export-board": "Export board", "filter": "Suodata", "filter-cards": "Suodata kortit", "filter-clear": "Poista suodatin", + "filter-no-label": "Ei tunnistetta", + "filter-no-member": "Ei jäseniä", "filter-on": "Suodatus on päällä", "filter-on-desc": "Suodatat kortteja tällä taululla. Klikkaa tästä muokataksesi suodatinta.", "filter-to-selection": "Suodata valintaan", "fullname": "Koko nimi", "header-logo-title": "Palaa taulut sivullesi.", + "hide-system-messages": "Piilota järjestelmäviestit", "home": "Koti", "import": "Tuo", "import-board": "tuo Trellosta", + "import-board-title": "Tuo taulu Trellosta", "import-board-trello-instruction": "Trello taulullasi, mene 'Menu', sitten 'More', 'Print and Export', 'Export JSON', ja kopioi tuloksena saamasi teksti", - "import-card": "Tuo Trello kortti", - "import-card-trello-instruction": "Mene Trello kortille, valitse 'Share and more...' sitten 'Export JSON' ja kopioi tuloksena saamasi teksti", "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 Wekan käyttäjät", "import-show-user-mapping": "Tarkasta vastaavat jäsenet", "import-user-select": "Valitse Wekan käyttäjä jota haluat käyttää tänä käyttäjänä", + "importMapMembersAddPopup-title": "Valitse Wekan käyttäjä", "info": "Tietoja", "initials": "Nimikirjaimet", + "invalid-date": "Virheellinen päivämäärä", "joined": "liittyi", "just-invited": "Sinut on juuri kutsuttu tälle taululle", "keyboard-shortcuts": "Pikanäppäimet", @@ -186,17 +225,20 @@ "listImportCardPopup-title": "Tuo Trello kortti", "lists": "Listat", "log-out": "Kirjaudu ulos", + "log-in": "Kirjaudu sisään", "loginPopup-title": "Kirjaudu sisään", - "mapMembersAddPopup-title": "Valitse Wekan käyttäjä", - "mapMembersPopup-title": "Vastaavat jäsenet", "memberMenuPopup-title": "Jäsen asetukset", "members": "Jäsenet", "menu": "Valikko", "move-selection": "Move selection", "moveCardPopup-title": "Siirrä kortti", + "moveCardToBottom-title": "Siirrä alimmaiseksi", + "moveCardToTop-title": "Siirrä ylimmäiseksi", "moveSelectionPopup-title": "Move selection", "multi-selection": "Monivalinta", "multi-selection-on": "Monivalinta on päällä", + "muted": "Vaimennettu", + "muted-info": "Et saa koskaan ilmoituksia tämän taulun muutoksista", "my-boards": "Tauluni", "name": "Nimi", "no-archived-cards": "Ei arkistoituja kortteja.", @@ -205,12 +247,15 @@ "normal": "Normaali", "normal-desc": "Voi nähdä ja muokata kortteja. Ei voi muokata asetuksia.", "not-accepted-yet": "Kutsua ei ole hyväksytty vielä", + "notify-participate": "Vastaanota päivityksiä kaikilta korteilta jotka olet tehnyt tai joihin osallistut.", + "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 kirjautumalla sisään.", "page-not-found": "Sivua ei löytynyt.", "password": "Salasana", "paste-or-dragdrop": "liittääksesi, tai vedä & pudota kuvatiedosto siihen (vain kuva)", + "participating": "Osallistutaan", "preview": "Esikatsele", "previewAttachedImagePopup-title": "Esikatsele", "previewClipboardImagePopup-title": "Esikatsele", @@ -240,8 +285,9 @@ "shortcut-close-dialog": "Sulje valintaikkuna", "shortcut-filter-my-cards": "Suodata korttini", "shortcut-show-shortcuts": "Tuo esiin tämä pikavalinta lista", - "shortcut-toggle-filterbar": "Vaihda suodatus sivupalkin näkyvyys", - "shortcut-toggle-sidebar": "Vaihda taulu sivupalkin näkyvyys", + "shortcut-toggle-filterbar": "Muokkaa suodatus sivupalkin näkyvyyttä", + "shortcut-toggle-sidebar": "Muokkaa taulu sivupalkin näkyvyyttä", + "show-cards-minimum-count": "Näytä korttien lukumäärä jos lista sisältää enemmän kuin", "signupPopup-title": "Luo tili", "star-board-title": "Klikkaa merkataksesi taulu tähdellä. Se tulee näkymään ylimpänä taululistallasi.", "starred-boards": "Tähdellä merkatut taulut", @@ -250,14 +296,24 @@ "team": "Tiimi", "this-board": "tämä taulu", "this-card": "tämä kortti", + "time": "Aika", "title": "Otsikko", + "tracking": "Ilmoitukset", + "tracking-info": "Sinulle ilmoitetaan muutoksista korteissa joihin olet osallistunut luojana tai jäsenenä.", "unassign-member": "Peru jäsenvalinta", "unsaved-description": "Sinulla on tallentamaton kuvaus.", + "unwatch": "Lopeta seuraaminen", "upload": "Lähetä", "upload-avatar": "Lähetä profiilikuva", "uploaded-avatar": "Profiilikuva lähetetty", "username": "Käyttäjänimi", "view-it": "Näytä se", "warn-list-archived": "varoitus: tämä kortti on arkistoitujen listalla", + "watch": "Seuraa", + "watching": "Seurataan", + "watching-info": "Sinulle ilmoitetaan tämän taulun muutoksista", + "welcome-board": "Tervetuloa taulu", + "welcome-list1": "Perusasiat", + "welcome-list2": "Edistynyt", "what-to-do": "Mitä haluat tehdä?" } diff --git a/i18n/ro_RO.i18n.json b/i18n/ro.i18n.json similarity index 100% rename from i18n/ro_RO.i18n.json rename to i18n/ro.i18n.json From 22b54d3f083804edbefd0b8a38c0712e32295322 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Wed, 14 Dec 2016 21:56:28 +0200 Subject: [PATCH 074/136] Update Chinese (Taiwan) and Italian translations. --- i18n/it.i18n.json | 422 ++++++++++++++++++++++++------------------- i18n/zh-TW.i18n.json | 42 ++--- 2 files changed, 260 insertions(+), 204 deletions(-) diff --git a/i18n/it.i18n.json b/i18n/it.i18n.json index 07026fd4e..48dd2642e 100644 --- a/i18n/it.i18n.json +++ b/i18n/it.i18n.json @@ -1,21 +1,41 @@ { - "accept": "Accept", + "accept": "Accetta", + "act-activity-notify": "[Wekan] Notifiche attività", + "act-addAttachment": "ha allegato __attachment__ a __card__", + "act-addComment": "ha commentato su __card__: __comment__", + "act-createBoard": "ha creato __board__", + "act-createCard": "ha aggiunto __card__ a __list__", + "act-createList": "ha aggiunto __list__ a __board__", + "act-addBoardMember": "ha aggiunto __member__ a __board__", + "act-archivedBoard": "ha archiviato __board__", + "act-archivedCard": "ha archiviato __card__", + "act-archivedList": "ha archiviato __list__", + "act-importBoard": " ha importato __board__", + "act-importCard": "ha importato __card__", + "act-importList": "ha importato __list__", + "act-joinMember": "ha aggiunto __member__ a __card__", + "act-moveCard": "ha spostato __card__ da __oldList__ a __list__", + "act-removeBoardMember": "ha rimosso __member__ da __board__", + "act-restoredCard": "ha ripristinato __card__ su __board__", + "act-unjoinMember": "ha rimosso __member__ da __card__", + "act-withBoardTitle": "[Wekan] __board__", + "act-withCardTitle": "[__board__] __card__", "actions": "Azioni", "activities": "Attività", "activity": "Attività", - "activity-added": "aggiunto %s a %s", + "activity-added": "ha aggiunto %s a %s", "activity-archived": "archiviato %s", "activity-attached": "allegato %s a %s", "activity-created": "creato %s", "activity-excluded": "escluso %s da %s", - "activity-imported": "imported %s into %s from %s", - "activity-imported-board": "imported %s from %s", - "activity-joined": "è stato unito %s", + "activity-imported": "importato %s in %s da %s", + "activity-imported-board": "importato %s da %s", + "activity-joined": "si è unito a %s", "activity-moved": "spostato %s da %s a %s", "activity-on": "su %s", "activity-removed": "rimosso %s da %s", "activity-sent": "inviato %s a %s", - "activity-unjoined": "unjoined %s", + "activity-unjoined": "ha abbandonato %s", "add": "Aggiungere", "add-attachment": "Aggiungi allegato", "add-board": "Aggiungi una nuova bachecha", @@ -31,21 +51,24 @@ "all-boards": "Tutte le bacheche", "and-n-other-card": "E __count__ altra scheda", "and-n-other-card_plural": "E __count__ altre schede", + "apply": "Applica", + "app-is-offline": "L'applicazione è al momento offline, ricaricando la pagina perderai i dati.", "archive": "Archivia", "archive-all": "Archivia tutto", "archive-board": "Archivia bacheca", "archive-card": "Archivia scheda", "archive-list": "Archivia questa lista", "archive-selection": "Archivia selezione", - "archiveBoardPopup-title": "Archive Board?", + "archiveBoardPopup-title": "Archivia Bacheca?", "archived-items": "Elementi archiviati", - "archives": "Archives", - "assign-member": "Assegna membri", + "archives": "Archivi", + "assign-member": "Aggiungi membro", "attached": "allegato", "attachment": "Allegato", "attachment-delete-pop": "L'eliminazione di un allegato è permanente. Non è possibile annullare.", "attachmentDeletePopup-title": "Eliminare l'allegato?", "attachments": "Allegati", + "auto-watch": "Segui automaticamente le bacheche quando le crei", "avatar-too-big": "L'avatar è troppo grande (max 70Kb)", "back": "Indietro", "board-change-color": "Cambia colore", @@ -56,7 +79,7 @@ "boardChangeColorPopup-title": "Cambia sfondo della bacheca", "boardChangeTitlePopup-title": "Rinomina bacheca", "boardChangeVisibilityPopup-title": "Cambia visibilità", - "boardImportBoardPopup-title": "Import board from Trello", + "boardChangeWatchPopup-title": "Change Watch", "boardMenuPopup-title": "Menu bacheca", "boards": "Bacheche", "bucket-example": "Like “Bucket List” for example", @@ -64,200 +87,233 @@ "card-archived": "Questa scheda è archiviata.", "card-comments-title": "Questa scheda ha %s commenti.", "card-delete-notice": "L'eliminazione è permanente. Tutte le azioni associate a questa scheda andranno perse.", - "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", - "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.", - "card-edit-attachments": "Edit attachments", - "card-edit-labels": "Edit labels", - "card-edit-members": "Edit members", - "card-labels-title": "Change the labels for the card.", - "card-members-title": "Add or remove members of the board from the card.", - "cardAttachmentsPopup-title": "Attach From", - "cardDeletePopup-title": "Delete Card?", - "cardDetailsActionsPopup-title": "Card Actions", - "cardLabelsPopup-title": "Labels", - "cardMembersPopup-title": "Membr", - "cardMorePopup-title": "More", - "cards": "Cards", - "change": "Change", - "change-avatar": "Change Avatar", - "change-password": "Change Password", - "change-permissions": "Change permissions", - "changeAvatarPopup-title": "Change Avatar", - "changeLanguagePopup-title": "Change Language", - "changePasswordPopup-title": "Change Password", - "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 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", + "card-delete-pop": "Tutte le azioni saranno rimosse dal flusso attività e non sarai in grado di riaprire la scheda. Non potrai tornare indietro.", + "card-delete-suggest-archive": "Puoi archiviare una scheda per rimuoverla dalla bacheca e preservare la sua attività.", + "card-due": "Scadenza", + "card-due-on": "Scade", + "card-edit-attachments": "Modifica allegati", + "card-edit-labels": "Modifica etichette", + "card-edit-members": "Modifica membri", + "card-labels-title": "Cambia le etichette per questa scheda.", + "card-members-title": "Aggiungi o rimuovi membri della bacheca da questa scheda", + "card-start": "Inizio", + "card-start-on": "Inizia", + "cardAttachmentsPopup-title": "Allega da", + "cardDeletePopup-title": "Elimina scheda?", + "cardDetailsActionsPopup-title": "Azioni scheda", + "cardLabelsPopup-title": "Etichette", + "cardMembersPopup-title": "Membri", + "cardMorePopup-title": "Altro", + "cards": "Schede", + "change": "Cambia", + "change-avatar": "Cambia avatar", + "change-password": "Cambia password", + "change-permissions": "Cambia permessi", + "change-settings": "Cambia impostazioni", + "changeAvatarPopup-title": "Cambia avatar", + "changeLanguagePopup-title": "Cambia lingua", + "changePasswordPopup-title": "Cambia password", + "changePermissionsPopup-title": "Cambia permessi", + "changeSettingsPopup-title": "Cambia impostazioni", + "click-to-star": "Clicca per stellare questa bacheca", + "click-to-unstar": "Clicca per togliere la stella da questa bacheca", + "clipboard" : "Clipboard o drag & drop", + "close": "Chiudi", + "close-board": "Chiudi bacheca", + "close-board-pop": "Sarai in grado di ripristinare la bacheca cliccando il tasto \"Archivi\" dall'intestazione della pagina principale.", + "color-black": "nero", + "color-blue": "blu", + "color-green": "verde", "color-lime": "lime", - "color-orange": "orange", - "color-pink": "pink", - "color-purple": "purple", - "color-red": "red", - "color-sky": "sky", - "color-yellow": "yellow", - "comment": "Comment", - "comment-placeholder": "Write a comment", + "color-orange": "arancione", + "color-pink": "rosa", + "color-purple": "viola", + "color-red": "rosso", + "color-sky": "azzurro", + "color-yellow": "giallo", + "comment": "Commento", + "comment-placeholder": "Scrivi un commento", "computer": "Computer", - "create": "Create", - "createBoardPopup-title": "Create Board", - "createLabelPopup-title": "Create Label", + "create": "Crea", + "createBoardPopup-title": "Crea bacheca", + "createLabelPopup-title": "Crea etichetta", "current": "current", - "decline": "Decline", - "default-avatar": "Default avatar", - "delete": "Delete", - "deleteLabelPopup-title": "Delete Label?", - "description": "Description", + "date": "Data", + "decline": "Declina", + "default-avatar": "Avatar predefinito", + "delete": "Elimina", + "deleteLabelPopup-title": "Eliminare etichetta?", + "description": "Descrizione", "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", - "discard": "Discard", - "done": "Done", + "discard": "Scarta", + "done": "Fatto", "download": "Download", - "edit": "Edit", - "edit-avatar": "Change Avatar", - "edit-profile": "Edit Profile", - "editLabelPopup-title": "Change Label", - "editProfilePopup-title": "Edit Profile", + "edit": "Modifica", + "edit-avatar": "Cambia avatar", + "edit-profile": "Modifica profilo", + "editCardStartDatePopup-title": "Cambia data di inizio", + "editCardDueDatePopup-title": "Cambia data di scadenza", + "editLabelPopup-title": "Cambia etichetta", + "editNotificationPopup-title": "Modifica notifiche", + "editProfilePopup-title": "Modifica profilo", "email": "Email", - "email-enrollAccount-subject": "An account created for you on __siteName__", - "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", - "email-fail": "Sending email failed", - "email-invalid": "Invalid email", - "email-invite": "Invite via Email", - "email-invite-subject": "__inviter__ sent you an invitation", - "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", - "email-resetPassword-subject": "Reset your password on __siteName__", - "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", - "email-sent": "Email sent", - "email-verifyEmail-subject": "Verify your email address on __siteName__", - "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", - "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", + "email-enrollAccount-subject": "Creato un account per te su __siteName__", + "email-enrollAccount-text": "Ciao __user__,\n\nPer iniziare ad usare il servizio, clicca sul link seguente:\n\n__url__\n\nGrazie.\n", + "email-fail": "Invio email fallito", + "email-invalid": "Email non valida", + "email-invite": "Invita via email", + "email-invite-subject": "__inviter__ ti ha inviato un invito", + "email-invite-text": "Caro __user__,\n\n__inviter__ ti ha invitato ad unirti alla bacheca \"__board__\" per le collaborazioni.\n\nPer favore clicca sul link seguente:\n\n__url__\n\nGrazie.\n", + "email-resetPassword-subject": "Ripristina la tua password su on __siteName__", + "email-resetPassword-text": "Ciao __user__,\n\nPer ripristinare la tua password, clicca sul link seguente:\n\n__url__\n\nGrazie.\n", + "email-sent": "Email inviata", + "email-verifyEmail-subject": "Verifica il tuo indirizzo email su on __siteName__", + "email-verifyEmail-text": "Ciao __user__,\n\nPer verificare il tuo account email, clicca sul link seguente:\n\n__url__\n\nGrazie.\n", + "error-board-doesNotExist": "Questa bacheca non esiste", + "error-board-notAdmin": "Devi essere admin di questa bacheca per poterlo fare", + "error-board-notAMember": "Devi essere un membro di questa bacheca per poterlo fare", + "error-json-malformed": "Il tuo testo non è un JSON valido", + "error-json-schema": "Il tuo file JSON non contiene le giuste informazioni nel formato corretto", + "error-list-doesNotExist": "Questa lista non esiste", + "error-user-doesNotExist": "Questo utente non esiste", "error-user-notAllowSelf": "This action on self is not allowed", "error-user-notCreated": "This user is not created", - "export-board": "Export board", - "filter": "Filter", - "filter-cards": "Filter Cards", - "filter-clear": "Clear filter", - "filter-on": "Filter is on", - "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", - "filter-to-selection": "Filter to selection", - "fullname": "Full Name", - "header-logo-title": "Go back to your boards page.", + "error-username-taken": "Questo username è già utilizzato", + "export-board": "Esporta bacheca", + "filter": "Filtra", + "filter-cards": "Filtra schede", + "filter-clear": "Pulisci filtri", + "filter-no-label": "Nessuna etichetta", + "filter-no-member": "Nessun membro", + "filter-on": "Il filtro è attivo", + "filter-on-desc": "Stai filtrando le schede su questa bacheca. Clicca qui per modificare il filtro,", + "filter-to-selection": "Seleziona", + "fullname": "Nome completo", + "header-logo-title": "Torna alla tua bacheca.", + "hide-system-messages": "Nascondi i messaggi di sistema", "home": "Home", - "import": "Import", - "import-board": "import from Trello", - "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text", - "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": "Importa", + "import-board": "importa da Trello", + "import-board-title": "Importa una bacheca da Trello", + "import-board-trello-instruction": "Nella tua bacheca Trello vai a 'Menu', poi 'Altro', 'Stampa ed esporta', 'Esporta JSON', e copia il testo che compare.", + "import-json-placeholder": "Incolla un JSON valido qui", + "import-map-members": "Map members", "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users", "import-show-user-mapping": "Review members mapping", "import-user-select": "Pick the Wekan user you want to use as this member", - "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)", - "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", - "labels": "Labels", - "language": "Language", - "last-admin-desc": "You can’t change roles because there must be at least one admin.", - "leave-board": "Leave Board", - "link-card": "Link to this card", - "list-archive-cards": "Archive all cards in this list", - "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view archived cards and bring them back to the board, click “Menu” > “Archived Items”.", - "list-move-cards": "Move all cards in this list", - "list-select-cards": "Select all cards in this list", - "listActionPopup-title": "List Actions", - "listImportCardPopup-title": "Import a Trello card", - "lists": "Lists", + "importMapMembersAddPopup-title": "Seleziona i membri di Wekan", + "info": "Info", + "initials": "Iniziali", + "invalid-date": "Data non valida", + "joined": "si è unito a", + "just-invited": "Sei stato appena invitato a questa bacheca", + "keyboard-shortcuts": "Scorciatoie da tastiera", + "label-create": "Crea una nuova etichetta", + "label-default": "%s etichetta (default)", + "label-delete-pop": "Non potrai tornare indietro. Procedendo, rimuoverai questa etichetta da tutte le schede e distruggerai la sua cronologia.", + "labels": "Etichette", + "language": "Lingua", + "last-admin-desc": "Non puoi cambiare i ruoli perché deve esserci almeno un admin.", + "leave-board": "Abbandona bacheca", + "link-card": "Link a questa scheda", + "list-archive-cards": "Archivia tutte le schede in questa lista", + "list-archive-cards-pop": "Questo rimuoverà dalla bacheca tutte le schede in questa lista. Per vedere le schede archiviate e portarle indietro alla bacheca, clicca “Menu” > “Elementi archiviati”", + "list-move-cards": "Sposta tutte le schede in questa lista", + "list-select-cards": "Selezione tutte le schede in questa lista", + "listActionPopup-title": "Azioni disponibili", + "listImportCardPopup-title": "Importa una scheda di Trello", + "lists": "Liste", "log-out": "Log Out", + "log-in": "Log In", "loginPopup-title": "Log In", - "mapMembersAddPopup-title": "Select Wekan member", - "mapMembersPopup-title": "Map members", - "memberMenuPopup-title": "Member Settings", - "members": "Membr", + "memberMenuPopup-title": "Impostazioni membri", + "members": "Membri", "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", - "name": "Name", - "no-archived-cards": "No archived cards.", - "no-archived-lists": "No archived lists.", - "no-results": "No results", - "normal": "Normal", - "normal-desc": "Can view and edit cards. Can't change settings.", - "not-accepted-yet": "Invitation not accepted yet", - "optional": "optional", - "or": "or", - "page-maybe-private": "This page may be private. You may be able to view it by logging in.", - "page-not-found": "Page not found.", + "move-selection": "Sposta selezione", + "moveCardPopup-title": "Sposta scheda", + "moveCardToBottom-title": "Sposta in fondo", + "moveCardToTop-title": "Sposta in alto", + "moveSelectionPopup-title": "Sposta selezione", + "multi-selection": "Multi-Selezione", + "multi-selection-on": "Multi-Selezione attiva", + "muted": "Silenziato", + "muted-info": "Non sarai mai notificato delle modifiche in questa bacheca", + "my-boards": "Le mie bacheche", + "name": "Nome", + "no-archived-cards": "Nessuna scheda archiviata.", + "no-archived-lists": "Nessuna lista archiviata.", + "no-results": "Nessun risultato", + "normal": "Normale", + "normal-desc": "Può visionare e modificare le schede. Non può cambiare le impostazioni.", + "not-accepted-yet": "Invitato non ancora accettato", + "notify-participate": "Ricevi aggiornamenti per qualsiasi scheda a cui partecipi come creatore o membro", + "notify-watch": "Ricevi aggiornamenti per tutte le bacheche, liste o schede che stai seguendo", + "optional": "opzionale", + "or": "o", + "page-maybe-private": "Questa pagina potrebbe essere privata. Potresti essere in grado di vederla facendo il log-in.", + "page-not-found": "Pagina non trovata.", "password": "Password", - "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", - "preview": "Preview", - "previewAttachedImagePopup-title": "Preview", - "previewClipboardImagePopup-title": "Preview", - "private": "Private", - "private-desc": "This board is private. Only people added to the board can view and edit it.", - "profile": "Profile", - "public": "Public", - "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", - "quick-access-description": "Star a board to add a shortcut in this bar.", - "remove-cover": "Remove Cover", - "remove-from-board": "Remove from Board", - "remove-label": "Remove the label", - "remove-member": "Remove Member", - "remove-member-from-card": "Remove from Card", - "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", - "removeMemberPopup-title": "Remove Member?", - "rename": "Rename", + "paste-or-dragdrop": "per incollare, oppure trascina & rilascia il file immagine (solo immagini)", + "participating": "Partecipando", + "preview": "Anteprima", + "previewAttachedImagePopup-title": "Anteprima", + "previewClipboardImagePopup-title": "Anteprima", + "private": "Privata", + "private-desc": "Questa bacheca è privata. Solo le persone aggiunte alla bacheca possono vederla e modificarla.", + "profile": "Profilo", + "public": "Pubblica", + "public-desc": "Questa bacheca è pubblica. È visibile a chiunque abbia il link e sarà mostrata dai motori di ricerca come Google. Solo le persone aggiunte alla bacheca possono modificarla.", + "quick-access-description": "Stella una bacheca per aggiungere una scorciatoia in questa barra.", + "remove-cover": "Rimuovi cover", + "remove-from-board": "Rimuovi dalla bacheca", + "remove-label": "Rimuovi l'etichetta", + "remove-member": "Rimuovi utente", + "remove-member-from-card": "Rimuovi dalla scheda", + "remove-member-pop": "Rimuovere __name__ (__username__) da __boardTitle__? L'utente sarà rimosso da tutte le schede in questa bacheca. Riceveranno una notifica.", + "removeMemberPopup-title": "Rimuovere membro?", + "rename": "Rinomina", "rename-board": "Rinomina bacheca", - "restore": "Restore", - "save": "Save", - "search": "Search", - "select-color": "Select a color", - "shortcut-assign-self": "Assign yourself to current card", - "shortcut-autocomplete-emoji": "Autocomplete emoji", - "shortcut-autocomplete-members": "Autocomplete members", - "shortcut-clear-filters": "Clear all filters", - "shortcut-close-dialog": "Close Dialog", - "shortcut-filter-my-cards": "Filter my cards", - "shortcut-show-shortcuts": "Bring up this shortcuts list", + "restore": "Ripristina", + "save": "Salva", + "search": "Cerca", + "select-color": "Seleziona un colore", + "shortcut-assign-self": "Aggiungi te stesso alla scheda corrente", + "shortcut-autocomplete-emoji": "Autocompletamento emoji", + "shortcut-autocomplete-members": "Autocompletamento membri", + "shortcut-clear-filters": "Pulisci tutti i filtri", + "shortcut-close-dialog": "Chiudi finestra di dialogo", + "shortcut-filter-my-cards": "Filtra le mie schede", + "shortcut-show-shortcuts": "Porta in alto questa lista di scorciatoie", "shortcut-toggle-filterbar": "Toggle Filter Sidebar", "shortcut-toggle-sidebar": "Toggle Board Sidebar", - "signupPopup-title": "Create an Account", - "star-board-title": "Click to star this board. It will show up at top of your boards list.", - "starred-boards": "Starred Boards", - "starred-boards-description": "Starred boards show up at the top of your boards list.", - "subscribe": "Subscribe", + "show-cards-minimum-count": "Mostra il contatore delle schede se la lista ne contiene più di", + "signupPopup-title": "Crea un account", + "star-board-title": "Clicca per stellare questa bacheca. Sarà mostrata all'inizio della tua lista bacheche.", + "starred-boards": "Bacheche stellate", + "starred-boards-description": "Le bacheche stellate vengono mostrato all'inizio della tua lista bacheche.", + "subscribe": "Sottoscrivi", "team": "Team", - "this-board": "this board", - "this-card": "this card", - "title": "Title", - "unassign-member": "Unassign member", - "unsaved-description": "You have an unsaved description.", + "this-board": "questa bacheca", + "this-card": "questa scheda", + "time": "Ora", + "title": "Titolo", + "tracking": "Monitoraggio", + "tracking-info": "Sarai notificato per tutte le modifiche alle schede delle quali sei creatore o membro.", + "unassign-member": "Rimuovi membro", + "unsaved-description": "Hai una descrizione non salvata", + "unwatch": "Non seguire", "upload": "Upload", - "upload-avatar": "Upload an avatar", - "uploaded-avatar": "Uploaded an avatar", + "upload-avatar": "Carica un avatar", + "uploaded-avatar": "Avatar caricato", "username": "Username", - "view-it": "View it", - "warn-list-archived": "warning: this card is in an archived list", - "what-to-do": "What do you want to do?" + "view-it": "Vedi", + "warn-list-archived": "attenzione: questa scheda è in una lista archiviata", + "watch": "Segui", + "watching": "Stai seguendo", + "watching-info": "Sarai notificato per tutte le modifiche in questa bacheca", + "welcome-board": "Bacheca di benvenuto", + "welcome-list1": "Basi", + "welcome-list2": "Avanzate", + "what-to-do": "Cosa vuoi fare?" } diff --git a/i18n/zh-TW.i18n.json b/i18n/zh-TW.i18n.json index dc8380415..0cd4565c1 100644 --- a/i18n/zh-TW.i18n.json +++ b/i18n/zh-TW.i18n.json @@ -1,23 +1,23 @@ { "accept": "接受", - "act-activity-notify": "[Wekan] Activity Notification", - "act-addAttachment": "attached __attachment__ to __card__", - "act-addComment": "commented on __card__: __comment__", - "act-createBoard": "created __board__", - "act-createCard": "added __card__ to __list__", - "act-createList": "added __list__ to __board__", - "act-addBoardMember": "added __member__ to __board__", - "act-archivedBoard": "archived __board__", - "act-archivedCard": "archived __card__", - "act-archivedList": "archived __list__", - "act-importBoard": "imported __board__", - "act-importCard": "imported __card__", - "act-importList": "imported __list__", - "act-joinMember": "added __member__ to __card__", - "act-moveCard": "moved __card__ from __oldList__ to __list__", - "act-removeBoardMember": "removed __member__ from __board__", - "act-restoredCard": "restored __card__ to __board__", - "act-unjoinMember": "removed __member__ from __card__", + "act-activity-notify": "[Wekan] 活動通知", + "act-addAttachment": "新增附件__attachment__至__card__", + "act-addComment": "評論__card__: __comment__", + "act-createBoard": "完成新增 __board__", + "act-createCard": "將__card__加入__list__", + "act-createList": "新增__list__至__board__", + "act-addBoardMember": "在__board__中新增成員__member__", + "act-archivedBoard": "封存__board__", + "act-archivedCard": "封存__card__", + "act-archivedList": "封存__list__", + "act-importBoard": "匯入__board__", + "act-importCard": "匯入__card__", + "act-importList": "匯入__list__", + "act-joinMember": "在__card__中新增成員__member__", + "act-moveCard": "將__card__從__oldList__移動至__list__", + "act-removeBoardMember": "從__board__中移除成員__member__", + "act-restoredCard": "將__card__回復至__board__", + "act-unjoinMember": "從__card__中移除成員__member__", "act-withBoardTitle": "[Wekan] __board__", "act-withCardTitle": "[__board__] __card__", "actions": "操作", @@ -248,14 +248,14 @@ "normal-desc": "可以建立以及編輯卡片,無法更改。", "not-accepted-yet": "邀請尚未接受", "notify-participate": "Receive updates to any cards you participate as creater or member", - "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "notify-watch": "接收您關注的看板、清單或卡片的更新", "optional": "選擇性的", "or": "或", "page-maybe-private": "本頁面被設為私有. 您必須 登入以瀏覽其中內容。", "page-not-found": "頁面不存在。", "password": "密碼", "paste-or-dragdrop": "從剪貼簿貼上,或者拖曳檔案到它上面 (僅限於圖片)", - "participating": "Participating", + "participating": "參與", "preview": "預覽", "previewAttachedImagePopup-title": "預覽", "previewClipboardImagePopup-title": "預覽", @@ -287,7 +287,7 @@ "shortcut-show-shortcuts": "顯示此快速鍵清單", "shortcut-toggle-filterbar": "切換過濾程式邊欄", "shortcut-toggle-sidebar": "切換面板邊欄", - "show-cards-minimum-count": "Show cards count if list contains more than", + "show-cards-minimum-count": "顯示卡片數量,當內容超過數量", "signupPopup-title": "建立帳戶", "star-board-title": "點此標記該看板,它將會出現在您的看板列表上方。", "starred-boards": "已標記看板", From fd18ca314a29b34a12761282385b98c7c7495ad3 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 16 Dec 2016 14:03:29 +0200 Subject: [PATCH 075/136] v0.11.0 Wekan fork first release. --- CHANGELOG.md | 5 +++-- package.json | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) mode change 100755 => 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md old mode 100755 new mode 100644 index 130af6d4a..22a8dcd8c --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -# v0.x Wekan fork upcoming release, already committed to devel branch +# v0.11.0 Wekan fork first release This release adds the following new features: @@ -10,6 +10,7 @@ This release adds the following new features: * Option 'filter by empty' to filter by cards by 'no member' and 'no label' properties; * Speedup: Added MongoDB index on CardId into Comments collection. +* Translation updates and fixes the following bugs: @@ -25,7 +26,7 @@ and fixes the following bugs: Thanks to GitHub users dwrencha, fmonthel, mario-orlicky, pierreozoux, shoetten, and xet7 for their contributions. -# v0.11 +# v0.11.0-rc2 This release adds the following new features: diff --git a/package.json b/package.json index 0a69681f3..795f0e5da 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "0.10.1", + "version": "0.11.0", "description": "The open-source Trello-like kanban", "private": true, "scripts": { From be3995716cc0404f599f3055cedec41ad4d79e67 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 16 Dec 2016 15:29:29 +0200 Subject: [PATCH 076/136] Install from source as supported platform. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a25295481..16acaa427 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,8 @@ that by providing one-click installation on various platforms. ## Supported Platforms +[Install from source][install_source] + [Debian Wheezy 64bit][debian_wheezy] [![Deploy][heroku_button]][heroku_deploy] @@ -39,8 +41,6 @@ that by providing one-click installation on various platforms. ## Upcoming Platforms -[Install from source][install_source] - [Create Sandstorm .spk file from source][sandstorm_spk] [Docker][docker_image] From 2ee7f1383c5a3b728b4a0365575e9899660025c3 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 16 Dec 2016 15:38:30 +0200 Subject: [PATCH 077/136] Add autoinstall script as upcoming platform. --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 16acaa427..fb1df21f0 100644 --- a/README.md +++ b/README.md @@ -41,14 +41,16 @@ that by providing one-click installation on various platforms. ## Upcoming Platforms -[Create Sandstorm .spk file from source][sandstorm_spk] - [Docker][docker_image] [Docker on SUSE Linux Enterprise Server 12 SP1][sles] +[Autoinstall script][autoinstall] based on [this issue][autoinstall_issue] + [VirtualBox][virtualbox]: Needs to be updated for Wefork. +[Create Sandstorm .spk file from source][sandstorm_spk] + Email to work on already working Heroku: Use 3rd party email like SendGrid, update process.env.MAIL_URL , change from email at Accounts.emailTeamplates.from , @@ -97,3 +99,5 @@ with [Meteor](https://www.meteor.com). [sandstorm_spk]: https://github.com/wefork/wekan/issues/36 [docker_image]: https://github.com/wefork/wekan/issues/33 [translate_wefork]: https://www.transifex.com/wefork/wefork/ +[autoinstall]: https://github.com/wefork/wekan-autoinstall +[autoinstall_issue]: https://github.com/anselal/wekan/issues/18 From bdd88f486e28c02fa21a8c582a27e7d543e9c040 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 10 Jan 2017 18:06:03 +0200 Subject: [PATCH 078/136] Update translations. --- .tx/config | 2 +- i18n/ar.i18n.json | 68 +++++++++++- i18n/br.i18n.json | 72 ++++++++++-- i18n/ca.i18n.json | 68 +++++++++++- i18n/cs.i18n.json | 72 ++++++++++-- i18n/de.i18n.json | 258 ++++++++++++++++++++++++++----------------- i18n/es-ES.i18n.json | 72 ++++++++++-- i18n/es.i18n.json | 68 +++++++++++- i18n/fa.i18n.json | 72 ++++++++++-- i18n/fr.i18n.json | 72 ++++++++++-- i18n/he.i18n.json | 74 +++++++++++-- i18n/ja.i18n.json | 68 +++++++++++- i18n/ko.i18n.json | 70 ++++++++++-- i18n/pl.i18n.json | 72 ++++++++++-- i18n/pt-BR.i18n.json | 72 ++++++++++-- i18n/ro.i18n.json | 72 ++++++++++-- i18n/ru.i18n.json | 95 +++++++++++++--- i18n/sr.i18n.json | 72 ++++++++++-- i18n/tr.i18n.json | 68 +++++++++++- i18n/zh-CN.i18n.json | 80 ++++++++++++-- i18n/zh-TW.i18n.json | 8 +- 21 files changed, 1321 insertions(+), 254 deletions(-) diff --git a/.tx/config b/.tx/config index 1f95dacdc..0d6318bc3 100644 --- a/.tx/config +++ b/.tx/config @@ -39,7 +39,7 @@ host = https://www.transifex.com # tap:i18n requires us to use `-` separator in the language identifiers whereas # Transifex uses a `_` separator, without an option to customize it on one side # or the other, so we need to do a Manual mapping. -lang_map = es_ES:es-ES, fa_IR:fa-IR, pt_BR:pt-BR, zh_CN:zh-CN, zh_TW:zh-TW +lang_map = es_ES:es-ES, fa_IR:fa, pt_BR:pt-BR, ro_RO:ro, zh_CN:zh-CN, zh_TW:zh-TW [wefork.application] file_filter = i18n/.i18n.json diff --git a/i18n/ar.i18n.json b/i18n/ar.i18n.json index 225b09752..a09721bc7 100644 --- a/i18n/ar.i18n.json +++ b/i18n/ar.i18n.json @@ -1,5 +1,25 @@ { "accept": "Accept", + "act-activity-notify": "[Wekan] Activity Notification", + "act-addAttachment": "attached __attachment__ to __card__", + "act-addComment": "commented on __card__: __comment__", + "act-createBoard": "created __board__", + "act-createCard": "added __card__ to __list__", + "act-createList": "added __list__ to __board__", + "act-addBoardMember": "added __member__ to __board__", + "act-archivedBoard": "archived __board__", + "act-archivedCard": "archived __card__", + "act-archivedList": "archived __list__", + "act-importBoard": "imported __board__", + "act-importCard": "imported __card__", + "act-importList": "imported __list__", + "act-joinMember": "added __member__ to __card__", + "act-moveCard": "moved __card__ from __oldList__ to __list__", + "act-removeBoardMember": "removed __member__ from __board__", + "act-restoredCard": "restored __card__ to __board__", + "act-unjoinMember": "removed __member__ from __card__", + "act-withBoardTitle": "[Wekan] __board__", + "act-withCardTitle": "[__board__] __card__", "actions": "الإجراءات", "activities": "الأنشطة", "activity": "النشاط", @@ -31,6 +51,8 @@ "all-boards": "كل اللوحات", "and-n-other-card": "And __count__ other بطاقة", "and-n-other-card_plural": "And __count__ other بطاقات", + "apply": "Apply", + "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", "archive": "أرشف", "archive-all": "أرشف الكل", "archive-board": "أرشف اللوحة", @@ -46,6 +68,7 @@ "attachment-delete-pop": "حذف المرق هو حذف نهائي . لا يمكن التراجع إذا حذف.", "attachmentDeletePopup-title": "تريد حذف المرفق ?", "attachments": "المرفقات", + "auto-watch": "Automatically watch boards when create it", "avatar-too-big": "حجم ملف الصورة الخاصة بك كبير . لا يمكن أن تتجاوز 70 كيلو أكتي", "back": "رجوع", "board-change-color": "تغيير اللومr", @@ -56,7 +79,7 @@ "boardChangeColorPopup-title": "تعديل خلفية الشاشة", "boardChangeTitlePopup-title": "إعادة تسمية اللوحة", "boardChangeVisibilityPopup-title": "تعديل وضوح الرؤية", - "boardImportBoardPopup-title": "Import board from Trello", + "boardChangeWatchPopup-title": "Change Watch", "boardMenuPopup-title": "قائمة اللوحة", "boards": "لوحات", "bucket-example": "مثل « todo list » على سبيل المثال", @@ -66,11 +89,15 @@ "card-delete-notice": "هذا حذف أبديّ . سوف تفقد كل الإجراءات المنوطة بهذه البطاقة", "card-delete-pop": "سيتم إزالة جميع الإجراءات من تبعات النشاط، وأنك لن تكون قادرا على إعادة فتح البطاقة. لا يوجد التراجع.", "card-delete-suggest-archive": "يمكنك أرشفة بطاقة لحذفها من اللوحة والمحافظة على النشاط.", + "card-due": "Due", + "card-due-on": "Due on", "card-edit-attachments": "تعديل المرفقات", "card-edit-labels": "تعديل العلامات", "card-edit-members": "تعديل الأعضاء", "card-labels-title": "تعديل علامات البطاقة.", "card-members-title": "إضافة او حذف أعضاء للبطاقة.", + "card-start": "Start", + "card-start-on": "Starts on", "cardAttachmentsPopup-title": "إرفاق من", "cardDeletePopup-title": "حذف البطاقة ?", "cardDetailsActionsPopup-title": "إجراءات على البطاقة", @@ -82,13 +109,15 @@ "change-avatar": "تعديل الصورة الشخصية", "change-password": "تغيير كلمة المرور", "change-permissions": "تعديل الصلاحيات", + "change-settings": "Change Settings", "changeAvatarPopup-title": "تعديل الصورة الشخصية", "changeLanguagePopup-title": "تغيير اللغة", "changePasswordPopup-title": "تغيير كلمة المرور", "changePermissionsPopup-title": "تعديل الصلاحيات", + "changeSettingsPopup-title": "Change Settings", "click-to-star": "اضغط لإضافة اللوحة للمفضلة.", "click-to-unstar": "اضغط لحذف اللوحة من المفضلة.", - "clipboard": "Clipboard or drag & drop", + "clipboard" : "Clipboard or drag & drop", "close": "غلق", "close-board": "غلق اللوحة", "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", @@ -109,6 +138,7 @@ "createBoardPopup-title": "إنشاء لوحة", "createLabelPopup-title": "إنشاء علامة", "current": "الحالي", + "date": "Date", "decline": "Decline", "default-avatar": "صورة شخصية افتراضية", "delete": "حذف", @@ -122,7 +152,10 @@ "edit": "تعديل", "edit-avatar": "تعديل الصورة الشخصية", "edit-profile": "تعديل الملف الشخصي", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", "editLabelPopup-title": "تعديل العلامة", + "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "تعديل الملف الشخصي", "email": "البريد الإلكتروني", "email-enrollAccount-subject": "An account created for you on __siteName__", @@ -146,27 +179,33 @@ "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", + "error-username-taken": "This username is already taken", "export-board": "Export board", "filter": "تصفية", "filter-cards": "تصفية البطاقات", "filter-clear": "مسح التصفية", + "filter-no-label": "No label", + "filter-no-member": "No member", "filter-on": "التصفية تشتغل", "filter-on-desc": "أنت بصدد تصفية بطاقات هذه اللوحة. اضغط هنا لتعديل التصفية.", "filter-to-selection": "تصفية بالتحديد", "fullname": "الإسم الكامل", "header-logo-title": "الرجوع إلى صفحة اللوحات", + "hide-system-messages": "Hide system messages", "home": "الرئيسية", "import": "Import", "import-board": "import from Trello", + "import-board-title": "Import board from Trello", "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text", - "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-map-members": "Map members", "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users", "import-show-user-mapping": "Review members mapping", "import-user-select": "Pick the Wekan user you want to use as this member", + "importMapMembersAddPopup-title": "Select Wekan member", "info": "معلومات", "initials": "أولية", + "invalid-date": "Invalid date", "joined": "انضمّ", "just-invited": "You are just invited to this board", "keyboard-shortcuts": "اختصار لوحة المفاتيح", @@ -186,17 +225,20 @@ "listImportCardPopup-title": "Import a Trello card", "lists": "القائمات", "log-out": "تسجيل الخروج", + "log-in": "Log In", "loginPopup-title": "تسجيل الدخول", - "mapMembersAddPopup-title": "Select Wekan member", - "mapMembersPopup-title": "Map members", "memberMenuPopup-title": "أفضليات الأعضاء", "members": "أعضاء", "menu": "القائمة", "move-selection": "Move selection", "moveCardPopup-title": "نقل البطاقة", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", "multi-selection": "تحديد أكثر من واحدة", "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", "my-boards": "لوحاتي", "name": "اسم", "no-archived-cards": "لا يوجد بطاقة في الأرشيف.", @@ -205,12 +247,15 @@ "normal": "عادي", "normal-desc": "يمكن مشاهدة و تعديل البطاقات. لا يمكن تغيير إعدادات الضبط.", "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", "optional": "اختياري", "or": "or", "page-maybe-private": "قدتكون هذه الصفحة خاصة . قد تستطيع مشاهدتها ب تسجيل الدخول.", "page-not-found": "صفحة غير موجودة", "password": "كلمة المرور", "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", "preview": "Preview", "previewAttachedImagePopup-title": "Preview", "previewClipboardImagePopup-title": "Preview", @@ -242,6 +287,7 @@ "shortcut-show-shortcuts": "عرض قائمة الإختصارات ،تلك", "shortcut-toggle-filterbar": "Toggle Filter Sidebar", "shortcut-toggle-sidebar": "إظهار-إخفاء الشريط الجانبي للوحة", + "show-cards-minimum-count": "Show cards count if list contains more than", "signupPopup-title": "إنشاء حساب", "star-board-title": "اضغط لإضافة هذه اللوحة إلى المفضلة . سوف يتم إظهارها على رأس بقية اللوحات.", "starred-boards": "اللوحات المفضلة", @@ -250,14 +296,24 @@ "team": "فريق", "this-board": "هذه اللوحة", "this-card": "هذه البطاقة", + "time": "Time", "title": "عنوان", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", "unassign-member": "إلغاء تعيين العضو", "unsaved-description": "لديك وصف غير محفوظ", + "unwatch": "Unwatch", "upload": "Upload", "upload-avatar": "رفع صورة شخصية", "uploaded-avatar": "تم رفع الصورة الشخصية", "username": "اسم المستخدم", "view-it": "شاهدها", "warn-list-archived": "انتبه : هذه البطاقة في أرشيف القائمات", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", "what-to-do": "ماذا تريد أن تنجز?" } diff --git a/i18n/br.i18n.json b/i18n/br.i18n.json index 634e53694..5e313ac26 100644 --- a/i18n/br.i18n.json +++ b/i18n/br.i18n.json @@ -1,5 +1,25 @@ { "accept": "Asantiñ", + "act-activity-notify": "[Wekan] Activity Notification", + "act-addAttachment": "attached __attachment__ to __card__", + "act-addComment": "commented on __card__: __comment__", + "act-createBoard": "created __board__", + "act-createCard": "added __card__ to __list__", + "act-createList": "added __list__ to __board__", + "act-addBoardMember": "added __member__ to __board__", + "act-archivedBoard": "archived __board__", + "act-archivedCard": "archived __card__", + "act-archivedList": "archived __list__", + "act-importBoard": "imported __board__", + "act-importCard": "imported __card__", + "act-importList": "imported __list__", + "act-joinMember": "added __member__ to __card__", + "act-moveCard": "moved __card__ from __oldList__ to __list__", + "act-removeBoardMember": "removed __member__ from __board__", + "act-restoredCard": "restored __card__ to __board__", + "act-unjoinMember": "removed __member__ from __card__", + "act-withBoardTitle": "[Wekan] __board__", + "act-withCardTitle": "[__board__] __card__", "actions": "Oberoù", "activities": "Oberiantizoù", "activity": "Oberiantiz", @@ -31,6 +51,8 @@ "all-boards": "All boards", "and-n-other-card": "And __count__ other card", "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", "archive": "Archive", "archive-all": "Archive All", "archive-board": "Archive Board", @@ -46,6 +68,7 @@ "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", "attachmentDeletePopup-title": "Delete Attachment?", "attachments": "Attachments", + "auto-watch": "Automatically watch boards when create it", "avatar-too-big": "The avatar is too large (70Kb max)", "back": "Back", "board-change-color": "Kemmañ al liv", @@ -56,7 +79,7 @@ "boardChangeColorPopup-title": "Change Board Background", "boardChangeTitlePopup-title": "Rename Board", "boardChangeVisibilityPopup-title": "Change Visibility", - "boardImportBoardPopup-title": "Import board from Trello", + "boardChangeWatchPopup-title": "Change Watch", "boardMenuPopup-title": "Board Menu", "boards": "Boards", "bucket-example": "Like “Bucket List” for example", @@ -66,11 +89,15 @@ "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.", + "card-due": "Due", + "card-due-on": "Due on", "card-edit-attachments": "Edit attachments", "card-edit-labels": "Edit labels", "card-edit-members": "Edit members", "card-labels-title": "Change the labels for the card.", "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", "cardAttachmentsPopup-title": "Attach From", "cardDeletePopup-title": "Diverkañ ar gartenn ?", "cardDetailsActionsPopup-title": "Card Actions", @@ -82,13 +109,15 @@ "change-avatar": "Change Avatar", "change-password": "Kemmañ ger-tremen", "change-permissions": "Change permissions", + "change-settings": "Change Settings", "changeAvatarPopup-title": "Change Avatar", "changeLanguagePopup-title": "Change Language", "changePasswordPopup-title": "Kemmañ ger-tremen", "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", "click-to-star": "Click to star this board.", "click-to-unstar": "Click to unstar this board.", - "clipboard": "Clipboard or drag & drop", + "clipboard" : "Clipboard or drag & drop", "close": "Close", "close-board": "Close Board", "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", @@ -109,6 +138,7 @@ "createBoardPopup-title": "Create Board", "createLabelPopup-title": "Create Label", "current": "current", + "date": "Date", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Diverkañ", @@ -122,7 +152,10 @@ "edit": "Kemmañ", "edit-avatar": "Change Avatar", "edit-profile": "Edit Profile", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", "email-enrollAccount-subject": "An account created for you on __siteName__", @@ -146,27 +179,33 @@ "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", + "error-username-taken": "This username is already taken", "export-board": "Export board", "filter": "Filter", "filter-cards": "Filter Cards", "filter-clear": "Clear filter", + "filter-no-label": "No label", + "filter-no-member": "No member", "filter-on": "Filter is on", "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", "filter-to-selection": "Filter to selection", "fullname": "Full Name", "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", "home": "Home", "import": "Import", "import-board": "import from Trello", + "import-board-title": "Import board from Trello", "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text", - "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-map-members": "Map members", "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users", "import-show-user-mapping": "Review members mapping", "import-user-select": "Pick the Wekan user you want to use as this member", + "importMapMembersAddPopup-title": "Select Wekan member", "info": "Infos", "initials": "Initials", + "invalid-date": "Invalid date", "joined": "joined", "just-invited": "You are just invited to this board", "keyboard-shortcuts": "Keyboard shortcuts", @@ -186,17 +225,20 @@ "listImportCardPopup-title": "Import a Trello card", "lists": "Lists", "log-out": "Log Out", + "log-in": "Log In", "loginPopup-title": "Log In", - "mapMembersAddPopup-title": "Select Wekan member", - "mapMembersPopup-title": "Map members", "memberMenuPopup-title": "Member Settings", "members": "Izili", "menu": "Menu", "move-selection": "Move selection", "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", "multi-selection": "Multi-Selection", "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", "my-boards": "My Boards", "name": "Name", "no-archived-cards": "No archived cards.", @@ -205,12 +247,15 @@ "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", "optional": "optional", "or": "or", "page-maybe-private": "This page may be private. You may be able to view it by logging in.", "page-not-found": "Page not found.", "password": "Ger-tremen", "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", "preview": "Preview", "previewAttachedImagePopup-title": "Preview", "previewClipboardImagePopup-title": "Preview", @@ -234,7 +279,7 @@ "search": "Search", "select-color": "Select a color", "shortcut-assign-self": "Assign yourself to current card", - "shortcut-autocomplete-emojies": "Autocomplete emojies", + "shortcut-autocomplete-emoji": "Autocomplete emoji", "shortcut-autocomplete-members": "Autocomplete members", "shortcut-clear-filters": "Clear all filters", "shortcut-close-dialog": "Close Dialog", @@ -242,6 +287,7 @@ "shortcut-show-shortcuts": "Bring up this shortcuts list", "shortcut-toggle-filterbar": "Toggle Filter Sidebar", "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", "signupPopup-title": "Create an Account", "star-board-title": "Click to star this board. It will show up at top of your boards list.", "starred-boards": "Starred Boards", @@ -250,14 +296,24 @@ "team": "Team", "this-board": "this board", "this-card": "this card", + "time": "Time", "title": "Title", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", "unassign-member": "Unassign member", "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", "upload": "Upload", "upload-avatar": "Upload an avatar", "uploaded-avatar": "Uploaded an avatar", "username": "Username", "view-it": "View it", "warn-list-archived": "warning: this card is in an archived list", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", "what-to-do": "What do you want to do?" -} \ No newline at end of file +} diff --git a/i18n/ca.i18n.json b/i18n/ca.i18n.json index fa223d022..83b82d422 100644 --- a/i18n/ca.i18n.json +++ b/i18n/ca.i18n.json @@ -1,5 +1,25 @@ { "accept": "Accepta", + "act-activity-notify": "[Wekan] Activity Notification", + "act-addAttachment": "attached __attachment__ to __card__", + "act-addComment": "commented on __card__: __comment__", + "act-createBoard": "created __board__", + "act-createCard": "added __card__ to __list__", + "act-createList": "added __list__ to __board__", + "act-addBoardMember": "added __member__ to __board__", + "act-archivedBoard": "archived __board__", + "act-archivedCard": "archived __card__", + "act-archivedList": "archived __list__", + "act-importBoard": "imported __board__", + "act-importCard": "imported __card__", + "act-importList": "imported __list__", + "act-joinMember": "added __member__ to __card__", + "act-moveCard": "moved __card__ from __oldList__ to __list__", + "act-removeBoardMember": "removed __member__ from __board__", + "act-restoredCard": "restored __card__ to __board__", + "act-unjoinMember": "removed __member__ from __card__", + "act-withBoardTitle": "[Wekan] __board__", + "act-withCardTitle": "[__board__] __card__", "actions": "Accions", "activities": "Activitats", "activity": "Activitat", @@ -31,6 +51,8 @@ "all-boards": "Tots els taulers", "and-n-other-card": "And __count__ other card", "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", "archive": "Desa", "archive-all": "Desa Tot", "archive-board": "Arxiva tauler", @@ -46,6 +68,7 @@ "attachment-delete-pop": "L'esborrat d'un arxiu adjunt és permanent. No es pot desfer.", "attachmentDeletePopup-title": "Esborrar adjunt?", "attachments": "Adjunts", + "auto-watch": "Automatically watch boards when create it", "avatar-too-big": "L'avatar és massa gran (70Kb max)", "back": "Enrere", "board-change-color": "Canvia el color", @@ -56,7 +79,7 @@ "boardChangeColorPopup-title": "Canvia fons", "boardChangeTitlePopup-title": "Canvia el nom tauler", "boardChangeVisibilityPopup-title": "Canvia visibilitat", - "boardImportBoardPopup-title": "Importa tauler des de Trello", + "boardChangeWatchPopup-title": "Change Watch", "boardMenuPopup-title": "Menú del tauler", "boards": "Taulers", "bucket-example": "Igual que “Bucket List”, per exemple", @@ -66,11 +89,15 @@ "card-delete-notice": "L'esborrat és permanent. Perdreu totes les accions associades a aquesta fitxa.", "card-delete-pop": "Totes les accions s'eliminaran de l'activitat i no podreu tornar a obrir la fitxa. No es pot desfer.", "card-delete-suggest-archive": "Podeu arxivar una fitxa per extreure-la del tauler i preservar l'activitat.", + "card-due": "Due", + "card-due-on": "Due on", "card-edit-attachments": "Edita arxius adjunts", "card-edit-labels": "Edita etiquetes", "card-edit-members": "Edita membres", "card-labels-title": "Canvia les etiquetes de la fitxa", "card-members-title": "Afegeix o eliminar membres del tauler des de la fitxa.", + "card-start": "Start", + "card-start-on": "Starts on", "cardAttachmentsPopup-title": "Adjunta des de", "cardDeletePopup-title": "Esborrar fitxa?", "cardDetailsActionsPopup-title": "Accions de fitxes", @@ -82,13 +109,15 @@ "change-avatar": "Canvia Avatar", "change-password": "Canvia la clau", "change-permissions": "Canvia permisos", + "change-settings": "Change Settings", "changeAvatarPopup-title": "Canvia Avatar", "changeLanguagePopup-title": "Canvia idioma", "changePasswordPopup-title": "Canvia la contrasenya", "changePermissionsPopup-title": "Canvia permisos", + "changeSettingsPopup-title": "Change Settings", "click-to-star": "Fes clic per destacar aquest tauler.", "click-to-unstar": "Fes clic per deixar de destacar aquest tauler.", - "clipboard": "Portaretalls o estirar i amollar", + "clipboard" : "Portaretalls o estirar i amollar", "close": "Tanca", "close-board": "Tanca tauler", "close-board-pop": "Podràs restaurar el tauler, seleccionant \"Arxivats\" de la finistra principal", @@ -109,6 +138,7 @@ "createBoardPopup-title": "Crea tauler", "createLabelPopup-title": "Crea etiqueta", "current": "Actual", + "date": "Date", "decline": "Declina", "default-avatar": "Avatar per defecte", "delete": "Esborra", @@ -122,7 +152,10 @@ "edit": "Edita", "edit-avatar": "Canvia Avatar", "edit-profile": "Edita el teu Perfil", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", "editLabelPopup-title": "Canvia etiqueta", + "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edita teu Perfil", "email": "Correu electrònic", "email-enrollAccount-subject": "An account created for you on __siteName__", @@ -146,27 +179,33 @@ "error-user-doesNotExist": "L'usuari no existeix", "error-user-notAllowSelf": "Aquesta acció no està permesa", "error-user-notCreated": "L'usuari no s'ha creat", + "error-username-taken": "This username is already taken", "export-board": "Export board", "filter": "Filtre", "filter-cards": "Fitxes de filtre", "filter-clear": "Elimina filtre", + "filter-no-label": "No label", + "filter-no-member": "No member", "filter-on": "Filtra per", "filter-on-desc": "Estau filtrant fitxes en aquest tauler. Feu clic aquí per editar el filtre.", "filter-to-selection": "Filtra selecció", "fullname": "Nom complet", "header-logo-title": "Torna a la teva pàgina de taulers", + "hide-system-messages": "Hide system messages", "home": "Inici", "import": "importa", "import-board": "Importa des de Trello", + "import-board-title": "Import board from Trello", "import-board-trello-instruction": "En el teu tauler Trello, ves a 'Menú', 'Més'.' Imprimir i Exportar', 'Exportar JSON', i copia el text resultant.", - "import-card": "Importa una fitxa de Trello", - "import-card-trello-instruction": "Ves a la fitxa Trello, selecciona 'Compartir i més...' llavors 'Export JSON' i copia el text resultant", "import-json-placeholder": "Aferra codi JSON vàlid aquí", + "import-map-members": "Map members", "import-members-map": "El tauler importat conté membres. Assigna els membres que vulguis importar a usuaris Wekan", "import-show-user-mapping": "Revisa l'assignació de membres", "import-user-select": "Selecciona l'usuari Wekan que vulguis associar a aquest membre", + "importMapMembersAddPopup-title": "Select Wekan member", "info": "Informacions", "initials": "Inicials", + "invalid-date": "Invalid date", "joined": "s'ha unit", "just-invited": "Has estat convidat a aquest tauler", "keyboard-shortcuts": "Dreceres de teclat", @@ -186,17 +225,20 @@ "listImportCardPopup-title": "importa una fitxa de Trello", "lists": "Llistes", "log-out": "Finalitza la sessió", + "log-in": "Log In", "loginPopup-title": "Inicia sessió", - "mapMembersAddPopup-title": "Selecciona membre de Wekan", - "mapMembersPopup-title": "Assigna membres", "memberMenuPopup-title": "Configura membres", "members": "Membres", "menu": "Menú", "move-selection": "Move selection", "moveCardPopup-title": "Moure fitxa", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", "multi-selection": "Multi-Selecció", "multi-selection-on": "Multi-Selecció està activada", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", "my-boards": "Els meus taulers", "name": "Nom", "no-archived-cards": "No hi ha fitxes arxivades.", @@ -205,12 +247,15 @@ "normal": "Normal", "normal-desc": "Podeu veure i editar fitxes. No podeu canviar la configuració.", "not-accepted-yet": "La invitació no ha esta acceptada encara", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", "optional": "opcional", "or": "o", "page-maybe-private": "Aquesta pàgina és privada. Per veure-la entra .", "page-not-found": "Pàgina no trobada.", "password": "Contrasenya", "paste-or-dragdrop": "aferra, o estira i amolla la imatge (només imatge)", + "participating": "Participating", "preview": "Vista prèvia", "previewAttachedImagePopup-title": "Vista prèvia", "previewClipboardImagePopup-title": "Vista prèvia", @@ -242,6 +287,7 @@ "shortcut-show-shortcuts": "Mostra aquesta lista d'accessos directes", "shortcut-toggle-filterbar": "Canvia la barra lateral del tauler", "shortcut-toggle-sidebar": "Canvia Sidebar del Tauler", + "show-cards-minimum-count": "Show cards count if list contains more than", "signupPopup-title": "Crea un compte", "star-board-title": "Fes clic per destacar aquest tauler. Es mostrarà a la part superior de la llista de taulers.", "starred-boards": "Taulers destacats", @@ -250,14 +296,24 @@ "team": "Equip", "this-board": "aquest tauler", "this-card": "aquesta fitxa", + "time": "Time", "title": "Títol", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", "unassign-member": "Desassignar membre", "unsaved-description": "Tens una descripció sense desar.", + "unwatch": "Unwatch", "upload": "Puja", "upload-avatar": "Actualitza avatar", "uploaded-avatar": "Avatar actualitzat", "username": "Nom d'Usuari", "view-it": "Vist", "warn-list-archived": "Avís: aquesta fitxa està en una llista arxivada", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", "what-to-do": "Què vols fer?" } diff --git a/i18n/cs.i18n.json b/i18n/cs.i18n.json index 30c847488..10bcc456c 100644 --- a/i18n/cs.i18n.json +++ b/i18n/cs.i18n.json @@ -1,5 +1,25 @@ { "accept": "Přijmout", + "act-activity-notify": "[Wekan] Activity Notification", + "act-addAttachment": "attached __attachment__ to __card__", + "act-addComment": "commented on __card__: __comment__", + "act-createBoard": "created __board__", + "act-createCard": "added __card__ to __list__", + "act-createList": "added __list__ to __board__", + "act-addBoardMember": "added __member__ to __board__", + "act-archivedBoard": "archived __board__", + "act-archivedCard": "archived __card__", + "act-archivedList": "archived __list__", + "act-importBoard": "imported __board__", + "act-importCard": "imported __card__", + "act-importList": "imported __list__", + "act-joinMember": "added __member__ to __card__", + "act-moveCard": "moved __card__ from __oldList__ to __list__", + "act-removeBoardMember": "removed __member__ from __board__", + "act-restoredCard": "restored __card__ to __board__", + "act-unjoinMember": "removed __member__ from __card__", + "act-withBoardTitle": "[Wekan] __board__", + "act-withCardTitle": "[__board__] __card__", "actions": "Akce", "activities": "Aktivity", "activity": "Aktivita", @@ -31,6 +51,8 @@ "all-boards": "Všechna tabla", "and-n-other-card": "A __count__ další karta(y)", "and-n-other-card_plural": "A __count__ dalších karet", + "apply": "Apply", + "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", "archive": "Archiv", "archive-all": "Archivovat vše", "archive-board": "Archivovat tablo", @@ -46,6 +68,7 @@ "attachment-delete-pop": "Smazání přílohy je trvalé. Nejde vrátit zpět.", "attachmentDeletePopup-title": "Smazat přílohu?", "attachments": "Přílohy", + "auto-watch": "Automatically watch boards when create it", "avatar-too-big": "Avatar je příliš velký (70Kb max)", "back": "Zpět", "board-change-color": "Změnit barvu", @@ -56,7 +79,7 @@ "boardChangeColorPopup-title": "Změnit pozadí tabla", "boardChangeTitlePopup-title": "Přejmenovat tablo", "boardChangeVisibilityPopup-title": "Upravit viditelnost", - "boardImportBoardPopup-title": "Importovat tablo ze služby Trello", + "boardChangeWatchPopup-title": "Change Watch", "boardMenuPopup-title": "Menu tabla", "boards": "Tabla", "bucket-example": "Například \"Než mě odvedou\"", @@ -66,11 +89,15 @@ "card-delete-notice": "Smazání je trvalé. Přijdete o všechny akce asociované s touto kartou.", "card-delete-pop": "Všechny akce budou odstraněny z kanálu aktivity a nebude možné kartu znovu otevřít. Toto nelze vrátit zpět.", "card-delete-suggest-archive": "Kartu můžete archivovat a tím ji odstranit z tabla a přitom zachovat aktivity.", + "card-due": "Due", + "card-due-on": "Due on", "card-edit-attachments": "Upravit přílohy", "card-edit-labels": "Upravit štítky", "card-edit-members": "Upravit členy", "card-labels-title": "Změnit štítky karty.", "card-members-title": "Přidat nebo odstranit členy tohoto tabla z karty.", + "card-start": "Start", + "card-start-on": "Starts on", "cardAttachmentsPopup-title": "Přiložit formulář", "cardDeletePopup-title": "Smazat kartu?", "cardDetailsActionsPopup-title": "Akce karty", @@ -82,13 +109,15 @@ "change-avatar": "Změnit avatar", "change-password": "Změnit heslo", "change-permissions": "Změnit oprávnění", + "change-settings": "Change Settings", "changeAvatarPopup-title": "Změnit avatar", "changeLanguagePopup-title": "Změnit jazyk", "changePasswordPopup-title": "Změnit heslo", "changePermissionsPopup-title": "Změnit oprávnění", + "changeSettingsPopup-title": "Change Settings", "click-to-star": "Kliknutím přidat hvězdičku tomuto tablu.", "click-to-unstar": "Kliknutím odebrat hvězdičku tomuto tablu.", - "clipboard": "Schránka nebo potáhnout a pustit", + "clipboard" : "Schránka nebo potáhnout a pustit", "close": "Zavřít", "close-board": "Zavřít tablo", "close-board-pop": "Budete moci obnovit tablo kliknutím na tlačítko \"Archivy\" v hlavním menu.", @@ -109,6 +138,7 @@ "createBoardPopup-title": "Vytvořit tablo", "createLabelPopup-title": "Vytvořit štítek", "current": "Aktuální", + "date": "Date", "decline": "Zamítnout", "default-avatar": "Výchozí avatar", "delete": "Smazat", @@ -122,7 +152,10 @@ "edit": "Upravit", "edit-avatar": "Změnit avatar", "edit-profile": "Upravit profil", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", "editLabelPopup-title": "Změnit štítek", + "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Upravit profil", "email": "Email", "email-enrollAccount-subject": "Byl vytvořen účet na __siteName__", @@ -146,27 +179,33 @@ "error-user-doesNotExist": "Tento uživatel neexistuje", "error-user-notAllowSelf": "Tato akce pro sebe sama není povolena", "error-user-notCreated": "Tento uživatel není vytvořen", + "error-username-taken": "This username is already taken", "export-board": "Exportovat tablo", "filter": "Filtr", "filter-cards": "Filtrovat karty", "filter-clear": "Vyčistit filtr", + "filter-no-label": "No label", + "filter-no-member": "No member", "filter-on": "Filtr je zapnut", "filter-on-desc": "Filtrujete karty tohoto tabla. Pro úpravu filtru klikni sem.", "filter-to-selection": "Filtrovat výběr", "fullname": "Celé jméno", "header-logo-title": "Jit zpět na stránku s tably.", + "hide-system-messages": "Hide system messages", "home": "Domů", "import": "Import", "import-board": "Importovat ze služby Trello", + "import-board-title": "Import board from Trello", "import-board-trello-instruction": "Na svém Trello tablu, otevři 'Menu', pak 'More', 'Print and Export', 'Export JSON', a zkopíruj výsledný text", - "import-card": "Importovat kartu ze služby Trello", - "import-card-trello-instruction": "Přejdi na Trello kartu, vyber 'Share and more...' a pak 'Export JSON' a zkopíruj výsledný text", "import-json-placeholder": "Sem vlož validní JSON data", + "import-map-members": "Map members", "import-members-map": "Toto importované tablo obsahuje několik členů. Namapuj členy z importu na uživatelské účty Wekan.", "import-show-user-mapping": "Zkontrolovat namapování členů", "import-user-select": "Vyber uživatele Wekan, kterého chceš použít pro tohoto člena", + "importMapMembersAddPopup-title": "Select Wekan member", "info": "Informace", "initials": "Iniciály", + "invalid-date": "Invalid date", "joined": "spojeno", "just-invited": "Právě jsi byl pozván(a) do tohoto tabla", "keyboard-shortcuts": "Klávesové zkratky", @@ -186,17 +225,20 @@ "listImportCardPopup-title": "Importovat Trello kartu", "lists": "Seznamy", "log-out": "Odhlásit", + "log-in": "Log In", "loginPopup-title": "Přihlásit", - "mapMembersAddPopup-title": "Vybrat Wekan uživatele", - "mapMembersPopup-title": "Mapovat členy", "memberMenuPopup-title": "Nastavení uživatele", "members": "Členové", "menu": "Menu", "move-selection": "Přesunout výběr", "moveCardPopup-title": "Přesunout kartu", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Přesunout výběr", "multi-selection": "Multi-výběr", "multi-selection-on": "Multi-výběr je zapnut", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", "my-boards": "Moje tabla", "name": "Jméno", "no-archived-cards": "Žádné archivované karty.", @@ -205,12 +247,15 @@ "normal": "Normální", "normal-desc": "Může zobrazovat a upravovat karty. Nemůže měnit nastavení.", "not-accepted-yet": "Pozvánka ještě nebyla přijmuta", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", "optional": "volitelný", "or": "nebo", "page-maybe-private": "Tato stránka může být soukromá. Můžete ji zobrazit po přihlášení.", "page-not-found": "Stránka nenalezena.", "password": "Heslo", "paste-or-dragdrop": "vložit, nebo přetáhnout a pustit soubor obrázku (pouze obrázek)", + "participating": "Participating", "preview": "Náhled", "previewAttachedImagePopup-title": "Náhled", "previewClipboardImagePopup-title": "Náhled", @@ -234,7 +279,7 @@ "search": "Hledat", "select-color": "Vybrat barvu", "shortcut-assign-self": "Přiřadit sebe k aktuální kartě", - "shortcut-autocomplete-emojies": "Automatický výběr emotikon", + "shortcut-autocomplete-emoji": "Autocomplete emoji", "shortcut-autocomplete-members": "Automatický výběr uživatel", "shortcut-clear-filters": "Vyčistit všechny filtry", "shortcut-close-dialog": "Zavřít dialog", @@ -242,6 +287,7 @@ "shortcut-show-shortcuts": "Otevřít tento seznam odkazů", "shortcut-toggle-filterbar": "Přepnout lištu filtrování", "shortcut-toggle-sidebar": "Přepnout lištu tabla", + "show-cards-minimum-count": "Show cards count if list contains more than", "signupPopup-title": "Vytvořit účet", "star-board-title": "Kliknutím přidat tablu hvězdičku. Poté bude zobrazeno navrchu seznamu.", "starred-boards": "Tabla s hvězdičkou", @@ -250,14 +296,24 @@ "team": "Tým", "this-board": "toto tablo", "this-card": "tuto kartu", + "time": "Time", "title": "Název", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", "unassign-member": "Vyřadit člena", "unsaved-description": "Popis neni uložen.", + "unwatch": "Unwatch", "upload": "Nahrát", "upload-avatar": "Nahrát avatar", "uploaded-avatar": "Avatar nahrán", "username": "Uživatelské jméno", "view-it": "Zobrazit", "warn-list-archived": "varování: tato karta je v archivovaném seznamu", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", "what-to-do": "Co chcete dělat?" -} \ No newline at end of file +} diff --git a/i18n/de.i18n.json b/i18n/de.i18n.json index 43e12d885..cb5190d45 100644 --- a/i18n/de.i18n.json +++ b/i18n/de.i18n.json @@ -1,5 +1,25 @@ { - "accept": "Accept", + "accept": "Akzeptieren", + "act-activity-notify": "[Wekan] Aktivitätsbenachrichtigung", + "act-addAttachment": "hat __attachment__ an __card__ angehängt", + "act-addComment": "hat __card__ kommentiert: __comment__", + "act-createBoard": "hat __board__ erstellt", + "act-createCard": "hat __card__ zu __list__ hinzugefügt", + "act-createList": "hat __list__ zu __board__ hinzugefügt", + "act-addBoardMember": "hat __member__ zu __board__ hinzugefügt", + "act-archivedBoard": "hat __board__ archiviert", + "act-archivedCard": "hat __card__ archiviert", + "act-archivedList": "hat __list__ archiviert", + "act-importBoard": "hat __board__ importiert", + "act-importCard": "hat __card__ importiert", + "act-importList": "hat __list__ importiert", + "act-joinMember": "hat __member__ zu __card__ hinzugefügt", + "act-moveCard": "hat __card__ von __oldList__ nach __list__ verschoben", + "act-removeBoardMember": "hat __member__ von __board__ entfernt", + "act-restoredCard": "hat __card__ in __board__ wiederhergestellt", + "act-unjoinMember": "hat __member__ von __card__ entfernt", + "act-withBoardTitle": "[Wekan] __board__", + "act-withCardTitle": "[__board__] __card__", "actions": "Aktionen", "activities": "Aktivitäten", "activity": "Aktivität", @@ -8,45 +28,48 @@ "activity-attached": "hat %s an %s angehängt", "activity-created": "hat %s erstellt", "activity-excluded": "hat %s von %s ausgeschlossen", - "activity-imported": "imported %s into %s from %s", - "activity-imported-board": "imported %s from %s", - "activity-joined": "hat %s beigetreten", + "activity-imported": "hat %s in %s von %s importiert", + "activity-imported-board": "hat %s von %s importiert", + "activity-joined": "ist %s beigetreten", "activity-moved": "hat %s von %s nach %s verschoben", - "activity-on": "on %s", + "activity-on": "in %s", "activity-removed": "hat %s von %s entfernt", "activity-sent": "hat %s an %s gesendet", - "activity-unjoined": "unjoined %s", + "activity-unjoined": "hat %s verlassen", "add": "Hinzufügen", "add-attachment": "Anhang hinzufügen", "add-board": "Neues Board erstellen", - "add-card": "Karte hinzufügen...", + "add-card": "Karte hinzufügen", "add-cover": "Cover hinzufügen", "add-label": "Label hinzufügen", - "add-list": "Liste hinzufügen...", - "add-members": "Mitglieder hinzufügen...", + "add-list": "Liste hinzufügen", + "add-members": "Mitglieder hinzufügen", "added": "Hinzugefügt", - "addMemberPopup-title": "Nutzer", + "addMemberPopup-title": "Mitglieder", "admin": "Admin", "admin-desc": "Kann Karten anschauen und bearbeiten, Mitglieder entfernen und Boardeinstellungen ändern.", "all-boards": "Alle Boards", "and-n-other-card": "und eine andere Karte", "and-n-other-card_plural": "und __count__ andere Karten", + "apply": "Übernehmen", + "app-is-offline": "Die Anwendung ist derzeit offline. Aktualisieren der Seite führt zu Datenverlust.", "archive": "Archiv", "archive-all": "Alles archivieren", "archive-board": "Board archivieren", "archive-card": "Karte archivieren", "archive-list": "Diese Liste archivieren", "archive-selection": "Auswahl archivieren", - "archiveBoardPopup-title": "Archive Board?", + "archiveBoardPopup-title": "Board archivieren?", "archived-items": "Archivierte Einträge", "archives": "Archive", "assign-member": "Mitglied zuweisen", "attached": "angehängt", "attachment": "Anhang", - "attachment-delete-pop": "Das Löschen des Anhangs ist endgültig und kann nicht wieder rückgängig gemacht werden.", + "attachment-delete-pop": "Das Löschen eines Anhangs kann nicht wieder rückgängig gemacht werden.", "attachmentDeletePopup-title": "Anhang löschen?", "attachments": "Anhänge", - "avatar-too-big": "Das Profilbild ist zu groß (70Kb max)", + "auto-watch": "Neue Boards automatisch beobachten", + "avatar-too-big": "Das Profilbild ist zu groß (max. 70Kb)", "back": "Zurück", "board-change-color": "Farbe ändern", "board-nb-stars": "%s Sterne", @@ -56,21 +79,25 @@ "boardChangeColorPopup-title": "Boardfarbe ändern", "boardChangeTitlePopup-title": "Board umbenennen", "boardChangeVisibilityPopup-title": "Sichtbarkeit ändern", - "boardImportBoardPopup-title": "Import board from Trello", + "boardChangeWatchPopup-title": "Beobachtung ändern", "boardMenuPopup-title": "Boardmenü", "boards": "Boards", - "bucket-example": "Zum Beispiel \"Bucket List\"", + "bucket-example": "z.B. \"Löffelliste\"", "cancel": "Abbrechen", "card-archived": "Diese Karte wurde archiviert.", "card-comments-title": "Diese Karte hat %s Kommentare.", - "card-delete-notice": "Löschen ist irreversiebel. Alle Aktionen, die mit dieser Karte zu tun haben, werden ebenfalls gelöscht.", - "card-delete-pop": "Alle Aktionen werden vom Aktivitätsfeed entfernt und du kannst die Karte nicht mehr öffnen. Es gibt keine Möglichkeit diese Aktion rückgängig zu machen.", - "card-delete-suggest-archive": "Du kannst die Karte statdessen archivieren, um sie vom Bord zu entfernen und die Aktivitäten zu erhalten.", - "card-edit-attachments": "Anhang ändern", + "card-delete-notice": "Löschen ist unwiderruflich. Alle Aktionen die dieser Karte zugeordnet sind werden ebenfalls gelöscht.", + "card-delete-pop": "Alle Aktionen werden vom Aktivitätsfeed entfernt und die Karte kann nicht mehr geöffnet werden. Das Löschen kann nicht widerrufen werden!", + "card-delete-suggest-archive": "Sie können eine Karte archivieren, um sie von dem Board zu entfernen und die Aktivitäten zu behalten.", + "card-due": "Ende", + "card-due-on": "Ende am", + "card-edit-attachments": "Anhänge ändern", "card-edit-labels": "Labels ändern", - "card-edit-members": "Nutzer ändern", - "card-labels-title": "Label für diese Karte ändern.", - "card-members-title": "Füge dem Board Nutzer hinzu oder entferne sie von der Karte.", + "card-edit-members": "Mitglieder ändern", + "card-labels-title": "Labels für diese Karte ändern.", + "card-members-title": "Der Karte Board-Mitglieder hinzufügen oder entfernen.", + "card-start": "Start", + "card-start-on": "Start am", "cardAttachmentsPopup-title": "Anhängen von", "cardDeletePopup-title": "Karte löschen?", "cardDetailsActionsPopup-title": "Kartenaktionen", @@ -78,20 +105,22 @@ "cardMembersPopup-title": "Mitglieder", "cardMorePopup-title": "Mehr", "cards": "Karten", - "change": "Change", + "change": "Ändern", "change-avatar": "Profilbild ändern", "change-password": "Passwort ändern", - "change-permissions": "Ändere Berechtigungen", + "change-permissions": "Berechtigungen ändern", + "change-settings": "Einstellungen ändern", "changeAvatarPopup-title": "Profilbild ändern", - "changeLanguagePopup-title": "Sprache ändern...", + "changeLanguagePopup-title": "Sprache ändern", "changePasswordPopup-title": "Passwort ändern", - "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", + "changePermissionsPopup-title": "Berechtigungen ändern", + "changeSettingsPopup-title": "Einstellungen ändern", + "click-to-star": "Klicken um dem Board einen Stern zu geben.", + "click-to-unstar": "Klicken um den Stern von dem Board zu entfernen.", + "clipboard" : "Zwischenablage oder Drag & Drop", "close": "Schließen", "close-board": "Board schließen", - "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", + "close-board-pop": "Sie können das Board wiederherstellen, indem Sie den \"Archiv\"-Button in der Kopfzeile der Startseite anklicken.", "color-black": "schwarz", "color-blue": "blau", "color-green": "grün", @@ -106,10 +135,11 @@ "comment-placeholder": "Kommentar schreiben", "computer": "Computer", "create": "Erstellen", - "createBoardPopup-title": "Erstelle ein Board", + "createBoardPopup-title": "Board erstellen", "createLabelPopup-title": "Label erstellen", "current": "aktuell", - "decline": "Decline", + "date": "Datum", + "decline": "Ablehnen", "default-avatar": "Standard Profilbild", "delete": "Löschen", "deleteLabelPopup-title": "Label löschen?", @@ -117,86 +147,98 @@ "disambiguateMultiLabelPopup-title": "Labels vereinheitlichen", "disambiguateMultiMemberPopup-title": "Mitglieder vereinheitlichen", "discard": "Verwerfen", - "done": "Done", - "download": "Download", + "done": "Erledigt", + "download": "Herunterladen", "edit": "Bearbeiten", "edit-avatar": "Profilbild ändern", "edit-profile": "Profil ändern", - "editLabelPopup-title": "Ändere Label", + "editCardStartDatePopup-title": "Startdatum ändern", + "editCardDueDatePopup-title": "Enddatum ändern", + "editLabelPopup-title": "Label ändern", + "editNotificationPopup-title": "Benachrichtigung ändern", "editProfilePopup-title": "Profil ändern", - "email": "Email", - "email-enrollAccount-subject": "An account created for you on __siteName__", - "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", - "email-fail": "Sending email failed", - "email-invalid": "Invalid email", - "email-invite": "Invite via Email", - "email-invite-subject": "__inviter__ sent you an invitation", - "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", - "email-resetPassword-subject": "Reset your password on __siteName__", - "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", - "email-sent": "Email sent", - "email-verifyEmail-subject": "Verify your email address on __siteName__", - "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", - "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", - "export-board": "Export board", + "email": "E-Mail", + "email-enrollAccount-subject": "Ihr Benutzerkonto auf __siteName__ wurde erstellt", + "email-enrollAccount-text": "Hallo __user__,\n\num den Dienst nutzen zu können, klicken Sie bitte auf folgenden Link:\n\n__url__\n\nDanke.\n", + "email-fail": "Senden der E-Mail fehlgeschlagen", + "email-invalid": "Ungültige E-Mail-Adresse", + "email-invite": "via E-Mail einladen", + "email-invite-subject": "__inviter__ hat Ihnen eine Einladung geschickt", + "email-invite-text": "Hallo __user__,\n\n__inviter__ hat Sie zu dem Board \"__board__\" eingeladen.\n\nBitte klicken Sie auf folgenden Link:\n\n__url__\n\nDanke.\n", + "email-resetPassword-subject": "Setzten Sie ihr Passwort auf __siteName__ zurück", + "email-resetPassword-text": "Hallo __user__,\n\num ihr Passwort zurückzusetzen, klicken Sie bitte auf folgenden Link:\n\n__url__\n\nDanke.\n", + "email-sent": "E-Mail gesendet", + "email-verifyEmail-subject": "Bestätigen Sie ihre E-Mail-Adresse auf __siteName__", + "email-verifyEmail-text": "Hallo __user__,\n\num ihre E-Mail-Adresse zu bestätigen, klicken Sie bitte auf folgenden Link:\n\n__url__\n\nDanke.\n", + "error-board-doesNotExist": "Dieses Board existiert nicht", + "error-board-notAdmin": "Um das zu tun, müssen Sie der Administrator dieses Boards sein", + "error-board-notAMember": "Um das zu tun, müssen Sie ein Mitglied dieses Boards sein", + "error-json-malformed": "Ihre Eingabe ist kein gültiges JSON", + "error-json-schema": "Ihre JSON-Daten enthalten nicht die gewünschten Informationen im richtigen Format", + "error-list-doesNotExist": "Diese Liste existiert nicht", + "error-user-doesNotExist": "Dieser Nutzer existiert nicht", + "error-user-notAllowSelf": "Diese Aktion auf self ist nicht erlaubt", + "error-user-notCreated": "Dieser Nutzer ist angelegt", + "error-username-taken": "Dieser Benutzername ist bereits vergeben", + "export-board": "Board exportieren", "filter": "Filter", "filter-cards": "Karten filtern", "filter-clear": "Filter entfernen", + "filter-no-label": "Kein Label", + "filter-no-member": "Kein Mitglied", "filter-on": "Filter ist aktiv", - "filter-on-desc": "Du filterst die Karten auf diesem Board. Klicke hier, um die Filter zu bearbeiten.", + "filter-on-desc": "Sie filtern die Karten in diesem Board. Klicken um die Filter zu bearbeiten.", "filter-to-selection": "Ergebnisse auswählen", - "fullname": "Voller Name", + "fullname": "Vollständiger Name", "header-logo-title": "Zurück zur Board Seite.", + "hide-system-messages": "Systemmeldungen ausblenden", "home": "Home", "import": "Importieren", - "import-board": "import from Trello", - "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text", - "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", + "import-board": "von Trello importieren", + "import-board-title": "Board von Trello importieren", + "import-board-trello-instruction": "Gehen Sie in ihrem Trello-Board auf 'Menü', dann 'Mehr', 'Drucken und Exportieren', 'JSON-Export' und kopieren Sie den dort angezeigten Text", + "import-json-placeholder": "Fügen Sie die korrekten JSON-Daten hier ein", + "import-map-members": "Mitglieder zuordnen", + "import-members-map": "Das importierte Board hat einige Mitglieder. Bitte ordnen Sie die Mitglieder, die importiert werden sollen, Wekan-Nutzern zu", + "import-show-user-mapping": "Mitgliederzuordnung überprüfen", + "import-user-select": "Wählen Sie den Wekan-Nutzer aus, der dieses Mitglied sein soll", + "importMapMembersAddPopup-title": "Wekan-Nutzer auswählen", "info": "Informationen", "initials": "Initialien", + "invalid-date": "Ungültiges Datum", "joined": "beigetreten", - "just-invited": "You are just invited to this board", + "just-invited": "Sie wurden soeben zu diesem Board eingeladen", "keyboard-shortcuts": "Tastaturkürzel", - "label-create": "Neues Label erstellen.", + "label-create": "Neues Label erstellen", "label-default": "%s Label (Standard)", - "label-delete-pop": "Diese Aktion ist irreversiebel. Das Label wird von allen Karten entfernt und seine Historie gelöscht.", + "label-delete-pop": "Diese Aktion ist unwiderruflich. Das Label wird von allen Karten entfernt und seine Historie wird gelöscht.", "labels": "Labels", "language": "Sprache", - "last-admin-desc": "Du kannst die Rolle nicht ändern, es muss mindestens einen Admin geben.", + "last-admin-desc": "Sie können keine Rollen ändern, weil es mindestens ein Administrator geben muss.", "leave-board": "Board verlassen", "link-card": "Link zu dieser Karte", "list-archive-cards": "Alle Karten in dieser Liste archivieren", - "list-archive-cards-pop": "Dies entfernt alle Karten in der Liste vom Board. Um archivierte Karten anzusehen und zurück zum Board zu bringen, klicke \"Menü\" > \"Archivierte Items\".", + "list-archive-cards-pop": "Dieses entfernt alle Karten von dieser Liste des Boards. Um archivierte Karten anzuzeigen und wiederherzustellen, klicken Sie auf \"Menü\" > \"Archivierte Einträge\".", "list-move-cards": "Alle Karten in dieser Liste verschieben", "list-select-cards": "Alle Karten in dieser Liste auswählen", "listActionPopup-title": "Listenaktionen", - "listImportCardPopup-title": "Import a Trello card", + "listImportCardPopup-title": "Eine Trello-Karte importieren", "lists": "Listen", "log-out": "Ausloggen", + "log-in": "Einloggen", "loginPopup-title": "Einloggen", - "mapMembersAddPopup-title": "Select Wekan member", - "mapMembersPopup-title": "Map members", "memberMenuPopup-title": "Nutzereinstellungen", - "members": "Mitglied", + "members": "Mitglieder", "menu": "Menü", - "move-selection": "Move selection", + "move-selection": "Auswahl verschieben", "moveCardPopup-title": "Karte verschieben", - "moveSelectionPopup-title": "Move selection", + "moveCardToBottom-title": "Zum Ende verschieben", + "moveCardToTop-title": "Zum Anfang verschieben", + "moveSelectionPopup-title": "Auswahl verschieben", "multi-selection": "Mehrfachauswahl", - "multi-selection-on": "Multi-Selection is on", + "multi-selection-on": "Mehrfachauswahl ist aktiv", + "muted": "Stumm", + "muted-info": "Sie werden über keine Änderung in diesem Board benachrichtigt", "my-boards": "Meine Boards", "name": "Name", "no-archived-cards": "Keine archivierten Karten.", @@ -204,60 +246,74 @@ "no-results": "Keine Ergebnisse", "normal": "Normal", "normal-desc": "Kann Karten anschauen und bearbeiten, aber keine Einstellungen ändern.", - "not-accepted-yet": "Invitation not accepted yet", + "not-accepted-yet": "Die Einladung wurde noch nicht angenommen", + "notify-participate": "Benachrichtigungen über alle Karten erhalten, bei denen Sie als Ersteller oder Mitglied teilnehmen", + "notify-watch": "Benachrichtigungen über alle Boards, Listen oder Karten erhalten, die Sie beobachten", "optional": "optional", "or": "oder", - "page-maybe-private": "Diese Seite könnte privat sein. Vielleicht kannst du sie sehen, wenn du dich einloggst.", + "page-maybe-private": "Diese Seite könnte privat sein. Vielleicht können Sie sie sehen, wenn Sie sich einloggen.", "page-not-found": "Seite nicht gefunden.", "password": "Passwort", - "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", - "preview": "Preview", - "previewAttachedImagePopup-title": "Preview", - "previewClipboardImagePopup-title": "Preview", + "paste-or-dragdrop": "Einfügen oder Datei mit Drag & Drop ablegen (nur Bilder)", + "participating": "Teilnehmen", + "preview": "Vorschau", + "previewAttachedImagePopup-title": "Vorschau", + "previewClipboardImagePopup-title": "Vorschau", "private": "Privat", "private-desc": "Dieses Board ist privat. Nur Nutzer, die zu dem Board gehören, können es anschauen und bearbeiten.", "profile": "Profil", "public": "Öffentlich", "public-desc": "Dieses Board ist öffentlich. Es ist für jeden, der den Link kennt, sichtbar und taucht in Suchmaschinen wie Google auf. Nur Nutzer, die zum Board hinzugefügt wurden, können es bearbeiten.", - "quick-access-description": "Markiere ein Board mit einem Stern um eine Verknüpfung in diese Leise hinzuzufügen.", + "quick-access-description": "Markieren Sie ein Board mit einem Stern um eine Verknüpfung in diese Leise hinzuzufügen.", "remove-cover": "Cover entfernen", "remove-from-board": "Von Board entfernen", "remove-label": "Label entfernen", "remove-member": "Nutzer entfernen", "remove-member-from-card": "Von Karte entfernen", - "remove-member-pop": "Entferne __name__ (__username__) von __boardTitle__? Nutzer wird von allen Karten auf diesem Board entfernt werden. Er wird eine Benachrichtigung erhalten.", - "removeMemberPopup-title": "Nutzer entfernen?", + "remove-member-pop": "__name__ (__username__) von __boardTitle__ entfernen? Das Mitglied wird von allen Karten auf diesem Board entfernt. Er erhält eine Benachrichtigung.", + "removeMemberPopup-title": "Mitglied entfernen?", "rename": "Umbenennen", "rename-board": "Board umbenennen", "restore": "Wiederherstellen", "save": "Speichern", "search": "Suchen", - "select-color": "Wähle eine Farbe aus", - "shortcut-assign-self": "Assign yourself to current card", - "shortcut-autocomplete-emoji": "Autovervollständige Emojis", - "shortcut-autocomplete-members": "Autovervollständige Nutzer", + "select-color": "Farbe auswählen", + "shortcut-assign-self": "Fügen Sie sich zur aktuellen Karte hinzu", + "shortcut-autocomplete-emoji": "Emojis vervollständigen", + "shortcut-autocomplete-members": "Mitglieder vervollständigen", "shortcut-clear-filters": "Alle Filter entfernen", "shortcut-close-dialog": "Dialog schließen", "shortcut-filter-my-cards": "Meine Karten filtern", "shortcut-show-shortcuts": "Liste der Tastaturkürzel anzeigen", - "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-filterbar": "Filter-Seitenleiste ein-/ausblenden", "shortcut-toggle-sidebar": "Seitenleiste ein-/ausblenden", - "signupPopup-title": "Account erstellen", - "star-board-title": "Klicke, um das Board mit einem Stern zu kennzeichnen. Es erscheint dann oben in deiner Boardliste.", - "starred-boards": "Gekennzeichnete Boards", - "starred-boards-description": "Gekennzeichnete Boards erscheinen oben in deiner Boardliste.", + "show-cards-minimum-count": "Zeigt die Kartenanzahl an, wenn die Liste mehr enthält als", + "signupPopup-title": "Benutzerkonto erstellen", + "star-board-title": "Klicken um das Board mit einem Stern zu kennzeichnen. Es erscheint dann oben in ihrer Boardliste.", + "starred-boards": "Markierte Boards", + "starred-boards-description": "Markierte Boards erscheinen oben in ihrer Boardliste.", "subscribe": "Abonnieren", "team": "Team", "this-board": "dieses Board", "this-card": "diese Karte", + "time": "Zeit", "title": "Titel", - "unassign-member": "Mitglied abziehen", - "unsaved-description": "Es gibt eine ungespeicherte Beschreibung.", + "tracking": "Folgen", + "tracking-info": "Sie werden über alle Änderungen an Karten, die Sie als Ersteller oder Mitglied beteiligt sind, benachrichtigt.", + "unassign-member": "Mitglied entfernen", + "unsaved-description": "Sie haben eine nicht gespeicherte Änderung.", + "unwatch": "Beobachtung entfernen", "upload": "Upload", "upload-avatar": "Profilbild hochladen", "uploaded-avatar": "Profilbild hochgeladen", - "username": "Nutzername", + "username": "Benutzername", "view-it": "Ansehen", "warn-list-archived": "Warnung: Diese Karte befindet sich in einer archivierten Liste", + "watch": "Beobachten", + "watching": "Beobatchen", + "watching-info": "Sie werden über alle Änderungen in diesem Board informiert", + "welcome-board": "Willkommen-Board", + "welcome-list1": "Grundlagen", + "welcome-list2": "Fortgeschritten", "what-to-do": "Was willst du tun?" } diff --git a/i18n/es-ES.i18n.json b/i18n/es-ES.i18n.json index 22aeb7041..4e3e56235 100644 --- a/i18n/es-ES.i18n.json +++ b/i18n/es-ES.i18n.json @@ -1,5 +1,25 @@ { "accept": "Aceptar", + "act-activity-notify": "[Wekan] Activity Notification", + "act-addAttachment": "attached __attachment__ to __card__", + "act-addComment": "commented on __card__: __comment__", + "act-createBoard": "created __board__", + "act-createCard": "added __card__ to __list__", + "act-createList": "added __list__ to __board__", + "act-addBoardMember": "added __member__ to __board__", + "act-archivedBoard": "archived __board__", + "act-archivedCard": "archived __card__", + "act-archivedList": "archived __list__", + "act-importBoard": "imported __board__", + "act-importCard": "imported __card__", + "act-importList": "imported __list__", + "act-joinMember": "added __member__ to __card__", + "act-moveCard": "moved __card__ from __oldList__ to __list__", + "act-removeBoardMember": "removed __member__ from __board__", + "act-restoredCard": "restored __card__ to __board__", + "act-unjoinMember": "removed __member__ from __card__", + "act-withBoardTitle": "[Wekan] __board__", + "act-withCardTitle": "[__board__] __card__", "actions": "Acciones", "activities": "Actividad", "activity": "Actividad", @@ -31,6 +51,8 @@ "all-boards": "Todos los tableros", "and-n-other-card": "And __count__ other card", "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", "archive": "Guardar", "archive-all": "Guardar Todo", "archive-board": "Archivar tablero", @@ -46,6 +68,7 @@ "attachment-delete-pop": "El borrado de un archivo adjunto es permanente. No se puede deshacer.", "attachmentDeletePopup-title": "¿Borrar adjunto?", "attachments": "Adjuntos", + "auto-watch": "Automatically watch boards when create it", "avatar-too-big": "El avatar es demasiado grande (70Kb max)", "back": "Atrás", "board-change-color": "Cambiar color", @@ -56,7 +79,7 @@ "boardChangeColorPopup-title": "Cambiar fondo", "boardChangeTitlePopup-title": "Renombrar tablero", "boardChangeVisibilityPopup-title": "Cambiar visibilidad", - "boardImportBoardPopup-title": "Importar tablero desde Trello", + "boardChangeWatchPopup-title": "Change Watch", "boardMenuPopup-title": "Menú del tablero", "boards": "Tableros", "bucket-example": "Al igual que “Bucket List”, por ejemplo", @@ -66,11 +89,15 @@ "card-delete-notice": "El borrado es permanente. Perderás todas las acciones asociadas a esta tarjeta.", "card-delete-pop": "Todas las acciones se eliminarán de la alimentación de la actividad y no podrán volver a abrir la tarjeta. No se puede deshacer.", "card-delete-suggest-archive": "Puedes archivar una tarjeta para quitarla del tablero y conservar la actividad.", + "card-due": "Due", + "card-due-on": "Due on", "card-edit-attachments": "Editar archivos adjuntos", "card-edit-labels": "Editar etiquetas", "card-edit-members": "Editar miembros", "card-labels-title": "Cambia las etiquetas de la tarjeta", "card-members-title": "Añadir o eliminar miembros del tablero desde la tarjeta.", + "card-start": "Start", + "card-start-on": "Starts on", "cardAttachmentsPopup-title": "Adjuntar desde", "cardDeletePopup-title": "¿Borrar tarjeta?", "cardDetailsActionsPopup-title": "Acciones de tarjeta", @@ -82,13 +109,15 @@ "change-avatar": "Cambiar Avatar", "change-password": "Cambiar la contraseña", "change-permissions": "Cambiar permisos", + "change-settings": "Change Settings", "changeAvatarPopup-title": "Cambiar Avatar", "changeLanguagePopup-title": "Cambiar idioma", "changePasswordPopup-title": "Cambiar la contraseña", "changePermissionsPopup-title": "Cambiar permisos", + "changeSettingsPopup-title": "Change Settings", "click-to-star": "Haz clic para destacar este tablero.", "click-to-unstar": "Haz clic para dejar de destacar este tablero.", - "clipboard": "Portapapeles o drag & drop", + "clipboard" : "Portapapeles o drag & drop", "close": "Cerrar", "close-board": "Cerrar tablero", "close-board-pop": "Podrás restaurar el tablero seleccionando el botón “Archivados” desde la cabecera de la página de inicio.", @@ -109,6 +138,7 @@ "createBoardPopup-title": "Crear tablero", "createLabelPopup-title": "Crear etiqueta", "current": "actual", + "date": "Date", "decline": "Denegar", "default-avatar": "Avatar por defecto", "delete": "Borrar", @@ -122,7 +152,10 @@ "edit": "Editar", "edit-avatar": "Cambiar Avatar", "edit-profile": "Edita tu Perfil", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", "editLabelPopup-title": "Cambiar etiqueta", + "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Editar Perfil", "email": "Correo electrónico", "email-enrollAccount-subject": "Se ha creado un cuenta para ti en __siteName__", @@ -146,27 +179,33 @@ "error-user-doesNotExist": "Este usuario no existe", "error-user-notAllowSelf": "Esa acción en si misma no está permitida", "error-user-notCreated": "Este usuario no se ha creado", + "error-username-taken": "This username is already taken", "export-board": "Exportar tablero", "filter": "Filtrar", "filter-cards": "Filtrar Tarjetas", "filter-clear": "Eliminar filtro", + "filter-no-label": "No label", + "filter-no-member": "No member", "filter-on": "Filtrar por", "filter-on-desc": "Estás filtrando tarjetas en este tablero. Haz clic aquí para editar el filtro.", "filter-to-selection": "Filtrar selección", "fullname": "Nombre Completo", "header-logo-title": "Volver a tu página de tableros", + "hide-system-messages": "Hide system messages", "home": "Inicio", "import": "Importar", "import-board": "Importar desde Trello", + "import-board-title": "Import board from Trello", "import-board-trello-instruction": "En su tablero Trello, vaya a \"Menú\", luego \"Más\", \"Imprimir y exportar\", \"Exportación JSON ', y copia el texto que se muestre", - "import-card": "Importar tarjeta de Trello", - "import-card-trello-instruction": "Ve a la tarjeta Trello, selecciona 'Compartir y más...' y marca 'Export JSON' y copia el texto que obtengas", "import-json-placeholder": "Pega aquí los datos JSON", + "import-map-members": "Map members", "import-members-map": "El tablero importado tiene algunos miembros. Por favor, asigna los miembros que deseas importar a Wekan", "import-show-user-mapping": "Revisar asignación de miembros", "import-user-select": "Escoja el usuario Wekan que desea utilizar como miembro", + "importMapMembersAddPopup-title": "Select Wekan member", "info": "Informaciones", "initials": "Iniciales", + "invalid-date": "Invalid date", "joined": "se ha unido", "just-invited": "Has sido invitado a este tablero", "keyboard-shortcuts": "Atajos de teclado", @@ -186,17 +225,20 @@ "listImportCardPopup-title": "Importar tarjeta de Trello", "lists": "Listas", "log-out": "Finalizar la sesión", + "log-in": "Log In", "loginPopup-title": "Iniciar sesión", - "mapMembersAddPopup-title": "Selecciona un miembro de Wekan", - "mapMembersPopup-title": "Asignar miembros", "memberMenuPopup-title": "Configurar miembros", "members": "Miembros", "menu": "Menú", "move-selection": "Mover selección", "moveCardPopup-title": "Mover Tarjeta", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Mover selección", "multi-selection": "Multi-Selección", "multi-selection-on": "Multi-selección activada", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", "my-boards": "Mis Tableros", "name": "Nombre", "no-archived-cards": "No hay tarjetas archivadas.", @@ -205,12 +247,15 @@ "normal": "Normal", "normal-desc": "Puedes ver y editar tarjetas. No puedes cambiar la configuración.", "not-accepted-yet": "Invitación no aceptada aún", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", "optional": "opcional", "or": "o", "page-maybe-private": "Esta página es privada. Para verla tienes que entrar.", "page-not-found": "Página no encontrada.", "password": "Contraseña", "paste-or-dragdrop": "para pegar, o hacer drag & drop de un archivo (solo imágenes)", + "participating": "Participating", "preview": "Vista previa", "previewAttachedImagePopup-title": "Vista previa", "previewClipboardImagePopup-title": "Vista previa", @@ -234,7 +279,7 @@ "search": "Buscar", "select-color": "Selecciona un color", "shortcut-assign-self": "Asignarme la tarjeta actual", - "shortcut-autocomplete-emojies": "Autocompletar emojies", + "shortcut-autocomplete-emoji": "Autocomplete emoji", "shortcut-autocomplete-members": "Autocompletar miembros", "shortcut-clear-filters": "Eliminar todos los filters", "shortcut-close-dialog": "Cierra el Dialogo", @@ -242,6 +287,7 @@ "shortcut-show-shortcuts": "Mostrar atajos de teclado", "shortcut-toggle-filterbar": "Mostrar/Ocultar la barra lateral de filtrado", "shortcut-toggle-sidebar": "Menú lateral del Tablero", + "show-cards-minimum-count": "Show cards count if list contains more than", "signupPopup-title": "Crear una cuenta", "star-board-title": "Haz clic para destacar este tablero. Se mostrará en la parte superior de tu lista de tableros.", "starred-boards": "Tableros Destacados", @@ -250,14 +296,24 @@ "team": "Equipo", "this-board": "este tablero", "this-card": "esta tarjeta", + "time": "Time", "title": "Título", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", "unassign-member": "Desasignar miembro", "unsaved-description": "Tienes una descripción sin guardar.", + "unwatch": "Unwatch", "upload": "Subir", "upload-avatar": "Subir avatar", "uploaded-avatar": "Avatar actualizado", "username": "Nombre de usuario", "view-it": "Visto", "warn-list-archived": "Aviso: esta tarjeta está en una lista archivada", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", "what-to-do": "¿Qué quieres hacer?" -} \ No newline at end of file +} diff --git a/i18n/es.i18n.json b/i18n/es.i18n.json index b4af8f5ac..a88ac8294 100644 --- a/i18n/es.i18n.json +++ b/i18n/es.i18n.json @@ -1,5 +1,25 @@ { "accept": "Accept", + "act-activity-notify": "[Wekan] Activity Notification", + "act-addAttachment": "attached __attachment__ to __card__", + "act-addComment": "commented on __card__: __comment__", + "act-createBoard": "created __board__", + "act-createCard": "added __card__ to __list__", + "act-createList": "added __list__ to __board__", + "act-addBoardMember": "added __member__ to __board__", + "act-archivedBoard": "archived __board__", + "act-archivedCard": "archived __card__", + "act-archivedList": "archived __list__", + "act-importBoard": "imported __board__", + "act-importCard": "imported __card__", + "act-importList": "imported __list__", + "act-joinMember": "added __member__ to __card__", + "act-moveCard": "moved __card__ from __oldList__ to __list__", + "act-removeBoardMember": "removed __member__ from __board__", + "act-restoredCard": "restored __card__ to __board__", + "act-unjoinMember": "removed __member__ from __card__", + "act-withBoardTitle": "[Wekan] __board__", + "act-withCardTitle": "[__board__] __card__", "actions": "Acciones", "activities": "Activities", "activity": "Actividad", @@ -31,6 +51,8 @@ "all-boards": "Tableros", "and-n-other-card": "And __count__ other card", "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", "archive": "Guardar", "archive-all": "Guardar Todo", "archive-board": "Archive Board", @@ -46,6 +68,7 @@ "attachment-delete-pop": "El borrado de un archivo adjunto es permanente. No se puede deshacer.", "attachmentDeletePopup-title": "¿Borrar adjunto?", "attachments": "Adjuntos", + "auto-watch": "Automatically watch boards when create it", "avatar-too-big": "The avatar is too large (70Kb max)", "back": "Atrás", "board-change-color": "Cambiar color", @@ -56,7 +79,7 @@ "boardChangeColorPopup-title": "Change Board Background", "boardChangeTitlePopup-title": "Renombrar tablero", "boardChangeVisibilityPopup-title": "Cambiar visibilidad", - "boardImportBoardPopup-title": "Import board from Trello", + "boardChangeWatchPopup-title": "Change Watch", "boardMenuPopup-title": "Board Menu", "boards": "Tableros", "bucket-example": "Like “Bucket List” for example", @@ -66,11 +89,15 @@ "card-delete-notice": "El borrado es permanente. Perderás todas las acciones asociadas a esta ficha.", "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.", + "card-due": "Due", + "card-due-on": "Due on", "card-edit-attachments": "Edit attachments", "card-edit-labels": "Edit labels", "card-edit-members": "Edit members", "card-labels-title": "Cambia las etiquetas de la ficha", "card-members-title": "Añadir o eliminar miembros del tablero desde la ficha.", + "card-start": "Start", + "card-start-on": "Starts on", "cardAttachmentsPopup-title": "Attach From", "cardDeletePopup-title": "¿Borrar ficha?", "cardDetailsActionsPopup-title": "Card Actions", @@ -82,13 +109,15 @@ "change-avatar": "Cambiar Avatar", "change-password": "Cambiar la clave", "change-permissions": "Cambiar permisos", + "change-settings": "Change Settings", "changeAvatarPopup-title": "Cambiar Avatar", "changeLanguagePopup-title": "Cambiar idioma", "changePasswordPopup-title": "Cambiar la clave", "changePermissionsPopup-title": "Cambiar permisos", + "changeSettingsPopup-title": "Change Settings", "click-to-star": "Haz clic para destacar este tablero. ", "click-to-unstar": "Haz clic para dejar de destacar este tablero. ", - "clipboard": "Clipboard or drag & drop", + "clipboard" : "Clipboard or drag & drop", "close": "Cerrar", "close-board": "Cerrar el tablero", "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", @@ -109,6 +138,7 @@ "createBoardPopup-title": "Crear tablero", "createLabelPopup-title": "Crear etiqueta", "current": "actual", + "date": "Date", "decline": "Decline", "default-avatar": "Avatar por defecto", "delete": "Borrar", @@ -122,7 +152,10 @@ "edit": "Editar", "edit-avatar": "Cambiar Avatar", "edit-profile": "Edit Profile", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", "editLabelPopup-title": "Cambiar etiqueta", + "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Correo electrónico", "email-enrollAccount-subject": "An account created for you on __siteName__", @@ -146,27 +179,33 @@ "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", + "error-username-taken": "This username is already taken", "export-board": "Export board", "filter": "Filter", "filter-cards": "Fichas de filtro", "filter-clear": "Clear filter", + "filter-no-label": "No label", + "filter-no-member": "No member", "filter-on": "Filter is on", "filter-on-desc": "Estás filtrando fichas en este tablero. Haz clic aquí para editar el filtro.", "filter-to-selection": "Filter to selection", "fullname": "Nombre Completo", "header-logo-title": "Volver a tu página de tableros", + "hide-system-messages": "Hide system messages", "home": "Inicio", "import": "Import", "import-board": "import from Trello", + "import-board-title": "Import board from Trello", "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text", - "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-map-members": "Map members", "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users", "import-show-user-mapping": "Review members mapping", "import-user-select": "Pick the Wekan user you want to use as this member", + "importMapMembersAddPopup-title": "Select Wekan member", "info": "Informaciones", "initials": "Initials", + "invalid-date": "Invalid date", "joined": "se ha unido", "just-invited": "You are just invited to this board", "keyboard-shortcuts": "Keyboard shortcuts", @@ -186,17 +225,20 @@ "listImportCardPopup-title": "Import a Trello card", "lists": "Lists", "log-out": "Finalizar la sesion", + "log-in": "Log In", "loginPopup-title": "Iniciar sesion", - "mapMembersAddPopup-title": "Select Wekan member", - "mapMembersPopup-title": "Map members", "memberMenuPopup-title": "Member Settings", "members": "Miembros", "menu": "Menu", "move-selection": "Move selection", "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", "multi-selection": "Multi-Selection", "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", "my-boards": "Mis tableros", "name": "Nombre", "no-archived-cards": "No archived cards.", @@ -205,12 +247,15 @@ "normal": "Normal", "normal-desc": "Puedes ver y editar fichas. No puedes cambiar la configuración.", "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", "optional": "opcional", "or": "or", "page-maybe-private": "Esta página puede ser privada. Puedes verla por logging in.", "page-not-found": "Página no encontrada.", "password": "Clave", "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", "preview": "Preview", "previewAttachedImagePopup-title": "Preview", "previewClipboardImagePopup-title": "Preview", @@ -242,6 +287,7 @@ "shortcut-show-shortcuts": "Bring up this shortcuts list", "shortcut-toggle-filterbar": "Toggle Filter Sidebar", "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", "signupPopup-title": "Crear una Cuenta", "star-board-title": "Haz clic para destacar este tablero. Se mostrará en la parte superior de tu lista de tableros.", "starred-boards": "Tableros Destacados", @@ -250,14 +296,24 @@ "team": "Equipo", "this-board": "este tablero", "this-card": "esta ficha", + "time": "Time", "title": "Título", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", "unassign-member": "Unassign member", "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", "upload": "Upload", "upload-avatar": "Upload an avatar", "uploaded-avatar": "Uploaded an avatar", "username": "Nombre de Usuario", "view-it": "View it", "warn-list-archived": "warning: this card is in an archived list", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", "what-to-do": "What do you want to do?" } diff --git a/i18n/fa.i18n.json b/i18n/fa.i18n.json index c9d0b95b1..bef0935fa 100644 --- a/i18n/fa.i18n.json +++ b/i18n/fa.i18n.json @@ -1,5 +1,25 @@ { "accept": "تایید", + "act-activity-notify": "[Wekan] Activity Notification", + "act-addAttachment": "attached __attachment__ to __card__", + "act-addComment": "commented on __card__: __comment__", + "act-createBoard": "created __board__", + "act-createCard": "added __card__ to __list__", + "act-createList": "added __list__ to __board__", + "act-addBoardMember": "added __member__ to __board__", + "act-archivedBoard": "archived __board__", + "act-archivedCard": "archived __card__", + "act-archivedList": "archived __list__", + "act-importBoard": "imported __board__", + "act-importCard": "imported __card__", + "act-importList": "imported __list__", + "act-joinMember": "added __member__ to __card__", + "act-moveCard": "moved __card__ from __oldList__ to __list__", + "act-removeBoardMember": "removed __member__ from __board__", + "act-restoredCard": "restored __card__ to __board__", + "act-unjoinMember": "removed __member__ from __card__", + "act-withBoardTitle": "[Wekan] __board__", + "act-withCardTitle": "[__board__] __card__", "actions": "اعمال", "activities": "فعالیت ها", "activity": "فعالیت", @@ -31,6 +51,8 @@ "all-boards": "تمام بردها", "and-n-other-card": "و __count__ کارت دیگر", "and-n-other-card_plural": "و __count__ کارت دیگر", + "apply": "Apply", + "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", "archive": "آرشیو", "archive-all": "تمامی آرشیوها", "archive-board": "بایگانی برد", @@ -46,6 +68,7 @@ "attachment-delete-pop": "حذف پیوست دایمی خواهد بود، بدون بازگشت", "attachmentDeletePopup-title": "آیا می خواهید ضمیمه را حذف کنید؟", "attachments": "ضمائم", + "auto-watch": "Automatically watch boards when create it", "avatar-too-big": "حجم تصویر انتخاب شده بیشتر از حد مجاز است .(حد مجاز 70Kb)", "back": "بازگشت", "board-change-color": "تغییر رنگ", @@ -56,7 +79,7 @@ "boardChangeColorPopup-title": "تغییر پس زمینه برد", "boardChangeTitlePopup-title": "تغییر نام برد", "boardChangeVisibilityPopup-title": "تغغیر وضعیت نمایش", - "boardImportBoardPopup-title": "وارد کردن تخته ها از Trello", + "boardChangeWatchPopup-title": "Change Watch", "boardMenuPopup-title": "منوی برد", "boards": "بردها", "bucket-example": "مانند \"لیست سبدها\" برای مثال", @@ -66,11 +89,15 @@ "card-delete-notice": "پاک کردن بطور کامل. شما تمامی اقدامات مربوطه را از دست خواهید داد.", "card-delete-pop": "همه اقدامات ازاین پردازه (خوراک) حذف خواهد شد و امکان بازگشا کردن کارت وجود نخواهد داشت. هیچ امکان بازگشتی!", "card-delete-suggest-archive": "شما می توانید یک کارت را بایگانی کرده با حفظ فعالیت های آن.", + "card-due": "Due", + "card-due-on": "Due on", "card-edit-attachments": "ویرایش ضمائم", "card-edit-labels": "ویرایش برچسب", "card-edit-members": "ویرایش اعضا", "card-labels-title": "تغییر برچسب کارت", "card-members-title": "افزودن یا حذف اعضا از کارت.", + "card-start": "Start", + "card-start-on": "Starts on", "cardAttachmentsPopup-title": "ضمیمه از", "cardDeletePopup-title": "آیا می خواهید کارت را حذف کنید؟", "cardDetailsActionsPopup-title": "اعمال کارت", @@ -82,13 +109,15 @@ "change-avatar": "تغییر آواتار", "change-password": "تغییر کلمه عبور", "change-permissions": "تغییر دسترسی ها", + "change-settings": "Change Settings", "changeAvatarPopup-title": "تغییر آواتار", "changeLanguagePopup-title": "تغییر زبان", "changePasswordPopup-title": "تغییر کلمه عبور", "changePermissionsPopup-title": "تغییر دسترسی ها", + "changeSettingsPopup-title": "Change Settings", "click-to-star": "جهت افزودن ستاره کلیک کنید .", "click-to-unstar": "جهت کاهش ستاره کلیک کنید.", - "clipboard": "ذخیره در حافظه ویا بکش-رهاکن", + "clipboard" : "ذخیره در حافظه ویا بکش-رهاکن", "close": "بستن", "close-board": "بستن برد", "close-board-pop": "شما می توانید با کلیک بر دکمه \"بایگانی\" از قسمت بالای خانه، تخته را بازگذاری نمایید.", @@ -109,6 +138,7 @@ "createBoardPopup-title": "ایجاد برد", "createLabelPopup-title": "ایجاد برچسب", "current": "جاری", + "date": "Date", "decline": "رد", "default-avatar": "آواتار پیش فرض", "delete": "حذف", @@ -122,7 +152,10 @@ "edit": "ویرایش", "edit-avatar": "تغییر آواتار", "edit-profile": "ویرایش پروفایل", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", "editLabelPopup-title": "تغغیر برچسب", + "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "ویرایش پروفایل", "email": "ایمیل", "email-enrollAccount-subject": "یک حساب کاربری برای شما در __siteName__ ایجاد شد", @@ -146,27 +179,33 @@ "error-user-doesNotExist": "این کاربر وجود ندارد", "error-user-notAllowSelf": "این اقدامبروی خود، مجاز نمی باشد", "error-user-notCreated": "این کاربر ایجاد نشده است", + "error-username-taken": "This username is already taken", "export-board": "انتقال به بیرون تخته", "filter": "فیلتر", "filter-cards": "صافی کارتها", "filter-clear": "حذف فیلتر", + "filter-no-label": "No label", + "filter-no-member": "No member", "filter-on": "صافی روشن است", "filter-on-desc": "شما صافی برای کارتهای تخته را روشن کرده اید. جهت ویرایش کلیک نمایید.", "filter-to-selection": "صافی برای موارد انتخابی", "fullname": "نام و نام خانوادگی", "header-logo-title": "بازگشت به صفحه تخته.", + "hide-system-messages": "Hide system messages", "home": "خانه", "import": "وارد کردن", "import-board": "وارد کردن از ترلو", + "import-board-title": "Import board from Trello", "import-board-trello-instruction": "در Trello-ی خود به 'Menu'، 'More'، 'Print'، 'Export to JSON رفته و متن نهایی را دراینجا وارد نمایید.", - "import-card": "وارد کردن کارت Trello", - "import-card-trello-instruction": "به کارت Trello رفته و با انتخاب Share and more...' و 'Export JSON' متن نهایی را دراینجا وارد کنید", "import-json-placeholder": "اطلاعات Json معتبر خود را اینجا وارد کنید.", + "import-map-members": "Map members", "import-members-map": "تخته خود وارد شده دارای برخی از اعضا می باشد. لطفا کاربرانی که باید وارد نرم افزار بشوند را مشخص کنید.", "import-show-user-mapping": "بررسی نقشه کاربران", "import-user-select": "کاربری از نرم افزار را که می خواهید بعنوان این عضو جایگزین شود را انتخاب کنید.", + "importMapMembersAddPopup-title": "Select Wekan member", "info": "اطلاعات", "initials": "تخصیصات اولیه", + "invalid-date": "Invalid date", "joined": "متصل", "just-invited": "هم اکنون، شما به این تخته دعوت شده اید.", "keyboard-shortcuts": "میانبر کلیدها", @@ -186,17 +225,20 @@ "listImportCardPopup-title": "وارد کردن کارت Trello", "lists": "لیست ها", "log-out": "خروج", + "log-in": "Log In", "loginPopup-title": "ورود", - "mapMembersAddPopup-title": "انتخاب عضو Wekan", - "mapMembersPopup-title": "نقشه اعضا", "memberMenuPopup-title": "تنظیمات اعضا", "members": "اعضا", "menu": "منو", "move-selection": "حرکت مورد انتخاب شده", "moveCardPopup-title": "حرکت کارت", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "حرکت مورد انتخاب شده", "multi-selection": "چند انتخابی", "multi-selection-on": "چند انتخابی روشن است", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", "my-boards": "بردهای من", "name": "نام", "no-archived-cards": "کارتی در بایگانی نیست", @@ -205,12 +247,15 @@ "normal": "عادی", "normal-desc": "امکان نمایش و تنظیم کارت بدون امکان تغییر تنظیمات", "not-accepted-yet": "دعوت هنوز پذیرفته نشده است", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", "optional": "انتخابی", "or": "یا", "page-maybe-private": "این صفحه ممکن است خصوصی باشد.شما باورود می توانید آنرا ملاحظه نمایید.", "page-not-found": "صفحه پیدا نشد.", "password": "کلمه عبور", "paste-or-dragdrop": "جهت چسباندن، یا کشیدن-رهاسازی فایل تصویر به آن (تصویر)", + "participating": "Participating", "preview": "نمایش", "previewAttachedImagePopup-title": "نمایش", "previewClipboardImagePopup-title": "نمایش", @@ -234,7 +279,7 @@ "search": "جستجو", "select-color": "انتخاب رنگ", "shortcut-assign-self": "اختصاص خود به کارت فعلی", - "shortcut-autocomplete-emojies": "تکمیل خودکار شکلک", + "shortcut-autocomplete-emoji": "Autocomplete emoji", "shortcut-autocomplete-members": "تکمیل خودکار کاربرها", "shortcut-clear-filters": "حذف تمامی فیلترها", "shortcut-close-dialog": "بستن دیالوگ", @@ -242,6 +287,7 @@ "shortcut-show-shortcuts": "بالا آوردن میانبر این لیست", "shortcut-toggle-filterbar": "ضامن نوار صافی", "shortcut-toggle-sidebar": "ضامن نوار تخته", + "show-cards-minimum-count": "Show cards count if list contains more than", "signupPopup-title": "ایجاد یک اکانت", "star-board-title": "جهت ستاره دار کردن تخته کلیک نمایی.این در بالای لیست تخته های شما نمایش داده خواهد شد.", "starred-boards": "تخته های ستاره دار", @@ -250,14 +296,24 @@ "team": "تیم", "this-board": "این برد", "this-card": "این کارت", + "time": "Time", "title": "عنوان", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", "unassign-member": "عدم انتصاب کاربر ", "unsaved-description": "شما توضیحات ذخیره نشده دارید.", + "unwatch": "Unwatch", "upload": "ارسال", "upload-avatar": "ارسال یک آواتار", "uploaded-avatar": "آواتار ارسال شد", "username": "نام کاربری", "view-it": "مشاهده", "warn-list-archived": "هشدار: این کارت در یک لیست بایگانی شده است", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", "what-to-do": "چه کاری می خواهید انجام دهید؟" -} \ No newline at end of file +} diff --git a/i18n/fr.i18n.json b/i18n/fr.i18n.json index adc4baa4a..e743280a2 100644 --- a/i18n/fr.i18n.json +++ b/i18n/fr.i18n.json @@ -1,5 +1,25 @@ { "accept": "Accepter", + "act-activity-notify": "[Wekan] Activity Notification", + "act-addAttachment": "attached __attachment__ to __card__", + "act-addComment": "commented on __card__: __comment__", + "act-createBoard": "created __board__", + "act-createCard": "added __card__ to __list__", + "act-createList": "added __list__ to __board__", + "act-addBoardMember": "added __member__ to __board__", + "act-archivedBoard": "archived __board__", + "act-archivedCard": "archived __card__", + "act-archivedList": "archived __list__", + "act-importBoard": "imported __board__", + "act-importCard": "imported __card__", + "act-importList": "imported __list__", + "act-joinMember": "added __member__ to __card__", + "act-moveCard": "moved __card__ from __oldList__ to __list__", + "act-removeBoardMember": "removed __member__ from __board__", + "act-restoredCard": "restored __card__ to __board__", + "act-unjoinMember": "removed __member__ from __card__", + "act-withBoardTitle": "[Wekan] __board__", + "act-withCardTitle": "[__board__] __card__", "actions": "Actions", "activities": "Activités", "activity": "Activité", @@ -31,6 +51,8 @@ "all-boards": "Tous les tableaux", "and-n-other-card": "Et __count__ autre carte", "and-n-other-card_plural": "Et __count__ autres cartes", + "apply": "Apply", + "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", "archive": "Archiver", "archive-all": "Tout archiver", "archive-board": "Archiver le tableau", @@ -46,6 +68,7 @@ "attachment-delete-pop": "La suppression d'une pièce jointe est définitive. Elle ne peut être annulée.", "attachmentDeletePopup-title": "Supprimer la pièce jointe ?", "attachments": "Pièces jointes", + "auto-watch": "Automatically watch boards when create it", "avatar-too-big": "La taille du fichier de l’avatar est trop importante (70 Ko au maximum)", "back": "Retour", "board-change-color": "Changer la couleur", @@ -56,7 +79,7 @@ "boardChangeColorPopup-title": "Change la fond du tableau", "boardChangeTitlePopup-title": "Renommer le tableau", "boardChangeVisibilityPopup-title": "Changer la visibilité", - "boardImportBoardPopup-title": "Importer le tableau depuis Trello", + "boardChangeWatchPopup-title": "Change Watch", "boardMenuPopup-title": "Menu du tableau", "boards": "Tableaux", "bucket-example": "Comme « todo list » par exemple", @@ -66,11 +89,15 @@ "card-delete-notice": "La suppression est permanente. Vous perdrez toutes les actions associées à cette carte.", "card-delete-pop": "Toutes les actions vont être supprimées du suivi d'activités et vous ne pourrez plus utiliser cette carte. Cette action est irréversible.", "card-delete-suggest-archive": "Vous pouvez archiver une carte pour la supprimer en préservant le suivi des activités.", + "card-due": "Due", + "card-due-on": "Due on", "card-edit-attachments": "Editer les pièces jointes", "card-edit-labels": "Editer les étiquettes", "card-edit-members": "Modifier les membres", "card-labels-title": "Modifier les étiquettes de la carte.", "card-members-title": "Ajouter ou supprimer des membres à la carte.", + "card-start": "Start", + "card-start-on": "Starts on", "cardAttachmentsPopup-title": "Joindre depuis", "cardDeletePopup-title": "Supprimer la carte ?", "cardDetailsActionsPopup-title": "Actions sur la carte", @@ -82,13 +109,15 @@ "change-avatar": "Changer l'avatar", "change-password": "Changer le mot de passe", "change-permissions": "Changer les permissions", + "change-settings": "Change Settings", "changeAvatarPopup-title": "Changer l'avatar", "changeLanguagePopup-title": "Changer la langue", "changePasswordPopup-title": "Changer le mot de passe", "changePermissionsPopup-title": "Changer les permissions", + "changeSettingsPopup-title": "Change Settings", "click-to-star": "Cliquez pour ajouter ce tableau aux favoris.", "click-to-unstar": "Cliquez pour retirer ce tableau des favoris.", - "clipboard": "Presse-papier ou glisser-déposer", + "clipboard" : "Presse-papier ou glisser-déposer", "close": "Fermer", "close-board": "Fermer le tableau", "close-board-pop": "Vous pouvez restaurer le tableau en cliquant sur le bouton « Archives » depuis le menu en entête.", @@ -109,6 +138,7 @@ "createBoardPopup-title": "Créer un tableau", "createLabelPopup-title": "Créer un étiquette", "current": "courant", + "date": "Date", "decline": "Refuser", "default-avatar": "Avatar par défaut", "delete": "Supprimer", @@ -122,7 +152,10 @@ "edit": "Éditer", "edit-avatar": "Changer l'avatar", "edit-profile": "Éditer le profil", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", "editLabelPopup-title": "Changer l'étiquette", + "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Éditer le profil", "email": "Email", "email-enrollAccount-subject": "Un compte a été créé pour vous sur __siteName__", @@ -146,27 +179,33 @@ "error-user-doesNotExist": "Cet utilisateur n’existe pas", "error-user-notAllowSelf": "This action on self is not allowed", "error-user-notCreated": "Cet utilisateur n’a pas encore été créé. ", + "error-username-taken": "This username is already taken", "export-board": "Exporter le tableau", "filter": "Filtrer", "filter-cards": "Filtrer les cartes", "filter-clear": "Retirer les filtres", + "filter-no-label": "No label", + "filter-no-member": "No member", "filter-on": "Le filtre est actif", "filter-on-desc": "Vous êtes en train de filtrer les cartes sur ce tableau. Cliquez ici pour changer les filtres.", "filter-to-selection": "Filtre vers la sélection", "fullname": "Nom complet", "header-logo-title": "Retourner à la page des tableaux", + "hide-system-messages": "Hide system messages", "home": "Accueil", "import": "Importer", "import-board": "Importer depuis Trello", + "import-board-title": "Import board from Trello", "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text", - "import-card": "Importer une carte Trello", - "import-card-trello-instruction": "Go to a Trello card, select 'Share and more...' then 'Export JSON' and copy the resulting text", "import-json-placeholder": "Collez ici les données JSON valides. ", + "import-map-members": "Map members", "import-members-map": "Le tableau que vous venez d’importer contient des participants. Veuillez associer les participants que vous souhaitez importer à des utilisateurs de Wekan. ", "import-show-user-mapping": "Review members mapping", "import-user-select": "Pick the Wekan user you want to use as this member", + "importMapMembersAddPopup-title": "Select Wekan member", "info": "Infos", "initials": "Initiales", + "invalid-date": "Invalid date", "joined": "a joint", "just-invited": "You are just invited to this board", "keyboard-shortcuts": "Raccourcis clavier", @@ -186,17 +225,20 @@ "listImportCardPopup-title": "Importer une carte Trello", "lists": "Listes", "log-out": "Déconnexion", + "log-in": "Log In", "loginPopup-title": "Connexion", - "mapMembersAddPopup-title": "Sélectioner le membre Wekan", - "mapMembersPopup-title": "Associer les membres", "memberMenuPopup-title": "Préférence de membre", "members": "Membres", "menu": "Menu", "move-selection": "Déplacer la sélection", "moveCardPopup-title": "Déplacer la carte", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Déplacer la sélection", "multi-selection": "Sélection multiple", "multi-selection-on": "Multi-Selection active", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", "my-boards": "Mes tableaux", "name": "Nom", "no-archived-cards": "Pas de carte archivée.", @@ -205,12 +247,15 @@ "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", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", "optional": "optionnel", "or": "ou", "page-maybe-private": "Cette page est peut-être privée. Vous pourrez peut-être la voir en vous connectant.", "page-not-found": "Page non trouvée", "password": "Mot de passe", "paste-or-dragdrop": "pour coller, ou glissez-déposez une image ici (seulement une image)", + "participating": "Participating", "preview": "Prévisualiser", "previewAttachedImagePopup-title": "Prévisualiser", "previewClipboardImagePopup-title": "Prévisualiser", @@ -234,7 +279,7 @@ "search": "Chercher", "select-color": "Choisissez une couleur", "shortcut-assign-self": "Assign yourself to current card", - "shortcut-autocomplete-emojies": "Auto-complétion des emojies", + "shortcut-autocomplete-emoji": "Autocomplete emoji", "shortcut-autocomplete-members": "Auto-complétion des membres", "shortcut-clear-filters": "Retirer tous les filtres", "shortcut-close-dialog": "Fermer le dialogue", @@ -242,6 +287,7 @@ "shortcut-show-shortcuts": "Afficher cette liste de raccourcis", "shortcut-toggle-filterbar": "Afficher/Cacher la barre latérale des filtres", "shortcut-toggle-sidebar": "Afficher/Cacher la barre latérale du tableau", + "show-cards-minimum-count": "Show cards count if list contains more than", "signupPopup-title": "Créer un compe", "star-board-title": "Cliquer pour ajouter ce tableau aux favoris. Il sera affiché en haut de votre liste de tableaux.", "starred-boards": "Tableaux favoris", @@ -250,14 +296,24 @@ "team": "Équipe", "this-board": "ce tableau", "this-card": "cette carte", + "time": "Time", "title": "Titre", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", "unassign-member": "Retirer le membre", "unsaved-description": "Vous avez une description non sauvegardée", + "unwatch": "Unwatch", "upload": "Télécharger", "upload-avatar": "Télécharger un avatar", "uploaded-avatar": "Avatar téléchargé", "username": "Nom d'utilisateur", "view-it": "Le voir", "warn-list-archived": "Attention : cette carte est dans une liste archivée", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", "what-to-do": "Que voulez-vous faire ?" -} \ No newline at end of file +} diff --git a/i18n/he.i18n.json b/i18n/he.i18n.json index f08f430bf..272c54860 100644 --- a/i18n/he.i18n.json +++ b/i18n/he.i18n.json @@ -1,10 +1,30 @@ { "accept": "אישור", + "act-activity-notify": "[Wekan] Activity Notification", + "act-addAttachment": "attached __attachment__ to __card__", + "act-addComment": "commented on __card__: __comment__", + "act-createBoard": "הלוח __board__ נוצר", + "act-createCard": "הכרטיס __card__ התווסף לרשימה __list__", + "act-createList": "הרשימה __list__ התווספה ללוח __board__", + "act-addBoardMember": "המשתמש __member__ שויך ללוח __board__", + "act-archivedBoard": "הלוח __board__ אורכב", + "act-archivedCard": "הכרטיס __card__ אורכב", + "act-archivedList": "הרשימה __card__ אורכבה", + "act-importBoard": "הלוח __board__ יובא", + "act-importCard": "הכרטיס __card__ יובא", + "act-importList": "הרשימה __list__ יובאה", + "act-joinMember": "המשתמש __member__ שוייך לכרטיס __card__", + "act-moveCard": "הכרטיס __card__ הועבר מהרשימה __oldList__ לרשימה __list__", + "act-removeBoardMember": "המשתמש __member__ הוסר מהלוח __board__", + "act-restoredCard": "הכרטיס __card__ שוחזר ללוח __board__", + "act-unjoinMember": "removed __member__ from __card__", + "act-withBoardTitle": "[Wekan] __board__", + "act-withCardTitle": "[__board__] __card__", "actions": "פעולות", "activities": "פעילויות", "activity": "פעילות", "activity-added": "%s נוסף ל%s", - "activity-archived": "%s בארכיון", + "activity-archived": "%s אורכב", "activity-attached": "%s צורף ל%s", "activity-created": "%s נוצר", "activity-excluded": "%s לא נכלל ב%s", @@ -31,6 +51,8 @@ "all-boards": "כל הלוחות", "and-n-other-card": "ו __count__ כרטיס אחר", "and-n-other-card_plural": "ו __count__ כרטיסים אחרים", + "apply": "Apply", + "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", "archive": "אחסן בארכיון", "archive-all": "אחסן הכל בארכיון", "archive-board": "אחסן לוח בארכיון", @@ -46,6 +68,7 @@ "attachment-delete-pop": "מחיקת קובץ מצורף הינה סופית. אין דרך חזרה.", "attachmentDeletePopup-title": "למחוק קובץ מצורף?", "attachments": "קבצים מצורפים", + "auto-watch": "Automatically watch boards when create it", "avatar-too-big": "האווטאר גדול מידי (מקס 70Kb)", "back": "חזור", "board-change-color": "שנה צבע", @@ -56,7 +79,7 @@ "boardChangeColorPopup-title": "שנה רקע ללוח", "boardChangeTitlePopup-title": "שנה שם ללוח", "boardChangeVisibilityPopup-title": "שנה תצוגה", - "boardImportBoardPopup-title": "ייבא לוח מטרלו", + "boardChangeWatchPopup-title": "Change Watch", "boardMenuPopup-title": "תפריט לוח", "boards": "לוחות", "bucket-example": "כמו “Bucket List” לדוגמא", @@ -66,11 +89,15 @@ "card-delete-notice": "מחיקה היא סופית. תאבדו את כל הפעולות המשויכות לכרטיס זה.", "card-delete-pop": "כל הפעולות יוסרו מלוח הפעילות ולא תוכלו לפתוח מחדש את הכרטיס. אין דרך חזרה.", "card-delete-suggest-archive": "באפשרותך לאחסן בארכיון כרטיס כדי להסירו מהלוח ולשמר את הפעילות.", + "card-due": "Due", + "card-due-on": "Due on", "card-edit-attachments": "ערוך קבצים מצורפים", "card-edit-labels": "ערוך תוויות ", "card-edit-members": "ערוך חברים", "card-labels-title": "שנה תוויות לכרטיס.", "card-members-title": "הוסף או הסר את חברי הלוח מהכרטיס", + "card-start": "Start", + "card-start-on": "Starts on", "cardAttachmentsPopup-title": "צרף מ", "cardDeletePopup-title": "למחוק כרטיס?", "cardDetailsActionsPopup-title": "פעולות על הכרטיס", @@ -82,13 +109,15 @@ "change-avatar": "שנה אווטאר", "change-password": "שנה סיסמא", "change-permissions": "שנה הרשאות", + "change-settings": "Change Settings", "changeAvatarPopup-title": "שנה אווטאר", "changeLanguagePopup-title": "שנה שפה", "changePasswordPopup-title": "שנה סיסמא", "changePermissionsPopup-title": "שנה הרשאות", + "changeSettingsPopup-title": "Change Settings", "click-to-star": "לחץ להוספת הלוח למועדפים", "click-to-unstar": "לחץ להסרת הלוח מהמועדפים.", - "clipboard": "Clipboard or drag & drop", + "clipboard" : "Clipboard or drag & drop", "close": "סגור", "close-board": "סגור לוח", "close-board-pop": "תוכלו לשחזר את הלוח בלחיצה על כפתור \"ארכיונים\" מהכותרת העליונה.", @@ -109,6 +138,7 @@ "createBoardPopup-title": "צור לוח", "createLabelPopup-title": "צור תווית", "current": "נוכחי", + "date": "Date", "decline": "סרב", "default-avatar": "אווטאר דיפולטי", "delete": "מחק", @@ -122,7 +152,10 @@ "edit": "ערוך", "edit-avatar": "שנה אווטאר", "edit-profile": "ערוך פרופיל", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", "editLabelPopup-title": "שנה תווית", + "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "ערוך פרופיל", "email": "אמייל", "email-enrollAccount-subject": "חשבון נוצר עבורך ב __siteName__", @@ -146,27 +179,33 @@ "error-user-doesNotExist": "משתמש זה לא קיים", "error-user-notAllowSelf": "פעולה זו איננה מותרת", "error-user-notCreated": "משתמש זה לא נוצר", + "error-username-taken": "This username is already taken", "export-board": "ייצא לוח", "filter": "מסנן", "filter-cards": "סנן כרטיסים", "filter-clear": "נקה מסנן", + "filter-no-label": "No label", + "filter-no-member": "No member", "filter-on": "מסנן פועל", "filter-on-desc": "מסנן כרטיסים בלוח זה פועל. יש ללחוץ כאן לעריכת המסנן.", "filter-to-selection": "סנן את הבחירה", "fullname": "שם מלא", "header-logo-title": "חזור לדף הלוחות שלך.", + "hide-system-messages": "Hide system messages", "home": "בית", "import": "ייבא", "import-board": "ייבא מטרלו", + "import-board-title": "Import board from Trello", "import-board-trello-instruction": "בלוח הטרלו שלך, עבור ל 'Menu', ואז ל 'More', 'Print and Export', 'Export JSON' והעתק את הטקסט שנוצר", - "import-card": "ייבא כרטיס מטרלו", - "import-card-trello-instruction": "עבור לכרטיס טרלו, בחר \"Share and more...\" ואז \"Export JSON\" והעתק את הטקסט שנוצר", "import-json-placeholder": "הדבק נתוני JSON תקינים כאן", + "import-map-members": "Map members", "import-members-map": "הלוחות המיובאים שלך מכילים חברים. בבקשה מפה את החברים שתרצה לייבא כמשתמשים", "import-show-user-mapping": "צפה במיפוי חברים", "import-user-select": "בחר במשתמש עבור חבר זה", + "importMapMembersAddPopup-title": "Select Wekan member", "info": "אינפורמציה", "initials": "ראשי תיבות", + "invalid-date": "Invalid date", "joined": "הצטרף", "just-invited": "הוזמנת ללוח זה", "keyboard-shortcuts": "קיצורי מקלדת", @@ -186,17 +225,20 @@ "listImportCardPopup-title": "ייבא כרטיס מטרלו", "lists": "רשימות", "log-out": "התנתק", + "log-in": "Log In", "loginPopup-title": "התחבר", - "mapMembersAddPopup-title": "בחר חבר", - "mapMembersPopup-title": "מפה חברים", "memberMenuPopup-title": "הגדרות חבר", "members": "חברים", "menu": "תפריט", "move-selection": "הזז בחירה", "moveCardPopup-title": "הזז כרטיס", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "הזז בחירה", "multi-selection": "בחירה מרובה", "multi-selection-on": "בחירה מרובה פועלת", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", "my-boards": "הלוחות שלי", "name": "שם", "no-archived-cards": "אין כרטיסים מאוחסנים בארכיון.", @@ -205,12 +247,15 @@ "normal": "נורמלי", "normal-desc": "יכול לצפות ולערוך כרטיסים. לא יכול לשנות הגדרות.", "not-accepted-yet": "הזמנה לא התקבלה עדיין", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", "optional": "אופציונלי", "or": "או", "page-maybe-private": "יתכן שדף זה פרטי. תוכלו לצפות על ידי התחברות למערכת", "page-not-found": "דף לא נמצא.", "password": "סיסמא", "paste-or-dragdrop": "בכדי להדביק או drag & drop קובץ תמונה (תמונה בלבד)", + "participating": "Participating", "preview": "תצוגה מקדימה", "previewAttachedImagePopup-title": "תצוגה מקדימה", "previewClipboardImagePopup-title": "תצוגה מקדימה", @@ -234,7 +279,7 @@ "search": "חפש", "select-color": "בחר צבע", "shortcut-assign-self": "הקצה את עצמך לכרטיס הנוכחי", - "shortcut-autocomplete-emojies": "השלמה אוטומטית של אימוג'יז", + "shortcut-autocomplete-emoji": "Autocomplete emoji", "shortcut-autocomplete-members": "השלמה אוטומטית של חברים", "shortcut-clear-filters": "נקה את כל המסננים", "shortcut-close-dialog": "סגור חלון", @@ -242,6 +287,7 @@ "shortcut-show-shortcuts": "הבא רשימת קיצורי דרך זו", "shortcut-toggle-filterbar": "החלף מצבי מסנן", "shortcut-toggle-sidebar": "החלף מצבי מסנן", + "show-cards-minimum-count": "Show cards count if list contains more than", "signupPopup-title": "צור חשבון", "star-board-title": "בלחיצה על הכווכב של הלוח יתווסף הלוח לראש רשימת הלוחות שלך.", "starred-boards": "לוחות שסומנו בכוכב", @@ -250,14 +296,24 @@ "team": "צוות", "this-board": "לוח זה", "this-card": "כרטיס זה", + "time": "Time", "title": "כותרת", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", "unassign-member": "בטל הקצאת חבר", "unsaved-description": "יש לך תיאור לא שמור.", + "unwatch": "Unwatch", "upload": "העלה/טען", "upload-avatar": "העלה/ טען אווטאר", "uploaded-avatar": "אווטאר הועלה/נטען", "username": "שם משתמש", "view-it": "צפה", "warn-list-archived": "אזהרה: הכרטיס נמצא ברשימה שהועברה לארכיון", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", "what-to-do": "מה תרצה לעשות?" -} \ No newline at end of file +} diff --git a/i18n/ja.i18n.json b/i18n/ja.i18n.json index 6cde68c60..bd21c65d1 100644 --- a/i18n/ja.i18n.json +++ b/i18n/ja.i18n.json @@ -1,5 +1,25 @@ { "accept": "Accept", + "act-activity-notify": "[Wekan] Activity Notification", + "act-addAttachment": "attached __attachment__ to __card__", + "act-addComment": "commented on __card__: __comment__", + "act-createBoard": "created __board__", + "act-createCard": "added __card__ to __list__", + "act-createList": "added __list__ to __board__", + "act-addBoardMember": "added __member__ to __board__", + "act-archivedBoard": "archived __board__", + "act-archivedCard": "archived __card__", + "act-archivedList": "archived __list__", + "act-importBoard": "imported __board__", + "act-importCard": "imported __card__", + "act-importList": "imported __list__", + "act-joinMember": "added __member__ to __card__", + "act-moveCard": "moved __card__ from __oldList__ to __list__", + "act-removeBoardMember": "removed __member__ from __board__", + "act-restoredCard": "restored __card__ to __board__", + "act-unjoinMember": "removed __member__ from __card__", + "act-withBoardTitle": "[Wekan] __board__", + "act-withCardTitle": "[__board__] __card__", "actions": "操作", "activities": "Activities", "activity": "アクティビティ", @@ -31,6 +51,8 @@ "all-boards": "All boards", "and-n-other-card": "And __count__ other card", "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", "archive": "アーカイブ", "archive-all": "すべてをアーカイブ", "archive-board": "Archive Board", @@ -46,6 +68,7 @@ "attachment-delete-pop": "添付ファイルの削除をすると取り消しできません。", "attachmentDeletePopup-title": "添付ファイルを削除しますか?", "attachments": "添付ファイル", + "auto-watch": "Automatically watch boards when create it", "avatar-too-big": "The avatar is too large (70Kb max)", "back": "戻る", "board-change-color": "Change color", @@ -56,7 +79,7 @@ "boardChangeColorPopup-title": "Change Board Background", "boardChangeTitlePopup-title": "ボード名の変更", "boardChangeVisibilityPopup-title": "公開範囲の変更", - "boardImportBoardPopup-title": "Import board from Trello", + "boardChangeWatchPopup-title": "Change Watch", "boardMenuPopup-title": "Board Menu", "boards": "ボード", "bucket-example": "Like “Bucket List” for example", @@ -66,11 +89,15 @@ "card-delete-notice": "削除は取り消しできません。このカードに関係するすべてのアクションがなくなります。", "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.", + "card-due": "Due", + "card-due-on": "Due on", "card-edit-attachments": "Edit attachments", "card-edit-labels": "Edit labels", "card-edit-members": "Edit members", "card-labels-title": "カードのラベルを変更する", "card-members-title": "カードからボードメンバーを追加・削除する", + "card-start": "Start", + "card-start-on": "Starts on", "cardAttachmentsPopup-title": "Attach From", "cardDeletePopup-title": "カードを削除しますか?", "cardDetailsActionsPopup-title": "Card Actions", @@ -82,13 +109,15 @@ "change-avatar": "アバターの変更", "change-password": "パスワードの変更", "change-permissions": "Change permissions", + "change-settings": "Change Settings", "changeAvatarPopup-title": "アバターの変更", "changeLanguagePopup-title": "言語の変更", "changePasswordPopup-title": "パスワードの変更", "changePermissionsPopup-title": "パーミッションの変更", + "changeSettingsPopup-title": "Change Settings", "click-to-star": "ボードにスターをつける", "click-to-unstar": "ボードからスターを外す", - "clipboard": "Clipboard or drag & drop", + "clipboard" : "Clipboard or drag & drop", "close": "閉じる", "close-board": "Close Board", "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", @@ -109,6 +138,7 @@ "createBoardPopup-title": "ボードの作成", "createLabelPopup-title": "ラベルの作成", "current": "current", + "date": "Date", "decline": "Decline", "default-avatar": "Default avatar", "delete": "削除", @@ -122,7 +152,10 @@ "edit": "編集", "edit-avatar": "アバターの変更", "edit-profile": "Edit Profile", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", "editLabelPopup-title": "ラベルの変更", + "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "メールアドレス", "email-enrollAccount-subject": "An account created for you on __siteName__", @@ -146,27 +179,33 @@ "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", + "error-username-taken": "This username is already taken", "export-board": "Export board", "filter": "Filter", "filter-cards": "カードをフィルターする", "filter-clear": "Clear filter", + "filter-no-label": "No label", + "filter-no-member": "No member", "filter-on": "Filter is on", "filter-on-desc": "このボードのカードをフィルターしています。フィルターを編集するにはこちらをクリックしてください。", "filter-to-selection": "Filter to selection", "fullname": "フルネーム", "header-logo-title": "自分のボードページに戻る。", + "hide-system-messages": "Hide system messages", "home": "ホーム", "import": "Import", "import-board": "import from Trello", + "import-board-title": "Import board from Trello", "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text", - "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-map-members": "Map members", "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users", "import-show-user-mapping": "Review members mapping", "import-user-select": "Pick the Wekan user you want to use as this member", + "importMapMembersAddPopup-title": "Select Wekan member", "info": "情報", "initials": "Initials", + "invalid-date": "Invalid date", "joined": "参加しました", "just-invited": "You are just invited to this board", "keyboard-shortcuts": "Keyboard shortcuts", @@ -186,17 +225,20 @@ "listImportCardPopup-title": "Import a Trello card", "lists": "Lists", "log-out": "ログアウト", + "log-in": "Log In", "loginPopup-title": "ログイン", - "mapMembersAddPopup-title": "Select Wekan member", - "mapMembersPopup-title": "Map members", "memberMenuPopup-title": "Member Settings", "members": "メンバー", "menu": "メニュー", "move-selection": "Move selection", "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", "multi-selection": "Multi-Selection", "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", "my-boards": "自分のボード", "name": "名前", "no-archived-cards": "No archived cards.", @@ -205,12 +247,15 @@ "normal": "通常", "normal-desc": "カードの閲覧と編集が可能。設定変更不可。", "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", "optional": "任意", "or": "or", "page-maybe-private": "このページはプライベートです。ログインして見てください。", "page-not-found": "ページが見つかりません。", "password": "パスワード", "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", "preview": "Preview", "previewAttachedImagePopup-title": "Preview", "previewClipboardImagePopup-title": "Preview", @@ -242,6 +287,7 @@ "shortcut-show-shortcuts": "Bring up this shortcuts list", "shortcut-toggle-filterbar": "Toggle Filter Sidebar", "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", "signupPopup-title": "アカウント作成", "star-board-title": "ボードにスターをつけると自分のボード一覧のトップに表示されます。", "starred-boards": "スターのついたボード", @@ -250,14 +296,24 @@ "team": "チーム", "this-board": "このボード", "this-card": "このカード", + "time": "Time", "title": "タイトル", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", "unassign-member": "Unassign member", "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", "upload": "Upload", "upload-avatar": "Upload an avatar", "uploaded-avatar": "Uploaded an avatar", "username": "ユーザー名", "view-it": "View it", "warn-list-archived": "warning: this card is in an archived list", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", "what-to-do": "What do you want to do?" } diff --git a/i18n/ko.i18n.json b/i18n/ko.i18n.json index 823a221d1..ac8a30495 100644 --- a/i18n/ko.i18n.json +++ b/i18n/ko.i18n.json @@ -1,5 +1,25 @@ { "accept": "Accept", + "act-activity-notify": "[Wekan] Activity Notification", + "act-addAttachment": "attached __attachment__ to __card__", + "act-addComment": "commented on __card__: __comment__", + "act-createBoard": "created __board__", + "act-createCard": "added __card__ to __list__", + "act-createList": "added __list__ to __board__", + "act-addBoardMember": "added __member__ to __board__", + "act-archivedBoard": "archived __board__", + "act-archivedCard": "archived __card__", + "act-archivedList": "archived __list__", + "act-importBoard": "imported __board__", + "act-importCard": "imported __card__", + "act-importList": "imported __list__", + "act-joinMember": "added __member__ to __card__", + "act-moveCard": "moved __card__ from __oldList__ to __list__", + "act-removeBoardMember": "removed __member__ from __board__", + "act-restoredCard": "restored __card__ to __board__", + "act-unjoinMember": "removed __member__ from __card__", + "act-withBoardTitle": "[Wekan] __board__", + "act-withCardTitle": "[__board__] __card__", "actions": "동작", "activities": "Activities", "activity": "활동 상태", @@ -31,6 +51,8 @@ "all-boards": "All boards", "and-n-other-card": "And __count__ other card", "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", "archive": "보관", "archive-all": "모두 보관", "archive-board": "Archive Board", @@ -46,6 +68,7 @@ "attachment-delete-pop": "영구 첨부파일을 삭제합니다. 되돌릴 수 없습니다.", "attachmentDeletePopup-title": "첨부 파일을 삭제합니까?", "attachments": "첨부 파일", + "auto-watch": "Automatically watch boards when create it", "avatar-too-big": "The avatar is too large (70Kb max)", "back": "뒤로", "board-change-color": "Change color", @@ -56,7 +79,7 @@ "boardChangeColorPopup-title": "Change Board Background", "boardChangeTitlePopup-title": "보드 이름 바꾸기", "boardChangeVisibilityPopup-title": "표시 여부 변경", - "boardImportBoardPopup-title": "Import board from Trello", + "boardChangeWatchPopup-title": "Change Watch", "boardMenuPopup-title": "Board Menu", "boards": "보드", "bucket-example": "Like “Bucket List” for example", @@ -66,11 +89,15 @@ "card-delete-notice": "영구 삭제입니다. 이 카드와 관련된 모든 작업들을 잃게됩니다.", "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.", + "card-due": "Due", + "card-due-on": "Due on", "card-edit-attachments": "Edit attachments", "card-edit-labels": "Edit labels", "card-edit-members": "Edit members", "card-labels-title": "카드의 라벨 변경.", "card-members-title": "카드에서 보드의 멤버를 추가하거나 삭제합니다.", + "card-start": "Start", + "card-start-on": "Starts on", "cardAttachmentsPopup-title": "Attach From", "cardDeletePopup-title": "카드를 삭제합니까?", "cardDetailsActionsPopup-title": "Card Actions", @@ -82,13 +109,15 @@ "change-avatar": "아바타 변경", "change-password": "암호 변경", "change-permissions": "Change permissions", + "change-settings": "Change Settings", "changeAvatarPopup-title": "아바타 변경", "changeLanguagePopup-title": "언어 변경", "changePasswordPopup-title": "암호 변경", "changePermissionsPopup-title": "권한 변경", + "changeSettingsPopup-title": "Change Settings", "click-to-star": "보드 별 추가.", "click-to-unstar": "보드 별 삭제.", - "clipboard": "Clipboard or drag & drop", + "clipboard" : "Clipboard or drag & drop", "close": "닫기", "close-board": "Close Board", "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", @@ -109,6 +138,7 @@ "createBoardPopup-title": "보드 생성", "createLabelPopup-title": "라벨 생성", "current": "current", + "date": "Date", "decline": "Decline", "default-avatar": "Default avatar", "delete": "삭제", @@ -122,7 +152,10 @@ "edit": "수정", "edit-avatar": "아바타 변경", "edit-profile": "Edit Profile", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", "editLabelPopup-title": "라벨 변경", + "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "이메일", "email-enrollAccount-subject": "An account created for you on __siteName__", @@ -146,27 +179,33 @@ "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", + "error-username-taken": "This username is already taken", "export-board": "Export board", "filter": "Filter", "filter-cards": "카드 필터", "filter-clear": "Clear filter", + "filter-no-label": "No label", + "filter-no-member": "No member", "filter-on": "Filter is on", "filter-on-desc": "보드에서 카드를 필터링합니다. 여기를 클릭하여 필터를 수정합니다.", "filter-to-selection": "Filter to selection", "fullname": "전체 이름", "header-logo-title": "보드 페이지로 돌아가기.", + "hide-system-messages": "Hide system messages", "home": "홈", "import": "Import", "import-board": "import from Trello", + "import-board-title": "Import board from Trello", "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text", - "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-map-members": "Map members", "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users", "import-show-user-mapping": "Review members mapping", "import-user-select": "Pick the Wekan user you want to use as this member", + "importMapMembersAddPopup-title": "Select Wekan member", "info": "정보", "initials": "Initials", + "invalid-date": "Invalid date", "joined": "참가함", "just-invited": "You are just invited to this board", "keyboard-shortcuts": "Keyboard shortcuts", @@ -186,17 +225,20 @@ "listImportCardPopup-title": "Import a Trello card", "lists": "Lists", "log-out": "로그아웃", + "log-in": "Log In", "loginPopup-title": "로그인", - "mapMembersAddPopup-title": "Select Wekan member", - "mapMembersPopup-title": "Map members", "memberMenuPopup-title": "Member Settings", "members": "멤버", "menu": "메뉴", "move-selection": "Move selection", "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", "multi-selection": "Multi-Selection", "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", "my-boards": "내 보드", "name": "이름", "no-archived-cards": "No archived cards.", @@ -205,12 +247,15 @@ "normal": "표준", "normal-desc": "카드를 보거나 수정할 수 있습니다. 설정값은 변경할 수 없습니다.", "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", "optional": "옴션", "or": "or", "page-maybe-private": "이 페이지를 비공개일 수 있습니다. 이것을 보고 싶으면 로그인을 하십시오.", "page-not-found": "페이지를 찾지 못 했습니다", "password": "암호", "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", "preview": "Preview", "previewAttachedImagePopup-title": "Preview", "previewClipboardImagePopup-title": "Preview", @@ -242,6 +287,7 @@ "shortcut-show-shortcuts": "Bring up this shortcuts list", "shortcut-toggle-filterbar": "Toggle Filter Sidebar", "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", "signupPopup-title": "계정 생성", "star-board-title": "보드에 별을 클릭합니다. 보드 목록에서 최상위로 둘 수 있습니다.", "starred-boards": "별표된 보드", @@ -250,14 +296,24 @@ "team": "팀", "this-board": "보드", "this-card": "카드", + "time": "Time", "title": "제목", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", "unassign-member": "Unassign member", "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", "upload": "Upload", "upload-avatar": "Upload an avatar", "uploaded-avatar": "Uploaded an avatar", "username": "사용자 이름", "view-it": "View it", "warn-list-archived": "warning: this card is in an archived list", - "what-to-do": "What do you want to do?" + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "what-to-do": "무엇을 원하나요?" } diff --git a/i18n/pl.i18n.json b/i18n/pl.i18n.json index d44bccdbd..f7d00b708 100644 --- a/i18n/pl.i18n.json +++ b/i18n/pl.i18n.json @@ -1,5 +1,25 @@ { "accept": "Akceptuj", + "act-activity-notify": "[Wekan] Activity Notification", + "act-addAttachment": "attached __attachment__ to __card__", + "act-addComment": "commented on __card__: __comment__", + "act-createBoard": "created __board__", + "act-createCard": "added __card__ to __list__", + "act-createList": "added __list__ to __board__", + "act-addBoardMember": "added __member__ to __board__", + "act-archivedBoard": "archived __board__", + "act-archivedCard": "archived __card__", + "act-archivedList": "archived __list__", + "act-importBoard": "imported __board__", + "act-importCard": "imported __card__", + "act-importList": "imported __list__", + "act-joinMember": "added __member__ to __card__", + "act-moveCard": "moved __card__ from __oldList__ to __list__", + "act-removeBoardMember": "removed __member__ from __board__", + "act-restoredCard": "restored __card__ to __board__", + "act-unjoinMember": "removed __member__ from __card__", + "act-withBoardTitle": "[Wekan] __board__", + "act-withCardTitle": "[__board__] __card__", "actions": "Akcje", "activities": "Aktywności", "activity": "Aktywność", @@ -31,6 +51,8 @@ "all-boards": "Wszystkie tablice", "and-n-other-card": "And __count__ other card", "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", "archive": "Zarchiwizuj", "archive-all": "Zarchiwizuj wszystkie", "archive-board": "Zarchiwizuj tablicę", @@ -46,6 +68,7 @@ "attachment-delete-pop": "Usunięcie załącznika jest nieodwracalne.", "attachmentDeletePopup-title": "Usunąć załącznik?", "attachments": "Załączniki", + "auto-watch": "Automatically watch boards when create it", "avatar-too-big": "Avatar jest za duży (maksymalnie 70Kb)", "back": "Wstecz", "board-change-color": "Zmień kolor", @@ -56,7 +79,7 @@ "boardChangeColorPopup-title": "Zmień tło tablicy", "boardChangeTitlePopup-title": "Zmień nazwę tablicy", "boardChangeVisibilityPopup-title": "Zmień widoczność", - "boardImportBoardPopup-title": "Zaimportuj tablicę z Trello", + "boardChangeWatchPopup-title": "Change Watch", "boardMenuPopup-title": "Menu tablicy", "boards": "Tablice", "bucket-example": "Like “Bucket List” for example", @@ -66,11 +89,15 @@ "card-delete-notice": "Usunięcie jest trwałe. Stracisz wszystkie akcje powiązane z tą kartą.", "card-delete-pop": "Wszystkie akcje będą usunięte z widoku aktywności, nie można będzie ponownie otworzyć karty. Usunięcie jest nieodwracalne. ", "card-delete-suggest-archive": "Możesz zarchiwizować kartę w celu usunięcia jej z tablicy oraz zachowania jej aktywności.", + "card-due": "Due", + "card-due-on": "Due on", "card-edit-attachments": "Edytuj załączniki", "card-edit-labels": "Edytuj etykiety", "card-edit-members": "Edytuj członków", "card-labels-title": "Zmień etykiety karty", "card-members-title": "Dodaj lub usuń członków tablicy z karty.", + "card-start": "Start", + "card-start-on": "Starts on", "cardAttachmentsPopup-title": "Załącz z", "cardDeletePopup-title": "Usunąć kartę?", "cardDetailsActionsPopup-title": "Card Actions", @@ -82,13 +109,15 @@ "change-avatar": "Zmień Avatar", "change-password": "Zmień hasło", "change-permissions": "Zmień uprawnienia", + "change-settings": "Change Settings", "changeAvatarPopup-title": "Zmień Avatar", "changeLanguagePopup-title": "Zmień język", "changePasswordPopup-title": "Zmień hasło", "changePermissionsPopup-title": "Zmień uprawnienia", + "changeSettingsPopup-title": "Change Settings", "click-to-star": "Kliknij by odznaczyć tę tablicę.", "click-to-unstar": "Kliknij by usunąć odznaczenie tej tablicy.", - "clipboard": "Schowek lub przeciągnij & upuść", + "clipboard" : "Schowek lub przeciągnij & upuść", "close": "Zamknij", "close-board": "Zamknij tablicę", "close-board-pop": "Możesz przywrócić tablicę klikając przycisk \"Zarchiwizowane\" z głównej belki.", @@ -109,6 +138,7 @@ "createBoardPopup-title": "Utwórz tablicę", "createLabelPopup-title": "Utwórz etykietę", "current": "obecny", + "date": "Date", "decline": "Odrzuć", "default-avatar": "Domyślny avatar", "delete": "Usuń", @@ -122,7 +152,10 @@ "edit": "Edytuj", "edit-avatar": "Zmień Avatar", "edit-profile": "Edytuj profil", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", "editLabelPopup-title": "Zmień etykietę", + "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edytuj profil", "email": "Email", "email-enrollAccount-subject": "Konto zostało utworzone na __siteName__", @@ -146,27 +179,33 @@ "error-user-doesNotExist": "Ten użytkownik nie istnieje", "error-user-notAllowSelf": "Ta akcje nie jest dozwolona", "error-user-notCreated": "Ten użytkownik nie został stworzony", + "error-username-taken": "This username is already taken", "export-board": "Eksportuj tablicę", "filter": "Filtr", "filter-cards": "Odfiltruj karty", "filter-clear": "Usuń filter", + "filter-no-label": "No label", + "filter-no-member": "No member", "filter-on": "Filtr jest włączony", "filter-on-desc": "Filtrujesz karty na tej tablicy. Kliknij tutaj by edytować filtr.", "filter-to-selection": "Odfiltruj zaznaczenie", "fullname": "Full Name", "header-logo-title": "Wróć do swojej strony z tablicami.", + "hide-system-messages": "Hide system messages", "home": "Strona główna", "import": "Importu", "import-board": "zaimportuj z Trello", + "import-board-title": "Import board from Trello", "import-board-trello-instruction": "W twojej tablicy na Trello, idź do 'Menu', następnie 'More', 'Print and Export', 'Export JSON' i skopiuj wynik", - "import-card": "Zaimportuj kartę z Trello", - "import-card-trello-instruction": "Idź do karty Trello, wybierz 'Share and more...', następnie 'Export JSON' i skopiuj wynik", "import-json-placeholder": "Wklej twój JSON tutaj", + "import-map-members": "Map members", "import-members-map": "Twoje zaimportowane tablice mają kilku członków. Proszę wybierz członków których chcesz zaimportować do Wekan", "import-show-user-mapping": "Przejrzyj wybranych członków", "import-user-select": "Pick the Wekan user you want to use as this member", + "importMapMembersAddPopup-title": "Select Wekan member", "info": "Informacje", "initials": "Initials", + "invalid-date": "Invalid date", "joined": "dołączył", "just-invited": "Właśnie zostałeś zaproszony do tej tablicy", "keyboard-shortcuts": "Skróty klawiaturowe", @@ -186,17 +225,20 @@ "listImportCardPopup-title": "Zaimportuj kartę z Trello", "lists": "Listy", "log-out": "Wyloguj", + "log-in": "Log In", "loginPopup-title": "Zaloguj", - "mapMembersAddPopup-title": "Wybierz członka Wekan", - "mapMembersPopup-title": "Map members", "memberMenuPopup-title": "Member Settings", "members": "Członkowie", "menu": "Menu", "move-selection": "Przenieś zaznaczone", "moveCardPopup-title": "Przenieś kartę", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Przenieś zaznaczone", "multi-selection": "Wielokrotne zaznaczenie", "multi-selection-on": "Wielokrotne zaznaczenie jest włączone", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", "my-boards": "Moje tablice", "name": "Nazwa", "no-archived-cards": "Brak zarchiwizowanych kart.", @@ -205,12 +247,15 @@ "normal": "Normal", "normal-desc": "Może widzieć i edytować karty. Nie może zmieniać ustawiań.", "not-accepted-yet": "Zaproszenie jeszcze nie zaakceptowane", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", "optional": "opcjonalny", "or": "lub", "page-maybe-private": "Ta strona może być prywatna. Możliwe, że możesz ją zobaczyć po zalogowaniu.", "page-not-found": "Strona nie znaleziona.", "password": "Hasło", "paste-or-dragdrop": "wklej lub przeciągnij & upuść obrazek", + "participating": "Participating", "preview": "Podgląd", "previewAttachedImagePopup-title": "Podgląd", "previewClipboardImagePopup-title": "Podgląd", @@ -234,7 +279,7 @@ "search": "Wyszukaj", "select-color": "Wybierz kolor", "shortcut-assign-self": "Przypisz siebie do obecnej karty", - "shortcut-autocomplete-emojies": "Autocomplete emojies", + "shortcut-autocomplete-emoji": "Autocomplete emoji", "shortcut-autocomplete-members": "Autocomplete members", "shortcut-clear-filters": "Usuń wszystkie filtry", "shortcut-close-dialog": "Zamknij okno", @@ -242,6 +287,7 @@ "shortcut-show-shortcuts": "Przypnij do listy skrótów", "shortcut-toggle-filterbar": "Przełącz boczny pasek filtru", "shortcut-toggle-sidebar": "Przełącz boczny pasek tablicy", + "show-cards-minimum-count": "Show cards count if list contains more than", "signupPopup-title": "Utwórz konto", "star-board-title": "Click to star this board. It will show up at top of your boards list.", "starred-boards": "Odznaczone tablice", @@ -250,14 +296,24 @@ "team": "Zespół", "this-board": "ta tablica", "this-card": "ta karta", + "time": "Time", "title": "Tytuł", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", "unassign-member": "Nieprzypisany członek", "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", "upload": "Wyślij", "upload-avatar": "Wyślij avatar", "uploaded-avatar": "Wysłany avatar", "username": "Nazwa użytkownika", "view-it": "Zobacz", "warn-list-archived": "ostrzeżenie: ta karta jest na zarchiwizowanej liście", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", "what-to-do": "Co chcesz zrobić?" -} \ No newline at end of file +} diff --git a/i18n/pt-BR.i18n.json b/i18n/pt-BR.i18n.json index 189d42987..5f43b287f 100644 --- a/i18n/pt-BR.i18n.json +++ b/i18n/pt-BR.i18n.json @@ -1,5 +1,25 @@ { "accept": "Aceitar", + "act-activity-notify": "[Wekan] Activity Notification", + "act-addAttachment": "attached __attachment__ to __card__", + "act-addComment": "commented on __card__: __comment__", + "act-createBoard": "created __board__", + "act-createCard": "added __card__ to __list__", + "act-createList": "added __list__ to __board__", + "act-addBoardMember": "added __member__ to __board__", + "act-archivedBoard": "archived __board__", + "act-archivedCard": "archived __card__", + "act-archivedList": "archived __list__", + "act-importBoard": "imported __board__", + "act-importCard": "imported __card__", + "act-importList": "imported __list__", + "act-joinMember": "added __member__ to __card__", + "act-moveCard": "moved __card__ from __oldList__ to __list__", + "act-removeBoardMember": "removed __member__ from __board__", + "act-restoredCard": "restored __card__ to __board__", + "act-unjoinMember": "removed __member__ from __card__", + "act-withBoardTitle": "[Wekan] __board__", + "act-withCardTitle": "[__board__] __card__", "actions": "Ações", "activities": "Atividades", "activity": "Atividade", @@ -31,6 +51,8 @@ "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": "Apply", + "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", "archive": "Arquivar", "archive-all": "Arquivar Tudo", "archive-board": "Arquivar Quadro", @@ -46,6 +68,7 @@ "attachment-delete-pop": "Excluir um anexo é permanente. Não será possível recuperá-lo.", "attachmentDeletePopup-title": "Excluir Anexo?", "attachments": "Anexos", + "auto-watch": "Automatically watch boards when create it", "avatar-too-big": "Imagem de avatar muito grande (máx 70KB)", "back": "Voltar", "board-change-color": "Alterar cor", @@ -56,7 +79,7 @@ "boardChangeColorPopup-title": "Alterar Tela de Fundo", "boardChangeTitlePopup-title": "Renomear Quadro", "boardChangeVisibilityPopup-title": "Alterar Visibilidade", - "boardImportBoardPopup-title": "Importar quadro do Trello", + "boardChangeWatchPopup-title": "Change Watch", "boardMenuPopup-title": "Menu do Quadro", "boards": "Quadros", "bucket-example": "\"Bucket List\", por exemplo", @@ -66,11 +89,15 @@ "card-delete-notice": "A exclusão será permanente. Você perderá todas as ações associadas a este cartão.", "card-delete-pop": "Todas as ações serão removidas da lista de Atividades e vocês não poderá re-abrir o cartão. Não há como desfazer.", "card-delete-suggest-archive": "Você pode arquivar um cartão para removê-lo do quadro e preservar suas atividades.", + "card-due": "Due", + "card-due-on": "Due on", "card-edit-attachments": "Editar anexos", "card-edit-labels": "Editar etiquetas", "card-edit-members": "Editar membros", "card-labels-title": "Alterar etiquetas do cartão.", "card-members-title": "Acrescentar ou remover membros do quadro deste cartão.", + "card-start": "Start", + "card-start-on": "Starts on", "cardAttachmentsPopup-title": "Anexar a partir de", "cardDeletePopup-title": "Excluir Cartão?", "cardDetailsActionsPopup-title": "Ações do cartão", @@ -82,13 +109,15 @@ "change-avatar": "Alterar Avatar", "change-password": "Alterar Senha", "change-permissions": "Alterar permissões", + "change-settings": "Change Settings", "changeAvatarPopup-title": "Alterar Avatar", "changeLanguagePopup-title": "Alterar Idioma", "changePasswordPopup-title": "Alterar Senha", "changePermissionsPopup-title": "Alterar Permissões", + "changeSettingsPopup-title": "Change Settings", "click-to-star": "Marcar quadro como favorito.", "click-to-unstar": "Remover quadro dos favoritos.", - "clipboard": "Área de Transferência ou arraste e solte", + "clipboard" : "Área de Transferência ou arraste e solte", "close": "Fechar", "close-board": "Fechar Quadro", "close-board-pop": "Você estará habilitado para restaurar o quadro clicando no botão \"Arquivos\" à partir da barra de início.", @@ -109,6 +138,7 @@ "createBoardPopup-title": "Criar Quadro", "createLabelPopup-title": "Criar Etiqueta", "current": "atual", + "date": "Date", "decline": "Rejeitar", "default-avatar": "Avatar padrão", "delete": "Excluir", @@ -122,7 +152,10 @@ "edit": "Editar", "edit-avatar": "Alterar Avatar", "edit-profile": "Editar Perfil", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", "editLabelPopup-title": "Alterar Etiqueta", + "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Editar Perfil", "email": "E-mail", "email-enrollAccount-subject": "Uma conta foi criada para você em __siteName__", @@ -146,27 +179,33 @@ "error-user-doesNotExist": "Este usuário não existe", "error-user-notAllowSelf": "Esta ação em você mesmo não é permitida", "error-user-notCreated": "Este usuário não foi criado", + "error-username-taken": "This username is already taken", "export-board": "Exportar quadro", "filter": "Filtrar", "filter-cards": "Filtrar Cartões", "filter-clear": "Limpar filtro", + "filter-no-label": "No label", + "filter-no-member": "No member", "filter-on": "Filtro está ativo", "filter-on-desc": "Você está filtrando cartões neste quadro. Clique aqui para editar o filtro.", "filter-to-selection": "Filtrar esta seleção", "fullname": "Nome Completo", "header-logo-title": "Voltar para a lista de quadros.", + "hide-system-messages": "Hide system messages", "home": "Início", "import": "Importar", "import-board": "Importar do Trello", + "import-board-title": "Import board from Trello", "import-board-trello-instruction": "No seu quadro do Trello, vá em 'Menu', depois em 'Mais', 'Imprimir e Exportar', 'Exportar JSON', então copie o texto emitido", - "import-card": "Importe um cartão do Trello", - "import-card-trello-instruction": "Vá para um cartão do Trello, selecione 'Compartilhar e mais...' então 'Exporte JSON' e copie o texto resultante", "import-json-placeholder": "Cole seus dados JSON válidos aqui", + "import-map-members": "Map members", "import-members-map": "O seu quadro importado tem alguns membros. Por favor determine os membros que você deseja importar para os usuários Wekan", "import-show-user-mapping": "Revisar mapeamento dos membros", "import-user-select": "Selecione o usuário Wekan que você gostaria de usar como este membro", + "importMapMembersAddPopup-title": "Select Wekan member", "info": "Informações", "initials": "Iniciais", + "invalid-date": "Invalid date", "joined": "juntou-se", "just-invited": "Você já foi convidado para este quadro", "keyboard-shortcuts": "Atalhos do teclado", @@ -186,17 +225,20 @@ "listImportCardPopup-title": "Importe um cartão do Trello", "lists": "Listas", "log-out": "Sair", + "log-in": "Log In", "loginPopup-title": "Entrar", - "mapMembersAddPopup-title": "Selecione um membro Wekan", - "mapMembersPopup-title": "Mapear membros", "memberMenuPopup-title": "Configuração de Membros", "members": "Membros", "menu": "Menu", "move-selection": "Mover seleção", "moveCardPopup-title": "Mover Cartão", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Mover seleção", "multi-selection": "Multi-Seleção", "multi-selection-on": "Multi-seleção está ativo", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", "my-boards": "Meus Quadros", "name": "Nome", "no-archived-cards": "Nenhum cartão arquivado", @@ -205,12 +247,15 @@ "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": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", "optional": "opcional", "or": "ou", "page-maybe-private": "Esta página pode ser privada. Você poderá vê-la se estiver logado.", "page-not-found": "Página não encontrada.", "password": "Senha", "paste-or-dragdrop": "para colar, ou arraste e solte o arquivo da imagem para ca (somente imagens)", + "participating": "Participating", "preview": "Previsualizar", "previewAttachedImagePopup-title": "Previsualizar", "previewClipboardImagePopup-title": "Previsualizar", @@ -234,7 +279,7 @@ "search": "Buscar", "select-color": "Selecione uma cor", "shortcut-assign-self": "Atribuir a si o cartão atual", - "shortcut-autocomplete-emojies": "Preenchimento automático de emojies", + "shortcut-autocomplete-emoji": "Autocomplete emoji", "shortcut-autocomplete-members": "Preenchimento automático de membros", "shortcut-clear-filters": "Limpar todos filtros", "shortcut-close-dialog": "Fechar dialogo", @@ -242,6 +287,7 @@ "shortcut-show-shortcuts": "Mostrar lista de atalhos", "shortcut-toggle-filterbar": "Alternar barra de filtro", "shortcut-toggle-sidebar": "Fechar barra lateral.", + "show-cards-minimum-count": "Show cards count if list contains more than", "signupPopup-title": "Criar uma Conta", "star-board-title": "Clique para marcar este quadro como favorito. Ele aparecerá no topo na lista dos seus quadros.", "starred-boards": "Quadros Favoritos", @@ -250,14 +296,24 @@ "team": "Equipe", "this-board": "este quadro", "this-card": "este cartão", + "time": "Time", "title": "Título", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", "unassign-member": "Membro não associado", "unsaved-description": "Você possui uma descrição não salva", + "unwatch": "Unwatch", "upload": "Upload", "upload-avatar": "Carregar um avatar", "uploaded-avatar": "Avatar carregado", "username": "Nome de usuário", "view-it": "Visualizar", "warn-list-archived": "aviso: este cartão está em uma lista arquivada", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", "what-to-do": "O que você gostaria de fazer?" -} \ No newline at end of file +} diff --git a/i18n/ro.i18n.json b/i18n/ro.i18n.json index 04b5a455f..ec7f55dec 100644 --- a/i18n/ro.i18n.json +++ b/i18n/ro.i18n.json @@ -1,5 +1,25 @@ { "accept": "Accept", + "act-activity-notify": "[Wekan] Activity Notification", + "act-addAttachment": "attached __attachment__ to __card__", + "act-addComment": "commented on __card__: __comment__", + "act-createBoard": "created __board__", + "act-createCard": "added __card__ to __list__", + "act-createList": "added __list__ to __board__", + "act-addBoardMember": "added __member__ to __board__", + "act-archivedBoard": "archived __board__", + "act-archivedCard": "archived __card__", + "act-archivedList": "archived __list__", + "act-importBoard": "imported __board__", + "act-importCard": "imported __card__", + "act-importList": "imported __list__", + "act-joinMember": "added __member__ to __card__", + "act-moveCard": "moved __card__ from __oldList__ to __list__", + "act-removeBoardMember": "removed __member__ from __board__", + "act-restoredCard": "restored __card__ to __board__", + "act-unjoinMember": "removed __member__ from __card__", + "act-withBoardTitle": "[Wekan] __board__", + "act-withCardTitle": "[__board__] __card__", "actions": "Actions", "activities": "Activities", "activity": "Activity", @@ -31,6 +51,8 @@ "all-boards": "All boards", "and-n-other-card": "And __count__ other card", "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", "archive": "Archive", "archive-all": "Archive All", "archive-board": "Archive Board", @@ -46,6 +68,7 @@ "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", "attachmentDeletePopup-title": "Delete Attachment?", "attachments": "Ataşamente", + "auto-watch": "Automatically watch boards when create it", "avatar-too-big": "The avatar is too large (70Kb max)", "back": "Înapoi", "board-change-color": "Change color", @@ -56,7 +79,7 @@ "boardChangeColorPopup-title": "Change Board Background", "boardChangeTitlePopup-title": "Rename Board", "boardChangeVisibilityPopup-title": "Change Visibility", - "boardImportBoardPopup-title": "Import board from Trello", + "boardChangeWatchPopup-title": "Change Watch", "boardMenuPopup-title": "Board Menu", "boards": "Boards", "bucket-example": "Like “Bucket List” for example", @@ -66,11 +89,15 @@ "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.", + "card-due": "Due", + "card-due-on": "Due on", "card-edit-attachments": "Edit attachments", "card-edit-labels": "Edit labels", "card-edit-members": "Edit members", "card-labels-title": "Change the labels for the card.", "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", "cardAttachmentsPopup-title": "Attach From", "cardDeletePopup-title": "Delete Card?", "cardDetailsActionsPopup-title": "Card Actions", @@ -82,13 +109,15 @@ "change-avatar": "Change Avatar", "change-password": "Change Password", "change-permissions": "Change permissions", + "change-settings": "Change Settings", "changeAvatarPopup-title": "Change Avatar", "changeLanguagePopup-title": "Change Language", "changePasswordPopup-title": "Change Password", "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", "click-to-star": "Click to star this board.", "click-to-unstar": "Click to unstar this board.", - "clipboard": "Clipboard or drag & drop", + "clipboard" : "Clipboard or drag & drop", "close": "Închide", "close-board": "Close Board", "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", @@ -109,6 +138,7 @@ "createBoardPopup-title": "Create Board", "createLabelPopup-title": "Create Label", "current": "current", + "date": "Date", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -122,7 +152,10 @@ "edit": "Edit", "edit-avatar": "Change Avatar", "edit-profile": "Edit Profile", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", "email-enrollAccount-subject": "An account created for you on __siteName__", @@ -146,27 +179,33 @@ "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", + "error-username-taken": "This username is already taken", "export-board": "Export board", "filter": "Filter", "filter-cards": "Filter Cards", "filter-clear": "Clear filter", + "filter-no-label": "No label", + "filter-no-member": "No member", "filter-on": "Filter is on", "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", "filter-to-selection": "Filter to selection", "fullname": "Full Name", "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", "home": "Home", "import": "Import", "import-board": "import from Trello", + "import-board-title": "Import board from Trello", "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text", - "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-map-members": "Map members", "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users", "import-show-user-mapping": "Review members mapping", "import-user-select": "Pick the Wekan user you want to use as this member", + "importMapMembersAddPopup-title": "Select Wekan member", "info": "Infos", "initials": "Iniţiale", + "invalid-date": "Invalid date", "joined": "joined", "just-invited": "You are just invited to this board", "keyboard-shortcuts": "Keyboard shortcuts", @@ -186,17 +225,20 @@ "listImportCardPopup-title": "Import a Trello card", "lists": "Liste", "log-out": "Log Out", + "log-in": "Log In", "loginPopup-title": "Log In", - "mapMembersAddPopup-title": "Select Wekan member", - "mapMembersPopup-title": "Map members", "memberMenuPopup-title": "Member Settings", "members": "Members", "menu": "Meniu", "move-selection": "Move selection", "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", "multi-selection": "Multi-Selection", "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", "my-boards": "My Boards", "name": "Nume", "no-archived-cards": "No archived cards.", @@ -205,12 +247,15 @@ "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", "optional": "optional", "or": "or", "page-maybe-private": "This page may be private. You may be able to view it by logging in.", "page-not-found": "Page not found.", "password": "Parolă", "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", "preview": "Preview", "previewAttachedImagePopup-title": "Preview", "previewClipboardImagePopup-title": "Preview", @@ -234,7 +279,7 @@ "search": "Caută", "select-color": "Select a color", "shortcut-assign-self": "Assign yourself to current card", - "shortcut-autocomplete-emojies": "Autocomplete emojies", + "shortcut-autocomplete-emoji": "Autocomplete emoji", "shortcut-autocomplete-members": "Autocomplete members", "shortcut-clear-filters": "Clear all filters", "shortcut-close-dialog": "Close Dialog", @@ -242,6 +287,7 @@ "shortcut-show-shortcuts": "Bring up this shortcuts list", "shortcut-toggle-filterbar": "Toggle Filter Sidebar", "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", "signupPopup-title": "Create an Account", "star-board-title": "Click to star this board. It will show up at top of your boards list.", "starred-boards": "Starred Boards", @@ -250,14 +296,24 @@ "team": "Team", "this-board": "this board", "this-card": "this card", + "time": "Time", "title": "Titlu", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", "unassign-member": "Unassign member", "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", "upload": "Upload", "upload-avatar": "Upload an avatar", "uploaded-avatar": "Uploaded an avatar", "username": "Username", "view-it": "View it", "warn-list-archived": "warning: this card is in an archived list", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", "what-to-do": "Ce ai vrea sa faci?" -} \ No newline at end of file +} diff --git a/i18n/ru.i18n.json b/i18n/ru.i18n.json index a2319a27d..c99d2badc 100644 --- a/i18n/ru.i18n.json +++ b/i18n/ru.i18n.json @@ -1,5 +1,25 @@ { "accept": "Принять", + "act-activity-notify": "[Wekan] Activity Notification", + "act-addAttachment": "attached __attachment__ to __card__", + "act-addComment": "commented on __card__: __comment__", + "act-createBoard": "created __board__", + "act-createCard": "added __card__ to __list__", + "act-createList": "added __list__ to __board__", + "act-addBoardMember": "added __member__ to __board__", + "act-archivedBoard": "archived __board__", + "act-archivedCard": "archived __card__", + "act-archivedList": "archived __list__", + "act-importBoard": "imported __board__", + "act-importCard": "imported __card__", + "act-importList": "imported __list__", + "act-joinMember": "added __member__ to __card__", + "act-moveCard": "moved __card__ from __oldList__ to __list__", + "act-removeBoardMember": "removed __member__ from __board__", + "act-restoredCard": "restored __card__ to __board__", + "act-unjoinMember": "removed __member__ from __card__", + "act-withBoardTitle": "[Wekan] __board__", + "act-withCardTitle": "[__board__] __card__", "actions": "Действия", "activities": "История действия", "activity": "Активность", @@ -31,6 +51,8 @@ "all-boards": "Все доски", "and-n-other-card": "И __count__ другая карточка", "and-n-other-card_plural": "И __count__ другие карточки", + "apply": "Apply", + "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", "archive": "Архивировать", "archive-all": "Архивировать все", "archive-board": "Архивировать доску", @@ -46,6 +68,7 @@ "attachment-delete-pop": "Если удалить вложение, его нельзя будет восстановить.", "attachmentDeletePopup-title": "Удалить вложение?", "attachments": "Вложения", + "auto-watch": "Automatically watch boards when create it", "avatar-too-big": "Аватар слишком большой (максимум 70кб)", "back": "Назад", "board-change-color": "Изменить цвет", @@ -56,7 +79,7 @@ "boardChangeColorPopup-title": "Изменить фон доски", "boardChangeTitlePopup-title": "Переименовать доску", "boardChangeVisibilityPopup-title": "Изменить настройки видимости", - "boardImportBoardPopup-title": "Импортировать доску с Trello", + "boardChangeWatchPopup-title": "Change Watch", "boardMenuPopup-title": "Меню доски", "boards": "Доски", "bucket-example": "Например “Список дел”", @@ -66,11 +89,15 @@ "card-delete-notice": "Это действие невозможно будет отменить. Все изменения, которые вы вносили в карточку будут потеряны.", "card-delete-pop": "Все действия будут удалены из ленты активности и вы не сможете заново открыть карточку. Действие необратимо", "card-delete-suggest-archive": "Вы можете заархивировать карточку, чтобы удалить ее с доски и сохранить активность .", + "card-due": "Due", + "card-due-on": "Due on", "card-edit-attachments": "Изменить вложения", "card-edit-labels": "Изменить метку", "card-edit-members": "Изменить пользователей", "card-labels-title": "Редактировать метки.", "card-members-title": "Добавить или удалить участника.", + "card-start": "Start", + "card-start-on": "Starts on", "cardAttachmentsPopup-title": "Прикрепить из", "cardDeletePopup-title": "Удалить карточку?", "cardDetailsActionsPopup-title": "Действия в карточке", @@ -82,26 +109,28 @@ "change-avatar": "Изменить аватар", "change-password": "Изменить пароль", "change-permissions": "Изменить права доступа", + "change-settings": "Change Settings", "changeAvatarPopup-title": "Изменить аватар", "changeLanguagePopup-title": "Сменить язык", "changePasswordPopup-title": "Изменить пароль", "changePermissionsPopup-title": "Изменить настройки доступа", + "changeSettingsPopup-title": "Change Settings", "click-to-star": "Добавить в «Избранное»", "click-to-unstar": "Удалить из «Избранного»", - "clipboard": "Буфер обмена или drag & drop", + "clipboard" : "Буфер обмена или drag & drop", "close": "Закрыть", "close-board": "Закрыть доску", "close-board-pop": "Вы можете восстановить доску, нажав “Архивы” в заголовке.", - "color-green": "зеленый", - "color-yellow": "желтый", - "color-orange": "оранджевый", - "color-red": "красный", - "color-purple": "фиолетовый", - "color-blue": "синий", - "color-sky": "голубой", - "color-lime": "лимоновый", - "color-pink": "зорозвый", "color-black": "черный", + "color-blue": "синий", + "color-green": "зеленый", + "color-lime": "лимоновый", + "color-orange": "оранджевый", + "color-pink": "зорозвый", + "color-purple": "фиолетовый", + "color-red": "красный", + "color-sky": "голубой", + "color-yellow": "желтый", "comment": "Отправить", "comment-placeholder": "Написать комментарий", "computer": "Загрузить с компьютера", @@ -109,6 +138,7 @@ "createBoardPopup-title": "Создать доску", "createLabelPopup-title": "Создать метку", "current": "Текущий", + "date": "Date", "decline": "Понизить", "default-avatar": "Стандартный аватар", "delete": "Удалить", @@ -122,7 +152,10 @@ "edit": "Редактировать", "edit-avatar": "Изменить аватар", "edit-profile": "Изменить профиль", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", "editLabelPopup-title": "Редактирование метки", + "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Изменить профиль", "email": "Эл.почта", "email-enrollAccount-subject": "Аккаунт создан для вас здесь __url__", @@ -134,9 +167,9 @@ "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\nThanks.", + "email-sent": "Email отправлен", "email-verifyEmail-subject": "Подтвердите Email перейдя по ссылке __url__", "email-verifyEmail-text": "Привет __user__,\n\nДля подтверждения Email перейдите по ссылке.\n\n__url__\n\nСпасибо.", - "email-sent": "Email отправлен", "error-board-doesNotExist": "Доска не найдена", "error-board-notAdmin": "Вы должны обладать правами админстратора, чтобы сделать это", "error-board-notAMember": "Вы должны быть пользователем доски, чтобы сделать это", @@ -146,26 +179,33 @@ "error-user-doesNotExist": "Пользователь не найден", "error-user-notAllowSelf": "Нельзя выполнить это действие на себе", "error-user-notCreated": "Пользователь не создан", + "error-username-taken": "This username is already taken", + "export-board": "Export board", "filter": "Фильтр", "filter-cards": "Фильтр карточек", "filter-clear": "Очистить фильтр", + "filter-no-label": "No label", + "filter-no-member": "No member", "filter-on": "Filter is on", "filter-on-desc": "Показываются карточки, соответствующие настройкам фильтра. Нажмите для редактирования.", "filter-to-selection": "Filter to selection", "fullname": "Полное имя", "header-logo-title": "Вернуться к доскам.", + "hide-system-messages": "Hide system messages", "home": "Главная", "import": "Импорт", "import-board": "Импорт с Trello", + "import-board-title": "Import board from Trello", "import-board-trello-instruction": "На вашей Trello доске нажмите “Menu” - “More” - “Print and export - “Export JSON” и скопируйте полученный текст", - "import-card": "Импортировать карточку Trello", - "import-card-trello-instruction": "Перейдите в карточку Trello, выбирите “Share and more” - “Export JSON” и скопируйте полученный текст", "import-json-placeholder": "Вставьте JSON сюда", + "import-map-members": "Map members", "import-members-map": "Вы ипортировали доску с пользователями. Пожалуйста, составьте карту пользователей, которых вы хотите импортировать в Wekan пользователей ", "import-show-user-mapping": "Пересмотреть карту пользователей", "import-user-select": "Выберите Wekan-пользователя, которого вы хотите использовать в качестве пользователя", + "importMapMembersAddPopup-title": "Select Wekan member", "info": "Информация", "initials": "Инициалы", + "invalid-date": "Invalid date", "joined": "вступил", "just-invited": "Вы только пригласили на эту доску", "keyboard-shortcuts": "Сочетания клавиш", @@ -185,15 +225,20 @@ "listImportCardPopup-title": "Импортировать Trello карточку", "lists": "Списки", "log-out": "Выйти", + "log-in": "Log In", "loginPopup-title": "Войти", - "mapMembersPopup-title": "Карта пользователей", - "mapMembersAddPopup-title": "Выбрать Wekan пользователя", "memberMenuPopup-title": "Настройки пользователя", "members": "Участники", "menu": "Меню", + "move-selection": "Move selection", "moveCardPopup-title": "Переместить карточку", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", "multi-selection": "Выбрать несколько", "multi-selection-on": "Выбрать несколько из", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", "my-boards": "Мои доски", "name": "Имя", "no-archived-cards": "Нет карточек в архиве.", @@ -202,15 +247,18 @@ "normal": "Обычный", "normal-desc": "Может редактировать карточки. Не может управлять настройками.", "not-accepted-yet": "Приглашение еще не принято", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", "optional": "не обязательно", "or": "или", "page-maybe-private": "Возможно, эта страница скрыта от незарегистрированных пользователей. Попробуйте войти на сайт.", "page-not-found": "Страница не найдена.", "password": "Пароль", "paste-or-dragdrop": "вставьте, или перетащите файл с изображением сюда (только графический фай)", + "participating": "Participating", "preview": "Предпросмотр", - "previewClipboardImagePopup-title": "Предпросмотр", "previewAttachedImagePopup-title": "Предпросмотр", + "previewClipboardImagePopup-title": "Предпросмотр", "private": "Закрытая", "private-desc": "Эта доска с ограниченным доступом. Только участники могут работать с ней.", "profile": "Профиль", @@ -239,22 +287,33 @@ "shortcut-show-shortcuts": "Поднять список ярлыков", "shortcut-toggle-filterbar": "Переместить фильтр на бововую панель", "shortcut-toggle-sidebar": "Переместить доску на боковую панель", + "show-cards-minimum-count": "Show cards count if list contains more than", "signupPopup-title": "Создать учетную запись", "star-board-title": "Добавить в «Избранное». Эта доска будет всегда на виду.", "starred-boards": "Добавленные в «Избранное»", - "starred-boards-description": "", + "starred-boards-description": "Starred boards show up at the top of your boards list.", "subscribe": "Подписаться", "team": "Участники", "this-board": "эту доску", "this-card": "текущая карточка", + "time": "Time", "title": "Название", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", "unassign-member": "Отменить назначение пользователя", "unsaved-description": "У вас есть несохраненное описание.", + "unwatch": "Unwatch", "upload": "Загрзуить", "upload-avatar": "Загрузить аватар", "uploaded-avatar": "Загруженный аватар", "username": "Имя пользователя", "view-it": "Просмотреть", "warn-list-archived": "Внимание: Данная карточка находится в списке архива", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", "what-to-do": "Что вы хотите сделать?" } diff --git a/i18n/sr.i18n.json b/i18n/sr.i18n.json index b7f004e4c..e3d4dd0ea 100644 --- a/i18n/sr.i18n.json +++ b/i18n/sr.i18n.json @@ -1,5 +1,25 @@ { "accept": "Prihvati", + "act-activity-notify": "[Wekan] Activity Notification", + "act-addAttachment": "attached __attachment__ to __card__", + "act-addComment": "commented on __card__: __comment__", + "act-createBoard": "created __board__", + "act-createCard": "added __card__ to __list__", + "act-createList": "added __list__ to __board__", + "act-addBoardMember": "added __member__ to __board__", + "act-archivedBoard": "archived __board__", + "act-archivedCard": "archived __card__", + "act-archivedList": "archived __list__", + "act-importBoard": "imported __board__", + "act-importCard": "imported __card__", + "act-importList": "imported __list__", + "act-joinMember": "added __member__ to __card__", + "act-moveCard": "moved __card__ from __oldList__ to __list__", + "act-removeBoardMember": "removed __member__ from __board__", + "act-restoredCard": "restored __card__ to __board__", + "act-unjoinMember": "removed __member__ from __card__", + "act-withBoardTitle": "[Wekan] __board__", + "act-withCardTitle": "[__board__] __card__", "actions": "Akcije", "activities": "Aktivnosti", "activity": "Aktivnost", @@ -31,6 +51,8 @@ "all-boards": "Sve table", "and-n-other-card": "And __count__ other card", "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", "archive": "Arhiviraj", "archive-all": "Arhiviraj sve", "archive-board": "Arhiviraj tablu", @@ -46,6 +68,7 @@ "attachment-delete-pop": "Brisanje prikačenog dokumenta je trajno. Ne postoji vraćanje obrisanog.", "attachmentDeletePopup-title": "Obrisati prikačeni dokument ?", "attachments": "Prikačeni dokumenti", + "auto-watch": "Automatically watch boards when create it", "avatar-too-big": "Avatar je prevelik (maksimum je 70Kb)", "back": "Nazad", "board-change-color": "Promeni boju", @@ -56,7 +79,7 @@ "boardChangeColorPopup-title": "Promeni pozadinu table", "boardChangeTitlePopup-title": "Preimenuj tablu", "boardChangeVisibilityPopup-title": "Promeni Vidljivost", - "boardImportBoardPopup-title": "Uvezi table iz Trello-a", + "boardChangeWatchPopup-title": "Change Watch", "boardMenuPopup-title": "Meni table", "boards": "Table", "bucket-example": "Na primer \"Lista zadataka\"", @@ -66,11 +89,15 @@ "card-delete-notice": "Brisanje je trajno. Izgubićeš sve akcije povezane sa ovom karticom.", "card-delete-pop": "Sve akcije će biti uklonjene sa liste aktivnosti i kartica neće moći biti ponovo otvorena. Nema vraćanja unazad.", "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.", + "card-due": "Due", + "card-due-on": "Due on", "card-edit-attachments": "Uredi priloge", "card-edit-labels": "Uredi natpise", "card-edit-members": "Uredi članove", "card-labels-title": "Promeni natpis na kartici.", "card-members-title": "Dodaj ili ukloni članove table sa kartice.", + "card-start": "Start", + "card-start-on": "Starts on", "cardAttachmentsPopup-title": "Attach From", "cardDeletePopup-title": "Delete Card?", "cardDetailsActionsPopup-title": "Card Actions", @@ -82,13 +109,15 @@ "change-avatar": "Change Avatar", "change-password": "Change Password", "change-permissions": "Change permissions", + "change-settings": "Change Settings", "changeAvatarPopup-title": "Change Avatar", "changeLanguagePopup-title": "Change Language", "changePasswordPopup-title": "Change Password", "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", "click-to-star": "Click to star this board.", "click-to-unstar": "Click to unstar this board.", - "clipboard": "Clipboard or drag & drop", + "clipboard" : "Clipboard or drag & drop", "close": "Close", "close-board": "Close Board", "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", @@ -109,6 +138,7 @@ "createBoardPopup-title": "Create Board", "createLabelPopup-title": "Create Label", "current": "current", + "date": "Date", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -122,7 +152,10 @@ "edit": "Edit", "edit-avatar": "Change Avatar", "edit-profile": "Edit Profile", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", "email-enrollAccount-subject": "An account created for you on __siteName__", @@ -146,27 +179,33 @@ "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", + "error-username-taken": "This username is already taken", "export-board": "Export board", "filter": "Filter", "filter-cards": "Filter Cards", "filter-clear": "Clear filter", + "filter-no-label": "No label", + "filter-no-member": "No member", "filter-on": "Filter is on", "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", "filter-to-selection": "Filter to selection", "fullname": "Full Name", "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", "home": "Home", "import": "Import", "import-board": "import from Trello", + "import-board-title": "Import board from Trello", "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text", - "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-map-members": "Map members", "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users", "import-show-user-mapping": "Review members mapping", "import-user-select": "Pick the Wekan user you want to use as this member", + "importMapMembersAddPopup-title": "Select Wekan member", "info": "Infos", "initials": "Initials", + "invalid-date": "Invalid date", "joined": "joined", "just-invited": "You are just invited to this board", "keyboard-shortcuts": "Keyboard shortcuts", @@ -186,17 +225,20 @@ "listImportCardPopup-title": "Import a Trello card", "lists": "Lists", "log-out": "Log Out", + "log-in": "Log In", "loginPopup-title": "Log In", - "mapMembersAddPopup-title": "Select Wekan member", - "mapMembersPopup-title": "Map members", "memberMenuPopup-title": "Member Settings", "members": "Članovi", "menu": "Menu", "move-selection": "Move selection", "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", "multi-selection": "Multi-Selection", "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", "my-boards": "My Boards", "name": "Name", "no-archived-cards": "No archived cards.", @@ -205,12 +247,15 @@ "normal": "Normalno", "normal-desc": "Can view and edit cards. Can't change settings.", "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", "optional": "opciono", "or": "ili", "page-maybe-private": "This page may be private. You may be able to view it by logging in.", "page-not-found": "Stranica nije pronađena.", "password": "Lozinka", "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", "preview": "Prikaz", "previewAttachedImagePopup-title": "Prikaz", "previewClipboardImagePopup-title": "Prikaz", @@ -234,7 +279,7 @@ "search": "Pretraga", "select-color": "Izaberi boju", "shortcut-assign-self": "Pridruži sebe trenutnoj kartici", - "shortcut-autocomplete-emojies": "Sam popuni emodžije", + "shortcut-autocomplete-emoji": "Autocomplete emoji", "shortcut-autocomplete-members": "Sam popuni članove", "shortcut-clear-filters": "Očisti sve filtere", "shortcut-close-dialog": "Zatvori dijalog", @@ -242,6 +287,7 @@ "shortcut-show-shortcuts": "Prikaži ovu listu prečica", "shortcut-toggle-filterbar": "Uključi ili isključi bočni meni filtera", "shortcut-toggle-sidebar": "Uključi ili isključi bočni meni table", + "show-cards-minimum-count": "Show cards count if list contains more than", "signupPopup-title": "Kreiraj nalog", "star-board-title": "Klikni da označiš zvezdicom ovu tablu. Pokazaće se na vrhu tvoje liste tabli.", "starred-boards": "Table sa zvezdicom", @@ -250,14 +296,24 @@ "team": "Tim", "this-board": "ova tabla", "this-card": "ova kartica", + "time": "Time", "title": "Naslov", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", "unassign-member": "Unassign member", "unsaved-description": "Imaš nesnimljen opis.", + "unwatch": "Unwatch", "upload": "Upload", "upload-avatar": "Upload an avatar", "uploaded-avatar": "Uploaded an avatar", "username": "Korisničko ime", "view-it": "Pregledaj je", "warn-list-archived": "upozorenje: ova kartica je u arhiviranoj listi", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", "what-to-do": "Šta želiš da uradiš ?" -} \ No newline at end of file +} diff --git a/i18n/tr.i18n.json b/i18n/tr.i18n.json index c05833bbe..24869280d 100644 --- a/i18n/tr.i18n.json +++ b/i18n/tr.i18n.json @@ -1,5 +1,25 @@ { "accept": "Accept", + "act-activity-notify": "[Wekan] Activity Notification", + "act-addAttachment": "attached __attachment__ to __card__", + "act-addComment": "commented on __card__: __comment__", + "act-createBoard": "created __board__", + "act-createCard": "added __card__ to __list__", + "act-createList": "added __list__ to __board__", + "act-addBoardMember": "added __member__ to __board__", + "act-archivedBoard": "archived __board__", + "act-archivedCard": "archived __card__", + "act-archivedList": "archived __list__", + "act-importBoard": "imported __board__", + "act-importCard": "imported __card__", + "act-importList": "imported __list__", + "act-joinMember": "added __member__ to __card__", + "act-moveCard": "moved __card__ from __oldList__ to __list__", + "act-removeBoardMember": "removed __member__ from __board__", + "act-restoredCard": "restored __card__ to __board__", + "act-unjoinMember": "removed __member__ from __card__", + "act-withBoardTitle": "[Wekan] __board__", + "act-withCardTitle": "[__board__] __card__", "actions": "İşlemler", "activities": "Aktiviteler", "activity": "Etkinlik", @@ -31,6 +51,8 @@ "all-boards": "All boards", "and-n-other-card": "And __count__ other card", "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", "archive": "Arşiv", "archive-all": "Tümünü Arşivle", "archive-board": "Archive Board", @@ -46,6 +68,7 @@ "attachment-delete-pop": "Ek dosya silme işlemi kalıcıdır. Geri dönüşü yok", "attachmentDeletePopup-title": "Ek Dosya Silinsin Mi?", "attachments": "Ek Dosyalar", + "auto-watch": "Automatically watch boards when create it", "avatar-too-big": "The avatar is too large (70Kb max)", "back": "Geri", "board-change-color": "Change color", @@ -56,7 +79,7 @@ "boardChangeColorPopup-title": "Change Board Background", "boardChangeTitlePopup-title": "Pano Adı Değiştirme", "boardChangeVisibilityPopup-title": "Görünebilirliği Değiştir", - "boardImportBoardPopup-title": "Import board from Trello", + "boardChangeWatchPopup-title": "Change Watch", "boardMenuPopup-title": "Board Menu", "boards": "Panolar", "bucket-example": "Like “Bucket List” for example", @@ -66,11 +89,15 @@ "card-delete-notice": "Silme işlemi kalıcıdır. Bu kartla ilişkili tüm eylemleri kaybedersiniz.", "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.", + "card-due": "Due", + "card-due-on": "Due on", "card-edit-attachments": "Edit attachments", "card-edit-labels": "Edit labels", "card-edit-members": "Edit members", "card-labels-title": "Change the labels for the card.", "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", "cardAttachmentsPopup-title": "Attach From", "cardDeletePopup-title": "Kart Silinsin mi?", "cardDetailsActionsPopup-title": "Card Actions", @@ -82,13 +109,15 @@ "change-avatar": "Avatar Değiştir", "change-password": "Parola Değiştir", "change-permissions": "Change permissions", + "change-settings": "Change Settings", "changeAvatarPopup-title": "Avatar Değiştir", "changeLanguagePopup-title": "Dil Değiştir", "changePasswordPopup-title": "Parola Değiştir", "changePermissionsPopup-title": "Yetkileri Değiştirme", + "changeSettingsPopup-title": "Change Settings", "click-to-star": "Bu panoyu yıldızlamak için tıkla.", "click-to-unstar": "Bu panunun yıldızını kaldırmak için tıkla.", - "clipboard": "Clipboard or drag & drop", + "clipboard" : "Clipboard or drag & drop", "close": "Kapat", "close-board": "Close Board", "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", @@ -109,6 +138,7 @@ "createBoardPopup-title": "Pano Oluşturma", "createLabelPopup-title": "Etiket Oluşturma", "current": "current", + "date": "Date", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Sil", @@ -122,7 +152,10 @@ "edit": "Düzenle", "edit-avatar": "Avatar Değiştir", "edit-profile": "Profili Düzenle", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", "editLabelPopup-title": "Etiket Değiştirme", + "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Profili Düzenle", "email": "E-posta", "email-enrollAccount-subject": "An account created for you on __siteName__", @@ -146,27 +179,33 @@ "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", + "error-username-taken": "This username is already taken", "export-board": "Export board", "filter": "Filter", "filter-cards": "Kartları Süz", "filter-clear": "Clear filter", + "filter-no-label": "No label", + "filter-no-member": "No member", "filter-on": "Filter is on", "filter-on-desc": "Bu panodaki kartları süzüyorsunuz. Süzgeci düzenlemek için tıklayın.", "filter-to-selection": "Filter to selection", "fullname": "Ad Soyad", "header-logo-title": "Panolar sayfanıza geri dön.", + "hide-system-messages": "Hide system messages", "home": "Home", "import": "Import", "import-board": "import from Trello", + "import-board-title": "Import board from Trello", "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text", - "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-map-members": "Map members", "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users", "import-show-user-mapping": "Review members mapping", "import-user-select": "Pick the Wekan user you want to use as this member", + "importMapMembersAddPopup-title": "Select Wekan member", "info": "Infos", "initials": "Initials", + "invalid-date": "Invalid date", "joined": "joined", "just-invited": "You are just invited to this board", "keyboard-shortcuts": "Keyboard shortcuts", @@ -186,17 +225,20 @@ "listImportCardPopup-title": "Import a Trello card", "lists": "Lists", "log-out": "Oturum Kapat", + "log-in": "Log In", "loginPopup-title": "Oturum Aç", - "mapMembersAddPopup-title": "Select Wekan member", - "mapMembersPopup-title": "Map members", "memberMenuPopup-title": "Member Settings", "members": "Üyeler", "menu": "Menü", "move-selection": "Move selection", "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", "multi-selection": "Multi-Selection", "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", "my-boards": "Panolarım", "name": "Adı", "no-archived-cards": "No archived cards.", @@ -205,12 +247,15 @@ "normal": "Normal", "normal-desc": "Kartları görüntüler ve düzenler. Ayarları değiştiremez.", "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", "optional": "isteğe bağlı", "or": "or", "page-maybe-private": "Bu sayfa özel olabilir. Oturum açarak görülebilir.", "page-not-found": "Sayda bulunamadı.", "password": "Parola", "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", "preview": "Preview", "previewAttachedImagePopup-title": "Preview", "previewClipboardImagePopup-title": "Preview", @@ -242,6 +287,7 @@ "shortcut-show-shortcuts": "Bring up this shortcuts list", "shortcut-toggle-filterbar": "Toggle Filter Sidebar", "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", "signupPopup-title": "Bir Hesap Oluştur", "star-board-title": "Bu panoyu yıldızlamak için tıkla. Pano listesinin en üstünde gösterilir.", "starred-boards": "Yıldızlı Panolar", @@ -250,14 +296,24 @@ "team": "Takım", "this-board": "bu panoyu", "this-card": "bu kart", + "time": "Time", "title": "Başlık", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", "unassign-member": "Unassign member", "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", "upload": "Upload", "upload-avatar": "Upload an avatar", "uploaded-avatar": "Uploaded an avatar", "username": "Kullanıcı adı", "view-it": "View it", "warn-list-archived": "warning: this card is in an archived list", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", "what-to-do": "What do you want to do?" } diff --git a/i18n/zh-CN.i18n.json b/i18n/zh-CN.i18n.json index 4cfd03f0b..03a9dedec 100644 --- a/i18n/zh-CN.i18n.json +++ b/i18n/zh-CN.i18n.json @@ -1,21 +1,41 @@ { "accept": "接受", + "act-activity-notify": "[Wekan] 活动通知", + "act-addAttachment": "添加附件 __attachment__ 至卡片 __card__", + "act-addComment": "在 __card__ 发布评论: __comment__", + "act-createBoard": "创建看板 __board__", + "act-createCard": "添加卡片 __card__ 至列表 __list__", + "act-createList": "添加列表 __list__ 至看板 __board__", + "act-addBoardMember": "添加成员 __member__ 至看板 __board__", + "act-archivedBoard": "归档看板 __board__", + "act-archivedCard": "归档卡片 __card__", + "act-archivedList": "归档列表 __list__", + "act-importBoard": "导入看板 __board__", + "act-importCard": "导入卡片 __card__", + "act-importList": "导入列表 __list__", + "act-joinMember": "添加成员 __member__ 至卡片 __card__", + "act-moveCard": "从列表 __oldList__ 移动卡片 __card__ 至列表 __list__", + "act-removeBoardMember": "从看板 __board__ 移除成员 __member__ ", + "act-restoredCard": "恢复卡片 __card__ 至看板 __board__", + "act-unjoinMember": "从卡片 __card__ 移除成员 __member__ ", + "act-withBoardTitle": "[Wekan] 看板 __board__", + "act-withCardTitle": "[看板 __board__] 卡片 __card__", "actions": "操作", "activities": "活动", "activity": "活动", "activity-added": "添加 %s 至 %s", - "activity-archived": "删除 %s", + "activity-archived": "归档 %s", "activity-attached": "添加附件 %s 至 %s", "activity-created": "创建 %s", "activity-excluded": "排除 %s 从 %s", "activity-imported": "导入 %s 至 %s 从 %s 中", "activity-imported-board": "已导入 %s 从 %s 中", - "activity-joined": "关联 %s", + "activity-joined": "已关联 %s", "activity-moved": "将 %s 从 %s 移动到 %s", "activity-on": "在 %s", - "activity-removed": "移除 %s 从 %s 中", + "activity-removed": "从 %s 中移除 %s", "activity-sent": "发送 %s 至 %s", - "activity-unjoined": "解除关联 %s", + "activity-unjoined": "已解除 %s 关联", "add": "添加", "add-attachment": "添加附件", "add-board": "添加新看板", @@ -31,6 +51,8 @@ "all-boards": "全部看板", "and-n-other-card": "和其他 __count__ 个卡片", "and-n-other-card_plural": "和其他 __count__ 个卡片", + "apply": "应用", + "app-is-offline": "处于离线状态,刷新页面将导致数据丢失。", "archive": "归档", "archive-all": "全部归档", "archive-board": "归档看板", @@ -46,6 +68,7 @@ "attachment-delete-pop": "删除附件的操作不可逆。", "attachmentDeletePopup-title": "删除附件?", "attachments": "附件", + "auto-watch": "创建看板时自动关注", "avatar-too-big": "头像太大 (最大 70 Kb)", "back": "返回", "board-change-color": "更改颜色", @@ -56,7 +79,7 @@ "boardChangeColorPopup-title": "修改看板背景", "boardChangeTitlePopup-title": "重命名看板", "boardChangeVisibilityPopup-title": "更改可视级别", - "boardImportBoardPopup-title": "从 Trello 导入看板", + "boardChangeWatchPopup-title": "更改关注状态", "boardMenuPopup-title": "看板菜单", "boards": "看板", "bucket-example": "例如 “目标清单”", @@ -66,11 +89,15 @@ "card-delete-notice": "彻底删除的操作不可恢复,你将会丢失该卡片相关的所有操作记录。", "card-delete-pop": "所有的动作将从活动动态中被移除且您将无法重新打开该卡片。此操作无法撤销。", "card-delete-suggest-archive": "你可以将卡片从看板中归档至回收箱,但保留相关活动。", + "card-due": "到期", + "card-due-on": "期限", "card-edit-attachments": "编辑附件", "card-edit-labels": "编辑标签", "card-edit-members": "编辑成员", "card-labels-title": "更改该卡片上的标签", "card-members-title": "在该卡片中添加或移除看板成员", + "card-start": "开始", + "card-start-on": "始于", "cardAttachmentsPopup-title": "附件来源", "cardDeletePopup-title": "彻底删除卡片?", "cardDetailsActionsPopup-title": "卡片动作", @@ -82,13 +109,15 @@ "change-avatar": "更改头像", "change-password": "更改密码", "change-permissions": "更改权限", + "change-settings": "更改设置", "changeAvatarPopup-title": "更改头像", "changeLanguagePopup-title": "更改语言", "changePasswordPopup-title": "更改密码", "changePermissionsPopup-title": "更改权限", + "changeSettingsPopup-title": "更改设置", "click-to-star": "点此来标记该看板", "click-to-unstar": "点此来去除该看板的标记", - "clipboard": "剪贴板或者拖放文件", + "clipboard" : "剪贴板或者拖放文件", "close": "关闭", "close-board": "关闭看板", "close-board-pop": "您可以通过点击主界面顶部的”回收箱“按钮来还原看板。", @@ -109,6 +138,7 @@ "createBoardPopup-title": "创建看板", "createLabelPopup-title": "创建标签", "current": "当前", + "date": "日期", "decline": "拒绝", "default-avatar": "默认头像", "delete": "删除", @@ -122,7 +152,10 @@ "edit": "编辑", "edit-avatar": "更改头像", "edit-profile": "编辑资料", + "editCardStartDatePopup-title": "更改起始日期", + "editCardDueDatePopup-title": "更改到期日期", "editLabelPopup-title": "更改标签", + "editNotificationPopup-title": "编辑通知", "editProfilePopup-title": "编辑资料", "email": "邮箱", "email-enrollAccount-subject": "已为您在 __siteName__ 创建帐号", @@ -146,27 +179,33 @@ "error-user-doesNotExist": "该用户不存在", "error-user-notAllowSelf": "不允许对自己执行此操作", "error-user-notCreated": "该用户未能成功创建", + "error-username-taken": "此用户名已存在", "export-board": "导出看板", "filter": "过滤", "filter-cards": "过滤卡片", "filter-clear": "清空过滤器", + "filter-no-label": "无标签", + "filter-no-member": "无成员", "filter-on": "过滤器启用", "filter-on-desc": "你正在过滤该看板上的卡片,点此编辑过滤。", "filter-to-selection": "要选择的过滤器", "fullname": "全称", "header-logo-title": "返回您的看板页", + "hide-system-messages": "隐藏系统消息", "home": "首页", "import": "导入", "import-board": "从 Trello 导入", + "import-board-title": "从Trello导入看板", "import-board-trello-instruction": "在你的Trello看板中,点击“菜单”,然后选择“更多”,“打印与导出”,“导出为 JSON” 并拷贝结果文本", - "import-card": "导入 Trello 卡片", - "import-card-trello-instruction": "进入一个 Trello 卡片,选择“分享与更多”,然后选择 “导出为 JSON” 并且拷贝结果文本", "import-json-placeholder": "粘贴您有效的 JSON 数据至此", + "import-map-members": " 映射成员", "import-members-map": "您导入的看板有一些成员。请将您想导入的成员映射到 Wekan 用户。", "import-show-user-mapping": "核对成员映射", "import-user-select": "选择您想将此成员映射到的 Wekan 用户", + "importMapMembersAddPopup-title": "选择Wekan成员", "info": "信息", "initials": "缩写", + "invalid-date": "无效日期", "joined": "关联", "just-invited": "您刚刚被邀请加入此看板", "keyboard-shortcuts": "键盘快捷键", @@ -186,17 +225,20 @@ "listImportCardPopup-title": "导入 Trello 卡片", "lists": "清单", "log-out": "登出", + "log-in": "登录", "loginPopup-title": "登录", - "mapMembersAddPopup-title": "选择 Wekan 成员", - "mapMembersPopup-title": "映射成员", "memberMenuPopup-title": "成员设置", "members": "成员", "menu": "菜单", "move-selection": "移动选择", "moveCardPopup-title": "移动卡片", + "moveCardToBottom-title": "移动至底端", + "moveCardToTop-title": "移动至顶端", "moveSelectionPopup-title": "移动选择", "multi-selection": "多选", "multi-selection-on": "多选启用", + "muted": "静默", + "muted-info": "你将不会收到此看板的任何变更通知", "my-boards": "我的看板", "name": "名称", "no-archived-cards": "没有已归档的卡片", @@ -205,12 +247,15 @@ "normal": "普通", "normal-desc": "可以创建以及编辑卡片,无法更改设置。", "not-accepted-yet": "邀请尚未接受", + "notify-participate": "接收以创建者或成员身份参与的卡片的更新", + "notify-watch": "接收所有关注的面板、列表、及卡片的更新", "optional": "可选", "or": "或", "page-maybe-private": "本页面被设为私有. 您必须 登录以浏览其中内容。", "page-not-found": "页面不存在。", "password": "密码", "paste-or-dragdrop": "从剪贴板粘贴,或者拖放文件到它上面 (仅限于图片)", + "participating": "参与", "preview": "预览", "previewAttachedImagePopup-title": "预览", "previewClipboardImagePopup-title": "预览", @@ -234,7 +279,7 @@ "search": "搜索", "select-color": "选择颜色", "shortcut-assign-self": "分配当前卡片给自己", - "shortcut-autocomplete-emojies": "自动补全表情", + "shortcut-autocomplete-emoji": "表情符号自动补全", "shortcut-autocomplete-members": "自动补全成员", "shortcut-clear-filters": "清空全部过滤器", "shortcut-close-dialog": "关闭对话框", @@ -242,6 +287,7 @@ "shortcut-show-shortcuts": "显示此快捷键列表", "shortcut-toggle-filterbar": "切换过滤器边栏", "shortcut-toggle-sidebar": "切换面板边栏", + "show-cards-minimum-count": "当列表中的卡片多于此阈值时将显示数量", "signupPopup-title": " 创建账户", "star-board-title": "点此来标记该看板,它将会出现在您的看板列表顶部。", "starred-boards": "已标记看板", @@ -250,14 +296,24 @@ "team": "团队", "this-board": "该看板", "this-card": "该卡片", + "time": "时间", "title": "标题", + "tracking": "跟踪", + "tracking-info": "当任何包含您(作为创建者或成员)的卡片发生变更时,您将得到通知。", "unassign-member": "取消分配成员", "unsaved-description": "存在未保存的描述", + "unwatch": "取消关注", "upload": "上传", "upload-avatar": "上传头像", "uploaded-avatar": "头像已经上传", "username": "用户名", "view-it": "查看", "warn-list-archived": "警告: 该卡片位于已归档清单中", + "watch": "关注", + "watching": "已关注", + "watching-info": "当此看板发生变更时会通知你", + "welcome-board": "“欢迎”看板", + "welcome-list1": "基本", + "welcome-list2": "高阶", "what-to-do": "要做什么?" -} \ No newline at end of file +} diff --git a/i18n/zh-TW.i18n.json b/i18n/zh-TW.i18n.json index 0cd4565c1..4cb738573 100644 --- a/i18n/zh-TW.i18n.json +++ b/i18n/zh-TW.i18n.json @@ -198,7 +198,7 @@ "import-board-title": "匯入在 Trello 的看板", "import-board-trello-instruction": "在你的Trello看板中,點選“功能表”,然後選擇“更多”,“列印與匯出”,“匯出為 JSON” 並拷貝結果文本", "import-json-placeholder": "貼上您有效的 JSON 資料至此", - "import-map-members": "Map members", + "import-map-members": "複製成員", "import-members-map": "您匯入的看板有一些成員。請將您想匯入的成員映射到 Wekan 使用者。", "import-show-user-mapping": "核對成員映射", "import-user-select": "選擇您想將此成員映射到的 Wekan 使用者", @@ -247,7 +247,7 @@ "normal": "普通", "normal-desc": "可以建立以及編輯卡片,無法更改。", "not-accepted-yet": "邀請尚未接受", - "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-participate": "接收與你有關的卡片更新", "notify-watch": "接收您關注的看板、清單或卡片的更新", "optional": "選擇性的", "or": "或", @@ -299,7 +299,7 @@ "time": "時間", "title": "標題", "tracking": "追蹤", - "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "tracking-info": "你將會收到與你有關的卡片的所有變更通知", "unassign-member": "取消分配成員", "unsaved-description": "未儲存的描述", "unwatch": "取消觀察", @@ -311,7 +311,7 @@ "warn-list-archived": "警告: 該卡片位於已刪除的清單中", "watch": "觀察", "watching": "觀察中", - "watching-info": "You will be notified of any change in this board", + "watching-info": "你將會收到關於這個看板所有的變更通知", "welcome-board": "歡迎進入看板", "welcome-list1": "基本", "welcome-list2": "進階", From 64e36d48278f355da4e2c3f6e182ae22b33ddd5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9ranger=20Campardou?= Date: Thu, 12 Jan 2017 16:14:51 +0100 Subject: [PATCH 079/136] Remove a list --- client/components/lists/listHeader.jade | 3 +++ client/components/lists/listHeader.js | 5 +++++ i18n/ar.i18n.json | 1 + i18n/ca.i18n.json | 1 + i18n/cs.i18n.json | 3 ++- i18n/de.i18n.json | 1 + i18n/en.i18n.json | 1 + i18n/es-ES.i18n.json | 3 ++- i18n/es.i18n.json | 1 + i18n/fi.i18n.json | 1 + i18n/fr.i18n.json | 3 ++- i18n/he.i18n.json | 3 ++- i18n/it.i18n.json | 1 + i18n/ja.i18n.json | 1 + i18n/ko.i18n.json | 1 + i18n/pl.i18n.json | 3 ++- i18n/pt-BR.i18n.json | 3 ++- i18n/ru.i18n.json | 1 + i18n/tr.i18n.json | 1 + i18n/zh-CN.i18n.json | 3 ++- i18n/zh-TW.i18n.json | 3 ++- 21 files changed, 35 insertions(+), 8 deletions(-) diff --git a/client/components/lists/listHeader.jade b/client/components/lists/listHeader.jade index f9fe065ff..aff059e8f 100644 --- a/client/components/lists/listHeader.jade +++ b/client/components/lists/listHeader.jade @@ -29,6 +29,9 @@ template(name="listActionPopup") hr ul.pop-over-list li: a.js-close-list {{_ 'archive-list'}} + hr + ul.pop-over-list + li: a.js-remove-list {{_ 'remove-list'}} template(name="boardLists") ul.pop-over-list diff --git a/client/components/lists/listHeader.js b/client/components/lists/listHeader.js index c7ae8e629..641cdd3ac 100644 --- a/client/components/lists/listHeader.js +++ b/client/components/lists/listHeader.js @@ -52,4 +52,9 @@ Template.listActionPopup.events({ this.archive(); Popup.close(); }, + 'click .js-remove-list'(evt) { + const currentList = this; + evt.preventDefault(); + Lists.remove(currentList._id); + } }); diff --git a/i18n/ar.i18n.json b/i18n/ar.i18n.json index 225b09752..8528068f1 100755 --- a/i18n/ar.i18n.json +++ b/i18n/ar.i18n.json @@ -223,6 +223,7 @@ "remove-cover": "حذف الغلاف", "remove-from-board": "حذف من اللوحة", "remove-label": "حذف هذه العلامة", + "remove-list": "Remove the list", "remove-member": "حذف العضو", "remove-member-from-card": "حذف من البطاقة", "remove-member-pop": "حذف __name__ (__username__) من __boardTitle__ ? سيتم حذف هذا العضو من جميع بطاقة اللوحة مع إرسال إشعار له بذاك.", diff --git a/i18n/ca.i18n.json b/i18n/ca.i18n.json index fa223d022..ba6e1b133 100755 --- a/i18n/ca.i18n.json +++ b/i18n/ca.i18n.json @@ -224,6 +224,7 @@ "remove-from-board": "Elimina del tauler", "remove-label": "Eliminia etiqueta", "remove-member": "Elimina membre", + "remove-list": "Remove the list", "remove-member-from-card": "Elimina de la fitxa", "remove-member-pop": "Eliminar __name__ (__username__) de __boardTitle__ ? El membre serà eliminat de totes les fitxes d'aquest tauler. Ells rebran una notificació.", "removeMemberPopup-title": "Vols suprimir el membre?", diff --git a/i18n/cs.i18n.json b/i18n/cs.i18n.json index 30c847488..3326307a7 100644 --- a/i18n/cs.i18n.json +++ b/i18n/cs.i18n.json @@ -223,6 +223,7 @@ "remove-cover": "Odstranit obal", "remove-from-board": "Odstranit z tabla", "remove-label": "Odstranit štítek", + "remove-list": "Remove the list", "remove-member": "Odebrat uživatele", "remove-member-from-card": "Odstranit z karty", "remove-member-pop": "Odstranit __name__ (__username__) z __boardTitle__? Uživatel bude odebrán ze všech karet na tomto tablu. Na tuto skutečnost bude upozorněn.", @@ -260,4 +261,4 @@ "view-it": "Zobrazit", "warn-list-archived": "varování: tato karta je v archivovaném seznamu", "what-to-do": "Co chcete dělat?" -} \ No newline at end of file +} diff --git a/i18n/de.i18n.json b/i18n/de.i18n.json index 43e12d885..e7bc63d35 100755 --- a/i18n/de.i18n.json +++ b/i18n/de.i18n.json @@ -223,6 +223,7 @@ "remove-cover": "Cover entfernen", "remove-from-board": "Von Board entfernen", "remove-label": "Label entfernen", + "remove-list": "Remove the list", "remove-member": "Nutzer entfernen", "remove-member-from-card": "Von Karte entfernen", "remove-member-pop": "Entferne __name__ (__username__) von __boardTitle__? Nutzer wird von allen Karten auf diesem Board entfernt werden. Er wird eine Benachrichtigung erhalten.", diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index f9cf7e82e..98d33100a 100755 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -253,6 +253,7 @@ "remove-cover": "Remove Cover", "remove-from-board": "Remove from Board", "remove-label": "Remove the label", + "remove-list": "Remove the list", "remove-member": "Remove Member", "remove-member-from-card": "Remove from Card", "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", diff --git a/i18n/es-ES.i18n.json b/i18n/es-ES.i18n.json index 22aeb7041..8f67fcfde 100644 --- a/i18n/es-ES.i18n.json +++ b/i18n/es-ES.i18n.json @@ -223,6 +223,7 @@ "remove-cover": "Eliminar cubierta", "remove-from-board": "Eliminar del tablero", "remove-label": "Eliminar etiqueta", + "remove-list": "Remove the list", "remove-member": "Eliminar Miembro", "remove-member-from-card": "Eliminar de la Tarjeta", "remove-member-pop": "Eliminar __name__ (__username__) de __boardTitle__? El miembro será eliminado de todas las tarjetas de este tablero. Ellos recibirán una notificación.", @@ -260,4 +261,4 @@ "view-it": "Visto", "warn-list-archived": "Aviso: esta tarjeta está en una lista archivada", "what-to-do": "¿Qué quieres hacer?" -} \ No newline at end of file +} diff --git a/i18n/es.i18n.json b/i18n/es.i18n.json index b4af8f5ac..760b1aa52 100755 --- a/i18n/es.i18n.json +++ b/i18n/es.i18n.json @@ -223,6 +223,7 @@ "remove-cover": "Eliminar cubierta", "remove-from-board": "Remove from Board", "remove-label": "Remove the label", + "remove-list": "Remove the list", "remove-member": "Eliminar Miembro", "remove-member-from-card": "Eliminar de la Ficha", "remove-member-pop": "Eliminar __nombre__ (__usuario__) de __Título del tablero__? El miembro será eliminado de todas las tarjetas de este tablero. Ellos recibirán una notificación.", diff --git a/i18n/fi.i18n.json b/i18n/fi.i18n.json index caab4faff..f3ab29a4b 100755 --- a/i18n/fi.i18n.json +++ b/i18n/fi.i18n.json @@ -223,6 +223,7 @@ "remove-cover": "Poista kansi", "remove-from-board": "Poista taululta", "remove-label": "Poista tunniste", + "remove-list": "Remove the list", "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.", diff --git a/i18n/fr.i18n.json b/i18n/fr.i18n.json index adc4baa4a..29164799e 100755 --- a/i18n/fr.i18n.json +++ b/i18n/fr.i18n.json @@ -223,6 +223,7 @@ "remove-cover": "Enlever la couverture", "remove-from-board": "Retirer du tableau", "remove-label": "Retirer cette étiquette", + "remove-list": "Supprimer la liste", "remove-member": "Supprimer le membre", "remove-member-from-card": "Supprimer de la carte", "remove-member-pop": "Supprimer __name__ (__username__) de __boardTitle__ ? Ce membre sera supprimé de toutes les cartes du tableau et recevra une notification.", @@ -260,4 +261,4 @@ "view-it": "Le voir", "warn-list-archived": "Attention : cette carte est dans une liste archivée", "what-to-do": "Que voulez-vous faire ?" -} \ No newline at end of file +} diff --git a/i18n/he.i18n.json b/i18n/he.i18n.json index f08f430bf..fedb9e8c7 100644 --- a/i18n/he.i18n.json +++ b/i18n/he.i18n.json @@ -223,6 +223,7 @@ "remove-cover": "הסר כיסוי", "remove-from-board": "הסר מהלוח", "remove-label": "הסר תווית", + "remove-list": "Remove the list", "remove-member": "הסר חבר", "remove-member-from-card": "הסר מהכרטיס", "remove-member-pop": "הסר __name__ (__username__) מ __boardTitle__? החבר יוסר מכל הכרטיסים בלוח זה. הוא יקבל על כך הודעה.", @@ -260,4 +261,4 @@ "view-it": "צפה", "warn-list-archived": "אזהרה: הכרטיס נמצא ברשימה שהועברה לארכיון", "what-to-do": "מה תרצה לעשות?" -} \ No newline at end of file +} diff --git a/i18n/it.i18n.json b/i18n/it.i18n.json index 07026fd4e..847e3c2f2 100755 --- a/i18n/it.i18n.json +++ b/i18n/it.i18n.json @@ -223,6 +223,7 @@ "remove-cover": "Remove Cover", "remove-from-board": "Remove from Board", "remove-label": "Remove the label", + "remove-list": "Remove the list", "remove-member": "Remove Member", "remove-member-from-card": "Remove from Card", "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", diff --git a/i18n/ja.i18n.json b/i18n/ja.i18n.json index 6cde68c60..aa04ceb73 100755 --- a/i18n/ja.i18n.json +++ b/i18n/ja.i18n.json @@ -223,6 +223,7 @@ "remove-cover": "カバーの削除", "remove-from-board": "Remove from Board", "remove-label": "Remove the label", + "remove-list": "Remove the list", "remove-member": "メンバーを外す", "remove-member-from-card": "カードから取り除く", "remove-member-pop": "__boardTitle__ から __name__ (__username__) を外しますか?メンバーはこのボードのすべてのカードから外れ、通知を受けます。", diff --git a/i18n/ko.i18n.json b/i18n/ko.i18n.json index 823a221d1..843d51e46 100755 --- a/i18n/ko.i18n.json +++ b/i18n/ko.i18n.json @@ -223,6 +223,7 @@ "remove-cover": "커버 제거", "remove-from-board": "Remove from Board", "remove-label": "Remove the label", + "remove-list": "Remove the list", "remove-member": "멤버 제거", "remove-member-from-card": "카드에서 제거", "remove-member-pop": "__boardTitle__에서 __name__(__username__) 을 제거합니까? 그 멤버는 이 보드의 모든 카드에서 제거됩니다. 그에대한 알람을 받게됩니다.", diff --git a/i18n/pl.i18n.json b/i18n/pl.i18n.json index d44bccdbd..6ca78ce24 100644 --- a/i18n/pl.i18n.json +++ b/i18n/pl.i18n.json @@ -223,6 +223,7 @@ "remove-cover": "Usuń okładkę", "remove-from-board": "Usuń z tablicy", "remove-label": "Usuń etykietę", + "remove-list": "Remove the list", "remove-member": "Usuń członka", "remove-member-from-card": "Usuń z karty", "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", @@ -260,4 +261,4 @@ "view-it": "Zobacz", "warn-list-archived": "ostrzeżenie: ta karta jest na zarchiwizowanej liście", "what-to-do": "Co chcesz zrobić?" -} \ No newline at end of file +} diff --git a/i18n/pt-BR.i18n.json b/i18n/pt-BR.i18n.json index 189d42987..5f5d45c5f 100755 --- a/i18n/pt-BR.i18n.json +++ b/i18n/pt-BR.i18n.json @@ -223,6 +223,7 @@ "remove-cover": "Remover Capa", "remove-from-board": "Remover do Quadro", "remove-label": "Remover Etiqueta", + "remove-list": "Remove the list", "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.", @@ -260,4 +261,4 @@ "view-it": "Visualizar", "warn-list-archived": "aviso: este cartão está em uma lista arquivada", "what-to-do": "O que você gostaria de fazer?" -} \ No newline at end of file +} diff --git a/i18n/ru.i18n.json b/i18n/ru.i18n.json index a2319a27d..880ccc482 100755 --- a/i18n/ru.i18n.json +++ b/i18n/ru.i18n.json @@ -220,6 +220,7 @@ "remove-cover": "Открепить", "remove-from-board": "Удалить с доски", "remove-label": "Удалить метку", + "remove-list": "Remove the list", "remove-member": "Удалить участника", "remove-member-from-card": "Удалить из карточки", "remove-member-pop": "Удалить участника __name__ (__username__) из доски __boardTitle__? Участник будет удален из всех карточек. Также он получит уведомление о совершаемом действии.", diff --git a/i18n/tr.i18n.json b/i18n/tr.i18n.json index c05833bbe..7df531e7f 100755 --- a/i18n/tr.i18n.json +++ b/i18n/tr.i18n.json @@ -223,6 +223,7 @@ "remove-cover": "Remove Cover", "remove-from-board": "Remove from Board", "remove-label": "Remove the label", + "remove-list": "Remove the list", "remove-member": "Üyeyi Çıkar", "remove-member-from-card": "Karttan Çıkar", "remove-member-pop": "__boardTitle__ panosundan __name__ (__username__) çıkarılsın mı? Üye, bu panodaki tüm kartlardan çıkarılacak ve bir bildirim alacak.", diff --git a/i18n/zh-CN.i18n.json b/i18n/zh-CN.i18n.json index 4cfd03f0b..2e11edc82 100755 --- a/i18n/zh-CN.i18n.json +++ b/i18n/zh-CN.i18n.json @@ -223,6 +223,7 @@ "remove-cover": "移除封面", "remove-from-board": "从看板中删除", "remove-label": "移除标签", + "remove-list": "Remove the list", "remove-member": "移除成员", "remove-member-from-card": "从该卡片中移除", "remove-member-pop": "确定从 __boardTitle__ 中移除 __name__ (__username__) 吗? 该成员将被从该看板的所有卡片中移除,同时他会收到一条提醒。", @@ -260,4 +261,4 @@ "view-it": "查看", "warn-list-archived": "警告: 该卡片位于已归档清单中", "what-to-do": "要做什么?" -} \ No newline at end of file +} diff --git a/i18n/zh-TW.i18n.json b/i18n/zh-TW.i18n.json index 9479acd33..5ee29ce53 100644 --- a/i18n/zh-TW.i18n.json +++ b/i18n/zh-TW.i18n.json @@ -223,6 +223,7 @@ "remove-cover": "移除封面", "remove-from-board": "從看板中刪除", "remove-label": "移除標籤", + "remove-list": "Remove the list", "remove-member": "移除成員", "remove-member-from-card": "從該卡片中移除", "remove-member-pop": "確定從 __boardTitle__ 中移除 __name__ (__username__) 嗎? 該成員將被從該看板的所有卡片中移除,同時他會收到一則提醒。", @@ -260,4 +261,4 @@ "view-it": "檢視", "warn-list-archived": "警告: 該卡片位於已刪除的清單中", "what-to-do": "要做什麼?" -} \ No newline at end of file +} From a7aa7e931825c7ce133fc19588cb6550af8543d7 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 12 Jan 2017 23:07:07 +0200 Subject: [PATCH 080/136] Add release dates to changelog. --- CHANGELOG.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22a8dcd8c..979fb7c9e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -# v0.11.0 Wekan fork first release +# v0.11.0 2016-12-16 Wekan fork first release This release adds the following new features: @@ -26,7 +26,7 @@ and fixes the following bugs: Thanks to GitHub users dwrencha, fmonthel, mario-orlicky, pierreozoux, shoetten, and xet7 for their contributions. -# v0.11.0-rc2 +# v0.11.0-rc2 2016-07-21 This release adds the following new features: @@ -55,14 +55,14 @@ and fixes the following bugs: Thanks to GitHub users alayek, AlexanderS, choclin, floatinghotpot, ForNeVeR, PeterDaveHello, seschwar, and TheElf for their contributions. -# v0.10.1 +# v0.10.1 2015-12-30 This patch release fixes two bugs on Sandstorm: * Drag and drop was broken; * Avatars weren’t working. -# v0.10 +# v0.10 2015-12-22 This release features: @@ -84,7 +84,7 @@ New languages supported: Arabic, Catalan, Italian, and Russian. Thanks to GitHub users AlexanderS, fisle, floatinghotpot, FuzzyWuzzie, mnutt, ndarilek, SirCmpwn, and xavierpriour for their contributions. -# v0.9 +# v0.9 2015-09-10 This release is a large re-write of the previous code base. This release marks the beginning of our new user interface and continues to improve the overall From 5eda2c80f8de3f0b025f5233613cdbb409a73e94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9ranger=20Campardou?= Date: Fri, 13 Jan 2017 11:05:31 +0100 Subject: [PATCH 081/136] missing coma --- client/components/lists/listHeader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/components/lists/listHeader.js b/client/components/lists/listHeader.js index 641cdd3ac..6910c58aa 100644 --- a/client/components/lists/listHeader.js +++ b/client/components/lists/listHeader.js @@ -56,5 +56,5 @@ Template.listActionPopup.events({ const currentList = this; evt.preventDefault(); Lists.remove(currentList._id); - } + }, }); From 1169c0d7dc8184ed4db615673844024bbbfd4e66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9ranger=20Campardou?= Date: Fri, 13 Jan 2017 11:16:54 +0100 Subject: [PATCH 082/136] resolve conflicts --- i18n/it.i18n.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/it.i18n.json b/i18n/it.i18n.json index 00a7a28cf..45036fce3 100755 --- a/i18n/it.i18n.json +++ b/i18n/it.i18n.json @@ -268,7 +268,7 @@ "remove-cover": "Rimuovi cover", "remove-from-board": "Rimuovi dalla bacheca", "remove-label": "Rimuovi l'etichetta", - "remove-list": "Remove list", + "remove-list": "Remove the list", "remove-member": "Rimuovi utente", "remove-member-from-card": "Rimuovi dalla scheda", "remove-member-pop": "Rimuovere __name__ (__username__) da __boardTitle__? L'utente sarà rimosso da tutte le schede in questa bacheca. Riceveranno una notifica.", From 0c4e332aa8ada301bb046fdfce1d396f1dca6fd8 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 13 Jan 2017 21:18:00 +0200 Subject: [PATCH 083/136] Update Wefork URLs. --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 795f0e5da..facbda357 100644 --- a/package.json +++ b/package.json @@ -9,13 +9,13 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/wekan/wekan.git" + "url": "git+https://github.com/wefork/wekan.git" }, "license": "MIT", "bugs": { - "url": "https://github.com/wekan/wekan/issues" + "url": "https://github.com/wefork/wekan/issues" }, - "homepage": "https://wekan.io", + "homepage": "https://github.com/wefork/wekan", "devDependencies": { "eslint": "^2.0.0" }, From a4328bd309cb05199e25fc60c4a1605fa840b33b Mon Sep 17 00:00:00 2001 From: Curtis G Date: Sun, 15 Jan 2017 14:40:32 -0500 Subject: [PATCH 084/136] Fix typo of multipleActions --- client/lib/escapeActions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/lib/escapeActions.js b/client/lib/escapeActions.js index 49b804222..dc6b05b77 100644 --- a/client/lib/escapeActions.js +++ b/client/lib/escapeActions.js @@ -44,7 +44,7 @@ EscapeActions = { executeLowest() { return this._execute({ - multipleAction: false, + multipleActions: false, }); }, From d619921d9c85f7cb30e9022c94b170bc1e571b47 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 17 Jan 2017 03:21:00 +0200 Subject: [PATCH 085/136] Created new VirtualBox appliance with Wefork etc. --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fb1df21f0..5afd88aa2 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,8 @@ that by providing one-click installation on various platforms. [Install from source][install_source] +[VirtualBox][virtualbox] + [Debian Wheezy 64bit][debian_wheezy] [![Deploy][heroku_button]][heroku_deploy] @@ -47,7 +49,6 @@ that by providing one-click installation on various platforms. [Autoinstall script][autoinstall] based on [this issue][autoinstall_issue] -[VirtualBox][virtualbox]: Needs to be updated for Wefork. [Create Sandstorm .spk file from source][sandstorm_spk] From 692f5fb10c60f8b933c3fbcfd549c5db2f9b7058 Mon Sep 17 00:00:00 2001 From: Stephen Moloney Date: Tue, 17 Jan 2017 08:49:42 +0000 Subject: [PATCH 086/136] locally build docker image --- Dockerfile | 76 ++++++++++++++++++++++++++++++++++++++++++---- docker-compose.yml | 66 +++++++++++++++++++++++----------------- 2 files changed, 108 insertions(+), 34 deletions(-) diff --git a/Dockerfile b/Dockerfile index 591d8ca23..7dea33ed9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,71 @@ -FROM meteorhacks/meteord:onbuild -MAINTAINER Maxime Quandalle +FROM debian:wheezy +MAINTAINER wefork -# Run as you wish! -# docker run -d --name wekan-db mongo -# docker run -d --link "wekan-db:db" -e "MONGO_URL=mongodb://db" \ -# -e "ROOT_URL=http://example.com" -p 8080:80 mquandalle/wekan +ENV BUILD_DEPS="wget curl bzip2 build-essential python git" +ARG NODE_VERSION=v0.10.48 +ARG METEOR_RELEASE=1.3.5.1 +ARG NPM_VERSION=3.10.10 +ARG ARCHICTECTURE=linux-x64 +ARG SRC_PATH=./ + +# Copy the app to the image +COPY ${SRC_PATH} ./app + +# OS dependencies +RUN apt-get update -y && apt-get install -y ${BUILD_DEPS} + +# Download nodejs +RUN wget https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHICTECTURE}.tar.gz && \ + wget https://nodejs.org/dist/${NODE_VERSION}/SHASUMS256.txt.asc + +# Verify nodejs authenticity +RUN \ + grep ${NODE_VERSION}-${ARCHICTECTURE}.tar.gz SHASUMS256.txt.asc | shasum -a 256 -c - && \ + gpg --keyserver pool.sks-keyservers.net --recv-keys 9554F04D7259F04124DE6B476D5A82AC7E37093B && \ + gpg --keyserver pool.sks-keyservers.net --recv-keys 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 && \ + gpg --keyserver pool.sks-keyservers.net --recv-keys FD3A5288F042B6850C66B31F09FE44734EB7990E && \ + gpg --keyserver pool.sks-keyservers.net --recv-keys 71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 && \ + gpg --keyserver pool.sks-keyservers.net --recv-keys DD8F2338BAE7501E3DD5AC78C273792F7D83545D && \ + gpg --keyserver pool.sks-keyservers.net --recv-keys C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 && \ + gpg --keyserver pool.sks-keyservers.net --recv-keys B9AE9905FFD7803F25714661B63B535A4C206CA9 && \ + gpg --refresh-keys pool.sks-keyservers.net && \ + gpg --verify SHASUMS256.txt.asc + +# Install Node +RUN \ + tar xvzf node-${NODE_VERSION}-${ARCHICTECTURE}.tar.gz && \ + rm node-${NODE_VERSION}-${ARCHICTECTURE}.tar.gz && \ + mv node-${NODE_VERSION}-${ARCHICTECTURE} /opt/nodejs && \ + ln -s /opt/nodejs/bin/node /usr/bin/node && \ + ln -s /opt/nodejs/bin/npm /usr/bin/npm + +# Install Node dependencies +RUN npm install npm@${NPM_VERSION} -g && \ + npm install -g node-gyp && \ + npm install -g fibers + +# Install meteor +RUN curl https://install.meteor.com -o ./install_meteor.sh && \ + sed -i "s|RELEASE=.*|RELEASE=${METEOR_RELEASE}\"\"|g" ./install_meteor.sh && \ + echo "Starting meteor ${METEOR_RELEASE} installation... \n" && \ + sh ./install_meteor.sh + +# Build app +RUN cd ./app && \ + meteor npm install --save xss && \ + echo "Starting meteor build of the app... \n" && \ + meteor build --directory /opt/app_build && \ + cd /opt/app_build/bundle/programs/server/ && \ + npm install && \ + mv /opt/app_build/bundle /build && \ + cd /build + +# Cleanup +RUN \ + apt-get remove --purge -y ${BUILD_DEPS} && \ + rm -R /var/lib/apt/lists/* /app /opt/app_build ~/.meteor && \ + rm /install_meteor.sh + +ENV PORT=80 + +CMD ["node", "/build/main.js"] diff --git a/docker-compose.yml b/docker-compose.yml index b9f02a489..029106e6a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,31 +1,41 @@ -# You can read the Docker Compose documentation at: -# -# https://docs.docker.com/compose/ -# -# Run with file with `docker-compose up -d`. -# -# We use two separate Docker containers: one for the database and one for the -# Wekan application. The Wekan container doensn’t contain any mutable state -# (all the user data, even uploads, are saved in the database) so updating it -# is as simple as stoping the old version and starting the new one. If you want -# to update the database you need to uncomment the volume section below. +version: '2' -wekandb: - image: mongo -# volumes: -# - ./data/runtime/db:/data/db -# - ./data/dump:/dump - command: mongod --smallfiles --oplogSize 128 - ports: - - 27017 +services: -wekan: - image: mquandalle/wekan - links: - - wekandb - environment: - - MONGO_URL=mongodb://wekandb/wekan - - ROOT_URL=http://localhost:80 - ports: - - 80:80 + wekandb: + image: mongo:latest + container_name: wekan-db + restart: always + command: mongod --smallfiles --oplogSize 128 + expose: + - 27017 + volumes: + - wekan-db:/data/db + - wekan-db-dump:/dump + wekan: + image: wefork/wekan + container_name: wekan-app + restart: always + build: + context: . + dockerfile: Dockerfile + args: + - node_version=${NODE_VERSION} + - meteor_release=${METEOR_RELEASE} + - npm_version=${NPM_VERSION} + - architecture=${ARCHITECTURE} + - src_path=${SRC_PATH} + ports: + - 80:80 + environment: + - MONGO_URL=mongodb://wekandb:27017/wekan + - ROOT_URL=http://localhost + links: + - wekandb + depends_on: + - wekandb + +volumes: + wekan-db: + driver: local From 250650f46af30f1219e77155b76457aa57f5839a Mon Sep 17 00:00:00 2001 From: Stephen Moloney Date: Tue, 17 Jan 2017 16:45:11 +0000 Subject: [PATCH 087/136] change to mongo 3.4 --- docker-compose.yml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 029106e6a..35318ed02 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,10 +3,12 @@ version: '2' services: wekandb: - image: mongo:latest + image: mongo:3.4 container_name: wekan-db restart: always command: mongod --smallfiles --oplogSize 128 + networks: + - wekan-tier expose: - 27017 volumes: @@ -17,6 +19,8 @@ services: image: wefork/wekan container_name: wekan-app restart: always + networks: + - wekan-tier build: context: . dockerfile: Dockerfile @@ -31,11 +35,15 @@ services: environment: - MONGO_URL=mongodb://wekandb:27017/wekan - ROOT_URL=http://localhost - links: - - wekandb depends_on: - wekandb volumes: wekan-db: driver: local + wekan-db-dump: + driver: local + +networks: + wekan-tier: + driver: bridge From 8644d3c5f3100af7ba10e8168c5c341a05d4e784 Mon Sep 17 00:00:00 2001 From: Martin Gabelmann Date: Tue, 17 Jan 2017 19:29:35 +0100 Subject: [PATCH 088/136] combine all RUN statements --- Dockerfile | 53 +++++++++++++++++++++++++---------------------------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/Dockerfile b/Dockerfile index 7dea33ed9..a35f9b0ed 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,14 +12,13 @@ ARG SRC_PATH=./ COPY ${SRC_PATH} ./app # OS dependencies -RUN apt-get update -y && apt-get install -y ${BUILD_DEPS} - -# Download nodejs -RUN wget https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHICTECTURE}.tar.gz && \ - wget https://nodejs.org/dist/${NODE_VERSION}/SHASUMS256.txt.asc - -# Verify nodejs authenticity -RUN \ +RUN apt-get update -y && apt-get install -y ${BUILD_DEPS} && \ + \ + # Download nodejs + wget https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHICTECTURE}.tar.gz && \ + wget https://nodejs.org/dist/${NODE_VERSION}/SHASUMS256.txt.asc && \ + \ + # Verify nodejs authenticity grep ${NODE_VERSION}-${ARCHICTECTURE}.tar.gz SHASUMS256.txt.asc | shasum -a 256 -c - && \ gpg --keyserver pool.sks-keyservers.net --recv-keys 9554F04D7259F04124DE6B476D5A82AC7E37093B && \ gpg --keyserver pool.sks-keyservers.net --recv-keys 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 && \ @@ -29,39 +28,37 @@ RUN \ gpg --keyserver pool.sks-keyservers.net --recv-keys C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 && \ gpg --keyserver pool.sks-keyservers.net --recv-keys B9AE9905FFD7803F25714661B63B535A4C206CA9 && \ gpg --refresh-keys pool.sks-keyservers.net && \ - gpg --verify SHASUMS256.txt.asc - -# Install Node -RUN \ + gpg --verify SHASUMS256.txt.asc && \ + \ + # Install Node tar xvzf node-${NODE_VERSION}-${ARCHICTECTURE}.tar.gz && \ rm node-${NODE_VERSION}-${ARCHICTECTURE}.tar.gz && \ mv node-${NODE_VERSION}-${ARCHICTECTURE} /opt/nodejs && \ ln -s /opt/nodejs/bin/node /usr/bin/node && \ - ln -s /opt/nodejs/bin/npm /usr/bin/npm - -# Install Node dependencies -RUN npm install npm@${NPM_VERSION} -g && \ + ln -s /opt/nodejs/bin/npm /usr/bin/npm && \ + \ + # Install Node dependencies + npm install npm@${NPM_VERSION} -g && \ npm install -g node-gyp && \ - npm install -g fibers - -# Install meteor -RUN curl https://install.meteor.com -o ./install_meteor.sh && \ + npm install -g fibers && \ + \ + # Install meteor + curl https://install.meteor.com -o ./install_meteor.sh && \ sed -i "s|RELEASE=.*|RELEASE=${METEOR_RELEASE}\"\"|g" ./install_meteor.sh && \ echo "Starting meteor ${METEOR_RELEASE} installation... \n" && \ - sh ./install_meteor.sh - -# Build app -RUN cd ./app && \ + sh ./install_meteor.sh && \ + \ + # Build app + cd ./app && \ meteor npm install --save xss && \ echo "Starting meteor build of the app... \n" && \ meteor build --directory /opt/app_build && \ cd /opt/app_build/bundle/programs/server/ && \ npm install && \ mv /opt/app_build/bundle /build && \ - cd /build - -# Cleanup -RUN \ + cd /build && \ + \ + # Cleanup apt-get remove --purge -y ${BUILD_DEPS} && \ rm -R /var/lib/apt/lists/* /app /opt/app_build ~/.meteor && \ rm /install_meteor.sh From 67d0036f62a97cdd75d00f6e0d7b28d029da6615 Mon Sep 17 00:00:00 2001 From: Martin Gabelmann Date: Tue, 17 Jan 2017 20:03:36 +0100 Subject: [PATCH 089/136] remove dependencies of build packages --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index a35f9b0ed..93cf72e01 100644 --- a/Dockerfile +++ b/Dockerfile @@ -60,6 +60,7 @@ RUN apt-get update -y && apt-get install -y ${BUILD_DEPS} && \ \ # Cleanup apt-get remove --purge -y ${BUILD_DEPS} && \ + apt-get autoremove -y && \ rm -R /var/lib/apt/lists/* /app /opt/app_build ~/.meteor && \ rm /install_meteor.sh From 7304028420213aa089111af9c9395227360f02cf Mon Sep 17 00:00:00 2001 From: Stephen Moloney Date: Tue, 17 Jan 2017 22:44:03 +0000 Subject: [PATCH 090/136] change docker-compose.yml VARS to CAPS --- docker-compose.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 35318ed02..d25e4b883 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,11 +25,11 @@ services: context: . dockerfile: Dockerfile args: - - node_version=${NODE_VERSION} - - meteor_release=${METEOR_RELEASE} - - npm_version=${NPM_VERSION} - - architecture=${ARCHITECTURE} - - src_path=${SRC_PATH} + - NODE_VERSION=${NODE_VERSION} + - METEOR_RELEASE=${METEOR_RELEASE} + - NPM_VERSION=${NPM_VERSION} + - ARCHITECTURE=${ARCHITECTURE} + - SRC_PATH=${SRC_PATH} ports: - 80:80 environment: From 49472728719e1a437e63d974b65f0a21865975db Mon Sep 17 00:00:00 2001 From: Stephen Moloney Date: Tue, 17 Jan 2017 23:46:36 +0000 Subject: [PATCH 091/136] --allow-superuser --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 93cf72e01..cea1d5b6f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -52,7 +52,7 @@ RUN apt-get update -y && apt-get install -y ${BUILD_DEPS} && \ cd ./app && \ meteor npm install --save xss && \ echo "Starting meteor build of the app... \n" && \ - meteor build --directory /opt/app_build && \ + meteor build --directory --allow-superuser /opt/app_build && \ cd /opt/app_build/bundle/programs/server/ && \ npm install && \ mv /opt/app_build/bundle /build && \ From 14873f3b2848e1f7bef97b5e5bb355b05a0552a2 Mon Sep 17 00:00:00 2001 From: Stephen Moloney Date: Tue, 17 Jan 2017 23:48:19 +0000 Subject: [PATCH 092/136] slight formatting --- Dockerfile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index cea1d5b6f..e441b76d0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,8 +11,9 @@ ARG SRC_PATH=./ # Copy the app to the image COPY ${SRC_PATH} ./app -# OS dependencies -RUN apt-get update -y && apt-get install -y ${BUILD_DEPS} && \ +RUN \ + # OS dependencies + apt-get update -y && apt-get install -y ${BUILD_DEPS} && \ \ # Download nodejs wget https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHICTECTURE}.tar.gz && \ From fd2d6efe4a38436899d3058c2d4bddebc9ee9c98 Mon Sep 17 00:00:00 2001 From: Stephen Moloney Date: Tue, 17 Jan 2017 23:48:55 +0000 Subject: [PATCH 093/136] typo --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index e441b76d0..77b29112d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ ENV BUILD_DEPS="wget curl bzip2 build-essential python git" ARG NODE_VERSION=v0.10.48 ARG METEOR_RELEASE=1.3.5.1 ARG NPM_VERSION=3.10.10 -ARG ARCHICTECTURE=linux-x64 +ARG ARCHITECTURE=linux-x64 ARG SRC_PATH=./ # Copy the app to the image From ca1641ff697baa44241f406ec9551c03b6856d62 Mon Sep 17 00:00:00 2001 From: Stephen Moloney Date: Tue, 17 Jan 2017 23:52:36 +0000 Subject: [PATCH 094/136] architecture typo --- Dockerfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 77b29112d..f77fd3d4a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,11 +16,11 @@ RUN \ apt-get update -y && apt-get install -y ${BUILD_DEPS} && \ \ # Download nodejs - wget https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHICTECTURE}.tar.gz && \ + wget https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \ wget https://nodejs.org/dist/${NODE_VERSION}/SHASUMS256.txt.asc && \ \ # Verify nodejs authenticity - grep ${NODE_VERSION}-${ARCHICTECTURE}.tar.gz SHASUMS256.txt.asc | shasum -a 256 -c - && \ + grep ${NODE_VERSION}-${ARCHITECTURE}.tar.gz SHASUMS256.txt.asc | shasum -a 256 -c - && \ gpg --keyserver pool.sks-keyservers.net --recv-keys 9554F04D7259F04124DE6B476D5A82AC7E37093B && \ gpg --keyserver pool.sks-keyservers.net --recv-keys 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 && \ gpg --keyserver pool.sks-keyservers.net --recv-keys FD3A5288F042B6850C66B31F09FE44734EB7990E && \ @@ -32,9 +32,9 @@ RUN \ gpg --verify SHASUMS256.txt.asc && \ \ # Install Node - tar xvzf node-${NODE_VERSION}-${ARCHICTECTURE}.tar.gz && \ - rm node-${NODE_VERSION}-${ARCHICTECTURE}.tar.gz && \ - mv node-${NODE_VERSION}-${ARCHICTECTURE} /opt/nodejs && \ + tar xvzf node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \ + rm node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \ + mv node-${NODE_VERSION}-${ARCHITECTURE} /opt/nodejs && \ ln -s /opt/nodejs/bin/node /usr/bin/node && \ ln -s /opt/nodejs/bin/npm /usr/bin/npm && \ \ From 0daad1a256a9a4f013968658bf214a46ac49863b Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Wed, 18 Jan 2017 11:03:11 +0200 Subject: [PATCH 095/136] Add Docker as supported platform. --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 5afd88aa2..d694e9c83 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,8 @@ that by providing one-click installation on various platforms. [VirtualBox][virtualbox] +Docker: [Docs][docker_docs] [Nginx proxy][docker_nginxproxy] [Issue][docker_issue] + [Debian Wheezy 64bit][debian_wheezy] [![Deploy][heroku_button]][heroku_deploy] @@ -43,13 +45,10 @@ that by providing one-click installation on various platforms. ## Upcoming Platforms -[Docker][docker_image] - [Docker on SUSE Linux Enterprise Server 12 SP1][sles] [Autoinstall script][autoinstall] based on [this issue][autoinstall_issue] - [Create Sandstorm .spk file from source][sandstorm_spk] Email to work on already working Heroku: Use 3rd party @@ -98,7 +97,9 @@ with [Meteor](https://www.meteor.com). [sles]: https://github.com/wekan/wekan/wiki/Install-Wekan-Docker-on-SUSE-Linux-Enterprise-Server-12-SP1 [virtualbox]: https://github.com/wekan/wekan/wiki/virtual-appliance [sandstorm_spk]: https://github.com/wefork/wekan/issues/36 -[docker_image]: https://github.com/wefork/wekan/issues/33 +[docker_docs]: https://github.com/wefork/wekan/wiki/Docker +[docker_nginxproxy]: https://github.com/wefork/wekan/wiki/Docker-NginxProxy +[docker_issue]: https://github.com/wefork/wekan/issues/33 [translate_wefork]: https://www.transifex.com/wefork/wefork/ [autoinstall]: https://github.com/wefork/wekan-autoinstall [autoinstall_issue]: https://github.com/anselal/wekan/issues/18 From 85354c995b49e75188d8b6d8de07f0741bc1dc68 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Wed, 18 Jan 2017 11:05:10 +0200 Subject: [PATCH 096/136] Add Docker as supported platform. - Add some commas. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d694e9c83..ccb3b9eef 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ that by providing one-click installation on various platforms. [VirtualBox][virtualbox] -Docker: [Docs][docker_docs] [Nginx proxy][docker_nginxproxy] [Issue][docker_issue] +Docker: [Docs][docker_docs], [Docker Nginx proxy][docker_nginxproxy], [Docker Issue][docker_issue] [Debian Wheezy 64bit][debian_wheezy] From edd69ac0f75b6ad1708fb62c64186cf3d310c928 Mon Sep 17 00:00:00 2001 From: Stephen Moloney Date: Fri, 20 Jan 2017 00:35:34 +0000 Subject: [PATCH 097/136] Change user to wekan for building with meteor --- Dockerfile | 49 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/Dockerfile b/Dockerfile index f77fd3d4a..702ab8069 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,8 @@ FROM debian:wheezy MAINTAINER wefork -ENV BUILD_DEPS="wget curl bzip2 build-essential python git" +ENV BUILD_DEPS="wget curl bzip2 build-essential python git ca-certificates" +ENV GOSU_VERSION=1.10 ARG NODE_VERSION=v0.10.48 ARG METEOR_RELEASE=1.3.5.1 ARG NPM_VERSION=3.10.10 @@ -9,11 +10,24 @@ ARG ARCHITECTURE=linux-x64 ARG SRC_PATH=./ # Copy the app to the image -COPY ${SRC_PATH} ./app +COPY ${SRC_PATH} /home/wekan/app RUN \ + # Add non-root user wekan + useradd --user-group --system --home-dir /home/wekan wekan && \ + \ # OS dependencies - apt-get update -y && apt-get install -y ${BUILD_DEPS} && \ + apt-get update -y && apt-get install -y --no-install-recommends ${BUILD_DEPS} && \ + \ + # Gosu installation + GOSU_ARCHITECTURE="$(dpkg --print-architecture | awk -F- '{ print $NF }')" && \ + wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/${GOSU_VERSION}/gosu-${GOSU_ARCHITECTURE}" && \ + wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/${GOSU_VERSION}/gosu-${GOSU_ARCHITECTURE}.asc" && \ + export GNUPGHOME="$(mktemp -d)" && \ + gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 && \ + gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu && \ + rm -R "$GNUPGHOME" /usr/local/bin/gosu.asc && \ + chmod +x /usr/local/bin/gosu && \ \ # Download nodejs wget https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \ @@ -21,6 +35,7 @@ RUN \ \ # Verify nodejs authenticity grep ${NODE_VERSION}-${ARCHITECTURE}.tar.gz SHASUMS256.txt.asc | shasum -a 256 -c - && \ + export GNUPGHOME="$(mktemp -d)" && \ gpg --keyserver pool.sks-keyservers.net --recv-keys 9554F04D7259F04124DE6B476D5A82AC7E37093B && \ gpg --keyserver pool.sks-keyservers.net --recv-keys 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 && \ gpg --keyserver pool.sks-keyservers.net --recv-keys FD3A5288F042B6850C66B31F09FE44734EB7990E && \ @@ -30,6 +45,7 @@ RUN \ gpg --keyserver pool.sks-keyservers.net --recv-keys B9AE9905FFD7803F25714661B63B535A4C206CA9 && \ gpg --refresh-keys pool.sks-keyservers.net && \ gpg --verify SHASUMS256.txt.asc && \ + rm -R "$GNUPGHOME" SHASUMS256.txt.asc && \ \ # Install Node tar xvzf node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \ @@ -43,27 +59,32 @@ RUN \ npm install -g node-gyp && \ npm install -g fibers && \ \ - # Install meteor + # Change user to wekan and install meteor + cd /home/wekan/ && \ + chown wekan:wekan --recursive /home/wekan && \ curl https://install.meteor.com -o ./install_meteor.sh && \ sed -i "s|RELEASE=.*|RELEASE=${METEOR_RELEASE}\"\"|g" ./install_meteor.sh && \ echo "Starting meteor ${METEOR_RELEASE} installation... \n" && \ - sh ./install_meteor.sh && \ + chown wekan:wekan ./install_meteor.sh && \ + gosu wekan:wekan sh ./install_meteor.sh && \ \ # Build app - cd ./app && \ - meteor npm install --save xss && \ - echo "Starting meteor build of the app... \n" && \ - meteor build --directory --allow-superuser /opt/app_build && \ - cd /opt/app_build/bundle/programs/server/ && \ - npm install && \ - mv /opt/app_build/bundle /build && \ + cd /home/wekan/app && \ + gosu wekan /home/wekan/.meteor/meteor npm install --save xss && \ + gosu wekan /home/wekan/.meteor/meteor build --directory /home/wekan/app_build && \ + cd /home/wekan/app_build/bundle/programs/server/ && \ + gosu wekan npm install && \ + mv /home/wekan/app_build/bundle /build && \ cd /build && \ \ # Cleanup apt-get remove --purge -y ${BUILD_DEPS} && \ apt-get autoremove -y && \ - rm -R /var/lib/apt/lists/* /app /opt/app_build ~/.meteor && \ - rm /install_meteor.sh + rm -R /var/lib/apt/lists/* && \ + rm -R /home/wekan/.meteor && \ + rm -R /home/wekan/app && \ + rm -R /home/wekan/app_build && \ + rm /home/wekan/install_meteor.sh ENV PORT=80 From 23cb98bb825a2e210a8d314ecaba228ed7d332f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9ranger=20Campardou?= Date: Fri, 20 Jan 2017 11:09:34 +0100 Subject: [PATCH 098/136] Fix activity message for list deletion --- .gitignore | 1 + client/components/activities/activities.jade | 3 +++ client/components/lists/listHeader.js | 1 + i18n/fr.i18n.json | 2 +- models/lists.js | 11 +++++++++++ 5 files changed, 17 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 564db75d1..dd2671fba 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ *.sublime-workspace tmp/ node_modules/ +.vscode/ diff --git a/client/components/activities/activities.jade b/client/components/activities/activities.jade index 9ff738647..b47dac22f 100644 --- a/client/components/activities/activities.jade +++ b/client/components/activities/activities.jade @@ -41,6 +41,9 @@ template(name="boardActivities") if($eq activityType 'createList') | {{_ 'activity-added' list.title boardLabel}}. + if($eq activityType 'removeList') + | {{_ 'activity-removed' title boardLabel}}. + if($eq activityType 'importBoard') | {{{_ 'activity-imported-board' boardLabel sourceLink}}}. diff --git a/client/components/lists/listHeader.js b/client/components/lists/listHeader.js index 65a464bbf..f352022dd 100644 --- a/client/components/lists/listHeader.js +++ b/client/components/lists/listHeader.js @@ -64,5 +64,6 @@ Template.listActionPopup.events({ const currentList = this; evt.preventDefault(); Lists.remove(currentList._id); + Popup.close(); }, }); diff --git a/i18n/fr.i18n.json b/i18n/fr.i18n.json index 8c2281058..4304f15f4 100644 --- a/i18n/fr.i18n.json +++ b/i18n/fr.i18n.json @@ -33,7 +33,7 @@ "activity-joined": "a rejoint %s", "activity-moved": "a déplacé %s depuis %s vers %s", "activity-on": "sur %s", - "activity-removed": "a supprimé %s vers %s", + "activity-removed": "a supprimé %s de %s", "activity-sent": "a envoyé %s vers %s", "activity-unjoined": "a quitté %s", "add": "Ajouter", diff --git a/models/lists.js b/models/lists.js index 9ae2e4f7c..3c50fba0b 100644 --- a/models/lists.js +++ b/models/lists.js @@ -105,6 +105,17 @@ if (Meteor.isServer) { }); }); + Lists.before.remove((userId, doc) => { + Activities.insert({ + userId, + type: 'list', + activityType: 'removeList', + boardId: doc.boardId, + listId: doc._id, + title: doc.title + }); + }); + Lists.after.update((userId, doc) => { if (doc.archived) { Activities.insert({ From 5b58b0b40c876ed58fb40f51436d05505d8b1548 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9ranger=20Campardou?= Date: Fri, 20 Jan 2017 11:11:57 +0100 Subject: [PATCH 099/136] missing coma --- models/lists.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/lists.js b/models/lists.js index 3c50fba0b..682fb0960 100644 --- a/models/lists.js +++ b/models/lists.js @@ -112,7 +112,7 @@ if (Meteor.isServer) { activityType: 'removeList', boardId: doc.boardId, listId: doc._id, - title: doc.title + title: doc.title, }); }); From 00af9fc0e49b2cf790c8fd1fa856ae385666f7fc Mon Sep 17 00:00:00 2001 From: Stephen Moloney Date: Tue, 17 Jan 2017 23:46:36 +0000 Subject: [PATCH 100/136] --allow-superuser --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 93cf72e01..cea1d5b6f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -52,7 +52,7 @@ RUN apt-get update -y && apt-get install -y ${BUILD_DEPS} && \ cd ./app && \ meteor npm install --save xss && \ echo "Starting meteor build of the app... \n" && \ - meteor build --directory /opt/app_build && \ + meteor build --directory --allow-superuser /opt/app_build && \ cd /opt/app_build/bundle/programs/server/ && \ npm install && \ mv /opt/app_build/bundle /build && \ From b88b710f097d378f47ac89fc111d6d7d8a5f0ab2 Mon Sep 17 00:00:00 2001 From: Stephen Moloney Date: Tue, 17 Jan 2017 23:48:19 +0000 Subject: [PATCH 101/136] slight formatting --- Dockerfile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index cea1d5b6f..e441b76d0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,8 +11,9 @@ ARG SRC_PATH=./ # Copy the app to the image COPY ${SRC_PATH} ./app -# OS dependencies -RUN apt-get update -y && apt-get install -y ${BUILD_DEPS} && \ +RUN \ + # OS dependencies + apt-get update -y && apt-get install -y ${BUILD_DEPS} && \ \ # Download nodejs wget https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHICTECTURE}.tar.gz && \ From 8efcc5e6c2f3d33c0254537b6bde928985d7173f Mon Sep 17 00:00:00 2001 From: Stephen Moloney Date: Tue, 17 Jan 2017 23:48:55 +0000 Subject: [PATCH 102/136] typo --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index e441b76d0..77b29112d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ ENV BUILD_DEPS="wget curl bzip2 build-essential python git" ARG NODE_VERSION=v0.10.48 ARG METEOR_RELEASE=1.3.5.1 ARG NPM_VERSION=3.10.10 -ARG ARCHICTECTURE=linux-x64 +ARG ARCHITECTURE=linux-x64 ARG SRC_PATH=./ # Copy the app to the image From 5ff23de8f522296012d841fa8e2ceef5a89662c0 Mon Sep 17 00:00:00 2001 From: Stephen Moloney Date: Tue, 17 Jan 2017 23:52:36 +0000 Subject: [PATCH 103/136] architecture typo --- Dockerfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 77b29112d..f77fd3d4a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,11 +16,11 @@ RUN \ apt-get update -y && apt-get install -y ${BUILD_DEPS} && \ \ # Download nodejs - wget https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHICTECTURE}.tar.gz && \ + wget https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \ wget https://nodejs.org/dist/${NODE_VERSION}/SHASUMS256.txt.asc && \ \ # Verify nodejs authenticity - grep ${NODE_VERSION}-${ARCHICTECTURE}.tar.gz SHASUMS256.txt.asc | shasum -a 256 -c - && \ + grep ${NODE_VERSION}-${ARCHITECTURE}.tar.gz SHASUMS256.txt.asc | shasum -a 256 -c - && \ gpg --keyserver pool.sks-keyservers.net --recv-keys 9554F04D7259F04124DE6B476D5A82AC7E37093B && \ gpg --keyserver pool.sks-keyservers.net --recv-keys 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 && \ gpg --keyserver pool.sks-keyservers.net --recv-keys FD3A5288F042B6850C66B31F09FE44734EB7990E && \ @@ -32,9 +32,9 @@ RUN \ gpg --verify SHASUMS256.txt.asc && \ \ # Install Node - tar xvzf node-${NODE_VERSION}-${ARCHICTECTURE}.tar.gz && \ - rm node-${NODE_VERSION}-${ARCHICTECTURE}.tar.gz && \ - mv node-${NODE_VERSION}-${ARCHICTECTURE} /opt/nodejs && \ + tar xvzf node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \ + rm node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \ + mv node-${NODE_VERSION}-${ARCHITECTURE} /opt/nodejs && \ ln -s /opt/nodejs/bin/node /usr/bin/node && \ ln -s /opt/nodejs/bin/npm /usr/bin/npm && \ \ From e9efc9205d1d7791eeb56de768fd422ce3374ca1 Mon Sep 17 00:00:00 2001 From: Stephen Moloney Date: Fri, 20 Jan 2017 00:35:34 +0000 Subject: [PATCH 104/136] Change user to wekan for building with meteor --- Dockerfile | 49 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/Dockerfile b/Dockerfile index f77fd3d4a..702ab8069 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,8 @@ FROM debian:wheezy MAINTAINER wefork -ENV BUILD_DEPS="wget curl bzip2 build-essential python git" +ENV BUILD_DEPS="wget curl bzip2 build-essential python git ca-certificates" +ENV GOSU_VERSION=1.10 ARG NODE_VERSION=v0.10.48 ARG METEOR_RELEASE=1.3.5.1 ARG NPM_VERSION=3.10.10 @@ -9,11 +10,24 @@ ARG ARCHITECTURE=linux-x64 ARG SRC_PATH=./ # Copy the app to the image -COPY ${SRC_PATH} ./app +COPY ${SRC_PATH} /home/wekan/app RUN \ + # Add non-root user wekan + useradd --user-group --system --home-dir /home/wekan wekan && \ + \ # OS dependencies - apt-get update -y && apt-get install -y ${BUILD_DEPS} && \ + apt-get update -y && apt-get install -y --no-install-recommends ${BUILD_DEPS} && \ + \ + # Gosu installation + GOSU_ARCHITECTURE="$(dpkg --print-architecture | awk -F- '{ print $NF }')" && \ + wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/${GOSU_VERSION}/gosu-${GOSU_ARCHITECTURE}" && \ + wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/${GOSU_VERSION}/gosu-${GOSU_ARCHITECTURE}.asc" && \ + export GNUPGHOME="$(mktemp -d)" && \ + gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 && \ + gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu && \ + rm -R "$GNUPGHOME" /usr/local/bin/gosu.asc && \ + chmod +x /usr/local/bin/gosu && \ \ # Download nodejs wget https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \ @@ -21,6 +35,7 @@ RUN \ \ # Verify nodejs authenticity grep ${NODE_VERSION}-${ARCHITECTURE}.tar.gz SHASUMS256.txt.asc | shasum -a 256 -c - && \ + export GNUPGHOME="$(mktemp -d)" && \ gpg --keyserver pool.sks-keyservers.net --recv-keys 9554F04D7259F04124DE6B476D5A82AC7E37093B && \ gpg --keyserver pool.sks-keyservers.net --recv-keys 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 && \ gpg --keyserver pool.sks-keyservers.net --recv-keys FD3A5288F042B6850C66B31F09FE44734EB7990E && \ @@ -30,6 +45,7 @@ RUN \ gpg --keyserver pool.sks-keyservers.net --recv-keys B9AE9905FFD7803F25714661B63B535A4C206CA9 && \ gpg --refresh-keys pool.sks-keyservers.net && \ gpg --verify SHASUMS256.txt.asc && \ + rm -R "$GNUPGHOME" SHASUMS256.txt.asc && \ \ # Install Node tar xvzf node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \ @@ -43,27 +59,32 @@ RUN \ npm install -g node-gyp && \ npm install -g fibers && \ \ - # Install meteor + # Change user to wekan and install meteor + cd /home/wekan/ && \ + chown wekan:wekan --recursive /home/wekan && \ curl https://install.meteor.com -o ./install_meteor.sh && \ sed -i "s|RELEASE=.*|RELEASE=${METEOR_RELEASE}\"\"|g" ./install_meteor.sh && \ echo "Starting meteor ${METEOR_RELEASE} installation... \n" && \ - sh ./install_meteor.sh && \ + chown wekan:wekan ./install_meteor.sh && \ + gosu wekan:wekan sh ./install_meteor.sh && \ \ # Build app - cd ./app && \ - meteor npm install --save xss && \ - echo "Starting meteor build of the app... \n" && \ - meteor build --directory --allow-superuser /opt/app_build && \ - cd /opt/app_build/bundle/programs/server/ && \ - npm install && \ - mv /opt/app_build/bundle /build && \ + cd /home/wekan/app && \ + gosu wekan /home/wekan/.meteor/meteor npm install --save xss && \ + gosu wekan /home/wekan/.meteor/meteor build --directory /home/wekan/app_build && \ + cd /home/wekan/app_build/bundle/programs/server/ && \ + gosu wekan npm install && \ + mv /home/wekan/app_build/bundle /build && \ cd /build && \ \ # Cleanup apt-get remove --purge -y ${BUILD_DEPS} && \ apt-get autoremove -y && \ - rm -R /var/lib/apt/lists/* /app /opt/app_build ~/.meteor && \ - rm /install_meteor.sh + rm -R /var/lib/apt/lists/* && \ + rm -R /home/wekan/.meteor && \ + rm -R /home/wekan/app && \ + rm -R /home/wekan/app_build && \ + rm /home/wekan/install_meteor.sh ENV PORT=80 From 8ba08988ee8d11a544adcaa161637b48fd33c171 Mon Sep 17 00:00:00 2001 From: Stephen Moloney Date: Fri, 20 Jan 2017 10:54:32 +0000 Subject: [PATCH 105/136] remove cd /build --- Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 702ab8069..9e2b3a2e3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -75,7 +75,6 @@ RUN \ cd /home/wekan/app_build/bundle/programs/server/ && \ gosu wekan npm install && \ mv /home/wekan/app_build/bundle /build && \ - cd /build && \ \ # Cleanup apt-get remove --purge -y ${BUILD_DEPS} && \ From 59731af139b73f4b9cd8bd0bd0602ac272538b4f Mon Sep 17 00:00:00 2001 From: lksime Date: Fri, 20 Jan 2017 21:05:48 +0800 Subject: [PATCH 106/136] Add checklist feature --- .eslintrc.json | 4 +- client/components/activities/activities.jade | 11 ++ client/components/activities/activities.styl | 8 + client/components/cards/cardDetails.jade | 4 + client/components/cards/checklists.jade | 61 +++++++ client/components/cards/checklists.js | 74 +++++++++ client/components/cards/checklists.styl | 68 ++++++++ client/components/cards/minicard.jade | 7 +- client/components/cards/minicard.styl | 16 ++ i18n/en.i18n.json | 4 + models/activities.js | 7 + models/cards.js | 30 ++++ models/checklists.js | 164 +++++++++++++++++++ server/lib/utils.js | 5 + server/publications/boards.js | 1 + 15 files changed, 462 insertions(+), 2 deletions(-) create mode 100644 client/components/cards/checklists.jade create mode 100644 client/components/cards/checklists.js create mode 100644 client/components/cards/checklists.styl create mode 100644 models/checklists.js diff --git a/.eslintrc.json b/.eslintrc.json index 87c2e2cf1..4808d873c 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -117,6 +117,8 @@ "Notifications": true, "allowIsBoardAdmin": true, "allowIsBoardMember": true, - "Emoji": true + "allowIsBoardMemberByCard": true, + "Emoji": true, + "Checklists": true } } diff --git a/client/components/activities/activities.jade b/client/components/activities/activities.jade index 9ff738647..9bbcd055f 100644 --- a/client/components/activities/activities.jade +++ b/client/components/activities/activities.jade @@ -26,6 +26,12 @@ template(name="boardActivities") +viewer = comment.text + if($eq activityType 'addChecklist') + | {{{_ 'activity-checklist-added' cardLink}}}. + .activity-checklist(href="{{ card.absoluteUrl }}") + +viewer + = checklist.title + if($eq activityType 'archivedCard') | {{{_ 'activity-archived' cardLink}}}. @@ -103,6 +109,11 @@ template(name="cardActivities") | {{{_ 'activity-attached' attachmentLink cardLabel}}}. if attachment.isImage img.attachment-image-preview(src=attachment.url) + if($eq activityType 'addChecklist') + | {{{_ 'activity-checklist-added' cardLabel}}}. + .activity-checklist + +viewer + = checklist.title if($eq activityType 'addComment') +inlinedForm(classNames='js-edit-comment') diff --git a/client/components/activities/activities.styl b/client/components/activities/activities.styl index 1f0494c72..2285fc0a1 100644 --- a/client/components/activities/activities.styl +++ b/client/components/activities/activities.styl @@ -26,6 +26,14 @@ margin-top: 5px padding: 5px + .activity-checklist + display: block + border-radius: 3px + background: white + text-decoration: none + box-shadow: 0 1px 2px rgba(0,0,0,.2) + margin-top: 5px + padding: 5px .activity-meta font-size: 0.8em color: darken(white, 40%) diff --git a/client/components/cards/cardDetails.jade b/client/components/cards/cardDetails.jade index f4212d838..cf1139513 100644 --- a/client/components/cards/cardDetails.jade +++ b/client/components/cards/cardDetails.jade @@ -72,6 +72,10 @@ template(name="cardDetails") h3.card-details-item-title {{_ 'description'}} +viewer = description + + hr + +checklists(cardId = _id) + if attachments.count hr h2 diff --git a/client/components/cards/checklists.jade b/client/components/cards/checklists.jade new file mode 100644 index 000000000..396cb107a --- /dev/null +++ b/client/components/cards/checklists.jade @@ -0,0 +1,61 @@ +template(name="checklists") + h2 {{_ 'checklists'}} + .card-checklist-items + each checklist in currentCard.checklists + +checklistDetail(checklist = checklist) + +inlinedForm(classNames="js-add-checklist" cardId = cardId) + +addChecklistItemForm + else + a.js-open-inlined-form + i.fa.fa-plus + | {{_ 'add-checklist'}}... + +template(name="checklistDetail") + +inlinedForm(classNames="js-edit-checklist-title") + +editChecklistItemForm(checklist = checklist) + else + .checklist-title + .checkbox.fa.fa-check-square-o + a.js-delete-checklist {{_ "delete"}}... + span.checklist-stat(class="{{#if checklist.isFinished}}is-finished{{/if}}") {{checklist.finishedCount}}/{{checklist.itemCount}} + h2.title.js-open-inlined-form.is-editable {{checklist.title}} + +checklistItems(checklist = checklist) + +template(name="addChecklistItemForm") + textarea.js-add-checklist-item(rows='1' autofocus) + .edit-controls.clearfix + button.primary.confirm.js-submit-add-checklist-item-form(type="submit") {{_ 'save'}} + a.fa.fa-times-thin.js-close-inlined-form + +template(name="editChecklistItemForm") + textarea.js-edit-checklist-item(rows='1' autofocus) + if $eq type 'item' + = item.title + else + = checklist.title + .edit-controls.clearfix + button.primary.confirm.js-submit-edit-checklist-item-form(type="submit") {{_ 'save'}} + a.fa.fa-times-thin.js-close-inlined-form + span(title=createdAt) {{ moment createdAt }} + if currentUser.isBoardMember + a.js-delete-checklist-item {{_ "delete"}}... + +template(name="checklistItems") + .checklist-items + each item in checklist.items + +inlinedForm(classNames="js-edit-checklist-item") + +editChecklistItemForm(type = 'item' item = item checklist = checklist) + else + +itemDetail(item = item checklist = checklist) + if currentUser.isBoardMember + +inlinedForm(classNames="js-add-checklist-item" checklist = checklist) + +addChecklistItemForm + else + a.add-checklist-item.js-open-inlined-form + i.fa.fa-plus + | {{_ 'add-checklist-item'}}... + +template(name='itemDetail') + .item + .check-box.materialCheckBox(class="{{#if item.isFinished }}is-checked{{/if}}") + .item-title.js-open-inlined-form.is-editable(class="{{#if item.isFinished }}is-checked{{/if}}") {{item.title}} diff --git a/client/components/cards/checklists.js b/client/components/cards/checklists.js new file mode 100644 index 000000000..b8113a544 --- /dev/null +++ b/client/components/cards/checklists.js @@ -0,0 +1,74 @@ +BlazeComponent.extendComponent({ + addChecklist(event) { + event.preventDefault(); + const textarea = this.find('textarea.js-add-checklist-item'); + const title = textarea.value.trim(); + const cardId = this.currentData().cardId; + Checklists.insert({ + cardId, + title, + }); + }, + + addChecklistItem(event) { + event.preventDefault(); + const textarea = this.find('textarea.js-add-checklist-item'); + const title = textarea.value.trim(); + const checklist = this.currentData().checklist; + checklist.addItem(title); + }, + + editChecklist(event) { + event.preventDefault(); + const textarea = this.find('textarea.js-edit-checklist-item'); + const title = textarea.value.trim(); + const checklist = this.currentData().checklist; + checklist.setTitle(title); + }, + + editChecklistItem(event) { + event.preventDefault(); + + const textarea = this.find('textarea.js-edit-checklist-item'); + const title = textarea.value.trim(); + const itemId = this.currentData().item._id; + const checklist = this.currentData().checklist; + checklist.editItem(itemId, title); + }, + + deleteItem() { + const checklist = this.currentData().checklist; + const item = this.currentData().item; + if (checklist && item && item._id) { + checklist.removeItem(item._id); + } + }, + + deleteChecklist() { + const checklist = this.currentData().checklist; + if (checklist && checklist._id) { + Checklists.remove(checklist._id); + } + }, + + pressKey(event) { + //If user press enter key inside a form, submit it, so user doesn't have to leave keyboard to submit a form. + if (event.keyCode === 13) { + event.preventDefault(); + const $form = $(event.currentTarget).closest('form'); + $form.find('button[type=submit]').click(); + } + }, + + events() { + return [{ + 'submit .js-add-checklist': this.addChecklist, + 'submit .js-edit-checklist-title': this.editChecklist, + 'submit .js-add-checklist-item': this.addChecklistItem, + 'submit .js-edit-checklist-item': this.editChecklistItem, + 'click .js-delete-checklist-item': this.deleteItem, + 'click .js-delete-checklist': this.deleteChecklist, + keydown: this.pressKey, + }]; + }, +}).register('checklists'); diff --git a/client/components/cards/checklists.styl b/client/components/cards/checklists.styl new file mode 100644 index 000000000..885d75282 --- /dev/null +++ b/client/components/cards/checklists.styl @@ -0,0 +1,68 @@ +.js-add-checklist + color: #8c8c8c + +textarea.js-add-checklist-item, textarea.js-edit-checklist-item + overflow: hidden + word-wrap: break-word + resize: none + height: 34px + +.delete-text + color: #8c8c8c + text-decoration: underline + word-wrap: break-word + float: right + padding-top: 6px + &:hover + color: inherit + +.checklist-title + .checkbox + float: left + width: 30px + height 30px + font-size: 18px + line-height: 30px + + .title + font-size: 18px + line-height: 30px + + .checklist-stat + margin: 0 0.5em + float: right + padding-top: 6px + &.is-finished + color: #3cb500 + + .js-delete-checklist + @extends .delete-text + +.checklist-items + margin: 0 0 0.5em 1.33em + + .item + line-height: 25px + font-size: 1.1em + margin-top: 3px + display: flex + + .check-box + margin-top: 5px + &.is-checked + border-bottom: 2px solid #3cb500 + border-right: 2px solid #3cb500 + + .item-title + padding-left: 10px; + &.is-checked + color: #8c8c8c + font-style: italic + + .js-delete-checklist-item + @extends .delete-text + padding: 12px 0 0 0 + + .add-checklist-item + padding-top: 0.5em + display: inline-block diff --git a/client/components/cards/minicard.jade b/client/components/cards/minicard.jade index edc7d2d39..8b46ee74d 100644 --- a/client/components/cards/minicard.jade +++ b/client/components/cards/minicard.jade @@ -14,7 +14,7 @@ template(name="minicard") .badges if comments.count .badge(title="{{_ 'card-comments-title' comments.count }}") - span.badge-icon.fa.fa-comment-o + span.badge-icon.fa.fa-comment-o.badge-comment span.badge-text= comments.count if description .badge.badge-state-image-only(title=description) @@ -29,3 +29,8 @@ template(name="minicard") if dueAt .badge +minicardDueDate + if checklists.count + .badge(class="{{#if checklistFinished}}is-finished{{/if}}") + span.badge-icon.fa.fa-check-square-o + span.badge-text.check-list-text {{checklistFinishedCount}}/{{checklistItemCount}} + diff --git a/client/components/cards/minicard.styl b/client/components/cards/minicard.styl index a61f60675..12a89785a 100644 --- a/client/components/cards/minicard.styl +++ b/client/components/cards/minicard.styl @@ -99,10 +99,26 @@ .badge-text vertical-align: middle + &.is-finished + background: #3cb500 + padding: 0px 3px + border-radius: 3px + color: white + + .badge-icon, + .badge-text + vertical-align: middle//didn't figure why use top, it'd be easier to fill bg if it's middle. This was introduced in commit "91cfcf7b12b5e7c137c2e765b2c378dde6b82966" & "* Improve the design of the minicards badges" was mentioned. + &.badge-comment + margin-bottom: 0.1rem + .badge-text font-size: 0.9em padding-left: 2px line-height: 14px + .check-list-text + padding-left: 0px + line-height: 12px + .minicard-members float: right diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index 91c8e0aff..1d803ee3b 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -36,10 +36,13 @@ "activity-removed": "removed %s from %s", "activity-sent": "sent %s to %s", "activity-unjoined": "unjoined %s", + "activity-checklist-added": "added checklist to %s", "add": "Add", "add-attachment": "Add an attachment", "add-board": "Add a new board", "add-card": "Add a card", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "Add Cover", "add-label": "Add the label", "add-list": "Add a list", @@ -115,6 +118,7 @@ "changePasswordPopup-title": "Change Password", "changePermissionsPopup-title": "Change Permissions", "changeSettingsPopup-title": "Change Settings", + "checklists": "Checklists", "click-to-star": "Click to star this board.", "click-to-unstar": "Click to unstar this board.", "clipboard" : "Clipboard or drag & drop", diff --git a/models/activities.js b/models/activities.js index aa2ea3ec0..7d262ec6e 100644 --- a/models/activities.js +++ b/models/activities.js @@ -35,6 +35,9 @@ Activities.helpers({ attachment() { return Attachments.findOne(this.attachmentId); }, + checklist() { + return Checklists.findOne(this.checklistId); + }, }); Activities.before.insert((userId, doc) => { @@ -102,6 +105,10 @@ if (Meteor.isServer) { const attachment = activity.attachment(); params.attachment = attachment._id; } + if (activity.checklistId) { + const checklist = activity.checklist(); + params.checklist = checklist.title; + } if (board) { const watchingUsers = _.pluck(_.where(board.watchers, {level: 'watching'}), 'userId'); const trackingUsers = _.pluck(_.where(board.watchers, {level: 'tracking'}), 'userId'); diff --git a/models/cards.js b/models/cards.js index 9e7d58c8f..f6bd0b068 100644 --- a/models/cards.js +++ b/models/cards.js @@ -141,6 +141,36 @@ Cards.helpers({ return cover && cover.url() && cover; }, + checklists() { + return Checklists.find({ cardId: this._id }, { sort: { createdAt: 1 }}); + }, + + checklistItemCount() { + const checklists = this.checklists().fetch(); + return checklists.map((checklist) => { + return checklist.itemCount(); + }).reduce((prev, next) => { + return prev + next; + }, 0); + }, + + checklistFinishedCount() { + const checklists = this.checklists().fetch(); + return checklists.map((checklist) => { + return checklist.finishedCount(); + }).reduce((prev, next) => { + return prev + next; + }, 0); + }, + + checklistFinished() { + return this.hasChecklist() && this.checklistItemCount() === this.checklistFinishedCount(); + }, + + hasChecklist() { + return this.checklistItemCount() !== 0; + }, + absoluteUrl() { const board = this.board(); return FlowRouter.url('card', { diff --git a/models/checklists.js b/models/checklists.js new file mode 100644 index 000000000..35be4dcc8 --- /dev/null +++ b/models/checklists.js @@ -0,0 +1,164 @@ +Checklists = new Mongo.Collection('checklists'); + +Checklists.attachSchema(new SimpleSchema({ + cardId: { + type: String, + }, + title: { + type: String, + }, + items: { + type: [Object], + defaultValue: [], + }, + 'items.$._id': { + type: String, + }, + 'items.$.title': { + type: String, + }, + 'items.$.isFinished': { + type: Boolean, + defaultValue: false, + }, + finishedAt: { + type: Date, + optional: true, + }, + createdAt: { + type: Date, + denyUpdate: false, + }, +})); + +Checklists.helpers({ + itemCount () { + return this.items.length; + }, + finishedCount () { + return this.items.filter((item) => { + return item.isFinished; + }).length; + }, + isFinished () { + return 0 !== this.itemCount() && this.itemCount() === this.finishedCount(); + }, + getItem (_id) { + return _.findWhere(this.items, { _id }); + }, + itemIndex(itemId) { + return _.pluck(this.items, '_id').indexOf(itemId); + }, +}); + +Checklists.allow({ + insert(userId, doc) { + return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId)); + }, + update(userId, doc) { + return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId)); + }, + remove(userId, doc) { + return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId)); + }, + fetch: ['userId', 'cardId'], +}); + +Checklists.before.insert((userId, doc) => { + doc.createdAt = new Date(); + if (!doc.userId) { + doc.userId = userId; + } +}); + +Checklists.mutations({ + //for checklist itself + setTitle(title){ + return { $set: { title }}; + }, + //for items in checklist + addItem(title) { + const itemCount = this.itemCount(); + const _id = `${this._id}${itemCount}`; + return { $addToSet: {items: {_id, title, isFinished: false}} }; + }, + removeItem(itemId) { + return {$pull: {items: {_id : itemId}}}; + }, + editItem(itemId, title) { + if (this.getItem(itemId)) { + const itemIndex = this.itemIndex(itemId); + return { + $set: { + [`items.${itemIndex}.title`]: title, + }, + }; + } + return {}; + }, + finishItem(itemId) { + if (this.getItem(itemId)) { + const itemIndex = this.itemIndex(itemId); + return { + $set: { + [`items.${itemIndex}.isFinished`]: true, + }, + }; + } + return {}; + }, + resumeItem(itemId) { + if (this.getItem(itemId)) { + const itemIndex = this.itemIndex(itemId); + return { + $set: { + [`items.${itemIndex}.isFinished`]: false, + }, + }; + } + return {}; + }, + toggleItem(itemId) { + const item = this.getItem(itemId); + if (item) { + const itemIndex = this.itemIndex(itemId); + return { + $set: { + [`items.${itemIndex}.isFinished`]: !item.isFinished, + }, + }; + } + return {}; + }, +}); + +if (Meteor.isServer) { + Checklists.after.insert((userId, doc) => { + Activities.insert({ + userId, + activityType: 'addChecklist', + cardId: doc.cardId, + boardId: Cards.findOne(doc.cardId).boardId, + checklistId: doc._id, + }); + }); + + //TODO: so there will be no activity for adding item into checklist, maybe will be implemented in the future. + // Checklists.after.update((userId, doc) => { + // console.log('update:', doc) + // Activities.insert({ + // userId, + // activityType: 'addChecklist', + // boardId: doc.boardId, + // cardId: doc.cardId, + // checklistId: doc._id, + // }); + // }); + + Checklists.before.remove((userId, doc) => { + const activity = Activities.findOne({ checklistId: doc._id }); + if (activity) { + Activities.remove(activity._id); + } + }); +} diff --git a/server/lib/utils.js b/server/lib/utils.js index b59671fba..bc3807bbb 100644 --- a/server/lib/utils.js +++ b/server/lib/utils.js @@ -5,3 +5,8 @@ allowIsBoardAdmin = function(userId, board) { allowIsBoardMember = function(userId, board) { return board && board.hasMember(userId); }; + +allowIsBoardMemberByCard = function(userId, card) { + const board = card.board(); + return board && board.hasMember(userId); +}; diff --git a/server/publications/boards.js b/server/publications/boards.js index 896819787..133082ddd 100644 --- a/server/publications/boards.js +++ b/server/publications/boards.js @@ -98,6 +98,7 @@ Meteor.publishRelations('board', function(boardId) { this.cursor(Cards.find({ boardId }), function(cardId) { this.cursor(CardComments.find({ cardId })); this.cursor(Attachments.find({ cardId })); + this.cursor(Checklists.find({ cardId })); }); if (board.members) { From 308bd53049be9e2e052523f69cf2848e77a1e2cd Mon Sep 17 00:00:00 2001 From: "mario.orlicky" Date: Sun, 29 Jan 2017 22:28:07 +0100 Subject: [PATCH 107/136] fixed warning in jade template --- client/components/sidebar/sidebarFilters.jade | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/client/components/sidebar/sidebarFilters.jade b/client/components/sidebar/sidebarFilters.jade index deefde82b..9a9774bbf 100644 --- a/client/components/sidebar/sidebarFilters.jade +++ b/client/components/sidebar/sidebarFilters.jade @@ -8,7 +8,7 @@ template(name="filterSidebar") li(class="{{#if Filter.labelIds.isSelected undefined}}active{{/if}}") a.name.js-toggle-label-filter span.sidebar-list-item-description - {{_ 'filter-no-label'}} + | {{_ 'filter-no-label'}} if Filter.labelIds.isSelected undefined i.fa.fa-check each currentBoard.labels @@ -27,7 +27,7 @@ template(name="filterSidebar") li(class="{{#if Filter.members.isSelected undefined}}active{{/if}}") a.name.js-toggle-member-filter span.sidebar-list-item-description - {{_ 'filter-no-member'}} + | {{_ 'filter-no-member'}} if Filter.members.isSelected undefined i.fa.fa-check each currentBoard.activeMembers @@ -98,4 +98,3 @@ template(name="disambiguateMultiMemberPopup") template(name="moveSelectionPopup") +boardLists - From 671dbdcb9686908b18ba3284c408ed0488cb92d4 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 31 Jan 2017 18:07:01 +0200 Subject: [PATCH 108/136] Start merging Wefork back to Wekan. --- README.md | 59 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index ccb3b9eef..6a7b74cd6 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,20 @@ -# Wekan fork +# Wekan -[![Join the chat][rocket_badge]][rocket_chat] -[![Build Status][travis_badge]][travis_status] +[![Join the chat][gitter_badge]][gitter_chat] -[Wekan fork FAQ][fork_faq] +2017-01-31 News: Wekan fork/Wefork is being merged back to official Wekan. -[Wekan fork announcement][fork_announcement] +[Wefork announcement and merging back][fork_announcement] -[Translate Wekan fork at Transifex][translate_wefork] +[![Wefork chat][rocket_badge]][rocket_chat] + +[![Wefork Build Status][travis_badge]][travis_status] + +[Wefork FAQ][fork_faq] + +[Newer Wefork translations at Transifex][translate_wefork] + +[Wekan at Transifex][translate_wekan] Wekan is an open-source and collaborative kanban board application. @@ -17,7 +24,21 @@ boards are an unbeatable tool to keep your things organized. They give you a visual overview of the current state of your project, and make you productive by allowing you to focus on the few items that matter the most. -[![Our roadmap is self-hosted on Wekan fork][screenshot]][roadmap] +## Roadmap + +Roadmap is handled using [Wekan GitHub issues][wekan_issues]. + +Newer [Wefork GitHub issues][wefork_issues] will be be moved to there also. + +## Screenshots + +[Previous Wekan roadmap][roadmap_wekan] + +[![Screenshot of Wekan][screenshot_wekan]][screenshot] + +[Previous Wefork roadmap][roadmap_wefork] + +[![Screenshot of Wefork][screenshot_wefork]][screenshot2] Wekan supports most features you would expect of it including a real-time user interface, cards comments, member assignations, customizable labels, filtered @@ -33,7 +54,7 @@ that by providing one-click installation on various platforms. [VirtualBox][virtualbox] -Docker: [Docs][docker_docs], [Docker Nginx proxy][docker_nginxproxy], [Docker Issue][docker_issue] +Docker: [Docker image][docker_image] (needs updating), [Docs][docker_docs], [Docker Nginx proxy][docker_nginxproxy], [Docker Issue][docker_issue] [Debian Wheezy 64bit][debian_wheezy] @@ -66,22 +87,24 @@ Google Cloud: Needs info how to enable websockets. ## License -Wekan fork is released under the very permissive [MIT license](LICENSE), and made +Wekan is released under the very permissive [MIT license](LICENSE), and made with [Meteor](https://www.meteor.com). -## Roadmap - -[Our roadmap is self-hosted on Wekan fork][roadmap] - +[gitter_badge]: https://badges.gitter.im/Join%20Chat.svg +[gitter_chat]: https://gitter.im/wekan/wekan [fork_faq]: https://github.com/wefork/wekan/wiki/FAQ -[fork_announcement]: https://github.com/wekan/wekan/issues/640#issuecomment-255091832 -[screenshot]: http://i.imgur.com/ShX2OTk.png +[fork_announcement]: https://github.com/wekan/wekan/issues/640#issuecomment-276383458 +[screenshot_wekan]: http://i.imgur.com/cI4jW2h.png +[screenshot_wefork]: http://i.imgur.com/ShX2OTk.png +[roadmap_wekan]: http://try.wekan.io/b/MeSsFJaSqeuo9M6bs/wekan-roadmap +[roadmap_wefork]: https://wekan.indie.host/b/t2YaGmyXgNkppcFBq/wekan-fork-roadmap [rocket_badge]: https://chat.indie.host/images/join-chat.svg [rocket_chat]: https://chat.indie.host/channel/wekan -[roadmap]: https://wekan.indie.host/b/t2YaGmyXgNkppcFBq/wekan-fork-roadmap +[wekan_issues]: https://github.com/wekan/wekan/issues +[wefork_issues]: https://github.com/wefork/wekan/issues [sandstorm_button]: https://img.shields.io/badge/try-Wekan%20on%20Sandstorm-783189.svg [sandstorm_appdemo]: https://demo.sandstorm.io/appdemo/m86q05rdvj14yvn78ghaxynqz7u2svw6rnttptxx49g1785cdv1h -[docker_image]: https://hub.docker.com/r/... +[docker_image]: https://hub.docker.com/r/mquandalle/wekan/ [heroku_button]: https://www.herokucdn.com/deploy/button.png [heroku_deploy]: https://heroku.com/deploy?template=https://github.com/wefork/wekan/tree/master [indiehosters_button]: https://indie.host/signup.png @@ -97,9 +120,11 @@ with [Meteor](https://www.meteor.com). [sles]: https://github.com/wekan/wekan/wiki/Install-Wekan-Docker-on-SUSE-Linux-Enterprise-Server-12-SP1 [virtualbox]: https://github.com/wekan/wekan/wiki/virtual-appliance [sandstorm_spk]: https://github.com/wefork/wekan/issues/36 +[docker_image]: https://hub.docker.com/r/mquandalle/wekan/ [docker_docs]: https://github.com/wefork/wekan/wiki/Docker [docker_nginxproxy]: https://github.com/wefork/wekan/wiki/Docker-NginxProxy [docker_issue]: https://github.com/wefork/wekan/issues/33 +[translate_wekan]: https://www.transifex.com/wekan/wekan/ [translate_wefork]: https://www.transifex.com/wefork/wefork/ [autoinstall]: https://github.com/wefork/wekan-autoinstall [autoinstall_issue]: https://github.com/anselal/wekan/issues/18 From e2e3e65d2ff32b9c547d14637bd850d2afa3d5c7 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 31 Jan 2017 18:13:33 +0200 Subject: [PATCH 109/136] Fix screenshots. --- README.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 6a7b74cd6..785251198 100644 --- a/README.md +++ b/README.md @@ -32,13 +32,9 @@ Newer [Wefork GitHub issues][wefork_issues] will be be moved to there also. ## Screenshots -[Previous Wekan roadmap][roadmap_wekan] +[![Screenshot of Wekan][screenshot_wekan]][roadmap_wekan] -[![Screenshot of Wekan][screenshot_wekan]][screenshot] - -[Previous Wefork roadmap][roadmap_wefork] - -[![Screenshot of Wefork][screenshot_wefork]][screenshot2] +[![Screenshot of Wefork][screenshot_wefork]][roadmap_wefork] Wekan supports most features you would expect of it including a real-time user interface, cards comments, member assignations, customizable labels, filtered From 739715b6191c2cb61f06e98eefda3778f09a73d5 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Wed, 1 Feb 2017 18:30:48 +0200 Subject: [PATCH 110/136] Added working Docker example. Using MongoDB v3.2.11 --- README.md | 9 ++++++++- docker-compose.yml | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 785251198..e6926efb7 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,14 @@ that by providing one-click installation on various platforms. [VirtualBox][virtualbox] -Docker: [Docker image][docker_image] (needs updating), [Docs][docker_docs], [Docker Nginx proxy][docker_nginxproxy], [Docker Issue][docker_issue] +Docker: [Docker image][docker_image], [Docs][docker_docs], [Docker Nginx proxy][docker_nginxproxy], [Docker Issue][docker_issue] + +Docker example, running latest Wekan: +``` +docker run -d --restart=always --name wekan-db mongo:3.2.11 + +docker run -d --restart=always --name wekan --link "wekan-db:db" -e "MONGO_URL=mongodb://db" -e "ROOT_URL=http://localhost:8080" -p 8080:80 mquandalle/wekan:latest +``` [Debian Wheezy 64bit][debian_wheezy] diff --git a/docker-compose.yml b/docker-compose.yml index d25e4b883..819ef430f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,7 +3,7 @@ version: '2' services: wekandb: - image: mongo:3.4 + image: mongo:3.2.11 container_name: wekan-db restart: always command: mongod --smallfiles --oplogSize 128 From 5b393756ef8b17a278c9beec039232e138d21fad Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Wed, 1 Feb 2017 18:45:26 +0200 Subject: [PATCH 111/136] Add supported platform: Docker on SLES12SP1 --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e6926efb7..c05a9f451 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,8 @@ docker run -d --restart=always --name wekan-db mongo:3.2.11 docker run -d --restart=always --name wekan --link "wekan-db:db" -e "MONGO_URL=mongodb://db" -e "ROOT_URL=http://localhost:8080" -p 8080:80 mquandalle/wekan:latest ``` +[Docker on SUSE Linux Enterprise Server 12 SP1][sles] + [Debian Wheezy 64bit][debian_wheezy] [![Deploy][heroku_button]][heroku_deploy] @@ -67,9 +69,8 @@ docker run -d --restart=always --name wekan --link "wekan-db:db" -e "MONGO_URL=m [![Install on Cloudron][cloudron_button]][cloudron_install] [![Try on Sandstorm][sandstorm_button]][sandstorm_appdemo] -## Upcoming Platforms -[Docker on SUSE Linux Enterprise Server 12 SP1][sles] +## Upcoming Platforms [Autoinstall script][autoinstall] based on [this issue][autoinstall_issue] From 1ec25c2a52d3bbe4c1613a6f818944aeea19a332 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Wed, 1 Feb 2017 20:01:38 +0200 Subject: [PATCH 112/136] Fix typos, thanks to umbertooo --- client/components/boards/boardHeader.js | 2 +- models/boards.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/components/boards/boardHeader.js b/client/components/boards/boardHeader.js index b72bb1621..a76b566a6 100644 --- a/client/components/boards/boardHeader.js +++ b/client/components/boards/boardHeader.js @@ -33,7 +33,7 @@ Template.boardChangeTitlePopup.events({ const newDesc = tpl.$('.js-board-desc').val().trim(); if (newTitle) { this.rename(newTitle); - this.setDesciption(newDesc); + this.setDescription(newDesc); Popup.close(); } evt.preventDefault(); diff --git a/models/boards.js b/models/boards.js index 3051ef1ea..14943d617 100644 --- a/models/boards.js +++ b/models/boards.js @@ -249,7 +249,7 @@ Boards.mutations({ return { $set: { title }}; }, - setDesciption(description) { + setDescription(description) { return { $set: {description} }; }, From 3f7919e0b31256401198499117590ded6a423491 Mon Sep 17 00:00:00 2001 From: Stephen Moloney Date: Wed, 1 Feb 2017 18:48:48 +0000 Subject: [PATCH 113/136] update docker compose to latest dockerhub --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 819ef430f..35c5bfd1f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,7 +16,7 @@ services: - wekan-db-dump:/dump wekan: - image: wefork/wekan + image: mquandalle/wekan:latest container_name: wekan-app restart: always networks: From 22b5b9819de63558d17df6a5490e9c8f896f8020 Mon Sep 17 00:00:00 2001 From: Stephen Moloney Date: Wed, 1 Feb 2017 20:07:07 +0000 Subject: [PATCH 114/136] fix problem with arguments --- Dockerfile | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 9e2b3a2e3..b6e8b3df0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,21 @@ FROM debian:wheezy MAINTAINER wefork +# Declare Arguments +ARG NODE_VERSION +ARG METEOR_RELEASE +ARG NPM_VERSION +ARG ARCHITECTURE +ARG SRC_PATH + +# Set the environment variables (defaults where required) ENV BUILD_DEPS="wget curl bzip2 build-essential python git ca-certificates" ENV GOSU_VERSION=1.10 -ARG NODE_VERSION=v0.10.48 -ARG METEOR_RELEASE=1.3.5.1 -ARG NPM_VERSION=3.10.10 -ARG ARCHITECTURE=linux-x64 -ARG SRC_PATH=./ +ENV NODE_VERSION ${NODE_VERSION:-v0.10.48} +ENV METEOR_RELEASE ${METEOR_RELEASE:-1.3.5.1} +ENV NPM_VERSION ${NPM_VERSION:-3.10.10} +ENV ARCHITECTURE ${ARCHITECTURE:-linux-x64} +ENV SRC_PATH ${SRC_PATH:-./} # Copy the app to the image COPY ${SRC_PATH} /home/wekan/app From 271ab687d856b3af6bc2f57c9cc86bee2b9838a9 Mon Sep 17 00:00:00 2001 From: Stephen Moloney Date: Wed, 1 Feb 2017 20:11:34 +0000 Subject: [PATCH 115/136] running with docker-compose --- README.md | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c05a9f451..6e8828998 100644 --- a/README.md +++ b/README.md @@ -50,9 +50,21 @@ that by providing one-click installation on various platforms. [VirtualBox][virtualbox] -Docker: [Docker image][docker_image], [Docs][docker_docs], [Docker Nginx proxy][docker_nginxproxy], [Docker Issue][docker_issue] +### Docker: [Docker image][docker_image], [Docs][docker_docs], [Docker Nginx proxy][docker_nginxproxy], [Docker Issue][docker_issue] -Docker example, running latest Wekan: +Docker example, running latest Wekan using docker-compose: + +#### Running from remote dockerhub images +``` +sudo docker-compose pull & sudo docker-compose up -d --no-build +``` + +#### Running from locally built dockerhub images +``` +sudo docker-compose up -d --build +``` + +Docker example, running latest Wekan using docker run commands alone: ``` docker run -d --restart=always --name wekan-db mongo:3.2.11 From 9909e72727029f7a80128b91c9ee2f569f72ba91 Mon Sep 17 00:00:00 2001 From: Stephen Moloney Date: Wed, 1 Feb 2017 20:11:45 +0000 Subject: [PATCH 116/136] run with variables --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 6e8828998..9b3dfd506 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,16 @@ sudo docker-compose pull & sudo docker-compose up -d --no-build sudo docker-compose up -d --build ``` +#### Running from locally built dockerhub images and modified `ARG` variables (not recommended) +``` +echo 'NODE_VERSION=v6.6.0' >> .env && \ +echo 'METEOR_RELEASE=1.4.2.3' >> .env && \ +echo 'NPM_VERSION=4.1.2' >> .env && \ +echo 'ARCHITECTURE=linux-x64' >> .env && \ +echo 'SRC_PATH=./' >> .env && \ +sudo docker-compose up -d --build +``` + Docker example, running latest Wekan using docker run commands alone: ``` docker run -d --restart=always --name wekan-db mongo:3.2.11 From 46a5b6374c94e221a3abac212ca2c8aad5ad9787 Mon Sep 17 00:00:00 2001 From: Stephen Moloney Date: Thu, 2 Feb 2017 22:19:16 +0000 Subject: [PATCH 117/136] fix & to && --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9b3dfd506..9d0f8235d 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ Docker example, running latest Wekan using docker-compose: #### Running from remote dockerhub images ``` -sudo docker-compose pull & sudo docker-compose up -d --no-build +sudo docker-compose pull && sudo docker-compose up -d --no-build ``` #### Running from locally built dockerhub images From 335b91f0a48c2c64a96a74e8a2b9866bf590714a Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 3 Feb 2017 01:49:58 +0200 Subject: [PATCH 118/136] Add remaining of checklist feature code --- client/components/cards/checklists.jade | 4 ++-- client/components/cards/checklists.js | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/client/components/cards/checklists.jade b/client/components/cards/checklists.jade index 396cb107a..987e6cd9b 100644 --- a/client/components/cards/checklists.jade +++ b/client/components/cards/checklists.jade @@ -11,7 +11,7 @@ template(name="checklists") | {{_ 'add-checklist'}}... template(name="checklistDetail") - +inlinedForm(classNames="js-edit-checklist-title") + +inlinedForm(classNames="js-edit-checklist-title" checklist = checklist) +editChecklistItemForm(checklist = checklist) else .checklist-title @@ -43,7 +43,7 @@ template(name="editChecklistItemForm") template(name="checklistItems") .checklist-items each item in checklist.items - +inlinedForm(classNames="js-edit-checklist-item") + +inlinedForm(classNames="js-edit-checklist-item" item = item checklist = checklist) +editChecklistItemForm(type = 'item' item = item checklist = checklist) else +itemDetail(item = item checklist = checklist) diff --git a/client/components/cards/checklists.js b/client/components/cards/checklists.js index b8113a544..5dac7bd34 100644 --- a/client/components/cards/checklists.js +++ b/client/components/cards/checklists.js @@ -72,3 +72,18 @@ BlazeComponent.extendComponent({ }]; }, }).register('checklists'); + +BlazeComponent.extendComponent({ + toggleItem() { + const checklist = this.currentData().checklist; + const item = this.currentData().item; + if (checklist && item && item._id) { + checklist.toggleItem(item._id); + } + }, + events() { + return [{ + 'click .item .check-box': this.toggleItem, + }]; + }, +}).register('itemDetail'); From 52a2ed0cdcad72aaa1763376deb7a78213f4e3ce Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 3 Feb 2017 11:48:52 +0200 Subject: [PATCH 119/136] Update translations from Wefork transifex. --- i18n/ar.i18n.json | 4 + i18n/br.i18n.json | 5 ++ i18n/ca.i18n.json | 126 ++++++++++++++------------- i18n/cs.i18n.json | 4 + i18n/de.i18n.json | 4 + i18n/es.i18n.json | 198 ++++++++++++++++++++++--------------------- i18n/fa.i18n.json | 5 ++ i18n/fi.i18n.json | 6 +- i18n/fr.i18n.json | 6 +- i18n/he.i18n.json | 4 + i18n/it.i18n.json | 30 ++++--- i18n/ja.i18n.json | 20 +++-- i18n/ko.i18n.json | 4 + i18n/pl.i18n.json | 4 + i18n/pt-BR.i18n.json | 4 + i18n/ro.i18n.json | 5 ++ i18n/ru.i18n.json | 4 + i18n/sr.i18n.json | 5 ++ i18n/tr.i18n.json | 4 + i18n/zh-CN.i18n.json | 8 +- i18n/zh-TW.i18n.json | 4 + 21 files changed, 271 insertions(+), 183 deletions(-) diff --git a/i18n/ar.i18n.json b/i18n/ar.i18n.json index 4e84cbf75..531364a99 100644 --- a/i18n/ar.i18n.json +++ b/i18n/ar.i18n.json @@ -36,10 +36,13 @@ "activity-removed": "حذف %s إلى %s", "activity-sent": "إرسال %s إلى %s", "activity-unjoined": "غادر %s", + "activity-checklist-added": "added checklist to %s", "add": "أضف", "add-attachment": "إرفاق ملف", "add-board": "إضافة لوحة", "add-card": "إضافة بطاقة", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "إضافة غلاف", "add-label": "إضافة علامة", "add-list": "إضافة قائمة", @@ -115,6 +118,7 @@ "changePasswordPopup-title": "تغيير كلمة المرور", "changePermissionsPopup-title": "تعديل الصلاحيات", "changeSettingsPopup-title": "Change Settings", + "checklists": "Checklists", "click-to-star": "اضغط لإضافة اللوحة للمفضلة.", "click-to-unstar": "اضغط لحذف اللوحة من المفضلة.", "clipboard" : "Clipboard or drag & drop", diff --git a/i18n/br.i18n.json b/i18n/br.i18n.json index 5e313ac26..ece3e1a8d 100644 --- a/i18n/br.i18n.json +++ b/i18n/br.i18n.json @@ -36,10 +36,13 @@ "activity-removed": "removed %s from %s", "activity-sent": "sent %s to %s", "activity-unjoined": "unjoined %s", + "activity-checklist-added": "added checklist to %s", "add": "Ouzhpenn", "add-attachment": "Add an attachment", "add-board": "Add a new board", "add-card": "Ouzhpenn ur gartenn", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "Ouzphenn ur golo", "add-label": "Ouzhpenn an titl", "add-list": "Ouzhpenn ur roll", @@ -115,6 +118,7 @@ "changePasswordPopup-title": "Kemmañ ger-tremen", "changePermissionsPopup-title": "Change Permissions", "changeSettingsPopup-title": "Change Settings", + "checklists": "Checklists", "click-to-star": "Click to star this board.", "click-to-unstar": "Click to unstar this board.", "clipboard" : "Clipboard or drag & drop", @@ -268,6 +272,7 @@ "remove-cover": "Remove Cover", "remove-from-board": "Remove from Board", "remove-label": "Remove the label", + "remove-list": "Remove the list", "remove-member": "Remove Member", "remove-member-from-card": "Remove from Card", "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", diff --git a/i18n/ca.i18n.json b/i18n/ca.i18n.json index 427376133..6d3745cea 100644 --- a/i18n/ca.i18n.json +++ b/i18n/ca.i18n.json @@ -1,23 +1,23 @@ { "accept": "Accepta", - "act-activity-notify": "[Wekan] Activity Notification", - "act-addAttachment": "attached __attachment__ to __card__", - "act-addComment": "commented on __card__: __comment__", - "act-createBoard": "created __board__", - "act-createCard": "added __card__ to __list__", - "act-createList": "added __list__ to __board__", - "act-addBoardMember": "added __member__ to __board__", - "act-archivedBoard": "archived __board__", - "act-archivedCard": "archived __card__", - "act-archivedList": "archived __list__", - "act-importBoard": "imported __board__", - "act-importCard": "imported __card__", - "act-importList": "imported __list__", - "act-joinMember": "added __member__ to __card__", - "act-moveCard": "moved __card__ from __oldList__ to __list__", - "act-removeBoardMember": "removed __member__ from __board__", - "act-restoredCard": "restored __card__ to __board__", - "act-unjoinMember": "removed __member__ from __card__", + "act-activity-notify": "[Wekan] Notificació d'activitat", + "act-addAttachment": "adjuntat __attachment__ a __card__", + "act-addComment": "comentat a __card__: __comment__", + "act-createBoard": "creat __board__", + "act-createCard": "afegit/da __card__ a __list__", + "act-createList": "afegit/da __list__ a __board__", + "act-addBoardMember": "afegit/da __member__ a __board__", + "act-archivedBoard": "__board__ arxivat", + "act-archivedCard": "\n __card__ arxivat/da", + "act-archivedList": "__list__ arxivat/da", + "act-importBoard": "__board__ importat", + "act-importCard": "__card__ importat", + "act-importList": "__list__ importat", + "act-joinMember": "afegit/da __member__ a __card__", + "act-moveCard": "mou __card__ de __oldList__ a __list__", + "act-removeBoardMember": "elimina __member__ de __board__", + "act-restoredCard": "recupera __card__ a __board__", + "act-unjoinMember": "elimina __member__ de __card__", "act-withBoardTitle": "[Wekan] __board__", "act-withCardTitle": "[__board__] __card__", "actions": "Accions", @@ -36,10 +36,13 @@ "activity-removed": "ha eliminat %s de %s", "activity-sent": "ha enviat %s %s", "activity-unjoined": "desassignat %s", + "activity-checklist-added": "Checklist afegida a %s", "add": "Afegeix", "add-attachment": "Afegeix arxiu adjunt", "add-board": "Afegeix un nou tauler", "add-card": "Afegeix fitxa", + "add-checklist": "Afegeix una checklist", + "add-checklist-item": "Afegeix un ítem", "add-cover": "Afegeix coberta", "add-label": "Afegeix etiqueta", "add-list": "Afegeix llista", @@ -51,8 +54,8 @@ "all-boards": "Tots els taulers", "and-n-other-card": "And __count__ other card", "and-n-other-card_plural": "And __count__ other cards", - "apply": "Apply", - "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", + "apply": "Aplica", + "app-is-offline": "L'aplicació éstà fora de línia. Si refresca la pàgina perdrà les dades.", "archive": "Desa", "archive-all": "Desa Tot", "archive-board": "Arxiva tauler", @@ -68,7 +71,7 @@ "attachment-delete-pop": "L'esborrat d'un arxiu adjunt és permanent. No es pot desfer.", "attachmentDeletePopup-title": "Esborrar adjunt?", "attachments": "Adjunts", - "auto-watch": "Automatically watch boards when create it", + "auto-watch": "Veure els taulers automàticament després de crear-los", "avatar-too-big": "L'avatar és massa gran (70Kb max)", "back": "Enrere", "board-change-color": "Canvia el color", @@ -79,7 +82,7 @@ "boardChangeColorPopup-title": "Canvia fons", "boardChangeTitlePopup-title": "Canvia el nom tauler", "boardChangeVisibilityPopup-title": "Canvia visibilitat", - "boardChangeWatchPopup-title": "Change Watch", + "boardChangeWatchPopup-title": "Canvia seguiment", "boardMenuPopup-title": "Menú del tauler", "boards": "Taulers", "bucket-example": "Igual que “Bucket List”, per exemple", @@ -89,15 +92,15 @@ "card-delete-notice": "L'esborrat és permanent. Perdreu totes les accions associades a aquesta fitxa.", "card-delete-pop": "Totes les accions s'eliminaran de l'activitat i no podreu tornar a obrir la fitxa. No es pot desfer.", "card-delete-suggest-archive": "Podeu arxivar una fitxa per extreure-la del tauler i preservar l'activitat.", - "card-due": "Due", - "card-due-on": "Due on", + "card-due": "Finalitza", + "card-due-on": "Finalitza a", "card-edit-attachments": "Edita arxius adjunts", "card-edit-labels": "Edita etiquetes", "card-edit-members": "Edita membres", "card-labels-title": "Canvia les etiquetes de la fitxa", "card-members-title": "Afegeix o eliminar membres del tauler des de la fitxa.", - "card-start": "Start", - "card-start-on": "Starts on", + "card-start": "Comença", + "card-start-on": "Comença a", "cardAttachmentsPopup-title": "Adjunta des de", "cardDeletePopup-title": "Esborrar fitxa?", "cardDetailsActionsPopup-title": "Accions de fitxes", @@ -109,12 +112,13 @@ "change-avatar": "Canvia Avatar", "change-password": "Canvia la clau", "change-permissions": "Canvia permisos", - "change-settings": "Change Settings", + "change-settings": "Canvia configuració", "changeAvatarPopup-title": "Canvia Avatar", "changeLanguagePopup-title": "Canvia idioma", "changePasswordPopup-title": "Canvia la contrasenya", "changePermissionsPopup-title": "Canvia permisos", - "changeSettingsPopup-title": "Change Settings", + "changeSettingsPopup-title": "Canvia configuració", + "checklists": "Checklists", "click-to-star": "Fes clic per destacar aquest tauler.", "click-to-unstar": "Fes clic per deixar de destacar aquest tauler.", "clipboard" : "Portaretalls o estirar i amollar", @@ -138,7 +142,7 @@ "createBoardPopup-title": "Crea tauler", "createLabelPopup-title": "Crea etiqueta", "current": "Actual", - "date": "Date", + "date": "Data", "decline": "Declina", "default-avatar": "Avatar per defecte", "delete": "Esborra", @@ -152,10 +156,10 @@ "edit": "Edita", "edit-avatar": "Canvia Avatar", "edit-profile": "Edita el teu Perfil", - "editCardStartDatePopup-title": "Change start date", - "editCardDueDatePopup-title": "Change due date", + "editCardStartDatePopup-title": "Canvia data d'inici", + "editCardDueDatePopup-title": "Canvia data de finalització", "editLabelPopup-title": "Canvia etiqueta", - "editNotificationPopup-title": "Edit Notification", + "editNotificationPopup-title": "Edita la notificació", "editProfilePopup-title": "Edita teu Perfil", "email": "Correu electrònic", "email-enrollAccount-subject": "An account created for you on __siteName__", @@ -179,33 +183,33 @@ "error-user-doesNotExist": "L'usuari no existeix", "error-user-notAllowSelf": "Aquesta acció no està permesa", "error-user-notCreated": "L'usuari no s'ha creat", - "error-username-taken": "This username is already taken", - "export-board": "Export board", + "error-username-taken": "Aquest usuari ja existeix", + "export-board": "Exporta tauler", "filter": "Filtre", "filter-cards": "Fitxes de filtre", "filter-clear": "Elimina filtre", - "filter-no-label": "No label", - "filter-no-member": "No member", + "filter-no-label": "Sense etiqueta", + "filter-no-member": "Sense membres", "filter-on": "Filtra per", "filter-on-desc": "Estau filtrant fitxes en aquest tauler. Feu clic aquí per editar el filtre.", "filter-to-selection": "Filtra selecció", "fullname": "Nom complet", "header-logo-title": "Torna a la teva pàgina de taulers", - "hide-system-messages": "Hide system messages", + "hide-system-messages": "Oculta missatges del sistema", "home": "Inici", "import": "importa", "import-board": "Importa des de Trello", - "import-board-title": "Import board from Trello", + "import-board-title": "Importa tauler des de Trello", "import-board-trello-instruction": "En el teu tauler Trello, ves a 'Menú', 'Més'.' Imprimir i Exportar', 'Exportar JSON', i copia el text resultant.", "import-json-placeholder": "Aferra codi JSON vàlid aquí", - "import-map-members": "Map members", + "import-map-members": "Mapeja el membres", "import-members-map": "El tauler importat conté membres. Assigna els membres que vulguis importar a usuaris Wekan", "import-show-user-mapping": "Revisa l'assignació de membres", "import-user-select": "Selecciona l'usuari Wekan que vulguis associar a aquest membre", - "importMapMembersAddPopup-title": "Select Wekan member", + "importMapMembersAddPopup-title": "Selecciona un membre de Wekan", "info": "Informacions", "initials": "Inicials", - "invalid-date": "Invalid date", + "invalid-date": "Data invàlida", "joined": "s'ha unit", "just-invited": "Has estat convidat a aquest tauler", "keyboard-shortcuts": "Dreceres de teclat", @@ -225,20 +229,20 @@ "listImportCardPopup-title": "importa una fitxa de Trello", "lists": "Llistes", "log-out": "Finalitza la sessió", - "log-in": "Log In", + "log-in": "Ingresa", "loginPopup-title": "Inicia sessió", "memberMenuPopup-title": "Configura membres", "members": "Membres", "menu": "Menú", "move-selection": "Move selection", "moveCardPopup-title": "Moure fitxa", - "moveCardToBottom-title": "Move to Bottom", - "moveCardToTop-title": "Move to Top", + "moveCardToBottom-title": "Mou a la part inferior", + "moveCardToTop-title": "Mou a la part superior", "moveSelectionPopup-title": "Move selection", "multi-selection": "Multi-Selecció", "multi-selection-on": "Multi-Selecció està activada", - "muted": "Muted", - "muted-info": "You will never be notified of any changes in this board", + "muted": "En silenci", + "muted-info": "No seràs notificat dels canvis en aquest tauler", "my-boards": "Els meus taulers", "name": "Nom", "no-archived-cards": "No hi ha fitxes arxivades.", @@ -247,15 +251,15 @@ "normal": "Normal", "normal-desc": "Podeu veure i editar fitxes. No podeu canviar la configuració.", "not-accepted-yet": "La invitació no ha esta acceptada encara", - "notify-participate": "Receive updates to any cards you participate as creater or member", - "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "notify-participate": "Rebre actualitzacions per a cada fitxa de la qual n'ets creador o membre", + "notify-watch": "Rebre actualitzacions per qualsevol tauler, llista o fitxa en observació", "optional": "opcional", "or": "o", "page-maybe-private": "Aquesta pàgina és privada. Per veure-la entra .", "page-not-found": "Pàgina no trobada.", "password": "Contrasenya", "paste-or-dragdrop": "aferra, o estira i amolla la imatge (només imatge)", - "participating": "Participating", + "participating": "Participant", "preview": "Vista prèvia", "previewAttachedImagePopup-title": "Vista prèvia", "previewClipboardImagePopup-title": "Vista prèvia", @@ -268,8 +272,8 @@ "remove-cover": "Elimina coberta", "remove-from-board": "Elimina del tauler", "remove-label": "Eliminia etiqueta", + "remove-list": "Elimina la llista", "remove-member": "Elimina membre", - "remove-list": "Remove the list", "remove-member-from-card": "Elimina de la fitxa", "remove-member-pop": "Eliminar __name__ (__username__) de __boardTitle__ ? El membre serà eliminat de totes les fitxes d'aquest tauler. Ells rebran una notificació.", "removeMemberPopup-title": "Vols suprimir el membre?", @@ -288,7 +292,7 @@ "shortcut-show-shortcuts": "Mostra aquesta lista d'accessos directes", "shortcut-toggle-filterbar": "Canvia la barra lateral del tauler", "shortcut-toggle-sidebar": "Canvia Sidebar del Tauler", - "show-cards-minimum-count": "Show cards count if list contains more than", + "show-cards-minimum-count": "Mostra contador de fitxes si la llista en conté més de ", "signupPopup-title": "Crea un compte", "star-board-title": "Fes clic per destacar aquest tauler. Es mostrarà a la part superior de la llista de taulers.", "starred-boards": "Taulers destacats", @@ -297,24 +301,24 @@ "team": "Equip", "this-board": "aquest tauler", "this-card": "aquesta fitxa", - "time": "Time", + "time": "Hora", "title": "Títol", - "tracking": "Tracking", - "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "tracking": "En seguiment", + "tracking-info": "Seràs notificat per cada canvi a aquelles fitxes de les que n'eres creador o membre", "unassign-member": "Desassignar membre", "unsaved-description": "Tens una descripció sense desar.", - "unwatch": "Unwatch", + "unwatch": "Suprimeix observació", "upload": "Puja", "upload-avatar": "Actualitza avatar", "uploaded-avatar": "Avatar actualitzat", "username": "Nom d'Usuari", "view-it": "Vist", "warn-list-archived": "Avís: aquesta fitxa està en una llista arxivada", - "watch": "Watch", - "watching": "Watching", - "watching-info": "You will be notified of any change in this board", - "welcome-board": "Welcome Board", - "welcome-list1": "Basics", - "welcome-list2": "Advanced", + "watch": "Observa", + "watching": "En observació", + "watching-info": "Seràs notificat de cada canvi en aquest tauler", + "welcome-board": "Tauler de benvinguda", + "welcome-list1": "Bàsics", + "welcome-list2": "Avançades", "what-to-do": "Què vols fer?" } diff --git a/i18n/cs.i18n.json b/i18n/cs.i18n.json index d774022bb..495cd4e9c 100644 --- a/i18n/cs.i18n.json +++ b/i18n/cs.i18n.json @@ -36,10 +36,13 @@ "activity-removed": "odstraněn %s z %s", "activity-sent": "%s posláno na %s", "activity-unjoined": "odpojen %s", + "activity-checklist-added": "added checklist to %s", "add": "Přidat", "add-attachment": "Přidat přílohu", "add-board": "Přidat nové tablo", "add-card": "Přidat kartu", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "Přidat obal", "add-label": "Přidat štítek", "add-list": "Přidat seznam", @@ -115,6 +118,7 @@ "changePasswordPopup-title": "Změnit heslo", "changePermissionsPopup-title": "Změnit oprávnění", "changeSettingsPopup-title": "Change Settings", + "checklists": "Checklists", "click-to-star": "Kliknutím přidat hvězdičku tomuto tablu.", "click-to-unstar": "Kliknutím odebrat hvězdičku tomuto tablu.", "clipboard" : "Schránka nebo potáhnout a pustit", diff --git a/i18n/de.i18n.json b/i18n/de.i18n.json index 91bf9ebd2..197fbba78 100644 --- a/i18n/de.i18n.json +++ b/i18n/de.i18n.json @@ -36,10 +36,13 @@ "activity-removed": "hat %s von %s entfernt", "activity-sent": "hat %s an %s gesendet", "activity-unjoined": "hat %s verlassen", + "activity-checklist-added": "added checklist to %s", "add": "Hinzufügen", "add-attachment": "Anhang hinzufügen", "add-board": "Neues Board erstellen", "add-card": "Karte hinzufügen", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "Cover hinzufügen", "add-label": "Label hinzufügen", "add-list": "Liste hinzufügen", @@ -115,6 +118,7 @@ "changePasswordPopup-title": "Passwort ändern", "changePermissionsPopup-title": "Berechtigungen ändern", "changeSettingsPopup-title": "Einstellungen ändern", + "checklists": "Checklists", "click-to-star": "Klicken um dem Board einen Stern zu geben.", "click-to-unstar": "Klicken um den Stern von dem Board zu entfernen.", "clipboard" : "Zwischenablage oder Drag & Drop", diff --git a/i18n/es.i18n.json b/i18n/es.i18n.json index 09090b514..f98581266 100644 --- a/i18n/es.i18n.json +++ b/i18n/es.i18n.json @@ -1,23 +1,23 @@ { - "accept": "Accept", - "act-activity-notify": "[Wekan] Activity Notification", - "act-addAttachment": "attached __attachment__ to __card__", - "act-addComment": "commented on __card__: __comment__", - "act-createBoard": "created __board__", - "act-createCard": "added __card__ to __list__", - "act-createList": "added __list__ to __board__", - "act-addBoardMember": "added __member__ to __board__", - "act-archivedBoard": "archived __board__", - "act-archivedCard": "archived __card__", - "act-archivedList": "archived __list__", - "act-importBoard": "imported __board__", - "act-importCard": "imported __card__", - "act-importList": "imported __list__", - "act-joinMember": "added __member__ to __card__", - "act-moveCard": "moved __card__ from __oldList__ to __list__", - "act-removeBoardMember": "removed __member__ from __board__", - "act-restoredCard": "restored __card__ to __board__", - "act-unjoinMember": "removed __member__ from __card__", + "accept": "Aceptar", + "act-activity-notify": "[Wekan] Notificación de Actividad", + "act-addAttachment": "adjuntado __attachment__ a __card__", + "act-addComment": "comentado en __card__: __comment__", + "act-createBoard": "creado __board__", + "act-createCard": "añadido __card__ a __list__", + "act-createList": "añadido __list__ a __board__", + "act-addBoardMember": "añadido __member__ a __board__", + "act-archivedBoard": "__board__ archivado", + "act-archivedCard": "__card__ archivada", + "act-archivedList": "__list__ archivada", + "act-importBoard": "__board__ importado", + "act-importCard": "__card__ importada", + "act-importList": "__list__ importada", + "act-joinMember": "añadido __member__ to __card__", + "act-moveCard": "movida __card__ desde __oldList__ a __list__", + "act-removeBoardMember": "borrado __member__ de __board__", + "act-restoredCard": "restaurada __card__ en __board__", + "act-unjoinMember": "borrado __member__ de __card__", "act-withBoardTitle": "[Wekan] __board__", "act-withCardTitle": "[__board__] __card__", "actions": "Acciones", @@ -36,10 +36,13 @@ "activity-removed": "eliminado %s de %s", "activity-sent": "enviado %s a %s", "activity-unjoined": "unjoined %s", + "activity-checklist-added": "added checklist to %s", "add": "Añadir", "add-attachment": "Añadir un adjunto", "add-board": "Añadir un nuevo tablero", "add-card": "Add a card", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "Añadir cubierta", "add-label": "Add the label", "add-list": "Add a list", @@ -51,8 +54,8 @@ "all-boards": "Tableros", "and-n-other-card": "And __count__ other card", "and-n-other-card_plural": "And __count__ other cards", - "apply": "Apply", - "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", + "apply": "Aplicar", + "app-is-offline": "La aplicación esta actualmente fuera de servicio, refrescar la página causará pérdida de datos", "archive": "Guardar", "archive-all": "Guardar Todo", "archive-board": "Archive Board", @@ -62,13 +65,13 @@ "archiveBoardPopup-title": "Archive Board?", "archived-items": "Items archivados", "archives": "Archives", - "assign-member": "Assign member", + "assign-member": "Asignar miembros", "attached": "adjuntado", "attachment": "Adjunto", "attachment-delete-pop": "El borrado de un archivo adjunto es permanente. No se puede deshacer.", "attachmentDeletePopup-title": "¿Borrar adjunto?", "attachments": "Adjuntos", - "auto-watch": "Automatically watch boards when create it", + "auto-watch": "Vigilar tableros automáticamente cuando se crean", "avatar-too-big": "The avatar is too large (70Kb max)", "back": "Atrás", "board-change-color": "Cambiar color", @@ -79,7 +82,7 @@ "boardChangeColorPopup-title": "Change Board Background", "boardChangeTitlePopup-title": "Renombrar tablero", "boardChangeVisibilityPopup-title": "Cambiar visibilidad", - "boardChangeWatchPopup-title": "Change Watch", + "boardChangeWatchPopup-title": "Cambiar Vigilancia", "boardMenuPopup-title": "Board Menu", "boards": "Tableros", "bucket-example": "Like “Bucket List” for example", @@ -89,15 +92,15 @@ "card-delete-notice": "El borrado es permanente. Perderás todas las acciones asociadas a esta ficha.", "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.", - "card-due": "Due", - "card-due-on": "Due on", + "card-due": "Motivo", + "card-due-on": "Debido a", "card-edit-attachments": "Edit attachments", "card-edit-labels": "Edit labels", - "card-edit-members": "Edit members", + "card-edit-members": "Editar miembros", "card-labels-title": "Cambia las etiquetas de la ficha", "card-members-title": "Añadir o eliminar miembros del tablero desde la ficha.", - "card-start": "Start", - "card-start-on": "Starts on", + "card-start": "Empezar", + "card-start-on": "Empieza", "cardAttachmentsPopup-title": "Attach From", "cardDeletePopup-title": "¿Borrar ficha?", "cardDetailsActionsPopup-title": "Card Actions", @@ -109,12 +112,13 @@ "change-avatar": "Cambiar Avatar", "change-password": "Cambiar la clave", "change-permissions": "Cambiar permisos", - "change-settings": "Change Settings", + "change-settings": "Cambiar Preferencias", "changeAvatarPopup-title": "Cambiar Avatar", "changeLanguagePopup-title": "Cambiar idioma", "changePasswordPopup-title": "Cambiar la clave", "changePermissionsPopup-title": "Cambiar permisos", - "changeSettingsPopup-title": "Change Settings", + "changeSettingsPopup-title": "Cambiar Preferencias", + "checklists": "Checklists", "click-to-star": "Haz clic para destacar este tablero. ", "click-to-unstar": "Haz clic para dejar de destacar este tablero. ", "clipboard" : "Clipboard or drag & drop", @@ -138,7 +142,7 @@ "createBoardPopup-title": "Crear tablero", "createLabelPopup-title": "Crear etiqueta", "current": "actual", - "date": "Date", + "date": "Fecha", "decline": "Decline", "default-avatar": "Avatar por defecto", "delete": "Borrar", @@ -152,10 +156,10 @@ "edit": "Editar", "edit-avatar": "Cambiar Avatar", "edit-profile": "Edit Profile", - "editCardStartDatePopup-title": "Change start date", - "editCardDueDatePopup-title": "Change due date", + "editCardStartDatePopup-title": "Cambiar fecha de inicio", + "editCardDueDatePopup-title": "Cambiar fecha de motivo", "editLabelPopup-title": "Cambiar etiqueta", - "editNotificationPopup-title": "Edit Notification", + "editNotificationPopup-title": "Editar Notificación", "editProfilePopup-title": "Edit Profile", "email": "Correo electrónico", "email-enrollAccount-subject": "An account created for you on __siteName__", @@ -179,86 +183,86 @@ "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", - "error-username-taken": "This username is already taken", + "error-username-taken": "Este nombre de usuario ya está en uso ", "export-board": "Export board", "filter": "Filter", "filter-cards": "Fichas de filtro", "filter-clear": "Clear filter", - "filter-no-label": "No label", - "filter-no-member": "No member", - "filter-on": "Filter is on", + "filter-no-label": "Sin etiqueta", + "filter-no-member": "Sin miembro", + "filter-on": "Filtro activo", "filter-on-desc": "Estás filtrando fichas en este tablero. Haz clic aquí para editar el filtro.", "filter-to-selection": "Filter to selection", "fullname": "Nombre Completo", "header-logo-title": "Volver a tu página de tableros", - "hide-system-messages": "Hide system messages", + "hide-system-messages": "Ocultar los mensajes del sistema", "home": "Inicio", - "import": "Import", - "import-board": "import from Trello", - "import-board-title": "Import board from Trello", + "import": "Importar", + "import-board": "importar desde Trello", + "import-board-title": "Importar tablero desde Trello", "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text", "import-json-placeholder": "Paste your valid JSON data here", - "import-map-members": "Map members", + "import-map-members": "Mapa de miembros", "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users", "import-show-user-mapping": "Review members mapping", "import-user-select": "Pick the Wekan user you want to use as this member", - "importMapMembersAddPopup-title": "Select Wekan member", + "importMapMembersAddPopup-title": "Seleccionar un miembro de Wekan", "info": "Informaciones", - "initials": "Initials", - "invalid-date": "Invalid date", + "initials": "Iniciales", + "invalid-date": "Fecha no Válida", "joined": "se ha unido", "just-invited": "You are just invited to this board", - "keyboard-shortcuts": "Keyboard shortcuts", + "keyboard-shortcuts": "Atajos de teclado", "label-create": "Crear una etiqueta nueva ", "label-default": "%s etiqueta (por Defecto)", "label-delete-pop": "No se puede deshacer. Esto eliminará esta etiqueta de todas las fichas y destruirá su historia.", "labels": "Etiquetas", "language": "Idioma", "last-admin-desc": "No puedes cambiar roles porque debe haber al menos un administrador.", - "leave-board": "Leave Board", + "leave-board": "Dejar el Tablero", "link-card": "Enlace a esta ficha", "list-archive-cards": "Archive all cards in this list", "list-archive-cards-pop": "Esto eliminara todas las fichas de esta lista del tablero. Para ver fichas archivadas y recuperarlas en el tablero, haz clic en \"Menu\" / \"Artículos Archivados\".", "list-move-cards": "Move all cards in this list", "list-select-cards": "Select all cards in this list", "listActionPopup-title": "Acciones de la lista", - "listImportCardPopup-title": "Import a Trello card", - "lists": "Lists", + "listImportCardPopup-title": "Importar una tarjeta de Trello", + "lists": "Listas", "log-out": "Finalizar la sesion", - "log-in": "Log In", + "log-in": "Iniciar sesion", "loginPopup-title": "Iniciar sesion", - "memberMenuPopup-title": "Member Settings", + "memberMenuPopup-title": "Preferencias de Miembro", "members": "Miembros", "menu": "Menu", - "move-selection": "Move selection", + "move-selection": "Mover selección", "moveCardPopup-title": "Move Card", - "moveCardToBottom-title": "Move to Bottom", - "moveCardToTop-title": "Move to Top", - "moveSelectionPopup-title": "Move selection", - "multi-selection": "Multi-Selection", - "multi-selection-on": "Multi-Selection is on", - "muted": "Muted", - "muted-info": "You will never be notified of any changes in this board", + "moveCardToBottom-title": "Mover al Final", + "moveCardToTop-title": "Movel al Principio", + "moveSelectionPopup-title": "Mover selección", + "multi-selection": "Multi-Selección", + "multi-selection-on": "Multi-Selección activada", + "muted": "Silenciado", + "muted-info": "No serás notificado de ningún cambio en este tablero", "my-boards": "Mis tableros", "name": "Nombre", - "no-archived-cards": "No archived cards.", - "no-archived-lists": "No archived lists.", + "no-archived-cards": "No hay tarjetas archivadas.", + "no-archived-lists": "No hay listas archivadas.", "no-results": "Sin resultados", "normal": "Normal", "normal-desc": "Puedes ver y editar fichas. No puedes cambiar la configuración.", "not-accepted-yet": "Invitation not accepted yet", - "notify-participate": "Receive updates to any cards you participate as creater or member", - "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "notify-participate": "Recibir actualizaciones de cualquier tarjeta en la que participas como creador o miembro", + "notify-watch": "Recibir actuaizaciones de cualquier tablero, lista o tarjeta que estés vigilando", "optional": "opcional", - "or": "or", + "or": "o", "page-maybe-private": "Esta página puede ser privada. Puedes verla por logging in.", "page-not-found": "Página no encontrada.", "password": "Clave", "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", - "participating": "Participating", - "preview": "Preview", - "previewAttachedImagePopup-title": "Preview", - "previewClipboardImagePopup-title": "Preview", + "participating": "Participando", + "preview": "Previsualizar", + "previewAttachedImagePopup-title": "Previsualizar", + "previewClipboardImagePopup-title": "Previsualizar", "private": "Privado", "private-desc": "Este tablero es privado. Sólo las personas añadidas al tablero pueden verlo y editarlo.", "profile": "Perfil", @@ -266,8 +270,8 @@ "public-desc": "Este tablero es público. Es visible para cualquier persona con el enlace y se mostrará en los motores de búsqueda como Google. Sólo personas añadidas al tablero pueden editarlo.", "quick-access-description": "Star a board to add a shortcut in this bar.", "remove-cover": "Eliminar cubierta", - "remove-from-board": "Remove from Board", - "remove-label": "Remove the label", + "remove-from-board": "Borrar del Tablero", + "remove-label": "Borrar la etiqueta", "remove-list": "Remove the list", "remove-member": "Eliminar Miembro", "remove-member-from-card": "Eliminar de la Ficha", @@ -275,46 +279,46 @@ "removeMemberPopup-title": "¿Eliminar miembro?", "rename": "Renombrar", "rename-board": "Renombrar tablero", - "restore": "Restore", + "restore": "Restaurar", "save": "Guardar", "search": "Buscar", "select-color": "Selecciona un color", - "shortcut-assign-self": "Assign yourself to current card", - "shortcut-autocomplete-emoji": "Autocomplete emoji", - "shortcut-autocomplete-members": "Autocomplete members", - "shortcut-clear-filters": "Clear all filters", - "shortcut-close-dialog": "Close Dialog", - "shortcut-filter-my-cards": "Filter my cards", + "shortcut-assign-self": "Asignarte a ti mismo a la tarjeta actual", + "shortcut-autocomplete-emoji": "Autocompletar emoji", + "shortcut-autocomplete-members": "Autocompletar miembros", + "shortcut-clear-filters": "Limpiar todos los filtros", + "shortcut-close-dialog": "Cerrar Diálogo", + "shortcut-filter-my-cards": "Filtrar mis tarjetas", "shortcut-show-shortcuts": "Bring up this shortcuts list", "shortcut-toggle-filterbar": "Toggle Filter Sidebar", "shortcut-toggle-sidebar": "Toggle Board Sidebar", - "show-cards-minimum-count": "Show cards count if list contains more than", + "show-cards-minimum-count": "Mostrar recuento de tarjetas si la lista contiene más de", "signupPopup-title": "Crear una Cuenta", "star-board-title": "Haz clic para destacar este tablero. Se mostrará en la parte superior de tu lista de tableros.", "starred-boards": "Tableros Destacados", "starred-boards-description": "Los tableros destacados se mostrarán en la parte superior de tu lista de tableros.", - "subscribe": "Suscribe", + "subscribe": "Suscribirse", "team": "Equipo", "this-board": "este tablero", "this-card": "esta ficha", - "time": "Time", + "time": "Hora", "title": "Título", - "tracking": "Tracking", - "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", - "unassign-member": "Unassign member", - "unsaved-description": "You have an unsaved description.", - "unwatch": "Unwatch", - "upload": "Upload", - "upload-avatar": "Upload an avatar", - "uploaded-avatar": "Uploaded an avatar", + "tracking": "Seguimiento", + "tracking-info": "Serás notificado de cualquier cambio en las tarjetas que estás envuelto como creador o miembro.", + "unassign-member": "Desasignar miembro", + "unsaved-description": "Tienes unas descripción no guardada.", + "unwatch": "Dejar de vigilar", + "upload": "Cargar", + "upload-avatar": "Cargar un avatar", + "uploaded-avatar": "Avatar cargado", "username": "Nombre de Usuario", - "view-it": "View it", + "view-it": "Verlo", "warn-list-archived": "warning: this card is in an archived list", - "watch": "Watch", - "watching": "Watching", - "watching-info": "You will be notified of any change in this board", - "welcome-board": "Welcome Board", - "welcome-list1": "Basics", - "welcome-list2": "Advanced", + "watch": "Vigilar", + "watching": "Vigilando", + "watching-info": "Serás notificado de cualquier cambio en este tablero", + "welcome-board": "Tablero de Bienvenida", + "welcome-list1": "Basicos", + "welcome-list2": "Avanzados", "what-to-do": "What do you want to do?" } diff --git a/i18n/fa.i18n.json b/i18n/fa.i18n.json index bef0935fa..30e5a4784 100644 --- a/i18n/fa.i18n.json +++ b/i18n/fa.i18n.json @@ -36,10 +36,13 @@ "activity-removed": "%s از %s حذف شد", "activity-sent": "ارسال %s به %s", "activity-unjoined": "جداسازی %s", + "activity-checklist-added": "added checklist to %s", "add": "افزودن", "add-attachment": "افزودن ضمیمه", "add-board": "افزودن برد جدید", "add-card": "افزودن کارت", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "افزودن کاور", "add-label": "افزودن برچسب", "add-list": "افزودن لیست", @@ -115,6 +118,7 @@ "changePasswordPopup-title": "تغییر کلمه عبور", "changePermissionsPopup-title": "تغییر دسترسی ها", "changeSettingsPopup-title": "Change Settings", + "checklists": "Checklists", "click-to-star": "جهت افزودن ستاره کلیک کنید .", "click-to-unstar": "جهت کاهش ستاره کلیک کنید.", "clipboard" : "ذخیره در حافظه ویا بکش-رهاکن", @@ -268,6 +272,7 @@ "remove-cover": "حذف کاور", "remove-from-board": "حذف از برد", "remove-label": "حذف برچسب", + "remove-list": "Remove the list", "remove-member": "حذف عضو", "remove-member-from-card": "حذف از کارت", "remove-member-pop": "آیا می خواهید __Name__ (__username__) را از __boardTitle__ حذف کنید? کاربر از تمام کارت ها در این تخته حذف خواهد شد و به آنها اطلاع رسانی خواهد شد.", diff --git a/i18n/fi.i18n.json b/i18n/fi.i18n.json index e43b01771..bb41ce60c 100644 --- a/i18n/fi.i18n.json +++ b/i18n/fi.i18n.json @@ -36,10 +36,13 @@ "activity-removed": "poistettu %s kohteesta %s", "activity-sent": "lähetetty %s kohteeseen %s", "activity-unjoined": "peruttu %s liityminen", + "activity-checklist-added": "lisätty tarkistuslista kohteeseen %s", "add": "Lisää", "add-attachment": "Lisää liitetiedosto", "add-board": "Lisää uusi taulu", "add-card": "Lisää kortti", + "add-checklist": "Lisää tarkistuslista", + "add-checklist-item": "Lisää kohde tarkistuslistaan", "add-cover": "Lisää kansi", "add-label": "Lisää tunniste", "add-list": "Lisää lista", @@ -115,6 +118,7 @@ "changePasswordPopup-title": "Vaihda salasana", "changePermissionsPopup-title": "Muokkaa oikeuksia", "changeSettingsPopup-title": "Muokkaa asetuksia", + "checklists": "Tarkistuslistat", "click-to-star": "Klikkaa merkataksesi tämä taulu tähdellä.", "click-to-unstar": "Klikkaa poistaaksesi tähtimerkintä taululta.", "clipboard" : "Leikepöytä tai raahaa ja pudota", @@ -268,7 +272,7 @@ "remove-cover": "Poista kansi", "remove-from-board": "Poista taululta", "remove-label": "Poista tunniste", - "remove-list": "Remove the list", + "remove-list": "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.", diff --git a/i18n/fr.i18n.json b/i18n/fr.i18n.json index 4304f15f4..9cc2f6b59 100644 --- a/i18n/fr.i18n.json +++ b/i18n/fr.i18n.json @@ -33,13 +33,16 @@ "activity-joined": "a rejoint %s", "activity-moved": "a déplacé %s depuis %s vers %s", "activity-on": "sur %s", - "activity-removed": "a supprimé %s de %s", + "activity-removed": "a supprimé %s vers %s", "activity-sent": "a envoyé %s vers %s", "activity-unjoined": "a quitté %s", + "activity-checklist-added": "added checklist to %s", "add": "Ajouter", "add-attachment": "Joindre un fichier", "add-board": "Ajouter un nouveau tableau", "add-card": "Ajouter une carte", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "Ajouter la couverture", "add-label": "Ajouter une étiquette", "add-list": "Ajouter une liste", @@ -115,6 +118,7 @@ "changePasswordPopup-title": "Changer le mot de passe", "changePermissionsPopup-title": "Changer les permissions", "changeSettingsPopup-title": "Change Settings", + "checklists": "Checklists", "click-to-star": "Cliquez pour ajouter ce tableau aux favoris.", "click-to-unstar": "Cliquez pour retirer ce tableau des favoris.", "clipboard" : "Presse-papier ou glisser-déposer", diff --git a/i18n/he.i18n.json b/i18n/he.i18n.json index 2a3863164..c3e18a667 100644 --- a/i18n/he.i18n.json +++ b/i18n/he.i18n.json @@ -36,10 +36,13 @@ "activity-removed": "%s הוסר מ%s", "activity-sent": "%s נשלח ל%s", "activity-unjoined": "בטל צירוף %s", + "activity-checklist-added": "added checklist to %s", "add": "הוסף", "add-attachment": "הוסף קובץ", "add-board": "הוסף לוח חדש", "add-card": "הוסף כרטיס", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "הוסף כיסוי", "add-label": "הוסף תווית", "add-list": "הוסף רשימה", @@ -115,6 +118,7 @@ "changePasswordPopup-title": "שנה סיסמא", "changePermissionsPopup-title": "שנה הרשאות", "changeSettingsPopup-title": "Change Settings", + "checklists": "Checklists", "click-to-star": "לחץ להוספת הלוח למועדפים", "click-to-unstar": "לחץ להסרת הלוח מהמועדפים.", "clipboard" : "Clipboard or drag & drop", diff --git a/i18n/it.i18n.json b/i18n/it.i18n.json index 45036fce3..b67aa2ede 100755 --- a/i18n/it.i18n.json +++ b/i18n/it.i18n.json @@ -36,10 +36,13 @@ "activity-removed": "rimosso %s da %s", "activity-sent": "inviato %s a %s", "activity-unjoined": "ha abbandonato %s", + "activity-checklist-added": "added checklist to %s", "add": "Aggiungere", "add-attachment": "Aggiungi allegato", "add-board": "Aggiungi una nuova bachecha", "add-card": "Aggiungi una scheda", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "Aggiungi copertina", "add-label": "Aggiungi l'etichetta", "add-list": "Aggiungi una lista", @@ -79,10 +82,10 @@ "boardChangeColorPopup-title": "Cambia sfondo della bacheca", "boardChangeTitlePopup-title": "Rinomina bacheca", "boardChangeVisibilityPopup-title": "Cambia visibilità", - "boardChangeWatchPopup-title": "Change Watch", + "boardChangeWatchPopup-title": "Cambia faccia", "boardMenuPopup-title": "Menu bacheca", "boards": "Bacheche", - "bucket-example": "Like “Bucket List” for example", + "bucket-example": "Per esempio come \"una lista di cose da fare\"", "cancel": "Cancella", "card-archived": "Questa scheda è archiviata.", "card-comments-title": "Questa scheda ha %s commenti.", @@ -115,6 +118,7 @@ "changePasswordPopup-title": "Cambia password", "changePermissionsPopup-title": "Cambia permessi", "changeSettingsPopup-title": "Cambia impostazioni", + "checklists": "Checklists", "click-to-star": "Clicca per stellare questa bacheca", "click-to-unstar": "Clicca per togliere la stella da questa bacheca", "clipboard" : "Clipboard o drag & drop", @@ -137,15 +141,15 @@ "create": "Crea", "createBoardPopup-title": "Crea bacheca", "createLabelPopup-title": "Crea etichetta", - "current": "current", + "current": "corrente", "date": "Data", "decline": "Declina", "default-avatar": "Avatar predefinito", "delete": "Elimina", "deleteLabelPopup-title": "Eliminare etichetta?", "description": "Descrizione", - "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", - "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "disambiguateMultiLabelPopup-title": "Disambiguare l'azione Etichetta", + "disambiguateMultiMemberPopup-title": "Disambiguare l'azione Membro", "discard": "Scarta", "done": "Fatto", "download": "Download", @@ -177,8 +181,8 @@ "error-json-schema": "Il tuo file JSON non contiene le giuste informazioni nel formato corretto", "error-list-doesNotExist": "Questa lista non esiste", "error-user-doesNotExist": "Questo utente non esiste", - "error-user-notAllowSelf": "This action on self is not allowed", - "error-user-notCreated": "This user is not created", + "error-user-notAllowSelf": "Questa azione su se stessa non è permessa", + "error-user-notCreated": "L'utente non è stato creato", "error-username-taken": "Questo username è già utilizzato", "export-board": "Esporta bacheca", "filter": "Filtra", @@ -198,10 +202,10 @@ "import-board-title": "Importa una bacheca da Trello", "import-board-trello-instruction": "Nella tua bacheca Trello vai a 'Menu', poi 'Altro', 'Stampa ed esporta', 'Esporta JSON', e copia il testo che compare.", "import-json-placeholder": "Incolla un JSON valido qui", - "import-map-members": "Map members", - "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users", - "import-show-user-mapping": "Review members mapping", - "import-user-select": "Pick the Wekan user you want to use as this member", + "import-map-members": "Mappatura dei membri", + "import-members-map": "La bacheca che hai importato ha alcuni membri. Per favore scegli i membri che vuoi vengano importati negli utenti di Wekan", + "import-show-user-mapping": "Rivedi la mappatura dei membri", + "import-user-select": "Scegli l'utente Wekan che vuoi utilizzare come questo membro", "importMapMembersAddPopup-title": "Seleziona i membri di Wekan", "info": "Info", "initials": "Iniziali", @@ -286,8 +290,8 @@ "shortcut-close-dialog": "Chiudi finestra di dialogo", "shortcut-filter-my-cards": "Filtra le mie schede", "shortcut-show-shortcuts": "Porta in alto questa lista di scorciatoie", - "shortcut-toggle-filterbar": "Toggle Filter Sidebar", - "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "shortcut-toggle-filterbar": "Attiva il filtro nella barra laterale", + "shortcut-toggle-sidebar": "Attiva la bacheca nella barra laterale", "show-cards-minimum-count": "Mostra il contatore delle schede se la lista ne contiene più di", "signupPopup-title": "Crea un account", "star-board-title": "Clicca per stellare questa bacheca. Sarà mostrata all'inizio della tua lista bacheche.", diff --git a/i18n/ja.i18n.json b/i18n/ja.i18n.json index e44e36afd..529795446 100644 --- a/i18n/ja.i18n.json +++ b/i18n/ja.i18n.json @@ -36,10 +36,13 @@ "activity-removed": "%s を %s から削除しました", "activity-sent": "%s を %s に送りました", "activity-unjoined": "unjoined %s", + "activity-checklist-added": "added checklist to %s", "add": "追加", "add-attachment": "Add an attachment", "add-board": "ボード追加", "add-card": "Add a card", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "カバーの追加", "add-label": "Add the label", "add-list": "Add a list", @@ -51,8 +54,8 @@ "all-boards": "All boards", "and-n-other-card": "And __count__ other card", "and-n-other-card_plural": "And __count__ other cards", - "apply": "Apply", - "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", + "apply": "適用", + "app-is-offline": "現在オフラインです。ページを更新すると保存していないデータは失われます。", "archive": "アーカイブ", "archive-all": "すべてをアーカイブ", "archive-board": "Archive Board", @@ -68,7 +71,7 @@ "attachment-delete-pop": "添付ファイルの削除をすると取り消しできません。", "attachmentDeletePopup-title": "添付ファイルを削除しますか?", "attachments": "添付ファイル", - "auto-watch": "Automatically watch boards when create it", + "auto-watch": "作成したボードは自動的に監視する", "avatar-too-big": "The avatar is too large (70Kb max)", "back": "戻る", "board-change-color": "Change color", @@ -89,14 +92,14 @@ "card-delete-notice": "削除は取り消しできません。このカードに関係するすべてのアクションがなくなります。", "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.", - "card-due": "Due", + "card-due": "期限", "card-due-on": "Due on", "card-edit-attachments": "Edit attachments", "card-edit-labels": "Edit labels", "card-edit-members": "Edit members", "card-labels-title": "カードのラベルを変更する", "card-members-title": "カードからボードメンバーを追加・削除する", - "card-start": "Start", + "card-start": "開始", "card-start-on": "Starts on", "cardAttachmentsPopup-title": "Attach From", "cardDeletePopup-title": "カードを削除しますか?", @@ -109,12 +112,13 @@ "change-avatar": "アバターの変更", "change-password": "パスワードの変更", "change-permissions": "Change permissions", - "change-settings": "Change Settings", + "change-settings": "設定の変更", "changeAvatarPopup-title": "アバターの変更", "changeLanguagePopup-title": "言語の変更", "changePasswordPopup-title": "パスワードの変更", "changePermissionsPopup-title": "パーミッションの変更", - "changeSettingsPopup-title": "Change Settings", + "changeSettingsPopup-title": "設定の変更", + "checklists": "Checklists", "click-to-star": "ボードにスターをつける", "click-to-unstar": "ボードからスターを外す", "clipboard" : "Clipboard or drag & drop", @@ -179,7 +183,7 @@ "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", - "error-username-taken": "This username is already taken", + "error-username-taken": "このユーザ名は既に使用されています", "export-board": "Export board", "filter": "Filter", "filter-cards": "カードをフィルターする", diff --git a/i18n/ko.i18n.json b/i18n/ko.i18n.json index f9c291cad..a7284d369 100644 --- a/i18n/ko.i18n.json +++ b/i18n/ko.i18n.json @@ -36,10 +36,13 @@ "activity-removed": "%s를 %s에서 삭제함", "activity-sent": "%s를 %s로 보냄", "activity-unjoined": "unjoined %s", + "activity-checklist-added": "added checklist to %s", "add": "추가", "add-attachment": "Add an attachment", "add-board": "새로운 보드를 추가", "add-card": "Add a card", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "커버 추가", "add-label": "Add the label", "add-list": "Add a list", @@ -115,6 +118,7 @@ "changePasswordPopup-title": "암호 변경", "changePermissionsPopup-title": "권한 변경", "changeSettingsPopup-title": "Change Settings", + "checklists": "Checklists", "click-to-star": "보드 별 추가.", "click-to-unstar": "보드 별 삭제.", "clipboard" : "Clipboard or drag & drop", diff --git a/i18n/pl.i18n.json b/i18n/pl.i18n.json index 5168fa6eb..800388fdc 100644 --- a/i18n/pl.i18n.json +++ b/i18n/pl.i18n.json @@ -36,10 +36,13 @@ "activity-removed": "usunięto %s z %s", "activity-sent": "wysłano %s z %s", "activity-unjoined": "odłączono %s", + "activity-checklist-added": "added checklist to %s", "add": "Dodaj", "add-attachment": "Dodaj załącznik", "add-board": "Dodaj nową tablicę", "add-card": "Dodaj kartę", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "Dodaj okładkę", "add-label": "Dodaj etykietę", "add-list": "Dodaj listę", @@ -115,6 +118,7 @@ "changePasswordPopup-title": "Zmień hasło", "changePermissionsPopup-title": "Zmień uprawnienia", "changeSettingsPopup-title": "Change Settings", + "checklists": "Checklists", "click-to-star": "Kliknij by odznaczyć tę tablicę.", "click-to-unstar": "Kliknij by usunąć odznaczenie tej tablicy.", "clipboard" : "Schowek lub przeciągnij & upuść", diff --git a/i18n/pt-BR.i18n.json b/i18n/pt-BR.i18n.json index cc4fcd34a..9e0018ddf 100644 --- a/i18n/pt-BR.i18n.json +++ b/i18n/pt-BR.i18n.json @@ -36,10 +36,13 @@ "activity-removed": "removeu %s de %s", "activity-sent": "enviou %s de %s", "activity-unjoined": "saiu de %s", + "activity-checklist-added": "added checklist to %s", "add": "Novo", "add-attachment": "Adicionar um anexo", "add-board": "Criar um quadro novo", "add-card": "Adicionar um cartão", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "Adicionar Capa", "add-label": "Adicionar a Etiqueta", "add-list": "Adicionar uma lista", @@ -115,6 +118,7 @@ "changePasswordPopup-title": "Alterar Senha", "changePermissionsPopup-title": "Alterar Permissões", "changeSettingsPopup-title": "Change Settings", + "checklists": "Checklists", "click-to-star": "Marcar quadro como favorito.", "click-to-unstar": "Remover quadro dos favoritos.", "clipboard" : "Área de Transferência ou arraste e solte", diff --git a/i18n/ro.i18n.json b/i18n/ro.i18n.json index ec7f55dec..feb955043 100644 --- a/i18n/ro.i18n.json +++ b/i18n/ro.i18n.json @@ -36,10 +36,13 @@ "activity-removed": "removed %s from %s", "activity-sent": "sent %s to %s", "activity-unjoined": "unjoined %s", + "activity-checklist-added": "added checklist to %s", "add": "Add", "add-attachment": "Add an attachment", "add-board": "Add a new board", "add-card": "Add a card", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "Add Cover", "add-label": "Add the label", "add-list": "Add a list", @@ -115,6 +118,7 @@ "changePasswordPopup-title": "Change Password", "changePermissionsPopup-title": "Change Permissions", "changeSettingsPopup-title": "Change Settings", + "checklists": "Checklists", "click-to-star": "Click to star this board.", "click-to-unstar": "Click to unstar this board.", "clipboard" : "Clipboard or drag & drop", @@ -268,6 +272,7 @@ "remove-cover": "Remove Cover", "remove-from-board": "Remove from Board", "remove-label": "Remove the label", + "remove-list": "Remove the list", "remove-member": "Remove Member", "remove-member-from-card": "Remove from Card", "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", diff --git a/i18n/ru.i18n.json b/i18n/ru.i18n.json index 0c1903d35..400352eec 100644 --- a/i18n/ru.i18n.json +++ b/i18n/ru.i18n.json @@ -36,10 +36,13 @@ "activity-removed": "удалено %s из %s", "activity-sent": "отправлено %s в %s", "activity-unjoined": "вышел из %s", + "activity-checklist-added": "added checklist to %s", "add": "Создать", "add-attachment": "Добавить вложение", "add-board": "Создать новую доску", "add-card": "Добавить карточку", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "Прикрепить", "add-label": "Добавить метку", "add-list": "Добавить список", @@ -115,6 +118,7 @@ "changePasswordPopup-title": "Изменить пароль", "changePermissionsPopup-title": "Изменить настройки доступа", "changeSettingsPopup-title": "Change Settings", + "checklists": "Checklists", "click-to-star": "Добавить в «Избранное»", "click-to-unstar": "Удалить из «Избранного»", "clipboard" : "Буфер обмена или drag & drop", diff --git a/i18n/sr.i18n.json b/i18n/sr.i18n.json index e3d4dd0ea..49e7bd1ab 100644 --- a/i18n/sr.i18n.json +++ b/i18n/sr.i18n.json @@ -36,10 +36,13 @@ "activity-removed": "uklonio %s iz %s", "activity-sent": "poslao %s %s-u", "activity-unjoined": "rastavio %s", + "activity-checklist-added": "added checklist to %s", "add": "Dodaj", "add-attachment": "Dodaj dokument", "add-board": "Dodaj novu tablu", "add-card": "Dodaj karticu", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "Dodaj zaglavlje", "add-label": "Dodaj natpis", "add-list": "Dodaj listu", @@ -115,6 +118,7 @@ "changePasswordPopup-title": "Change Password", "changePermissionsPopup-title": "Change Permissions", "changeSettingsPopup-title": "Change Settings", + "checklists": "Checklists", "click-to-star": "Click to star this board.", "click-to-unstar": "Click to unstar this board.", "clipboard" : "Clipboard or drag & drop", @@ -268,6 +272,7 @@ "remove-cover": "Remove Cover", "remove-from-board": "Ukloni iz table", "remove-label": "Ukloni natpis", + "remove-list": "Remove the list", "remove-member": "Ukloni člana", "remove-member-from-card": "Ukloni iz kartice", "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", diff --git a/i18n/tr.i18n.json b/i18n/tr.i18n.json index f5ef82ccc..7f79436f2 100644 --- a/i18n/tr.i18n.json +++ b/i18n/tr.i18n.json @@ -36,10 +36,13 @@ "activity-removed": "removed %s from %s", "activity-sent": "sent %s to %s", "activity-unjoined": "unjoined %s", + "activity-checklist-added": "added checklist to %s", "add": "Ekle", "add-attachment": "Add an attachment", "add-board": "Yeni bir pano ekle", "add-card": "Add a card", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "Add Cover", "add-label": "Add the label", "add-list": "Add a list", @@ -115,6 +118,7 @@ "changePasswordPopup-title": "Parola Değiştir", "changePermissionsPopup-title": "Yetkileri Değiştirme", "changeSettingsPopup-title": "Change Settings", + "checklists": "Checklists", "click-to-star": "Bu panoyu yıldızlamak için tıkla.", "click-to-unstar": "Bu panunun yıldızını kaldırmak için tıkla.", "clipboard" : "Clipboard or drag & drop", diff --git a/i18n/zh-CN.i18n.json b/i18n/zh-CN.i18n.json index 91fd4f6aa..8947cc4a8 100644 --- a/i18n/zh-CN.i18n.json +++ b/i18n/zh-CN.i18n.json @@ -36,10 +36,13 @@ "activity-removed": "从 %s 中移除 %s", "activity-sent": "发送 %s 至 %s", "activity-unjoined": "已解除 %s 关联", + "activity-checklist-added": "added checklist to %s", "add": "添加", "add-attachment": "添加附件", "add-board": "添加新看板", "add-card": "添加卡片", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "添加封面", "add-label": "添加标签", "add-list": "添加清单", @@ -115,6 +118,7 @@ "changePasswordPopup-title": "更改密码", "changePermissionsPopup-title": "更改权限", "changeSettingsPopup-title": "更改设置", + "checklists": "Checklists", "click-to-star": "点此来标记该看板", "click-to-unstar": "点此来去除该看板的标记", "clipboard" : "剪贴板或者拖放文件", @@ -152,8 +156,8 @@ "edit": "编辑", "edit-avatar": "更改头像", "edit-profile": "编辑资料", - "editCardStartDatePopup-title": "更改起始日期", - "editCardDueDatePopup-title": "更改到期日期", + "editCardStartDatePopup-title": "修改起始日期", + "editCardDueDatePopup-title": "修改截止日期", "editLabelPopup-title": "更改标签", "editNotificationPopup-title": "编辑通知", "editProfilePopup-title": "编辑资料", diff --git a/i18n/zh-TW.i18n.json b/i18n/zh-TW.i18n.json index 3f5a4dc4b..6855d9cb5 100644 --- a/i18n/zh-TW.i18n.json +++ b/i18n/zh-TW.i18n.json @@ -36,10 +36,13 @@ "activity-removed": "移除 %s 從 %s 中", "activity-sent": "寄送 %s 至 %s", "activity-unjoined": "解除關聯 %s", + "activity-checklist-added": "added checklist to %s", "add": "新增", "add-attachment": "新增附件", "add-board": "新增看板", "add-card": "新增卡片", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "新增封面", "add-label": "新增標籤", "add-list": "新增清單", @@ -115,6 +118,7 @@ "changePasswordPopup-title": "更改密碼", "changePermissionsPopup-title": "更改許可權", "changeSettingsPopup-title": "更改設定", + "checklists": "Checklists", "click-to-star": "點此來標記該看板", "click-to-unstar": "點此來去除該看板的標記", "clipboard" : "剪貼簿貼上或者拖曳檔案", From b8f555ab2221ef90ec6012509ae3765a2dbb3a92 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 3 Feb 2017 13:12:13 +0200 Subject: [PATCH 120/136] Update README and CHANGELOG --- CHANGELOG.md | 35 +++++++++++++++++++++++++++++++++++ README.md | 23 ++++++++++++++--------- 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 979fb7c9e..6d1deb86f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,38 @@ +# v0.11.1 Upcoming Wekan release + +2017-01-29 mquandalle gave Wekan access to xet7, +so at 2017-01-31 xet7 started merging Wefork back to Wekan. +At 2017-02-03 all Wefork code and pull requests are now +merged back to Wekan. + +This release adds the following supported platforms: + +* Docker; +* Docker on SLES12SP1. + +and adds the following new features: + +* Checklists; +* Remove a list. + +and fixes the following bugs: + +* Typos in boards.js and boardHeader.js; +* Build warning in jade template; +* Using older version of MongoDB because of newer + version breaks uploading files and avatars. + +and adds the following new documentation to Wefork wiki, +to be moved to Wekan wiki: + +* Developer Documentation +* Docker +* Docker NginxProxy + +Thanks to GitHub users BaobabCoder, jLouzado, lkisme, mario-orlicky, +martingabelmann, mquandalle, stephenmoloney, umbertooo, xet7 and +qge for their contributions. + # v0.11.0 2016-12-16 Wekan fork first release This release adds the following new features: diff --git a/README.md b/README.md index 9d0f8235d..483b11f30 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,10 @@ # Wekan -[![Join the chat][gitter_badge]][gitter_chat] +[![JOIN OFFICIAL WEKAN CHAT][gitter_badge]][gitter_chat] -2017-01-31 News: Wekan fork/Wefork is being merged back to official Wekan. +2017-02-03 News: All Wekan fork/Wefork code and pull requests has been +merged back to official Wekan. Wefork will not accept new pull requests +and issues to Wefork. All development happens on Wekan. [Wefork announcement and merging back][fork_announcement] @@ -12,9 +14,9 @@ [Wefork FAQ][fork_faq] -[Newer Wefork translations at Transifex][translate_wefork] +[Translate Wekan using newer Wefork translations at Transifex][translate_wefork] -[Wekan at Transifex][translate_wekan] +[Not in use yet: Old Wekan translations at Transifex][translate_wekan] Wekan is an open-source and collaborative kanban board application. @@ -37,8 +39,8 @@ Newer [Wefork GitHub issues][wefork_issues] will be be moved to there also. [![Screenshot of Wefork][screenshot_wefork]][roadmap_wefork] Wekan supports most features you would expect of it including a real-time user -interface, cards comments, member assignations, customizable labels, filtered -views, and more. +interface, cards comments, checklists, member assignations, customizable labels, +closing lists, filtered views, and more. Since it is a free software, you don’t have to trust us with your data and can install Wekan on your own computer or server. In fact we encourage you to do @@ -46,9 +48,8 @@ that by providing one-click installation on various platforms. ## Supported Platforms -[Install from source][install_source] - -[VirtualBox][virtualbox] +Newest features are already at dockerhub images by automatically generated +trusted build. Other platforms are not up-to-date yet. ### Docker: [Docker image][docker_image], [Docs][docker_docs], [Docker Nginx proxy][docker_nginxproxy], [Docker Issue][docker_issue] @@ -83,6 +84,10 @@ docker run -d --restart=always --name wekan --link "wekan-db:db" -e "MONGO_URL=m [Docker on SUSE Linux Enterprise Server 12 SP1][sles] +[Install from source][install_source] + +[VirtualBox][virtualbox] + [Debian Wheezy 64bit][debian_wheezy] [![Deploy][heroku_button]][heroku_deploy] From 3e2883b9df47fe66f10a99310bdf226e4981dad3 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 4 Feb 2017 13:47:43 +0200 Subject: [PATCH 121/136] Moved all Wefork translations to Wekan. --- README.md | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 483b11f30..7eb829d74 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,9 @@ [![JOIN OFFICIAL WEKAN CHAT][gitter_badge]][gitter_chat] -2017-02-03 News: All Wekan fork/Wefork code and pull requests has been -merged back to official Wekan. Wefork will not accept new pull requests -and issues to Wefork. All development happens on Wekan. +2017-02-04 News: All Wekan fork/Wefork code, pull requests and translations +has been merged back to official Wekan. Wefork will not accept new pull +requests and issues to Wefork. All development happens on Wekan. [Wefork announcement and merging back][fork_announcement] @@ -14,9 +14,7 @@ and issues to Wefork. All development happens on Wekan. [Wefork FAQ][fork_faq] -[Translate Wekan using newer Wefork translations at Transifex][translate_wefork] - -[Not in use yet: Old Wekan translations at Transifex][translate_wekan] +[Translate Wekan at Transifex][translate_wekan] Wekan is an open-source and collaborative kanban board application. @@ -156,6 +154,5 @@ with [Meteor](https://www.meteor.com). [docker_nginxproxy]: https://github.com/wefork/wekan/wiki/Docker-NginxProxy [docker_issue]: https://github.com/wefork/wekan/issues/33 [translate_wekan]: https://www.transifex.com/wekan/wekan/ -[translate_wefork]: https://www.transifex.com/wefork/wefork/ [autoinstall]: https://github.com/wefork/wekan-autoinstall [autoinstall_issue]: https://github.com/anselal/wekan/issues/18 From 09c22eaa55c3d97133f32c78f5d4dc51c0f664e1 Mon Sep 17 00:00:00 2001 From: Joel L Date: Sat, 4 Feb 2017 13:54:47 +0200 Subject: [PATCH 122/136] tweaked .gitignore to exclude .build/* --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index dd2671fba..257d8a853 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ tmp/ node_modules/ .vscode/ +.build/* \ No newline at end of file From ac6ae7607ebdbedf0386be800a4ee3af69cfb368 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sun, 5 Feb 2017 20:23:19 +0200 Subject: [PATCH 123/136] Documentation has been moved to Wekan wiki. --- Contributing.md | 61 ++----------------------------------------------- 1 file changed, 2 insertions(+), 59 deletions(-) diff --git a/Contributing.md b/Contributing.md index a6da0cb0e..82440260b 100644 --- a/Contributing.md +++ b/Contributing.md @@ -1,62 +1,5 @@ # Contributing -We’re glad you’re interested in helping the Wekan project! We welcome bug -reports, enhancement ideas, and pull requests, in our GitHub bug tracker. Before -opening a new thread please verify that your issue hasn’t already been reported. +Please see wiki for all documentation: - - -## Security Disclosure - -Security is very important to us. If discover any issue regarding security, -please disclose the information responsibly by sending an email to -security@wekan.io and not by creating a GitHub issue. - -## Translations - -You are encouraged to translate (or improve the translation of) Wekan in your -locale language. For that purpose we rely on -[Transifex](https://www.transifex.com/projects/p/wekan). So the first step is to -create a Transifex account if you don’t have one already. You can then send a -request to join one of the translation teams. If there we will create a new one. - -Once you are in a team you can start translating the application. Please take a -look at the glossary so you can agree with other (present and future) -contributors on words to use to translate key concepts in the application like -“boards” and “cards”. - -The original application is written in English, and if you want to contribute to -the application itself, you are asked to fill the `i18n/en.i18n.json` file. When -you do that the new strings of text to translate automatically appears on -Transifex to be translated (the refresh may take a few hours). - -We pull all translations from Transifex before every new Wekan release -candidate, ask the translators to review the app, and pull all translations -again for the final release. - -## Installation - -Wekan is made with [Meteor](https://www.meteor.com). Thus the easiest way to -start hacking is by installing the framework, cloning the git repository, and -launching the application: - -```bash -$ curl https://install.meteor.com/ | sh # On Mac or Linux -$ git clone https://github.com/wekan/wekan.git -$ cd wekan -$ meteor -``` - -As for any Meteor application, Wekan is automatically refreshed when you change -any file of the source code, just play with it to see how it behaves! - -## Style guide - -We follow the -[meteor style guide](https://github.com/meteor/meteor/wiki/Meteor-Style-Guide). - -Please read the meteor style guide before making any significant contribution. - -## Code organisation - -TODO + From 14d3c373c496ca0007890bef29810c59d0a48609 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 6 Feb 2017 00:21:14 +0200 Subject: [PATCH 124/136] Add info about upcoming Wekan App Development Platform. --- README.md | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7eb829d74..3783b0f33 100644 --- a/README.md +++ b/README.md @@ -26,10 +26,29 @@ allowing you to focus on the few items that matter the most. ## Roadmap +Upcoming Wekan App Development Platform will make possible +many use cases like kanban workflows, dependencies, gantt charts, +WIP limits, time tracking, managing website, Rocket.Chat support +and custom apps with themes by providing Team/Organizations, +APIs, admin interface, custom fields, calendar view, time tracking, +vote on cards, move cards to another board, board templates. LDAP and other +SSO options are already available on Sandstorm, not standalone Wekan. +Some of these don't even have feature request in Wekan issues, +we do need detailed descriptions, screenshots and links to videos +how these should work. + +We are very welcoming to new developers and teams to submit new pull +requests to devel branch to make this Wekan App Development Platform possible +faster. By working directly with Wekan you get benefit of active +maintenance and new features added by growing Wekan developer community. +Please see [Developer Documentation][dev_docs] to get started. + Roadmap is handled using [Wekan GitHub issues][wekan_issues]. +If you don't see your feature request or use case there, please add it. Newer [Wefork GitHub issues][wefork_issues] will be be moved to there also. + ## Screenshots [![Screenshot of Wekan][screenshot_wekan]][roadmap_wekan] @@ -37,8 +56,8 @@ Newer [Wefork GitHub issues][wefork_issues] will be be moved to there also. [![Screenshot of Wefork][screenshot_wefork]][roadmap_wefork] Wekan supports most features you would expect of it including a real-time user -interface, cards comments, checklists, member assignations, customizable labels, -closing lists, filtered views, and more. +interface, import from Trello, cards comments, checklists, member assignations, +customizable labels, closing lists, filtered views, and more. Since it is a free software, you don’t have to trust us with your data and can install Wekan on your own computer or server. In fact we encourage you to do @@ -156,3 +175,4 @@ with [Meteor](https://www.meteor.com). [translate_wekan]: https://www.transifex.com/wekan/wekan/ [autoinstall]: https://github.com/wefork/wekan-autoinstall [autoinstall_issue]: https://github.com/anselal/wekan/issues/18 +[dev_docs]: https://github.com/wekan/wekan/wiki/Developer-Documentation From 1e5553b0046da648617891295d80caa2704e0aef Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 6 Feb 2017 00:24:35 +0200 Subject: [PATCH 125/136] Fix typos etc. --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 3783b0f33..0cadd583e 100644 --- a/README.md +++ b/README.md @@ -31,11 +31,11 @@ many use cases like kanban workflows, dependencies, gantt charts, WIP limits, time tracking, managing website, Rocket.Chat support and custom apps with themes by providing Team/Organizations, APIs, admin interface, custom fields, calendar view, time tracking, -vote on cards, move cards to another board, board templates. LDAP and other -SSO options are already available on Sandstorm, not standalone Wekan. -Some of these don't even have feature request in Wekan issues, -we do need detailed descriptions, screenshots and links to videos -how these should work. +vote on cards, move cards to another board and board templates. +LDAP and other SSO options are already available on Sandstorm, +not standalone Wekan. Some of these don't even have feature +requests in Wekan issues, so we do need detailed descriptions, +screenshots and links to videos how these should work. We are very welcoming to new developers and teams to submit new pull requests to devel branch to make this Wekan App Development Platform possible From 52131b956ba4d751397217bdafc5849508352f19 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 6 Feb 2017 00:35:32 +0200 Subject: [PATCH 126/136] Add missing word. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0cadd583e..b70cfe75a 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ screenshots and links to videos how these should work. We are very welcoming to new developers and teams to submit new pull requests to devel branch to make this Wekan App Development Platform possible -faster. By working directly with Wekan you get benefit of active +faster. By working directly with Wekan you get the benefit of active maintenance and new features added by growing Wekan developer community. Please see [Developer Documentation][dev_docs] to get started. From a3a26342f78af1e4c3b316c341f48a07066175da Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 6 Feb 2017 00:38:31 +0200 Subject: [PATCH 127/136] Fix typo. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b70cfe75a..aab8b9aae 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ allowing you to focus on the few items that matter the most. Upcoming Wekan App Development Platform will make possible many use cases like kanban workflows, dependencies, gantt charts, WIP limits, time tracking, managing website, Rocket.Chat support -and custom apps with themes by providing Team/Organizations, +and custom apps with themes by providing Teams/Organizations, APIs, admin interface, custom fields, calendar view, time tracking, vote on cards, move cards to another board and board templates. LDAP and other SSO options are already available on Sandstorm, From 7102e91f508054e68fc97fe030526f9b84b22ab4 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 6 Feb 2017 01:29:41 +0200 Subject: [PATCH 128/136] Chat moved to Vanila, we will get more developers from there. --- README.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index aab8b9aae..9d66e5536 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Wekan -[![JOIN OFFICIAL WEKAN CHAT][gitter_badge]][gitter_chat] +[![Wekan chat][vanila_badge]][vanila_chat] 2017-02-04 News: All Wekan fork/Wefork code, pull requests and translations has been merged back to official Wekan. Wefork will not accept new pull @@ -8,8 +8,6 @@ requests and issues to Wefork. All development happens on Wekan. [Wefork announcement and merging back][fork_announcement] -[![Wefork chat][rocket_badge]][rocket_chat] - [![Wefork Build Status][travis_badge]][travis_status] [Wefork FAQ][fork_faq] @@ -138,16 +136,14 @@ Google Cloud: Needs info how to enable websockets. Wekan is released under the very permissive [MIT license](LICENSE), and made with [Meteor](https://www.meteor.com). -[gitter_badge]: https://badges.gitter.im/Join%20Chat.svg -[gitter_chat]: https://gitter.im/wekan/wekan +[vanila_badge]: https://vanila.io/img/join-chat-button2.png +[vanila_chat]: https://chat.vanila.io/channel/wekan [fork_faq]: https://github.com/wefork/wekan/wiki/FAQ [fork_announcement]: https://github.com/wekan/wekan/issues/640#issuecomment-276383458 [screenshot_wekan]: http://i.imgur.com/cI4jW2h.png [screenshot_wefork]: http://i.imgur.com/ShX2OTk.png [roadmap_wekan]: http://try.wekan.io/b/MeSsFJaSqeuo9M6bs/wekan-roadmap [roadmap_wefork]: https://wekan.indie.host/b/t2YaGmyXgNkppcFBq/wekan-fork-roadmap -[rocket_badge]: https://chat.indie.host/images/join-chat.svg -[rocket_chat]: https://chat.indie.host/channel/wekan [wekan_issues]: https://github.com/wekan/wekan/issues [wefork_issues]: https://github.com/wefork/wekan/issues [sandstorm_button]: https://img.shields.io/badge/try-Wekan%20on%20Sandstorm-783189.svg From 3c3b744d1636455de0fbeb944cebf46f9492733a Mon Sep 17 00:00:00 2001 From: Curtis G Date: Sun, 5 Feb 2017 21:01:15 -0500 Subject: [PATCH 129/136] Fix executeUpTo label when dragging cards 'popup' is not in the predefined hierarchy --- client/components/lists/list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/components/lists/list.js b/client/components/lists/list.js index e19097835..187d8ec3c 100644 --- a/client/components/lists/list.js +++ b/client/components/lists/list.js @@ -44,7 +44,7 @@ BlazeComponent.extendComponent({ placeholder: 'minicard-wrapper placeholder', start(evt, ui) { ui.placeholder.height(ui.helper.height()); - EscapeActions.executeUpTo('popup'); + EscapeActions.executeUpTo('popup-close'); boardComponent.setIsDragging(true); }, stop(evt, ui) { From 5e30dcde491670bb32afac5c3d3dac864641fe3c Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 6 Feb 2017 15:18:25 +0200 Subject: [PATCH 130/136] Translations at Transifex moved from Wefork to Wekan. --- .tx/config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.tx/config b/.tx/config index 0d6318bc3..f2527c8f9 100644 --- a/.tx/config +++ b/.tx/config @@ -41,7 +41,7 @@ host = https://www.transifex.com # or the other, so we need to do a Manual mapping. lang_map = es_ES:es-ES, fa_IR:fa, pt_BR:pt-BR, ro_RO:ro, zh_CN:zh-CN, zh_TW:zh-TW -[wefork.application] +[wekan.application] file_filter = i18n/.i18n.json source_lang = en type = KEYVALUEJSON @@ -49,7 +49,7 @@ type = KEYVALUEJSON # We might have a dedicated second resource later to translate the “Welcome # Board” data. # -# [wefork.welcomeBoard] +# [wekan.welcomeBoard] # file_filter = private/welcomeBoard/.json # source_lang = en # type = KEYVALUEJSON From 425129eb1659c49aafef101fb423b14f00fb48a0 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Wed, 8 Feb 2017 03:24:40 +0200 Subject: [PATCH 131/136] All of Wefork is now moved back to Wekan. --- README.md | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 9d66e5536..c2342f804 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,9 @@ [![Wekan chat][vanila_badge]][vanila_chat] -2017-02-04 News: All Wekan fork/Wefork code, pull requests and translations -has been merged back to official Wekan. Wefork will not accept new pull -requests and issues to Wefork. All development happens on Wekan. +2017-02-08 News: All of Wefork is now merged and moved back to official +Wekan. Wefork will not accept any new issues and pull requests. +All development happens on Wekan. [Wefork announcement and merging back][fork_announcement] @@ -22,6 +22,18 @@ boards are an unbeatable tool to keep your things organized. They give you a visual overview of the current state of your project, and make you productive by allowing you to focus on the few items that matter the most. +Wekan supports most features you would expect of it including a real-time user +interface, import from Trello (on standalone Wekan), cards comments, checklists, +member assignations, customizable labels, closing lists, filtered views, and more. + +SSO options like LDAP, passwordless email, SAML, GitHub and Google Auth are +already available on Sandstorm, not standalone Wekan. Sandstorm is now completely +Open Source, including server clustering. + +Since Wekan is a free software, you don’t have to trust us with your data and can +install Wekan on your own computer or server. In fact we encourage you to do +that by providing one-click installation on various platforms. + ## Roadmap Upcoming Wekan App Development Platform will make possible @@ -30,10 +42,9 @@ WIP limits, time tracking, managing website, Rocket.Chat support and custom apps with themes by providing Teams/Organizations, APIs, admin interface, custom fields, calendar view, time tracking, vote on cards, move cards to another board and board templates. -LDAP and other SSO options are already available on Sandstorm, -not standalone Wekan. Some of these don't even have feature -requests in Wekan issues, so we do need detailed descriptions, -screenshots and links to videos how these should work. +Some of these don't even have feature requests in Wekan issues, +so we do need detailed descriptions, screenshots and links to +videos how these should work. We are very welcoming to new developers and teams to submit new pull requests to devel branch to make this Wekan App Development Platform possible @@ -53,18 +64,15 @@ Newer [Wefork GitHub issues][wefork_issues] will be be moved to there also. [![Screenshot of Wefork][screenshot_wefork]][roadmap_wefork] -Wekan supports most features you would expect of it including a real-time user -interface, import from Trello, cards comments, checklists, member assignations, -customizable labels, closing lists, filtered views, and more. - -Since it is a free software, you don’t have to trust us with your data and can +Since Wekan is a free software, you don’t have to trust us with your data and can install Wekan on your own computer or server. In fact we encourage you to do that by providing one-click installation on various platforms. ## Supported Platforms -Newest features are already at dockerhub images by automatically generated -trusted build. Other platforms are not up-to-date yet. +Automatic generated newest builds are available for Docker, and some others that +install directly from this repo. Automatic builds will be added later for more +platforms. ### Docker: [Docker image][docker_image], [Docs][docker_docs], [Docker Nginx proxy][docker_nginxproxy], [Docker Issue][docker_issue] From 44564b9fa6a24822b33f01201f08ee39c02706bd Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Wed, 8 Feb 2017 03:43:44 +0200 Subject: [PATCH 132/136] Update translations. --- i18n/ar.i18n.json | 6 +- i18n/br.i18n.json | 4 +- i18n/ca.i18n.json | 8 +- i18n/cs.i18n.json | 8 +- i18n/de.i18n.json | 20 +- i18n/en.i18n.json | 12 +- i18n/es.i18n.json | 12 +- i18n/fa.i18n.json | 12 +- i18n/fi.i18n.json | 628 +++++++++++++++++++++---------------------- i18n/fr.i18n.json | 46 ++-- i18n/he.i18n.json | 102 +++---- i18n/it.i18n.json | 24 +- i18n/ja.i18n.json | 238 ++++++++-------- i18n/ko.i18n.json | 6 +- i18n/pl.i18n.json | 8 +- i18n/pt-BR.i18n.json | 6 +- i18n/ro.i18n.json | 4 +- i18n/ru.i18n.json | 8 +- i18n/sr.i18n.json | 60 ++--- i18n/tr.i18n.json | 6 +- i18n/zh-CN.i18n.json | 22 +- i18n/zh-TW.i18n.json | 14 +- 22 files changed, 627 insertions(+), 627 deletions(-) diff --git a/i18n/ar.i18n.json b/i18n/ar.i18n.json index 531364a99..f534592e5 100644 --- a/i18n/ar.i18n.json +++ b/i18n/ar.i18n.json @@ -121,7 +121,7 @@ "checklists": "Checklists", "click-to-star": "اضغط لإضافة اللوحة للمفضلة.", "click-to-unstar": "اضغط لحذف اللوحة من المفضلة.", - "clipboard" : "Clipboard or drag & drop", + "clipboard": "Clipboard or drag & drop", "close": "غلق", "close-board": "غلق اللوحة", "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", @@ -229,7 +229,7 @@ "listImportCardPopup-title": "Import a Trello card", "lists": "القائمات", "log-out": "تسجيل الخروج", - "log-in": "Log In", + "log-in": "تسجيل الدخول", "loginPopup-title": "تسجيل الدخول", "memberMenuPopup-title": "أفضليات الأعضاء", "members": "أعضاء", @@ -321,4 +321,4 @@ "welcome-list1": "Basics", "welcome-list2": "Advanced", "what-to-do": "ماذا تريد أن تنجز?" -} +} \ No newline at end of file diff --git a/i18n/br.i18n.json b/i18n/br.i18n.json index ece3e1a8d..8e638b381 100644 --- a/i18n/br.i18n.json +++ b/i18n/br.i18n.json @@ -121,7 +121,7 @@ "checklists": "Checklists", "click-to-star": "Click to star this board.", "click-to-unstar": "Click to unstar this board.", - "clipboard" : "Clipboard or drag & drop", + "clipboard": "Clipboard or drag & drop", "close": "Close", "close-board": "Close Board", "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", @@ -321,4 +321,4 @@ "welcome-list1": "Basics", "welcome-list2": "Advanced", "what-to-do": "What do you want to do?" -} +} \ No newline at end of file diff --git a/i18n/ca.i18n.json b/i18n/ca.i18n.json index 6d3745cea..188edcf6e 100644 --- a/i18n/ca.i18n.json +++ b/i18n/ca.i18n.json @@ -8,7 +8,7 @@ "act-createList": "afegit/da __list__ a __board__", "act-addBoardMember": "afegit/da __member__ a __board__", "act-archivedBoard": "__board__ arxivat", - "act-archivedCard": "\n __card__ arxivat/da", + "act-archivedCard": "__card__ arxivat/da", "act-archivedList": "__list__ arxivat/da", "act-importBoard": "__board__ importat", "act-importCard": "__card__ importat", @@ -121,7 +121,7 @@ "checklists": "Checklists", "click-to-star": "Fes clic per destacar aquest tauler.", "click-to-unstar": "Fes clic per deixar de destacar aquest tauler.", - "clipboard" : "Portaretalls o estirar i amollar", + "clipboard": "Portaretalls o estirar i amollar", "close": "Tanca", "close-board": "Tanca tauler", "close-board-pop": "Podràs restaurar el tauler, seleccionant \"Arxivats\" de la finistra principal", @@ -292,7 +292,7 @@ "shortcut-show-shortcuts": "Mostra aquesta lista d'accessos directes", "shortcut-toggle-filterbar": "Canvia la barra lateral del tauler", "shortcut-toggle-sidebar": "Canvia Sidebar del Tauler", - "show-cards-minimum-count": "Mostra contador de fitxes si la llista en conté més de ", + "show-cards-minimum-count": "Mostra contador de fitxes si la llista en conté més de", "signupPopup-title": "Crea un compte", "star-board-title": "Fes clic per destacar aquest tauler. Es mostrarà a la part superior de la llista de taulers.", "starred-boards": "Taulers destacats", @@ -321,4 +321,4 @@ "welcome-list1": "Bàsics", "welcome-list2": "Avançades", "what-to-do": "Què vols fer?" -} +} \ No newline at end of file diff --git a/i18n/cs.i18n.json b/i18n/cs.i18n.json index 495cd4e9c..3db88d56e 100644 --- a/i18n/cs.i18n.json +++ b/i18n/cs.i18n.json @@ -121,7 +121,7 @@ "checklists": "Checklists", "click-to-star": "Kliknutím přidat hvězdičku tomuto tablu.", "click-to-unstar": "Kliknutím odebrat hvězdičku tomuto tablu.", - "clipboard" : "Schránka nebo potáhnout a pustit", + "clipboard": "Schránka nebo potáhnout a pustit", "close": "Zavřít", "close-board": "Zavřít tablo", "close-board-pop": "Budete moci obnovit tablo kliknutím na tlačítko \"Archivy\" v hlavním menu.", @@ -172,7 +172,7 @@ "email-resetPassword-subject": "Změň své heslo na __siteName__", "email-resetPassword-text": "Ahoj __user__,\n\nPro změnu hesla klikni na odkaz níže.\n\n__url__\n\nDěkujeme.", "email-sent": "Email byl odeslán", - "email-verifyEmail-subject": "Ověř svou emailovou adresu na ", + "email-verifyEmail-subject": "Ověř svou emailovou adresu na", "email-verifyEmail-text": "Ahoj __user__,\n\nPro ověření emailové adresy klikni na odkaz níže.\n\n__url__\n\nDěkujeme.", "error-board-doesNotExist": "Toto tablo neexistuje", "error-board-notAdmin": "K provedení změny musíš být administrátor tohoto tabla", @@ -229,7 +229,7 @@ "listImportCardPopup-title": "Importovat Trello kartu", "lists": "Seznamy", "log-out": "Odhlásit", - "log-in": "Log In", + "log-in": "Přihlásit", "loginPopup-title": "Přihlásit", "memberMenuPopup-title": "Nastavení uživatele", "members": "Členové", @@ -321,4 +321,4 @@ "welcome-list1": "Basics", "welcome-list2": "Advanced", "what-to-do": "Co chcete dělat?" -} +} \ No newline at end of file diff --git a/i18n/de.i18n.json b/i18n/de.i18n.json index 197fbba78..c91a53dbe 100644 --- a/i18n/de.i18n.json +++ b/i18n/de.i18n.json @@ -36,13 +36,13 @@ "activity-removed": "hat %s von %s entfernt", "activity-sent": "hat %s an %s gesendet", "activity-unjoined": "hat %s verlassen", - "activity-checklist-added": "added checklist to %s", + "activity-checklist-added": "Checklist zu %s hinzugefügt", "add": "Hinzufügen", "add-attachment": "Anhang hinzufügen", "add-board": "Neues Board erstellen", "add-card": "Karte hinzufügen", - "add-checklist": "Add a checklist", - "add-checklist-item": "Add an item to checklist", + "add-checklist": "Füge eine Checklist hinzu", + "add-checklist-item": "Füge einen Punkt zu Checklist hinzu", "add-cover": "Cover hinzufügen", "add-label": "Label hinzufügen", "add-list": "Liste hinzufügen", @@ -121,7 +121,7 @@ "checklists": "Checklists", "click-to-star": "Klicken um dem Board einen Stern zu geben.", "click-to-unstar": "Klicken um den Stern von dem Board zu entfernen.", - "clipboard" : "Zwischenablage oder Drag & Drop", + "clipboard": "Zwischenablage oder Drag & Drop", "close": "Schließen", "close-board": "Board schließen", "close-board-pop": "Sie können das Board wiederherstellen, indem Sie den \"Archiv\"-Button in der Kopfzeile der Startseite anklicken.", @@ -163,17 +163,17 @@ "editProfilePopup-title": "Profil ändern", "email": "E-Mail", "email-enrollAccount-subject": "Ihr Benutzerkonto auf __siteName__ wurde erstellt", - "email-enrollAccount-text": "Hallo __user__,\n\num den Dienst nutzen zu können, klicken Sie bitte auf folgenden Link:\n\n__url__\n\nDanke.\n", + "email-enrollAccount-text": "Hallo __user__,\n\num den Dienst nutzen zu können, klicken Sie bitte auf folgenden Link:\n\n__url__\n\nDanke.", "email-fail": "Senden der E-Mail fehlgeschlagen", "email-invalid": "Ungültige E-Mail-Adresse", "email-invite": "via E-Mail einladen", "email-invite-subject": "__inviter__ hat Ihnen eine Einladung geschickt", - "email-invite-text": "Hallo __user__,\n\n__inviter__ hat Sie zu dem Board \"__board__\" eingeladen.\n\nBitte klicken Sie auf folgenden Link:\n\n__url__\n\nDanke.\n", + "email-invite-text": "Hallo __user__,\n\n__inviter__ hat Sie zu dem Board \"__board__\" eingeladen.\n\nBitte klicken Sie auf folgenden Link:\n\n__url__\n\nDanke.", "email-resetPassword-subject": "Setzten Sie ihr Passwort auf __siteName__ zurück", - "email-resetPassword-text": "Hallo __user__,\n\num ihr Passwort zurückzusetzen, klicken Sie bitte auf folgenden Link:\n\n__url__\n\nDanke.\n", + "email-resetPassword-text": "Hallo __user__,\n\num ihr Passwort zurückzusetzen, klicken Sie bitte auf folgenden Link:\n\n__url__\n\nDanke.", "email-sent": "E-Mail gesendet", "email-verifyEmail-subject": "Bestätigen Sie ihre E-Mail-Adresse auf __siteName__", - "email-verifyEmail-text": "Hallo __user__,\n\num ihre E-Mail-Adresse zu bestätigen, klicken Sie bitte auf folgenden Link:\n\n__url__\n\nDanke.\n", + "email-verifyEmail-text": "Hallo __user__,\n\num ihre E-Mail-Adresse zu bestätigen, klicken Sie bitte auf folgenden Link:\n\n__url__\n\nDanke.", "error-board-doesNotExist": "Dieses Board existiert nicht", "error-board-notAdmin": "Um das zu tun, müssen Sie der Administrator dieses Boards sein", "error-board-notAMember": "Um das zu tun, müssen Sie ein Mitglied dieses Boards sein", @@ -272,7 +272,7 @@ "remove-cover": "Cover entfernen", "remove-from-board": "Von Board entfernen", "remove-label": "Label entfernen", - "remove-list": "Remove the list", + "remove-list": "Liste entfernen", "remove-member": "Nutzer entfernen", "remove-member-from-card": "Von Karte entfernen", "remove-member-pop": "__name__ (__username__) von __boardTitle__ entfernen? Das Mitglied wird von allen Karten auf diesem Board entfernt. Er erhält eine Benachrichtigung.", @@ -321,4 +321,4 @@ "welcome-list1": "Grundlagen", "welcome-list2": "Fortgeschritten", "what-to-do": "Was willst du tun?" -} +} \ No newline at end of file diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index f05f22786..5d52e3904 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -121,7 +121,7 @@ "checklists": "Checklists", "click-to-star": "Click to star this board.", "click-to-unstar": "Click to unstar this board.", - "clipboard" : "Clipboard or drag & drop", + "clipboard": "Clipboard or drag & drop", "close": "Close", "close-board": "Close Board", "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", @@ -163,17 +163,17 @@ "editProfilePopup-title": "Edit Profile", "email": "Email", "email-enrollAccount-subject": "An account created for you on __siteName__", - "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.\n", + "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.\n", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", "email-resetPassword-subject": "Reset your password on __siteName__", - "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.\n", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", "email-sent": "Email sent", "email-verifyEmail-subject": "Verify your email address on __siteName__", - "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.\n", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", "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", @@ -321,4 +321,4 @@ "welcome-list1": "Basics", "welcome-list2": "Advanced", "what-to-do": "What do you want to do?" -} +} \ No newline at end of file diff --git a/i18n/es.i18n.json b/i18n/es.i18n.json index f98581266..4f20036b7 100644 --- a/i18n/es.i18n.json +++ b/i18n/es.i18n.json @@ -119,9 +119,9 @@ "changePermissionsPopup-title": "Cambiar permisos", "changeSettingsPopup-title": "Cambiar Preferencias", "checklists": "Checklists", - "click-to-star": "Haz clic para destacar este tablero. ", - "click-to-unstar": "Haz clic para dejar de destacar este tablero. ", - "clipboard" : "Clipboard or drag & drop", + "click-to-star": "Haz clic para destacar este tablero.", + "click-to-unstar": "Haz clic para dejar de destacar este tablero.", + "clipboard": "Clipboard or drag & drop", "close": "Cerrar", "close-board": "Cerrar el tablero", "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", @@ -183,7 +183,7 @@ "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", - "error-username-taken": "Este nombre de usuario ya está en uso ", + "error-username-taken": "Este nombre de usuario ya está en uso", "export-board": "Export board", "filter": "Filter", "filter-cards": "Fichas de filtro", @@ -213,7 +213,7 @@ "joined": "se ha unido", "just-invited": "You are just invited to this board", "keyboard-shortcuts": "Atajos de teclado", - "label-create": "Crear una etiqueta nueva ", + "label-create": "Crear una etiqueta nueva", "label-default": "%s etiqueta (por Defecto)", "label-delete-pop": "No se puede deshacer. Esto eliminará esta etiqueta de todas las fichas y destruirá su historia.", "labels": "Etiquetas", @@ -321,4 +321,4 @@ "welcome-list1": "Basicos", "welcome-list2": "Avanzados", "what-to-do": "What do you want to do?" -} +} \ No newline at end of file diff --git a/i18n/fa.i18n.json b/i18n/fa.i18n.json index 30e5a4784..cb0beffed 100644 --- a/i18n/fa.i18n.json +++ b/i18n/fa.i18n.json @@ -23,7 +23,7 @@ "actions": "اعمال", "activities": "فعالیت ها", "activity": "فعالیت", - "activity-added": " %s به %s اضافه شد", + "activity-added": "%s به %s اضافه شد", "activity-archived": "%s بایگانی شد", "activity-attached": "%s به %s پیوست شد", "activity-created": "%s ایجاد شد", @@ -121,13 +121,13 @@ "checklists": "Checklists", "click-to-star": "جهت افزودن ستاره کلیک کنید .", "click-to-unstar": "جهت کاهش ستاره کلیک کنید.", - "clipboard" : "ذخیره در حافظه ویا بکش-رهاکن", + "clipboard": "ذخیره در حافظه ویا بکش-رهاکن", "close": "بستن", "close-board": "بستن برد", "close-board-pop": "شما می توانید با کلیک بر دکمه \"بایگانی\" از قسمت بالای خانه، تخته را بازگذاری نمایید.", "color-black": "مشکی", "color-blue": "آبی", - "color-green": "سبز\n", + "color-green": "سبز", "color-lime": "لیمویی", "color-orange": "نارنجی", "color-pink": "صورتی", @@ -229,7 +229,7 @@ "listImportCardPopup-title": "وارد کردن کارت Trello", "lists": "لیست ها", "log-out": "خروج", - "log-in": "Log In", + "log-in": "ورود", "loginPopup-title": "ورود", "memberMenuPopup-title": "تنظیمات اعضا", "members": "اعضا", @@ -305,7 +305,7 @@ "title": "عنوان", "tracking": "Tracking", "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", - "unassign-member": "عدم انتصاب کاربر ", + "unassign-member": "عدم انتصاب کاربر", "unsaved-description": "شما توضیحات ذخیره نشده دارید.", "unwatch": "Unwatch", "upload": "ارسال", @@ -321,4 +321,4 @@ "welcome-list1": "Basics", "welcome-list2": "Advanced", "what-to-do": "چه کاری می خواهید انجام دهید؟" -} +} \ No newline at end of file diff --git a/i18n/fi.i18n.json b/i18n/fi.i18n.json index bb41ce60c..5d52e3904 100644 --- a/i18n/fi.i18n.json +++ b/i18n/fi.i18n.json @@ -1,324 +1,324 @@ { - "accept": "Hyväksy", - "act-activity-notify": "[Wekan] Toimintailmoitus", - "act-addAttachment": "liitetty __attachment__ kortille __card__", - "act-addComment": "kommentoitu __card__: __comment__", - "act-createBoard": "luotu __board__", - "act-createCard": "lisätty __card__ listalle __list__", - "act-createList": "lisätty __list__ taululle __board__", - "act-addBoardMember": "lisätty __member__ taululle __board__", - "act-archivedBoard": "arkistoitu __board__", - "act-archivedCard": "arkistoitu __card__", - "act-archivedList": "arkistoitu __list__", - "act-importBoard": "tuotu __board__", - "act-importCard": "tuotu __card__", - "act-importList": "tuotu __list__", - "act-joinMember": "lisätty __member__ kortille __card__", - "act-moveCard": "siirretty __card__ listalta __oldList__ listalle __list__", - "act-removeBoardMember": "poistettu __member__ taululta __board__", - "act-restoredCard": "palautettu __card__ taululle __board__", - "act-unjoinMember": "poistettu __member__ kortilta __card__", + "accept": "Accept", + "act-activity-notify": "[Wekan] Activity Notification", + "act-addAttachment": "attached __attachment__ to __card__", + "act-addComment": "commented on __card__: __comment__", + "act-createBoard": "created __board__", + "act-createCard": "added __card__ to __list__", + "act-createList": "added __list__ to __board__", + "act-addBoardMember": "added __member__ to __board__", + "act-archivedBoard": "archived __board__", + "act-archivedCard": "archived __card__", + "act-archivedList": "archived __list__", + "act-importBoard": "imported __board__", + "act-importCard": "imported __card__", + "act-importList": "imported __list__", + "act-joinMember": "added __member__ to __card__", + "act-moveCard": "moved __card__ from __oldList__ to __list__", + "act-removeBoardMember": "removed __member__ from __board__", + "act-restoredCard": "restored __card__ to __board__", + "act-unjoinMember": "removed __member__ from __card__", "act-withBoardTitle": "[Wekan] __board__", "act-withCardTitle": "[__board__] __card__", - "actions": "Toimet", - "activities": "Toimet", - "activity": "Toiminta", - "activity-added": "lisätty %s kohteeseen %s", - "activity-archived": "arkistoitu %s", - "activity-attached": "liitetty %s kohteeseen %s", - "activity-created": "luotu %s", - "activity-excluded": "poistettu %s kohteesta %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": "peruttu %s liityminen", - "activity-checklist-added": "lisätty tarkistuslista kohteeseen %s", - "add": "Lisää", - "add-attachment": "Lisää liitetiedosto", - "add-board": "Lisää uusi taulu", - "add-card": "Lisää kortti", - "add-checklist": "Lisää tarkistuslista", - "add-checklist-item": "Lisää kohde tarkistuslistaan", - "add-cover": "Lisää kansi", - "add-label": "Lisää tunniste", - "add-list": "Lisää lista", - "add-members": "Lisää jäseniä", - "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.", - "all-boards": "Kaikki taulut", - "and-n-other-card": "Ja __count__ muu kortti", - "and-n-other-card_plural": "Ja __count__ muuta korttia", - "apply": "Käytä", - "app-is-offline": "Sovellus ei ole tällä hetkellä linjoilla, sivun lataaminen uudelleen voi aiheuttaa muutettujen tietojen menettämisen.", - "archive": "Arkistoi", - "archive-all": "Arkistoi kaikki", - "archive-board": "Arkistoi taulu", - "archive-card": "Arkistoi kortti", - "archive-list": "Arkistoi tämä lista", - "archive-selection": "Arkistoi valinta", - "archiveBoardPopup-title": "Arkistoi taulu?", - "archived-items": "Arkistoidut kohteet", - "archives": "Arkistot", - "assign-member": "Valitse jäsen", - "attached": "liitetty", - "attachment": "Liitetiedosto", - "attachment-delete-pop": "Liitetiedoston poistaminen on lopullista. Tätä ei pysty peruuttamaan.", - "attachmentDeletePopup-title": "Poista liitetiedosto?", - "attachments": "Liitetiedostot", - "auto-watch": "Automaattisesti seuraa tauluja kun ne on luotu", - "avatar-too-big": "Profiilikuva on liian suuri (70Kb maksimi)", - "back": "Takaisin", - "board-change-color": "Muokkaa väriä", - "board-nb-stars": "%s tähteä", - "board-not-found": "Taulua ei löytynyt", - "board-private-info": "Tämä taulu tulee olemaan yksityinen.", - "board-public-info": "Tämä taulu tulee olemaan julkinen.", - "boardChangeColorPopup-title": "Muokkaa taulun taustaa", - "boardChangeTitlePopup-title": "Nimeä taulu uudelleen", - "boardChangeVisibilityPopup-title": "Muokkaa näkyvyyttä", - "boardChangeWatchPopup-title": "Muokkaa seuraamista", - "boardMenuPopup-title": "Taulu valikko", - "boards": "Taulut", - "bucket-example": "Kuten “Laatikko lista” esimerkiksi", - "cancel": "Peruuta", - "card-archived": "Tämä kortti on arkistoitu.", - "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-suggest-archive": "Voit arkistoida kortin poistaaksesi sen taululta ja säilyttääksesi toimet.", - "card-due": "Erääntyy", - "card-due-on": "Erääntyy", - "card-edit-attachments": "Muokkaa liitetiedostoja", - "card-edit-labels": "Muokkaa tunnisteita", - "card-edit-members": "Muokkaa jäseniä", - "card-labels-title": "Muokkaa kortin tunnisteita.", - "card-members-title": "Lisää tai poista taulun jäseniä tältä kortilta.", - "card-start": "Alkaa", - "card-start-on": "Alkaa", - "cardAttachmentsPopup-title": "Liitä mistä", - "cardDeletePopup-title": "Poista kortti?", - "cardDetailsActionsPopup-title": "Kortti toimet", - "cardLabelsPopup-title": "Tunnisteet", - "cardMembersPopup-title": "Jäsenet", - "cardMorePopup-title": "Lisää", - "cards": "Kortit", - "change": "Muokkaa", - "change-avatar": "Muokkaa profiilikuvaa", - "change-password": "Vaihda salasana", - "change-permissions": "Muokkaa oikeuksia", - "change-settings": "Muokkaa asetuksia", - "changeAvatarPopup-title": "Muokkaa profiilikuvaa", - "changeLanguagePopup-title": "Vaihda kieltä", - "changePasswordPopup-title": "Vaihda salasana", - "changePermissionsPopup-title": "Muokkaa oikeuksia", - "changeSettingsPopup-title": "Muokkaa asetuksia", - "checklists": "Tarkistuslistat", - "click-to-star": "Klikkaa merkataksesi tämä taulu tähdellä.", - "click-to-unstar": "Klikkaa poistaaksesi tähtimerkintä taululta.", - "clipboard" : "Leikepöytä tai raahaa ja pudota", - "close": "Sulje", - "close-board": "Sulje taulu", - "close-board-pop": "Voit palauttaa taulun klikkaamalla “Arkistot” painiketta kotiotsikosta.", - "color-black": "musta", - "color-blue": "sininen", - "color-green": "vihreä", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "archived %s", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-checklist-added": "added checklist to %s", + "add": "Add", + "add-attachment": "Add an attachment", + "add-board": "Add a new board", + "add-card": "Add a card", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", + "add-cover": "Add Cover", + "add-label": "Add the label", + "add-list": "Add a list", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", + "archive": "Archive", + "archive-all": "Archive All", + "archive-board": "Archive Board", + "archive-card": "Archive Card", + "archive-list": "Archive this list", + "archive-selection": "Archive selection", + "archiveBoardPopup-title": "Archive Board?", + "archived-items": "Archived Items", + "archives": "Archives", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when create it", + "avatar-too-big": "The avatar is too large (70Kb max)", + "back": "Back", + "board-change-color": "Change color", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be private.", + "board-public-info": "This board will be public.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Menu", + "boards": "Boards", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is archived.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.", + "card-due": "Due", + "card-due-on": "Due on", + "card-edit-attachments": "Edit attachments", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardDeletePopup-title": "Delete Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cards": "Cards", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", + "color-black": "black", + "color-blue": "blue", + "color-green": "green", "color-lime": "lime", - "color-orange": "oranssi", - "color-pink": "vaaleanpunainen", - "color-purple": "violetti", - "color-red": "punainen", - "color-sky": "taivas", - "color-yellow": "keltainen", - "comment": "Kommentti", - "comment-placeholder": "Kirjoita kommentti", - "computer": "Tietokone", - "create": "Luo", - "createBoardPopup-title": "Luo taulu", - "createLabelPopup-title": "Luo tunniste", - "current": "nykyinen", - "date": "Päivämäärä", - "decline": "Kieltäydy", - "default-avatar": "Oletus profiilikuva", - "delete": "Poista", - "deleteLabelPopup-title": "Poista tunniste?", - "description": "Kuvaus", - "disambiguateMultiLabelPopup-title": "Yksikäsitteistä tunniste toiminta", - "disambiguateMultiMemberPopup-title": "Yksikäsitteistä jäsen toiminta", - "discard": "Hylkää", - "done": "Valmis", - "download": "Lataa", - "edit": "Muokkaa", - "edit-avatar": "Muokkaa profiilikuvaa", - "edit-profile": "Muokkaa profiilia", - "editCardStartDatePopup-title": "Muokkaa aloituspäivää", - "editCardDueDatePopup-title": "Muokkaa eräpäivää", - "editLabelPopup-title": "Muokkaa tunnistetta", - "editNotificationPopup-title": "Muokkaa ilmoituksia", - "editProfilePopup-title": "Muokkaa profiilia", - "email": "Sähköposti", + "color-orange": "orange", + "color-pink": "pink", + "color-purple": "purple", + "color-red": "red", + "color-sky": "sky", + "color-yellow": "yellow", + "comment": "Comment", + "comment-placeholder": "Write a comment", + "computer": "Computer", + "create": "Create", + "createBoardPopup-title": "Create Board", + "createLabelPopup-title": "Create Label", + "current": "current", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", "email-enrollAccount-subject": "An account created for you on __siteName__", - "email-enrollAccount-text": "Hei __user__,\n\nAlkaaksesi käyttämään palvelua, klikkaa 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-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 __siteName__", - "email-resetPassword-text": "Hei __user__,\n\nNollataksesi salasanasi, klikkaa allaolevaa linkkiä.\n\n__url__\n\nKiitos.", - "email-sent": "Sähköposti lähetetty", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", "email-verifyEmail-subject": "Verify your email address on __siteName__", - "email-verifyEmail-text": "Hei __user__,\n\nvahvistaaksesi sähköpostiosoitteesi, klikkaa allaolevaa linkkiä.\n\n__url__\n\nKiitos.", - "error-board-doesNotExist": "Tämä taulu 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-list-doesNotExist": "Tätä listaa ei ole olemassa", - "error-user-doesNotExist": "Tätä käyttäjää ei ole olemassa", - "error-user-notAllowSelf": "Tämä toiminto itseäsi kohtaan ei ole sallittu", - "error-user-notCreated": "Tätä käyttäjää ei ole luotu", - "error-username-taken": "Tämä käyttäjätunnus on jo käytössä", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "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", + "error-username-taken": "This username is already taken", "export-board": "Export board", - "filter": "Suodata", - "filter-cards": "Suodata kortit", - "filter-clear": "Poista suodatin", - "filter-no-label": "Ei tunnistetta", - "filter-no-member": "Ei jäseniä", - "filter-on": "Suodatus on päällä", - "filter-on-desc": "Suodatat kortteja tällä taululla. Klikkaa tästä muokataksesi suodatinta.", - "filter-to-selection": "Suodata valintaan", - "fullname": "Koko nimi", - "header-logo-title": "Palaa taulut sivullesi.", - "hide-system-messages": "Piilota järjestelmäviestit", - "home": "Koti", - "import": "Tuo", - "import-board": "tuo Trellosta", - "import-board-title": "Tuo taulu Trellosta", - "import-board-trello-instruction": "Trello taulullasi, mene 'Menu', sitten 'More', 'Print and Export', 'Export JSON', ja kopioi tuloksena saamasi teksti", - "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 Wekan käyttäjät", - "import-show-user-mapping": "Tarkasta vastaavat jäsenet", - "import-user-select": "Valitse Wekan käyttäjä jota haluat käyttää tänä käyttäjänä", - "importMapMembersAddPopup-title": "Valitse Wekan käyttäjä", - "info": "Tietoja", - "initials": "Nimikirjaimet", - "invalid-date": "Virheellinen päivämäärä", - "joined": "liittyi", - "just-invited": "Sinut on juuri kutsuttu tälle taululle", - "keyboard-shortcuts": "Pikanäppäimet", - "label-create": "Luo uusi tunniste", - "label-default": "%s tunniste (oletus)", - "label-delete-pop": "Tätä ei voi peruuttaa. Tämä poistaa tämän tunnisteen kaikista korteista ja tuhoaa sen historian.", - "labels": "Tunnisteet", - "language": "Kieli", - "last-admin-desc": "Et voi vaihtaa rooleja koska täytyy olla olemassa ainakin yksi ylläpitäjä.", - "leave-board": "Jää pois taululta", - "link-card": "Linkki tähän korttiin", - "list-archive-cards": "Arkistoi kaikki kortit tässä listassa", - "list-archive-cards-pop": "Tämä poistaa kaikki tämän listan kortit tältä taululta. Nähdäksesi arkistoidut kortit ja tuodaksesi ne takaisin taululle, klikkaa “Valikko” > “Arkistoidut kohteet”.", - "list-move-cards": "Siirrä kaikki kortit tässä listassa", - "list-select-cards": "Valitse kaikki kortit tässä listassa", - "listActionPopup-title": "Listaa toimet", - "listImportCardPopup-title": "Tuo Trello kortti", - "lists": "Listat", - "log-out": "Kirjaudu ulos", - "log-in": "Kirjaudu sisään", - "loginPopup-title": "Kirjaudu sisään", - "memberMenuPopup-title": "Jäsen asetukset", - "members": "Jäsenet", - "menu": "Valikko", + "filter": "Filter", + "filter-cards": "Filter Cards", + "filter-clear": "Clear filter", + "filter-no-label": "No label", + "filter-no-member": "No member", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "home": "Home", + "import": "Import", + "import-board": "import from Trello", + "import-board-title": "Import board from Trello", + "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick the Wekan user you want to use as this member", + "importMapMembersAddPopup-title": "Select Wekan member", + "info": "Infos", + "initials": "Initials", + "invalid-date": "Invalid date", + "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)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "link-card": "Link to this card", + "list-archive-cards": "Archive all cards in this list", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view archived cards and bring them back to the board, click “Menu” > “Archived Items”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "listActionPopup-title": "List Actions", + "listImportCardPopup-title": "Import a Trello card", + "lists": "Lists", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", "move-selection": "Move selection", - "moveCardPopup-title": "Siirrä kortti", - "moveCardToBottom-title": "Siirrä alimmaiseksi", - "moveCardToTop-title": "Siirrä ylimmäiseksi", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "multi-selection": "Monivalinta", - "multi-selection-on": "Monivalinta on päällä", - "muted": "Vaimennettu", - "muted-info": "Et saa koskaan ilmoituksia tämän taulun muutoksista", - "my-boards": "Tauluni", - "name": "Nimi", - "no-archived-cards": "Ei arkistoituja kortteja.", - "no-archived-lists": "Ei arkistoituja listoja.", - "no-results": "Ei tuloksia", - "normal": "Normaali", - "normal-desc": "Voi nähdä ja muokata kortteja. Ei voi muokata asetuksia.", - "not-accepted-yet": "Kutsua ei ole hyväksytty vielä", - "notify-participate": "Vastaanota päivityksiä kaikilta korteilta jotka olet tehnyt tai joihin osallistut.", - "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 kirjautumalla sisään.", - "page-not-found": "Sivua ei löytynyt.", - "password": "Salasana", - "paste-or-dragdrop": "liittääksesi, tai vedä & pudota kuvatiedosto siihen (vain kuva)", - "participating": "Osallistutaan", - "preview": "Esikatsele", - "previewAttachedImagePopup-title": "Esikatsele", - "previewClipboardImagePopup-title": "Esikatsele", - "private": "Yksityinen", - "private-desc": "Tämä taulu on yksityinen. Vain taululle lisätyt henkilöt voivat nähdä ja muokata sitä.", - "profile": "Profiili", - "public": "Julkinen", - "public-desc": "Tämä taulu on julkinen. Se näkyy kenelle tahansa jolla on linkki ja näkyy myös hakukoneissa kuten Google. Vain taululle lisätyt henkilöt voivat muokata sitä.", - "quick-access-description": "Merkkaa taulu tähdellä lisätäksesi pikavalinta tähän palkkiin.", - "remove-cover": "Poista kansi", - "remove-from-board": "Poista taululta", - "remove-label": "Poista tunniste", - "remove-list": "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.", - "removeMemberPopup-title": "Poista jäsen?", - "rename": "Nimeä uudelleen", - "rename-board": "Nimeä taulu uudelleen", - "restore": "Palauta", - "save": "Tallenna", - "search": "Etsi", - "select-color": "Valitse väri", - "shortcut-assign-self": "Valitse itsesi nykyiselle kortille", - "shortcut-autocomplete-emoji": "Automaattinen täydennys emojille", - "shortcut-autocomplete-members": "Automaattinen täydennys jäsenille", - "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ä", - "show-cards-minimum-count": "Näytä korttien lukumäärä jos lista sisältää enemmän kuin", - "signupPopup-title": "Luo tili", - "star-board-title": "Klikkaa merkataksesi taulu tähdellä. Se tulee näkymään ylimpänä taululistallasi.", - "starred-boards": "Tähdellä merkatut taulut", - "starred-boards-description": "Tähdellä merkatut taulut näkyvät ylimpänä taululistallasi.", - "subscribe": "Tilaa", - "team": "Tiimi", - "this-board": "tämä taulu", - "this-card": "tämä kortti", - "time": "Aika", - "title": "Otsikko", - "tracking": "Ilmoitukset", - "tracking-info": "Sinulle ilmoitetaan muutoksista korteissa joihin olet osallistunut luojana tai jäsenenä.", - "unassign-member": "Peru jäsenvalinta", - "unsaved-description": "Sinulla on tallentamaton kuvaus.", - "unwatch": "Lopeta seuraaminen", - "upload": "Lähetä", - "upload-avatar": "Lähetä profiilikuva", - "uploaded-avatar": "Profiilikuva lähetetty", - "username": "Käyttäjänimi", - "view-it": "Näytä se", - "warn-list-archived": "varoitus: tämä kortti on arkistoitujen listalla", - "watch": "Seuraa", - "watching": "Seurataan", - "watching-info": "Sinulle ilmoitetaan tämän taulun muutoksista", - "welcome-board": "Tervetuloa taulu", - "welcome-list1": "Perusasiat", - "welcome-list2": "Edistynyt", - "what-to-do": "Mitä haluat tehdä?" -} + "multi-selection": "Multi-Selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No archived cards.", + "no-archived-lists": "No archived lists.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by logging in.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove the label", + "remove-list": "Remove the list", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "select-color": "Select a color", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "time": "Time", + "title": "Title", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "username": "Username", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an archived list", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "what-to-do": "What do you want to do?" +} \ No newline at end of file diff --git a/i18n/fr.i18n.json b/i18n/fr.i18n.json index 9cc2f6b59..985681a24 100644 --- a/i18n/fr.i18n.json +++ b/i18n/fr.i18n.json @@ -54,7 +54,7 @@ "all-boards": "Tous les tableaux", "and-n-other-card": "Et __count__ autre carte", "and-n-other-card_plural": "Et __count__ autres cartes", - "apply": "Apply", + "apply": "Appliquer", "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", "archive": "Archiver", "archive-all": "Tout archiver", @@ -99,8 +99,8 @@ "card-edit-members": "Modifier les membres", "card-labels-title": "Modifier les étiquettes de la carte.", "card-members-title": "Ajouter ou supprimer des membres à la carte.", - "card-start": "Start", - "card-start-on": "Starts on", + "card-start": "Début", + "card-start-on": "Commence le", "cardAttachmentsPopup-title": "Joindre depuis", "cardDeletePopup-title": "Supprimer la carte ?", "cardDetailsActionsPopup-title": "Actions sur la carte", @@ -112,16 +112,16 @@ "change-avatar": "Changer l'avatar", "change-password": "Changer le mot de passe", "change-permissions": "Changer les permissions", - "change-settings": "Change Settings", + "change-settings": "Modifier les paramètres", "changeAvatarPopup-title": "Changer l'avatar", "changeLanguagePopup-title": "Changer la langue", "changePasswordPopup-title": "Changer le mot de passe", "changePermissionsPopup-title": "Changer les permissions", - "changeSettingsPopup-title": "Change Settings", + "changeSettingsPopup-title": "Modifier les paramètres", "checklists": "Checklists", "click-to-star": "Cliquez pour ajouter ce tableau aux favoris.", "click-to-unstar": "Cliquez pour retirer ce tableau des favoris.", - "clipboard" : "Presse-papier ou glisser-déposer", + "clipboard": "Presse-papier ou glisser-déposer", "close": "Fermer", "close-board": "Fermer le tableau", "close-board-pop": "Vous pouvez restaurer le tableau en cliquant sur le bouton « Archives » depuis le menu en entête.", @@ -156,10 +156,10 @@ "edit": "Éditer", "edit-avatar": "Changer l'avatar", "edit-profile": "Éditer le profil", - "editCardStartDatePopup-title": "Change start date", + "editCardStartDatePopup-title": "Modifier la date de début", "editCardDueDatePopup-title": "Change due date", "editLabelPopup-title": "Changer l'étiquette", - "editNotificationPopup-title": "Edit Notification", + "editNotificationPopup-title": "Modifier la Notification", "editProfilePopup-title": "Éditer le profil", "email": "Email", "email-enrollAccount-subject": "Un compte a été créé pour vous sur __siteName__", @@ -182,34 +182,34 @@ "error-list-doesNotExist": "Cette liste n’existe pas", "error-user-doesNotExist": "Cet utilisateur n’existe pas", "error-user-notAllowSelf": "This action on self is not allowed", - "error-user-notCreated": "Cet utilisateur n’a pas encore été créé. ", - "error-username-taken": "This username is already taken", + "error-user-notCreated": "Cet utilisateur n’a pas encore été créé.", + "error-username-taken": "Ce nom d'utilisateur est déjà pris", "export-board": "Exporter le tableau", "filter": "Filtrer", "filter-cards": "Filtrer les cartes", "filter-clear": "Retirer les filtres", - "filter-no-label": "No label", - "filter-no-member": "No member", + "filter-no-label": "Aucun libellé", + "filter-no-member": "Aucun membre", "filter-on": "Le filtre est actif", "filter-on-desc": "Vous êtes en train de filtrer les cartes sur ce tableau. Cliquez ici pour changer les filtres.", "filter-to-selection": "Filtre vers la sélection", "fullname": "Nom complet", "header-logo-title": "Retourner à la page des tableaux", - "hide-system-messages": "Hide system messages", + "hide-system-messages": "Masquer les messages système", "home": "Accueil", "import": "Importer", "import-board": "Importer depuis Trello", - "import-board-title": "Import board from Trello", + "import-board-title": "Importer le tableau depuis Trello", "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text", - "import-json-placeholder": "Collez ici les données JSON valides. ", + "import-json-placeholder": "Collez ici les données JSON valides.", "import-map-members": "Map members", - "import-members-map": "Le tableau que vous venez d’importer contient des participants. Veuillez associer les participants que vous souhaitez importer à des utilisateurs de Wekan. ", + "import-members-map": "Le tableau que vous venez d’importer contient des participants. Veuillez associer les participants que vous souhaitez importer à des utilisateurs de Wekan.", "import-show-user-mapping": "Review members mapping", "import-user-select": "Pick the Wekan user you want to use as this member", - "importMapMembersAddPopup-title": "Select Wekan member", + "importMapMembersAddPopup-title": "Sélectionner le membre Wekan", "info": "Infos", "initials": "Initiales", - "invalid-date": "Invalid date", + "invalid-date": "Date invalide", "joined": "a joint", "just-invited": "You are just invited to this board", "keyboard-shortcuts": "Raccourcis clavier", @@ -229,20 +229,20 @@ "listImportCardPopup-title": "Importer une carte Trello", "lists": "Listes", "log-out": "Déconnexion", - "log-in": "Log In", + "log-in": "Connexion", "loginPopup-title": "Connexion", "memberMenuPopup-title": "Préférence de membre", "members": "Membres", "menu": "Menu", "move-selection": "Déplacer la sélection", "moveCardPopup-title": "Déplacer la carte", - "moveCardToBottom-title": "Move to Bottom", - "moveCardToTop-title": "Move to Top", + "moveCardToBottom-title": "Aller en bas", + "moveCardToTop-title": "Aller en haut", "moveSelectionPopup-title": "Déplacer la sélection", "multi-selection": "Sélection multiple", "multi-selection-on": "Multi-Selection active", "muted": "Muted", - "muted-info": "You will never be notified of any changes in this board", + "muted-info": "Vous ne serez jamais averti des modifications effectuées dans ce tableau", "my-boards": "Mes tableaux", "name": "Nom", "no-archived-cards": "Pas de carte archivée.", @@ -321,4 +321,4 @@ "welcome-list1": "Basics", "welcome-list2": "Advanced", "what-to-do": "Que voulez-vous faire ?" -} +} \ No newline at end of file diff --git a/i18n/he.i18n.json b/i18n/he.i18n.json index c3e18a667..be7ef0a06 100644 --- a/i18n/he.i18n.json +++ b/i18n/he.i18n.json @@ -1,15 +1,15 @@ { "accept": "אישור", "act-activity-notify": "[Wekan] Activity Notification", - "act-addAttachment": "attached __attachment__ to __card__", + "act-addAttachment": " __attachment__ שוייך ל- __card__", "act-addComment": "commented on __card__: __comment__", "act-createBoard": "הלוח __board__ נוצר", "act-createCard": "הכרטיס __card__ התווסף לרשימה __list__", "act-createList": "הרשימה __list__ התווספה ללוח __board__", "act-addBoardMember": "המשתמש __member__ שויך ללוח __board__", - "act-archivedBoard": "הלוח __board__ אורכב", - "act-archivedCard": "הכרטיס __card__ אורכב", - "act-archivedList": "הרשימה __card__ אורכבה", + "act-archivedBoard": "הלוח __board__ הועבר לארכיון", + "act-archivedCard": "הכרטיס __card__ הועבר לארכיון", + "act-archivedList": "הרשימה __card__ הועברה לארכיון", "act-importBoard": "הלוח __board__ יובא", "act-importCard": "הכרטיס __card__ יובא", "act-importList": "הרשימה __list__ יובאה", @@ -17,7 +17,7 @@ "act-moveCard": "הכרטיס __card__ הועבר מהרשימה __oldList__ לרשימה __list__", "act-removeBoardMember": "המשתמש __member__ הוסר מהלוח __board__", "act-restoredCard": "הכרטיס __card__ שוחזר ללוח __board__", - "act-unjoinMember": "removed __member__ from __card__", + "act-unjoinMember": "המשתמש __member__ הוסר מהכרטיס __card__", "act-withBoardTitle": "[Wekan] __board__", "act-withCardTitle": "[__board__] __card__", "actions": "פעולות", @@ -36,13 +36,13 @@ "activity-removed": "%s הוסר מ%s", "activity-sent": "%s נשלח ל%s", "activity-unjoined": "בטל צירוף %s", - "activity-checklist-added": "added checklist to %s", + "activity-checklist-added": "רשימת משימות התווספה ל- %s", "add": "הוסף", "add-attachment": "הוסף קובץ", "add-board": "הוסף לוח חדש", "add-card": "הוסף כרטיס", - "add-checklist": "Add a checklist", - "add-checklist-item": "Add an item to checklist", + "add-checklist": "הוסף רשימת משימות", + "add-checklist-item": "הוסף פריט לרשימת משימות", "add-cover": "הוסף כיסוי", "add-label": "הוסף תווית", "add-list": "הוסף רשימה", @@ -54,8 +54,8 @@ "all-boards": "כל הלוחות", "and-n-other-card": "ו __count__ כרטיס אחר", "and-n-other-card_plural": "ו __count__ כרטיסים אחרים", - "apply": "Apply", - "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", + "apply": "אשר שינויים", + "app-is-offline": "המערכת למטה כרגע, ריענון של הדף יגרום לאבדן מידע", "archive": "אחסן בארכיון", "archive-all": "אחסן הכל בארכיון", "archive-board": "אחסן לוח בארכיון", @@ -71,7 +71,7 @@ "attachment-delete-pop": "מחיקת קובץ מצורף הינה סופית. אין דרך חזרה.", "attachmentDeletePopup-title": "למחוק קובץ מצורף?", "attachments": "קבצים מצורפים", - "auto-watch": "Automatically watch boards when create it", + "auto-watch": "עקוב באופן אוטומטי אחרי לוחות אחרי שהם נוצרים", "avatar-too-big": "האווטאר גדול מידי (מקס 70Kb)", "back": "חזור", "board-change-color": "שנה צבע", @@ -82,7 +82,7 @@ "boardChangeColorPopup-title": "שנה רקע ללוח", "boardChangeTitlePopup-title": "שנה שם ללוח", "boardChangeVisibilityPopup-title": "שנה תצוגה", - "boardChangeWatchPopup-title": "Change Watch", + "boardChangeWatchPopup-title": "שנה את הגדרת המעקב", "boardMenuPopup-title": "תפריט לוח", "boards": "לוחות", "bucket-example": "כמו “Bucket List” לדוגמא", @@ -92,15 +92,15 @@ "card-delete-notice": "מחיקה היא סופית. תאבדו את כל הפעולות המשויכות לכרטיס זה.", "card-delete-pop": "כל הפעולות יוסרו מלוח הפעילות ולא תוכלו לפתוח מחדש את הכרטיס. אין דרך חזרה.", "card-delete-suggest-archive": "באפשרותך לאחסן בארכיון כרטיס כדי להסירו מהלוח ולשמר את הפעילות.", - "card-due": "Due", - "card-due-on": "Due on", + "card-due": "תאריך יעד", + "card-due-on": "תאריך יעד", "card-edit-attachments": "ערוך קבצים מצורפים", - "card-edit-labels": "ערוך תוויות ", + "card-edit-labels": "ערוך תוויות", "card-edit-members": "ערוך חברים", "card-labels-title": "שנה תוויות לכרטיס.", "card-members-title": "הוסף או הסר את חברי הלוח מהכרטיס", - "card-start": "Start", - "card-start-on": "Starts on", + "card-start": "התחל", + "card-start-on": "מתחיל ב-", "cardAttachmentsPopup-title": "צרף מ", "cardDeletePopup-title": "למחוק כרטיס?", "cardDetailsActionsPopup-title": "פעולות על הכרטיס", @@ -112,16 +112,16 @@ "change-avatar": "שנה אווטאר", "change-password": "שנה סיסמא", "change-permissions": "שנה הרשאות", - "change-settings": "Change Settings", + "change-settings": "שנה הגדרות", "changeAvatarPopup-title": "שנה אווטאר", "changeLanguagePopup-title": "שנה שפה", "changePasswordPopup-title": "שנה סיסמא", "changePermissionsPopup-title": "שנה הרשאות", - "changeSettingsPopup-title": "Change Settings", - "checklists": "Checklists", + "changeSettingsPopup-title": "שנה הגדרות", + "checklists": "רשימות", "click-to-star": "לחץ להוספת הלוח למועדפים", "click-to-unstar": "לחץ להסרת הלוח מהמועדפים.", - "clipboard" : "Clipboard or drag & drop", + "clipboard": "Clipboard or drag & drop", "close": "סגור", "close-board": "סגור לוח", "close-board-pop": "תוכלו לשחזר את הלוח בלחיצה על כפתור \"ארכיונים\" מהכותרת העליונה.", @@ -142,7 +142,7 @@ "createBoardPopup-title": "צור לוח", "createLabelPopup-title": "צור תווית", "current": "נוכחי", - "date": "Date", + "date": "תאריך", "decline": "סרב", "default-avatar": "אווטאר דיפולטי", "delete": "מחק", @@ -156,10 +156,10 @@ "edit": "ערוך", "edit-avatar": "שנה אווטאר", "edit-profile": "ערוך פרופיל", - "editCardStartDatePopup-title": "Change start date", - "editCardDueDatePopup-title": "Change due date", + "editCardStartDatePopup-title": "שנה זמן התחלה", + "editCardDueDatePopup-title": "שנה זמן סיום", "editLabelPopup-title": "שנה תווית", - "editNotificationPopup-title": "Edit Notification", + "editNotificationPopup-title": "שנה התראה", "editProfilePopup-title": "ערוך פרופיל", "email": "אמייל", "email-enrollAccount-subject": "חשבון נוצר עבורך ב __siteName__", @@ -183,33 +183,33 @@ "error-user-doesNotExist": "משתמש זה לא קיים", "error-user-notAllowSelf": "פעולה זו איננה מותרת", "error-user-notCreated": "משתמש זה לא נוצר", - "error-username-taken": "This username is already taken", + "error-username-taken": "המשתמש כבר קיים במערכת", "export-board": "ייצא לוח", "filter": "מסנן", "filter-cards": "סנן כרטיסים", "filter-clear": "נקה מסנן", - "filter-no-label": "No label", - "filter-no-member": "No member", + "filter-no-label": "אין תווית", + "filter-no-member": "המשתמש לא קיים", "filter-on": "מסנן פועל", "filter-on-desc": "מסנן כרטיסים בלוח זה פועל. יש ללחוץ כאן לעריכת המסנן.", "filter-to-selection": "סנן את הבחירה", "fullname": "שם מלא", "header-logo-title": "חזור לדף הלוחות שלך.", - "hide-system-messages": "Hide system messages", + "hide-system-messages": "הסתר הודעות מערכת", "home": "בית", "import": "ייבא", "import-board": "ייבא מטרלו", - "import-board-title": "Import board from Trello", + "import-board-title": "ייבא לוח מטרלו", "import-board-trello-instruction": "בלוח הטרלו שלך, עבור ל 'Menu', ואז ל 'More', 'Print and Export', 'Export JSON' והעתק את הטקסט שנוצר", "import-json-placeholder": "הדבק נתוני JSON תקינים כאן", - "import-map-members": "Map members", + "import-map-members": "מפֱה חברים", "import-members-map": "הלוחות המיובאים שלך מכילים חברים. בבקשה מפה את החברים שתרצה לייבא כמשתמשים", "import-show-user-mapping": "צפה במיפוי חברים", "import-user-select": "בחר במשתמש עבור חבר זה", - "importMapMembersAddPopup-title": "Select Wekan member", + "importMapMembersAddPopup-title": "בחר משתמש", "info": "אינפורמציה", "initials": "ראשי תיבות", - "invalid-date": "Invalid date", + "invalid-date": "תאריך שגוי", "joined": "הצטרף", "just-invited": "הוזמנת ללוח זה", "keyboard-shortcuts": "קיצורי מקלדת", @@ -229,20 +229,20 @@ "listImportCardPopup-title": "ייבא כרטיס מטרלו", "lists": "רשימות", "log-out": "התנתק", - "log-in": "Log In", + "log-in": "התחבר", "loginPopup-title": "התחבר", "memberMenuPopup-title": "הגדרות חבר", "members": "חברים", "menu": "תפריט", "move-selection": "הזז בחירה", "moveCardPopup-title": "הזז כרטיס", - "moveCardToBottom-title": "Move to Bottom", - "moveCardToTop-title": "Move to Top", + "moveCardToBottom-title": "העבר כרטיס לתחתית הרשימה", + "moveCardToTop-title": "העבר כרטיס לראש הרשימה ", "moveSelectionPopup-title": "הזז בחירה", "multi-selection": "בחירה מרובה", "multi-selection-on": "בחירה מרובה פועלת", - "muted": "Muted", - "muted-info": "You will never be notified of any changes in this board", + "muted": "השתק", + "muted-info": "מעתה אתה לא תקבל עוד התראות על שינויים בלוח זה", "my-boards": "הלוחות שלי", "name": "שם", "no-archived-cards": "אין כרטיסים מאוחסנים בארכיון.", @@ -251,8 +251,8 @@ "normal": "נורמלי", "normal-desc": "יכול לצפות ולערוך כרטיסים. לא יכול לשנות הגדרות.", "not-accepted-yet": "הזמנה לא התקבלה עדיין", - "notify-participate": "Receive updates to any cards you participate as creater or member", - "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "notify-participate": "קבל התראות על שינויים בכרטיסים שיצרת או שבהם אתה חבר", + "notify-watch": "קבל התראות על עדכונים בכל לוח, רשימה או כרטיס שבהם אתה חבר", "optional": "אופציונלי", "or": "או", "page-maybe-private": "יתכן שדף זה פרטי. תוכלו לצפות על ידי התחברות למערכת", @@ -272,7 +272,7 @@ "remove-cover": "הסר כיסוי", "remove-from-board": "הסר מהלוח", "remove-label": "הסר תווית", - "remove-list": "Remove the list", + "remove-list": "הסר מהרשימה", "remove-member": "הסר חבר", "remove-member-from-card": "הסר מהכרטיס", "remove-member-pop": "הסר __name__ (__username__) מ __boardTitle__? החבר יוסר מכל הכרטיסים בלוח זה. הוא יקבל על כך הודעה.", @@ -284,7 +284,7 @@ "search": "חפש", "select-color": "בחר צבע", "shortcut-assign-self": "הקצה את עצמך לכרטיס הנוכחי", - "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-emoji": "השלמה אוטומטית לפרצופונים (Emoji)", "shortcut-autocomplete-members": "השלמה אוטומטית של חברים", "shortcut-clear-filters": "נקה את כל המסננים", "shortcut-close-dialog": "סגור חלון", @@ -292,7 +292,7 @@ "shortcut-show-shortcuts": "הבא רשימת קיצורי דרך זו", "shortcut-toggle-filterbar": "החלף מצבי מסנן", "shortcut-toggle-sidebar": "החלף מצבי מסנן", - "show-cards-minimum-count": "Show cards count if list contains more than", + "show-cards-minimum-count": "הצג מספר כרטיסים אם הרשימה מכיל יותר כרטיסים מ-", "signupPopup-title": "צור חשבון", "star-board-title": "בלחיצה על הכווכב של הלוח יתווסף הלוח לראש רשימת הלוחות שלך.", "starred-boards": "לוחות שסומנו בכוכב", @@ -301,24 +301,24 @@ "team": "צוות", "this-board": "לוח זה", "this-card": "כרטיס זה", - "time": "Time", + "time": "זמן", "title": "כותרת", "tracking": "Tracking", - "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "tracking-info": "אתה תקבל התראות על שינויים בכרטיסים שיצרת או שאתה חבר בהם", "unassign-member": "בטל הקצאת חבר", "unsaved-description": "יש לך תיאור לא שמור.", - "unwatch": "Unwatch", + "unwatch": "הספק מעקב", "upload": "העלה/טען", "upload-avatar": "העלה/ טען אווטאר", "uploaded-avatar": "אווטאר הועלה/נטען", "username": "שם משתמש", "view-it": "צפה", "warn-list-archived": "אזהרה: הכרטיס נמצא ברשימה שהועברה לארכיון", - "watch": "Watch", - "watching": "Watching", - "watching-info": "You will be notified of any change in this board", - "welcome-board": "Welcome Board", + "watch": "עקוב", + "watching": "עוקב", + "watching-info": "מעתה אתה תקבל התראות על עדכונים בלוח זה", + "welcome-board": "ברוך הבא ללוח", "welcome-list1": "Basics", "welcome-list2": "Advanced", "what-to-do": "מה תרצה לעשות?" -} +} \ No newline at end of file diff --git a/i18n/it.i18n.json b/i18n/it.i18n.json index b67aa2ede..7ddfa678c 100755 --- a/i18n/it.i18n.json +++ b/i18n/it.i18n.json @@ -10,7 +10,7 @@ "act-archivedBoard": "ha archiviato __board__", "act-archivedCard": "ha archiviato __card__", "act-archivedList": "ha archiviato __list__", - "act-importBoard": " ha importato __board__", + "act-importBoard": "ha importato __board__", "act-importCard": "ha importato __card__", "act-importList": "ha importato __list__", "act-joinMember": "ha aggiunto __member__ a __card__", @@ -36,13 +36,13 @@ "activity-removed": "rimosso %s da %s", "activity-sent": "inviato %s a %s", "activity-unjoined": "ha abbandonato %s", - "activity-checklist-added": "added checklist to %s", + "activity-checklist-added": "aggiunta checklist a %s", "add": "Aggiungere", "add-attachment": "Aggiungi allegato", "add-board": "Aggiungi una nuova bachecha", "add-card": "Aggiungi una scheda", - "add-checklist": "Add a checklist", - "add-checklist-item": "Add an item to checklist", + "add-checklist": "Aggiungi una checklist", + "add-checklist-item": "Aggiungi un elemento alla checklist", "add-cover": "Aggiungi copertina", "add-label": "Aggiungi l'etichetta", "add-list": "Aggiungi una lista", @@ -118,10 +118,10 @@ "changePasswordPopup-title": "Cambia password", "changePermissionsPopup-title": "Cambia permessi", "changeSettingsPopup-title": "Cambia impostazioni", - "checklists": "Checklists", + "checklists": "Checklist", "click-to-star": "Clicca per stellare questa bacheca", "click-to-unstar": "Clicca per togliere la stella da questa bacheca", - "clipboard" : "Clipboard o drag & drop", + "clipboard": "Clipboard o drag & drop", "close": "Chiudi", "close-board": "Chiudi bacheca", "close-board-pop": "Sarai in grado di ripristinare la bacheca cliccando il tasto \"Archivi\" dall'intestazione della pagina principale.", @@ -163,17 +163,17 @@ "editProfilePopup-title": "Modifica profilo", "email": "Email", "email-enrollAccount-subject": "Creato un account per te su __siteName__", - "email-enrollAccount-text": "Ciao __user__,\n\nPer iniziare ad usare il servizio, clicca sul link seguente:\n\n__url__\n\nGrazie.\n", + "email-enrollAccount-text": "Ciao __user__,\n\nPer iniziare ad usare il servizio, clicca sul link seguente:\n\n__url__\n\nGrazie.", "email-fail": "Invio email fallito", "email-invalid": "Email non valida", "email-invite": "Invita via email", "email-invite-subject": "__inviter__ ti ha inviato un invito", - "email-invite-text": "Caro __user__,\n\n__inviter__ ti ha invitato ad unirti alla bacheca \"__board__\" per le collaborazioni.\n\nPer favore clicca sul link seguente:\n\n__url__\n\nGrazie.\n", + "email-invite-text": "Caro __user__,\n\n__inviter__ ti ha invitato ad unirti alla bacheca \"__board__\" per le collaborazioni.\n\nPer favore clicca sul link seguente:\n\n__url__\n\nGrazie.", "email-resetPassword-subject": "Ripristina la tua password su on __siteName__", - "email-resetPassword-text": "Ciao __user__,\n\nPer ripristinare la tua password, clicca sul link seguente:\n\n__url__\n\nGrazie.\n", + "email-resetPassword-text": "Ciao __user__,\n\nPer ripristinare la tua password, clicca sul link seguente:\n\n__url__\n\nGrazie.", "email-sent": "Email inviata", "email-verifyEmail-subject": "Verifica il tuo indirizzo email su on __siteName__", - "email-verifyEmail-text": "Ciao __user__,\n\nPer verificare il tuo account email, clicca sul link seguente:\n\n__url__\n\nGrazie.\n", + "email-verifyEmail-text": "Ciao __user__,\n\nPer verificare il tuo account email, clicca sul link seguente:\n\n__url__\n\nGrazie.", "error-board-doesNotExist": "Questa bacheca non esiste", "error-board-notAdmin": "Devi essere admin di questa bacheca per poterlo fare", "error-board-notAMember": "Devi essere un membro di questa bacheca per poterlo fare", @@ -272,7 +272,7 @@ "remove-cover": "Rimuovi cover", "remove-from-board": "Rimuovi dalla bacheca", "remove-label": "Rimuovi l'etichetta", - "remove-list": "Remove the list", + "remove-list": "Rimuovi la lista", "remove-member": "Rimuovi utente", "remove-member-from-card": "Rimuovi dalla scheda", "remove-member-pop": "Rimuovere __name__ (__username__) da __boardTitle__? L'utente sarà rimosso da tutte le schede in questa bacheca. Riceveranno una notifica.", @@ -321,4 +321,4 @@ "welcome-list1": "Basi", "welcome-list2": "Avanzate", "what-to-do": "Cosa vuoi fare?" -} +} \ No newline at end of file diff --git a/i18n/ja.i18n.json b/i18n/ja.i18n.json index 529795446..da89a5d3f 100644 --- a/i18n/ja.i18n.json +++ b/i18n/ja.i18n.json @@ -1,5 +1,5 @@ { - "accept": "Accept", + "accept": "受け入れ", "act-activity-notify": "[Wekan] Activity Notification", "act-addAttachment": "attached __attachment__ to __card__", "act-addComment": "commented on __card__: __comment__", @@ -21,7 +21,7 @@ "act-withBoardTitle": "[Wekan] __board__", "act-withCardTitle": "[__board__] __card__", "actions": "操作", - "activities": "Activities", + "activities": "アクティビティ", "activity": "アクティビティ", "activity-added": "%s を %s に追加しました", "activity-archived": "%s をアーカイブしました", @@ -35,55 +35,55 @@ "activity-on": "%s", "activity-removed": "%s を %s から削除しました", "activity-sent": "%s を %s に送りました", - "activity-unjoined": "unjoined %s", - "activity-checklist-added": "added checklist to %s", + "activity-unjoined": "%s への参加を止めました", + "activity-checklist-added": "%s にチェックリストを追加しました", "add": "追加", - "add-attachment": "Add an attachment", + "add-attachment": "添付ファイルの追加", "add-board": "ボード追加", - "add-card": "Add a card", - "add-checklist": "Add a checklist", - "add-checklist-item": "Add an item to checklist", + "add-card": "カードの追加", + "add-checklist": "チェックリストの追加", + "add-checklist-item": "チェックリストに項目を追加", "add-cover": "カバーの追加", - "add-label": "Add the label", - "add-list": "Add a list", - "add-members": "Add Members", + "add-label": "ラベルの追加", + "add-list": "リストの追加", + "add-members": "メンバーの追加", "added": "追加しました", "addMemberPopup-title": "メンバー", "admin": "管理", "admin-desc": "カードの閲覧と編集、メンバーの削除、ボードの設定変更が可能", - "all-boards": "All boards", + "all-boards": "全てのボード", "and-n-other-card": "And __count__ other card", "and-n-other-card_plural": "And __count__ other cards", "apply": "適用", "app-is-offline": "現在オフラインです。ページを更新すると保存していないデータは失われます。", "archive": "アーカイブ", "archive-all": "すべてをアーカイブ", - "archive-board": "Archive Board", - "archive-card": "Archive Card", + "archive-board": "ボードをアーカイブ", + "archive-card": "カードをアーカイブ", "archive-list": "このリストをアーカイブ", - "archive-selection": "Archive selection", - "archiveBoardPopup-title": "Archive Board?", + "archive-selection": "選択したものをアーカイブ", + "archiveBoardPopup-title": "ボードをアーカイブしますか?", "archived-items": "アーカイブされたアイテム", - "archives": "Archives", - "assign-member": "Assign member", + "archives": "アーカイブ", + "assign-member": "メンバーの割当", "attached": "添付されました", "attachment": "添付ファイル", "attachment-delete-pop": "添付ファイルの削除をすると取り消しできません。", "attachmentDeletePopup-title": "添付ファイルを削除しますか?", "attachments": "添付ファイル", "auto-watch": "作成したボードは自動的に監視する", - "avatar-too-big": "The avatar is too large (70Kb max)", + "avatar-too-big": "アバターが大きすぎます(最大70KB)", "back": "戻る", - "board-change-color": "Change color", + "board-change-color": "色の変更", "board-nb-stars": "%s stars", "board-not-found": "ボードが見つかりません", "board-private-info": "This board will be private.", "board-public-info": "ボードは公開されます。", - "boardChangeColorPopup-title": "Change Board Background", + "boardChangeColorPopup-title": "ボードの背景を変更", "boardChangeTitlePopup-title": "ボード名の変更", "boardChangeVisibilityPopup-title": "公開範囲の変更", "boardChangeWatchPopup-title": "Change Watch", - "boardMenuPopup-title": "Board Menu", + "boardMenuPopup-title": "ボードメニュー", "boards": "ボード", "bucket-example": "Like “Bucket List” for example", "cancel": "キャンセル", @@ -94,79 +94,79 @@ "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.", "card-due": "期限", "card-due-on": "Due on", - "card-edit-attachments": "Edit attachments", - "card-edit-labels": "Edit labels", - "card-edit-members": "Edit members", + "card-edit-attachments": "添付ファイルの編集", + "card-edit-labels": "ラベルの編集", + "card-edit-members": "メンバーの編集", "card-labels-title": "カードのラベルを変更する", "card-members-title": "カードからボードメンバーを追加・削除する", "card-start": "開始", "card-start-on": "Starts on", "cardAttachmentsPopup-title": "Attach From", "cardDeletePopup-title": "カードを削除しますか?", - "cardDetailsActionsPopup-title": "Card Actions", + "cardDetailsActionsPopup-title": "カード操作", "cardLabelsPopup-title": "ラベル", "cardMembersPopup-title": "メンバー", "cardMorePopup-title": "さらに見る", - "cards": "Cards", - "change": "Change", + "cards": "カード", + "change": "変更", "change-avatar": "アバターの変更", "change-password": "パスワードの変更", - "change-permissions": "Change permissions", + "change-permissions": "権限の変更", "change-settings": "設定の変更", "changeAvatarPopup-title": "アバターの変更", "changeLanguagePopup-title": "言語の変更", "changePasswordPopup-title": "パスワードの変更", "changePermissionsPopup-title": "パーミッションの変更", "changeSettingsPopup-title": "設定の変更", - "checklists": "Checklists", + "checklists": "チェックリスト", "click-to-star": "ボードにスターをつける", "click-to-unstar": "ボードからスターを外す", - "clipboard" : "Clipboard or drag & drop", + "clipboard": "クリップボードもしくはドラッグ&ドロップ", "close": "閉じる", - "close-board": "Close Board", + "close-board": "ボードを閉じる", "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", - "color-black": "black", - "color-blue": "blue", - "color-green": "green", - "color-lime": "lime", - "color-orange": "orange", - "color-pink": "pink", - "color-purple": "purple", - "color-red": "red", - "color-sky": "sky", - "color-yellow": "yellow", + "color-black": "黒", + "color-blue": "青", + "color-green": "緑", + "color-lime": "ライム", + "color-orange": "オレンジ", + "color-pink": "ピンク", + "color-purple": "紫", + "color-red": "赤", + "color-sky": "空", + "color-yellow": "黄", "comment": "コメント", - "comment-placeholder": "Write a comment", + "comment-placeholder": "コメントを書く", "computer": "コンピューター", "create": "作成", "createBoardPopup-title": "ボードの作成", "createLabelPopup-title": "ラベルの作成", - "current": "current", - "date": "Date", - "decline": "Decline", - "default-avatar": "Default avatar", + "current": "現在", + "date": "日付", + "decline": "拒否", + "default-avatar": "デフォルトのアバター", "delete": "削除", "deleteLabelPopup-title": "ラベルを削除しますか?", "description": "詳細", "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", - "discard": "Discard", - "done": "Done", + "discard": "捨てる", + "done": "完了", "download": "ダウンロード", "edit": "編集", "edit-avatar": "アバターの変更", - "edit-profile": "Edit Profile", - "editCardStartDatePopup-title": "Change start date", - "editCardDueDatePopup-title": "Change due date", + "edit-profile": "プロフィールの編集", + "editCardStartDatePopup-title": "開始日の変更", + "editCardDueDatePopup-title": "期限の変更", "editLabelPopup-title": "ラベルの変更", - "editNotificationPopup-title": "Edit Notification", - "editProfilePopup-title": "Edit Profile", + "editNotificationPopup-title": "通知の変更", + "editProfilePopup-title": "プロフィールの編集", "email": "メールアドレス", "email-enrollAccount-subject": "An account created for you on __siteName__", "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", - "email-fail": "Sending email failed", - "email-invalid": "Invalid email", - "email-invite": "Invite via Email", + "email-fail": "メールの送信に失敗しました", + "email-invalid": "無効なメールアドレス", + "email-invite": "メールで招待", "email-invite-subject": "__inviter__ sent you an invitation", "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", "email-resetPassword-subject": "Reset your password on __siteName__", @@ -174,32 +174,32 @@ "email-sent": "Email sent", "email-verifyEmail-subject": "Verify your email address on __siteName__", "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", - "error-board-doesNotExist": "This board does not exist", + "error-board-doesNotExist": "ボードがありません", "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", + "error-user-doesNotExist": "ユーザーが存在しません", + "error-user-notAllowSelf": "この操作は許可されていません", + "error-user-notCreated": "ユーザーが作成されていません", "error-username-taken": "このユーザ名は既に使用されています", - "export-board": "Export board", - "filter": "Filter", + "export-board": "ボードのエクスポート", + "filter": "フィルター", "filter-cards": "カードをフィルターする", - "filter-clear": "Clear filter", - "filter-no-label": "No label", - "filter-no-member": "No member", - "filter-on": "Filter is on", + "filter-clear": "フィルターの解除", + "filter-no-label": "ラベルなし", + "filter-no-member": "メンバーなし", + "filter-on": "フィルター有効", "filter-on-desc": "このボードのカードをフィルターしています。フィルターを編集するにはこちらをクリックしてください。", "filter-to-selection": "Filter to selection", "fullname": "フルネーム", "header-logo-title": "自分のボードページに戻る。", - "hide-system-messages": "Hide system messages", + "hide-system-messages": "システムメッセージを隠す", "home": "ホーム", - "import": "Import", - "import-board": "import from Trello", - "import-board-title": "Import board from Trello", + "import": "インポート", + "import-board": "Trelloからインポート", + "import-board-title": "Trelloからボードをインポート", "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text", "import-json-placeholder": "Paste your valid JSON data here", "import-map-members": "Map members", @@ -209,48 +209,48 @@ "importMapMembersAddPopup-title": "Select Wekan member", "info": "情報", "initials": "Initials", - "invalid-date": "Invalid date", + "invalid-date": "無効な日付", "joined": "参加しました", "just-invited": "You are just invited to this board", - "keyboard-shortcuts": "Keyboard shortcuts", + "keyboard-shortcuts": "キーボード・ショートカット", "label-create": "ラベル作成", "label-default": "%s ラベル(デフォルト)", "label-delete-pop": "この操作は取り消しできません。このラベルはすべてのカードから外され履歴からも見えなくなります。", "labels": "ラベル", "language": "言語", "last-admin-desc": "最低でも1人以上の管理者が必要なためロールを変更できません。", - "leave-board": "Leave Board", + "leave-board": "ボードから退出する", "link-card": "このカードへのリンク", - "list-archive-cards": "Archive all cards in this list", + "list-archive-cards": "リストの全カードをアーカイブする", "list-archive-cards-pop": "ボードのこのリスト内のすべてのカードを取り除きます。アーカイブされたカードの確認やそれをボードに戻すには、メニューをクリックし、\"アーカイブされたアイテム\"をクリックしてください。", - "list-move-cards": "Move all cards in this list", - "list-select-cards": "Select all cards in this list", + "list-move-cards": "リストの全カードを移動する", + "list-select-cards": "リストの全カードを選択", "listActionPopup-title": "操作一覧", - "listImportCardPopup-title": "Import a Trello card", - "lists": "Lists", + "listImportCardPopup-title": "Trelloのカードをインポート", + "lists": "リスト", "log-out": "ログアウト", - "log-in": "Log In", + "log-in": "ログイン", "loginPopup-title": "ログイン", - "memberMenuPopup-title": "Member Settings", + "memberMenuPopup-title": "メンバー設定", "members": "メンバー", "menu": "メニュー", "move-selection": "Move selection", - "moveCardPopup-title": "Move Card", - "moveCardToBottom-title": "Move to Bottom", - "moveCardToTop-title": "Move to Top", - "moveSelectionPopup-title": "Move selection", - "multi-selection": "Multi-Selection", - "multi-selection-on": "Multi-Selection is on", - "muted": "Muted", - "muted-info": "You will never be notified of any changes in this board", + "moveCardPopup-title": "カードの移動", + "moveCardToBottom-title": "最下部に移動", + "moveCardToTop-title": "先頭に移動", + "moveSelectionPopup-title": "選択箇所に移動", + "multi-selection": "複数選択", + "multi-selection-on": "複数選択有効", + "muted": "ミュート", + "muted-info": "このボードの変更は通知されません", "my-boards": "自分のボード", "name": "名前", - "no-archived-cards": "No archived cards.", - "no-archived-lists": "No archived lists.", + "no-archived-cards": "アーカイブされたボードはありません", + "no-archived-lists": "アーカイブされたリストはありません", "no-results": "該当するものはありません", "normal": "通常", "normal-desc": "カードの閲覧と編集が可能。設定変更不可。", - "not-accepted-yet": "Invitation not accepted yet", + "not-accepted-yet": "招待はアクセプトされていません", "notify-participate": "Receive updates to any cards you participate as creater or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", "optional": "任意", @@ -259,10 +259,10 @@ "page-not-found": "ページが見つかりません。", "password": "パスワード", "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", - "participating": "Participating", - "preview": "Preview", - "previewAttachedImagePopup-title": "Preview", - "previewClipboardImagePopup-title": "Preview", + "participating": "参加", + "preview": "プレビュー", + "previewAttachedImagePopup-title": "プレビュー", + "previewClipboardImagePopup-title": "プレビュー", "private": "プライベート", "private-desc": "このボードはプライベートです。ボードメンバーのみが閲覧・編集可能です。", "profile": "プロフィール", @@ -270,11 +270,11 @@ "public-desc": "このボードはパブリックです。リンクを知っていれば誰でもアクセス可能でGoogleのような検索エンジンの結果に表示されます。このボードに追加されている人だけがカード追加が可能です。", "quick-access-description": "Star a board to add a shortcut in this bar.", "remove-cover": "カバーの削除", - "remove-from-board": "Remove from Board", - "remove-label": "Remove the label", - "remove-list": "Remove the list", + "remove-from-board": "ボードから外す", + "remove-label": "ラベルを外す", + "remove-list": "リストの除去", "remove-member": "メンバーを外す", - "remove-member-from-card": "カードから取り除く", + "remove-member-from-card": "カードから外す", "remove-member-pop": "__boardTitle__ から __name__ (__username__) を外しますか?メンバーはこのボードのすべてのカードから外れ、通知を受けます。", "removeMemberPopup-title": "メンバーを外しますか?", "rename": "名前変更", @@ -283,15 +283,15 @@ "save": "保存", "search": "検索", "select-color": "色を選択", - "shortcut-assign-self": "Assign yourself to current card", + "shortcut-assign-self": "自分をこのカードに割り当てる", "shortcut-autocomplete-emoji": "Autocomplete emoji", "shortcut-autocomplete-members": "Autocomplete members", - "shortcut-clear-filters": "Clear all filters", - "shortcut-close-dialog": "Close Dialog", + "shortcut-clear-filters": "すべてのフィルターを解除する", + "shortcut-close-dialog": "ダイアログを閉じる", "shortcut-filter-my-cards": "Filter my cards", "shortcut-show-shortcuts": "Bring up this shortcuts list", - "shortcut-toggle-filterbar": "Toggle Filter Sidebar", - "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "shortcut-toggle-filterbar": "フィルターサイドバーの切り替え", + "shortcut-toggle-sidebar": "ボードサイドバーの切り替え", "show-cards-minimum-count": "Show cards count if list contains more than", "signupPopup-title": "アカウント作成", "star-board-title": "ボードにスターをつけると自分のボード一覧のトップに表示されます。", @@ -301,24 +301,24 @@ "team": "チーム", "this-board": "このボード", "this-card": "このカード", - "time": "Time", + "time": "時間", "title": "タイトル", - "tracking": "Tracking", + "tracking": "トラッキング", "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", "unassign-member": "Unassign member", "unsaved-description": "You have an unsaved description.", - "unwatch": "Unwatch", - "upload": "Upload", - "upload-avatar": "Upload an avatar", - "uploaded-avatar": "Uploaded an avatar", + "unwatch": "アンウォッチ", + "upload": "アップロード", + "upload-avatar": "アバターのアップロード", + "uploaded-avatar": "アップロードされたアバター", "username": "ユーザー名", "view-it": "View it", "warn-list-archived": "warning: this card is in an archived list", - "watch": "Watch", - "watching": "Watching", - "watching-info": "You will be notified of any change in this board", - "welcome-board": "Welcome Board", - "welcome-list1": "Basics", - "welcome-list2": "Advanced", - "what-to-do": "What do you want to do?" -} + "watch": "ウォッチ", + "watching": "ウォッチしています", + "watching-info": "このボードの変更が通知されます", + "welcome-board": "ウェルカムボード", + "welcome-list1": "基本", + "welcome-list2": "高度", + "what-to-do": "何をしたいですか?" +} \ No newline at end of file diff --git a/i18n/ko.i18n.json b/i18n/ko.i18n.json index a7284d369..315aef0e7 100644 --- a/i18n/ko.i18n.json +++ b/i18n/ko.i18n.json @@ -121,7 +121,7 @@ "checklists": "Checklists", "click-to-star": "보드 별 추가.", "click-to-unstar": "보드 별 삭제.", - "clipboard" : "Clipboard or drag & drop", + "clipboard": "Clipboard or drag & drop", "close": "닫기", "close-board": "Close Board", "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", @@ -229,7 +229,7 @@ "listImportCardPopup-title": "Import a Trello card", "lists": "Lists", "log-out": "로그아웃", - "log-in": "Log In", + "log-in": "로그인", "loginPopup-title": "로그인", "memberMenuPopup-title": "Member Settings", "members": "멤버", @@ -321,4 +321,4 @@ "welcome-list1": "Basics", "welcome-list2": "Advanced", "what-to-do": "무엇을 원하나요?" -} +} \ No newline at end of file diff --git a/i18n/pl.i18n.json b/i18n/pl.i18n.json index 800388fdc..533674427 100644 --- a/i18n/pl.i18n.json +++ b/i18n/pl.i18n.json @@ -90,7 +90,7 @@ "card-archived": "Ta karta jest zarchiwizowana.", "card-comments-title": "Ta karta ma %s komentarzy.", "card-delete-notice": "Usunięcie jest trwałe. Stracisz wszystkie akcje powiązane z tą kartą.", - "card-delete-pop": "Wszystkie akcje będą usunięte z widoku aktywności, nie można będzie ponownie otworzyć karty. Usunięcie jest nieodwracalne. ", + "card-delete-pop": "Wszystkie akcje będą usunięte z widoku aktywności, nie można będzie ponownie otworzyć karty. Usunięcie jest nieodwracalne.", "card-delete-suggest-archive": "Możesz zarchiwizować kartę w celu usunięcia jej z tablicy oraz zachowania jej aktywności.", "card-due": "Due", "card-due-on": "Due on", @@ -121,7 +121,7 @@ "checklists": "Checklists", "click-to-star": "Kliknij by odznaczyć tę tablicę.", "click-to-unstar": "Kliknij by usunąć odznaczenie tej tablicy.", - "clipboard" : "Schowek lub przeciągnij & upuść", + "clipboard": "Schowek lub przeciągnij & upuść", "close": "Zamknij", "close-board": "Zamknij tablicę", "close-board-pop": "Możesz przywrócić tablicę klikając przycisk \"Zarchiwizowane\" z głównej belki.", @@ -229,7 +229,7 @@ "listImportCardPopup-title": "Zaimportuj kartę z Trello", "lists": "Listy", "log-out": "Wyloguj", - "log-in": "Log In", + "log-in": "Zaloguj", "loginPopup-title": "Zaloguj", "memberMenuPopup-title": "Member Settings", "members": "Członkowie", @@ -321,4 +321,4 @@ "welcome-list1": "Basics", "welcome-list2": "Advanced", "what-to-do": "Co chcesz zrobić?" -} +} \ No newline at end of file diff --git a/i18n/pt-BR.i18n.json b/i18n/pt-BR.i18n.json index 9e0018ddf..2912787d4 100644 --- a/i18n/pt-BR.i18n.json +++ b/i18n/pt-BR.i18n.json @@ -121,7 +121,7 @@ "checklists": "Checklists", "click-to-star": "Marcar quadro como favorito.", "click-to-unstar": "Remover quadro dos favoritos.", - "clipboard" : "Área de Transferência ou arraste e solte", + "clipboard": "Área de Transferência ou arraste e solte", "close": "Fechar", "close-board": "Fechar Quadro", "close-board-pop": "Você estará habilitado para restaurar o quadro clicando no botão \"Arquivos\" à partir da barra de início.", @@ -229,7 +229,7 @@ "listImportCardPopup-title": "Importe um cartão do Trello", "lists": "Listas", "log-out": "Sair", - "log-in": "Log In", + "log-in": "Entrar", "loginPopup-title": "Entrar", "memberMenuPopup-title": "Configuração de Membros", "members": "Membros", @@ -321,4 +321,4 @@ "welcome-list1": "Basics", "welcome-list2": "Advanced", "what-to-do": "O que você gostaria de fazer?" -} +} \ No newline at end of file diff --git a/i18n/ro.i18n.json b/i18n/ro.i18n.json index feb955043..da2f3bb6d 100644 --- a/i18n/ro.i18n.json +++ b/i18n/ro.i18n.json @@ -121,7 +121,7 @@ "checklists": "Checklists", "click-to-star": "Click to star this board.", "click-to-unstar": "Click to unstar this board.", - "clipboard" : "Clipboard or drag & drop", + "clipboard": "Clipboard or drag & drop", "close": "Închide", "close-board": "Close Board", "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", @@ -321,4 +321,4 @@ "welcome-list1": "Basics", "welcome-list2": "Advanced", "what-to-do": "Ce ai vrea sa faci?" -} +} \ No newline at end of file diff --git a/i18n/ru.i18n.json b/i18n/ru.i18n.json index 400352eec..fd98b49fa 100644 --- a/i18n/ru.i18n.json +++ b/i18n/ru.i18n.json @@ -121,7 +121,7 @@ "checklists": "Checklists", "click-to-star": "Добавить в «Избранное»", "click-to-unstar": "Удалить из «Избранного»", - "clipboard" : "Буфер обмена или drag & drop", + "clipboard": "Буфер обмена или drag & drop", "close": "Закрыть", "close-board": "Закрыть доску", "close-board-pop": "Вы можете восстановить доску, нажав “Архивы” в заголовке.", @@ -203,7 +203,7 @@ "import-board-trello-instruction": "На вашей Trello доске нажмите “Menu” - “More” - “Print and export - “Export JSON” и скопируйте полученный текст", "import-json-placeholder": "Вставьте JSON сюда", "import-map-members": "Map members", - "import-members-map": "Вы ипортировали доску с пользователями. Пожалуйста, составьте карту пользователей, которых вы хотите импортировать в Wekan пользователей ", + "import-members-map": "Вы ипортировали доску с пользователями. Пожалуйста, составьте карту пользователей, которых вы хотите импортировать в Wekan пользователей", "import-show-user-mapping": "Пересмотреть карту пользователей", "import-user-select": "Выберите Wekan-пользователя, которого вы хотите использовать в качестве пользователя", "importMapMembersAddPopup-title": "Select Wekan member", @@ -229,7 +229,7 @@ "listImportCardPopup-title": "Импортировать Trello карточку", "lists": "Списки", "log-out": "Выйти", - "log-in": "Log In", + "log-in": "Войти", "loginPopup-title": "Войти", "memberMenuPopup-title": "Настройки пользователя", "members": "Участники", @@ -321,4 +321,4 @@ "welcome-list1": "Basics", "welcome-list2": "Advanced", "what-to-do": "Что вы хотите сделать?" -} +} \ No newline at end of file diff --git a/i18n/sr.i18n.json b/i18n/sr.i18n.json index 49e7bd1ab..af7b4efcd 100644 --- a/i18n/sr.i18n.json +++ b/i18n/sr.i18n.json @@ -54,7 +54,7 @@ "all-boards": "Sve table", "and-n-other-card": "And __count__ other card", "and-n-other-card_plural": "And __count__ other cards", - "apply": "Apply", + "apply": "Primeni", "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", "archive": "Arhiviraj", "archive-all": "Arhiviraj sve", @@ -92,15 +92,15 @@ "card-delete-notice": "Brisanje je trajno. Izgubićeš sve akcije povezane sa ovom karticom.", "card-delete-pop": "Sve akcije će biti uklonjene sa liste aktivnosti i kartica neće moći biti ponovo otvorena. Nema vraćanja unazad.", "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.", - "card-due": "Due", - "card-due-on": "Due on", + "card-due": "Krajnji datum", + "card-due-on": "Završava se", "card-edit-attachments": "Uredi priloge", "card-edit-labels": "Uredi natpise", "card-edit-members": "Uredi članove", "card-labels-title": "Promeni natpis na kartici.", "card-members-title": "Dodaj ili ukloni članove table sa kartice.", - "card-start": "Start", - "card-start-on": "Starts on", + "card-start": "Početak", + "card-start-on": "Počinje", "cardAttachmentsPopup-title": "Attach From", "cardDeletePopup-title": "Delete Card?", "cardDetailsActionsPopup-title": "Card Actions", @@ -112,16 +112,16 @@ "change-avatar": "Change Avatar", "change-password": "Change Password", "change-permissions": "Change permissions", - "change-settings": "Change Settings", + "change-settings": "Izmeni podešavanja", "changeAvatarPopup-title": "Change Avatar", "changeLanguagePopup-title": "Change Language", "changePasswordPopup-title": "Change Password", "changePermissionsPopup-title": "Change Permissions", - "changeSettingsPopup-title": "Change Settings", + "changeSettingsPopup-title": "Izmeni podešavanja", "checklists": "Checklists", "click-to-star": "Click to star this board.", "click-to-unstar": "Click to unstar this board.", - "clipboard" : "Clipboard or drag & drop", + "clipboard": "Clipboard or drag & drop", "close": "Close", "close-board": "Close Board", "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", @@ -142,7 +142,7 @@ "createBoardPopup-title": "Create Board", "createLabelPopup-title": "Create Label", "current": "current", - "date": "Date", + "date": "Datum", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -156,10 +156,10 @@ "edit": "Edit", "edit-avatar": "Change Avatar", "edit-profile": "Edit Profile", - "editCardStartDatePopup-title": "Change start date", - "editCardDueDatePopup-title": "Change due date", + "editCardStartDatePopup-title": "Izmeni početni datum", + "editCardDueDatePopup-title": "Izmeni krajnji datum", "editLabelPopup-title": "Change Label", - "editNotificationPopup-title": "Edit Notification", + "editNotificationPopup-title": "Izmeni notifikaciju", "editProfilePopup-title": "Edit Profile", "email": "Email", "email-enrollAccount-subject": "An account created for you on __siteName__", @@ -183,33 +183,33 @@ "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", - "error-username-taken": "This username is already taken", + "error-username-taken": "Korisničko ime je već zauzeto", "export-board": "Export board", "filter": "Filter", "filter-cards": "Filter Cards", "filter-clear": "Clear filter", "filter-no-label": "No label", - "filter-no-member": "No member", + "filter-no-member": "Nema člana", "filter-on": "Filter is on", "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", "filter-to-selection": "Filter to selection", "fullname": "Full Name", "header-logo-title": "Go back to your boards page.", - "hide-system-messages": "Hide system messages", + "hide-system-messages": "Sakrij sistemske poruke", "home": "Home", "import": "Import", "import-board": "import from Trello", "import-board-title": "Import board from Trello", "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text", "import-json-placeholder": "Paste your valid JSON data here", - "import-map-members": "Map members", + "import-map-members": "Mapiraj članove", "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users", "import-show-user-mapping": "Review members mapping", "import-user-select": "Pick the Wekan user you want to use as this member", - "importMapMembersAddPopup-title": "Select Wekan member", + "importMapMembersAddPopup-title": "Izaberi člana Wekan-a", "info": "Infos", "initials": "Initials", - "invalid-date": "Invalid date", + "invalid-date": "Neispravan datum", "joined": "joined", "just-invited": "You are just invited to this board", "keyboard-shortcuts": "Keyboard shortcuts", @@ -236,12 +236,12 @@ "menu": "Menu", "move-selection": "Move selection", "moveCardPopup-title": "Move Card", - "moveCardToBottom-title": "Move to Bottom", - "moveCardToTop-title": "Move to Top", + "moveCardToBottom-title": "Premesti na dno", + "moveCardToTop-title": "Premesti na vrh", "moveSelectionPopup-title": "Move selection", "multi-selection": "Multi-Selection", "multi-selection-on": "Multi-Selection is on", - "muted": "Muted", + "muted": "Utišano", "muted-info": "You will never be notified of any changes in this board", "my-boards": "My Boards", "name": "Name", @@ -259,7 +259,7 @@ "page-not-found": "Stranica nije pronađena.", "password": "Lozinka", "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", - "participating": "Participating", + "participating": "Učestvujem", "preview": "Prikaz", "previewAttachedImagePopup-title": "Prikaz", "previewClipboardImagePopup-title": "Prikaz", @@ -272,7 +272,7 @@ "remove-cover": "Remove Cover", "remove-from-board": "Ukloni iz table", "remove-label": "Ukloni natpis", - "remove-list": "Remove the list", + "remove-list": "Ukloni listu", "remove-member": "Ukloni člana", "remove-member-from-card": "Ukloni iz kartice", "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", @@ -301,24 +301,24 @@ "team": "Tim", "this-board": "ova tabla", "this-card": "ova kartica", - "time": "Time", + "time": "Vreme", "title": "Naslov", - "tracking": "Tracking", + "tracking": "Praćenje", "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", "unassign-member": "Unassign member", "unsaved-description": "Imaš nesnimljen opis.", - "unwatch": "Unwatch", + "unwatch": "Ne posmatraj", "upload": "Upload", "upload-avatar": "Upload an avatar", "uploaded-avatar": "Uploaded an avatar", "username": "Korisničko ime", "view-it": "Pregledaj je", "warn-list-archived": "upozorenje: ova kartica je u arhiviranoj listi", - "watch": "Watch", + "watch": "Posmatraj", "watching": "Watching", "watching-info": "You will be notified of any change in this board", "welcome-board": "Welcome Board", - "welcome-list1": "Basics", - "welcome-list2": "Advanced", + "welcome-list1": "Osnove", + "welcome-list2": "Napredno", "what-to-do": "Šta želiš da uradiš ?" -} +} \ No newline at end of file diff --git a/i18n/tr.i18n.json b/i18n/tr.i18n.json index 7f79436f2..47336f668 100644 --- a/i18n/tr.i18n.json +++ b/i18n/tr.i18n.json @@ -121,7 +121,7 @@ "checklists": "Checklists", "click-to-star": "Bu panoyu yıldızlamak için tıkla.", "click-to-unstar": "Bu panunun yıldızını kaldırmak için tıkla.", - "clipboard" : "Clipboard or drag & drop", + "clipboard": "Clipboard or drag & drop", "close": "Kapat", "close-board": "Close Board", "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", @@ -229,7 +229,7 @@ "listImportCardPopup-title": "Import a Trello card", "lists": "Lists", "log-out": "Oturum Kapat", - "log-in": "Log In", + "log-in": "Oturum Aç", "loginPopup-title": "Oturum Aç", "memberMenuPopup-title": "Member Settings", "members": "Üyeler", @@ -321,4 +321,4 @@ "welcome-list1": "Basics", "welcome-list2": "Advanced", "what-to-do": "What do you want to do?" -} +} \ No newline at end of file diff --git a/i18n/zh-CN.i18n.json b/i18n/zh-CN.i18n.json index 8947cc4a8..0f5871c36 100644 --- a/i18n/zh-CN.i18n.json +++ b/i18n/zh-CN.i18n.json @@ -15,9 +15,9 @@ "act-importList": "导入列表 __list__", "act-joinMember": "添加成员 __member__ 至卡片 __card__", "act-moveCard": "从列表 __oldList__ 移动卡片 __card__ 至列表 __list__", - "act-removeBoardMember": "从看板 __board__ 移除成员 __member__ ", + "act-removeBoardMember": "从看板 __board__ 移除成员 __member__", "act-restoredCard": "恢复卡片 __card__ 至看板 __board__", - "act-unjoinMember": "从卡片 __card__ 移除成员 __member__ ", + "act-unjoinMember": "从卡片 __card__ 移除成员 __member__", "act-withBoardTitle": "[Wekan] 看板 __board__", "act-withCardTitle": "[看板 __board__] 卡片 __card__", "actions": "操作", @@ -36,13 +36,13 @@ "activity-removed": "从 %s 中移除 %s", "activity-sent": "发送 %s 至 %s", "activity-unjoined": "已解除 %s 关联", - "activity-checklist-added": "added checklist to %s", + "activity-checklist-added": "已经将清单添加到 %s", "add": "添加", "add-attachment": "添加附件", "add-board": "添加新看板", "add-card": "添加卡片", - "add-checklist": "Add a checklist", - "add-checklist-item": "Add an item to checklist", + "add-checklist": "添加清单", + "add-checklist-item": "扩充清单", "add-cover": "添加封面", "add-label": "添加标签", "add-list": "添加清单", @@ -118,10 +118,10 @@ "changePasswordPopup-title": "更改密码", "changePermissionsPopup-title": "更改权限", "changeSettingsPopup-title": "更改设置", - "checklists": "Checklists", + "checklists": "清单", "click-to-star": "点此来标记该看板", "click-to-unstar": "点此来去除该看板的标记", - "clipboard" : "剪贴板或者拖放文件", + "clipboard": "剪贴板或者拖放文件", "close": "关闭", "close-board": "关闭看板", "close-board-pop": "您可以通过点击主界面顶部的”回收箱“按钮来还原看板。", @@ -202,7 +202,7 @@ "import-board-title": "从Trello导入看板", "import-board-trello-instruction": "在你的Trello看板中,点击“菜单”,然后选择“更多”,“打印与导出”,“导出为 JSON” 并拷贝结果文本", "import-json-placeholder": "粘贴您有效的 JSON 数据至此", - "import-map-members": " 映射成员", + "import-map-members": "映射成员", "import-members-map": "您导入的看板有一些成员。请将您想导入的成员映射到 Wekan 用户。", "import-show-user-mapping": "核对成员映射", "import-user-select": "选择您想将此成员映射到的 Wekan 用户", @@ -272,7 +272,7 @@ "remove-cover": "移除封面", "remove-from-board": "从看板中删除", "remove-label": "移除标签", - "remove-list": "Remove the list", + "remove-list": "删除清单", "remove-member": "移除成员", "remove-member-from-card": "从该卡片中移除", "remove-member-pop": "确定从 __boardTitle__ 中移除 __name__ (__username__) 吗? 该成员将被从该看板的所有卡片中移除,同时他会收到一条提醒。", @@ -293,7 +293,7 @@ "shortcut-toggle-filterbar": "切换过滤器边栏", "shortcut-toggle-sidebar": "切换面板边栏", "show-cards-minimum-count": "当列表中的卡片多于此阈值时将显示数量", - "signupPopup-title": " 创建账户", + "signupPopup-title": "创建账户", "star-board-title": "点此来标记该看板,它将会出现在您的看板列表顶部。", "starred-boards": "已标记看板", "starred-boards-description": "已标记看板将会出现在您的看板列表顶部。", @@ -321,4 +321,4 @@ "welcome-list1": "基本", "welcome-list2": "高阶", "what-to-do": "要做什么?" -} +} \ No newline at end of file diff --git a/i18n/zh-TW.i18n.json b/i18n/zh-TW.i18n.json index 6855d9cb5..6658bea72 100644 --- a/i18n/zh-TW.i18n.json +++ b/i18n/zh-TW.i18n.json @@ -36,13 +36,13 @@ "activity-removed": "移除 %s 從 %s 中", "activity-sent": "寄送 %s 至 %s", "activity-unjoined": "解除關聯 %s", - "activity-checklist-added": "added checklist to %s", + "activity-checklist-added": "新增待辦清單至 %s", "add": "新增", "add-attachment": "新增附件", "add-board": "新增看板", "add-card": "新增卡片", - "add-checklist": "Add a checklist", - "add-checklist-item": "Add an item to checklist", + "add-checklist": "新增待辦清單", + "add-checklist-item": "新增項目", "add-cover": "新增封面", "add-label": "新增標籤", "add-list": "新增清單", @@ -118,10 +118,10 @@ "changePasswordPopup-title": "更改密碼", "changePermissionsPopup-title": "更改許可權", "changeSettingsPopup-title": "更改設定", - "checklists": "Checklists", + "checklists": "待辦清單", "click-to-star": "點此來標記該看板", "click-to-unstar": "點此來去除該看板的標記", - "clipboard" : "剪貼簿貼上或者拖曳檔案", + "clipboard": "剪貼簿貼上或者拖曳檔案", "close": "關閉", "close-board": "關閉看板", "close-board-pop": "您可以透過點選主介面上方的”回收筒“按鈕來還原看板。", @@ -272,7 +272,7 @@ "remove-cover": "移除封面", "remove-from-board": "從看板中刪除", "remove-label": "移除標籤", - "remove-list": "Remove the list", + "remove-list": "移除清單", "remove-member": "移除成員", "remove-member-from-card": "從該卡片中移除", "remove-member-pop": "確定從 __boardTitle__ 中移除 __name__ (__username__) 嗎? 該成員將被從該看板的所有卡片中移除,同時他會收到一則提醒。", @@ -321,4 +321,4 @@ "welcome-list1": "基本", "welcome-list2": "進階", "what-to-do": "要做什麼?" -} +} \ No newline at end of file From 8c090344d4f487d61c538fb17de5d1dc16b247aa Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Wed, 8 Feb 2017 13:48:14 +0200 Subject: [PATCH 133/136] Roadmap now at self-hosted Wekan, actual work happends on GitHub issues. Made descriptions more clear. --- README.md | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index c2342f804..dcdd65e4a 100644 --- a/README.md +++ b/README.md @@ -27,8 +27,11 @@ interface, import from Trello (on standalone Wekan), cards comments, checklists, member assignations, customizable labels, closing lists, filtered views, and more. SSO options like LDAP, passwordless email, SAML, GitHub and Google Auth are -already available on Sandstorm, not standalone Wekan. Sandstorm is now completely -Open Source, including server clustering. +already available on Sandstorm, not standalone Wekan. Sandstorm is Enterprise +scale highly secure platform with grains, logging, admin settings, +server clustering, App Market and it's now fully Open Source. Sandstorm is +preferred platform for Wekan, as it would take a lot of work to reimplement +everything in standalone Wekan. Since Wekan is a free software, you don’t have to trust us with your data and can install Wekan on your own computer or server. In fact we encourage you to do @@ -52,18 +55,19 @@ faster. By working directly with Wekan you get the benefit of active maintenance and new features added by growing Wekan developer community. Please see [Developer Documentation][dev_docs] to get started. -Roadmap is handled using [Wekan GitHub issues][wekan_issues]. -If you don't see your feature request or use case there, please add it. +[Roadmap is self-hosted on Wekan][roadmap_wefork] -Newer [Wefork GitHub issues][wefork_issues] will be be moved to there also. +At roadmap there is links to [Wekan GitHub issues][wekan_issues] where actual +work happens. If you don't see your feature request at GitHub issues, +please add it. Not all feature requests have been added to roadmap board yet. - -## Screenshots - -[![Screenshot of Wekan][screenshot_wekan]][roadmap_wekan] +## Screenshot [![Screenshot of Wefork][screenshot_wefork]][roadmap_wefork] +Content is being copied from [old Wekan roadmap][roadmap_wekan] to +new one in process of merging Wefork back to Wekan. + Since Wekan is a free software, you don’t have to trust us with your data and can install Wekan on your own computer or server. In fact we encourage you to do that by providing one-click installation on various platforms. @@ -149,7 +153,7 @@ with [Meteor](https://www.meteor.com). [fork_faq]: https://github.com/wefork/wekan/wiki/FAQ [fork_announcement]: https://github.com/wekan/wekan/issues/640#issuecomment-276383458 [screenshot_wekan]: http://i.imgur.com/cI4jW2h.png -[screenshot_wefork]: http://i.imgur.com/ShX2OTk.png +[screenshot_wefork]: http://i.imgur.com/auWUKxO.png [roadmap_wekan]: http://try.wekan.io/b/MeSsFJaSqeuo9M6bs/wekan-roadmap [roadmap_wefork]: https://wekan.indie.host/b/t2YaGmyXgNkppcFBq/wekan-fork-roadmap [wekan_issues]: https://github.com/wekan/wekan/issues From 7c009c69f1e9aac8aab74e709ef3817c7a110f1a Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 9 Feb 2017 11:23:10 +0200 Subject: [PATCH 134/136] Clarified some text, because someone misunderstood it. --- README.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index dcdd65e4a..2afd6c151 100644 --- a/README.md +++ b/README.md @@ -33,9 +33,9 @@ server clustering, App Market and it's now fully Open Source. Sandstorm is preferred platform for Wekan, as it would take a lot of work to reimplement everything in standalone Wekan. -Since Wekan is a free software, you don’t have to trust us with your data and can -install Wekan on your own computer or server. In fact we encourage you to do -that by providing one-click installation on various platforms. +You don’t have to trust us with your data and can install Wekan on your own +computer or server. In fact we encourage you to do that by providing +one-click installation on various platforms. ## Roadmap @@ -51,9 +51,10 @@ videos how these should work. We are very welcoming to new developers and teams to submit new pull requests to devel branch to make this Wekan App Development Platform possible -faster. By working directly with Wekan you get the benefit of active -maintenance and new features added by growing Wekan developer community. -Please see [Developer Documentation][dev_docs] to get started. +faster. Please see [Developer Documentation][dev_docs] to get started. +We also welcome sponsors for features. By working directly with Wekan you +get the benefit of active maintenance and new features added by +growing Wekan developer community. [Roadmap is self-hosted on Wekan][roadmap_wefork] From 064f609fd799e4addfb23eac657c01c25c7a64ed Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 9 Feb 2017 13:46:02 +0200 Subject: [PATCH 135/136] Add link to donations. --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 2afd6c151..76374bffd 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ [![Wekan chat][vanila_badge]][vanila_chat] +[Donations][donations] + 2017-02-08 News: All of Wefork is now merged and moved back to official Wekan. Wefork will not accept any new issues and pull requests. All development happens on Wekan. @@ -185,3 +187,4 @@ with [Meteor](https://www.meteor.com). [autoinstall]: https://github.com/wefork/wekan-autoinstall [autoinstall_issue]: https://github.com/anselal/wekan/issues/18 [dev_docs]: https://github.com/wekan/wekan/wiki/Developer-Documentation +[donations]: http://www.xet7.org/wekan From 752f84363f885b2c9f4b825ba7ab5f4b9b62772a Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 9 Feb 2017 14:11:43 +0200 Subject: [PATCH 136/136] Fix links. --- README.md | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 76374bffd..f32f65a81 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ Automatic generated newest builds are available for Docker, and some others that install directly from this repo. Automatic builds will be added later for more platforms. -### Docker: [Docker image][docker_image], [Docs][docker_docs], [Docker Nginx proxy][docker_nginxproxy], [Docker Issue][docker_issue] +### Docker: [Docker image][docker_image], [Docs at wiki][wekan_wiki] Docker example, running latest Wekan using docker-compose: @@ -165,26 +165,24 @@ with [Meteor](https://www.meteor.com). [sandstorm_appdemo]: https://demo.sandstorm.io/appdemo/m86q05rdvj14yvn78ghaxynqz7u2svw6rnttptxx49g1785cdv1h [docker_image]: https://hub.docker.com/r/mquandalle/wekan/ [heroku_button]: https://www.herokucdn.com/deploy/button.png -[heroku_deploy]: https://heroku.com/deploy?template=https://github.com/wefork/wekan/tree/master +[heroku_deploy]: https://heroku.com/deploy?template=https://github.com/wekan/wekan/tree/master [indiehosters_button]: https://indie.host/signup.png [indiehosters_saas]: https://indiehosters.net/shop/product/wekan-20 [scalingo_button]: https://cdn.scalingo.com/deploy/button.svg -[scalingo_deploy]: https://my.scalingo.com/deploy?source=https://github.com/wefork/wekan#master +[scalingo_deploy]: https://my.scalingo.com/deploy?source=https://github.com/wekan/wekan#master [cloudron_button]: https://cloudron.io/img/button.svg [cloudron_install]: https://cloudron.io/button.html?app=io.wekan.cloudronapp [debian_wheezy]: https://github.com/soohwa/sps/blob/master/example/docs/1/wekan.md -[travis_badge]: https://travis-ci.org/wefork/wekan.svg?branch=devel -[travis_status]: https://travis-ci.org/wefork/wekan -[install_source]: https://github.com/wefork/wekan/wiki/Install-from-source +[travis_badge]: https://travis-ci.org/wekan/wekan.svg?branch=devel +[travis_status]: https://travis-ci.org/wekan/wekan +[install_source]: https://github.com/wekan/wekan/wiki/Install-and-Update#install-manually-from-source [sles]: https://github.com/wekan/wekan/wiki/Install-Wekan-Docker-on-SUSE-Linux-Enterprise-Server-12-SP1 [virtualbox]: https://github.com/wekan/wekan/wiki/virtual-appliance -[sandstorm_spk]: https://github.com/wefork/wekan/issues/36 +[sandstorm_spk]: https://github.com/wekan/wekan/issues/823 [docker_image]: https://hub.docker.com/r/mquandalle/wekan/ -[docker_docs]: https://github.com/wefork/wekan/wiki/Docker -[docker_nginxproxy]: https://github.com/wefork/wekan/wiki/Docker-NginxProxy -[docker_issue]: https://github.com/wefork/wekan/issues/33 +[wekan_wiki]: https://github.com/wekan/wekan/wiki [translate_wekan]: https://www.transifex.com/wekan/wekan/ -[autoinstall]: https://github.com/wefork/wekan-autoinstall +[autoinstall]: https://github.com/wekan/wekan-autoinstall [autoinstall_issue]: https://github.com/anselal/wekan/issues/18 [dev_docs]: https://github.com/wekan/wekan/wiki/Developer-Documentation [donations]: http://www.xet7.org/wekan