From 21512526014d3379be3ede61d367f57d552fad49 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 20 Oct 2016 18:27:48 +0300 Subject: 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 7b3eea26..e6a95623 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 -- cgit v1.2.3-1-g7c22 From 9f3cbcbcb076cccfc1398a43552cb9b66bb20de9 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 20 Oct 2016 18:31:27 +0300 Subject: 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 e6a95623..1b6adafa 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. -- cgit v1.2.3-1-g7c22 From 1a3a878778ebc6acc511aedceba680a349127ab5 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 20 Oct 2016 18:35:41 +0300 Subject: Fix Rocket.Chat badge. --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 1b6adafa..f62f818a 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/... -- cgit v1.2.3-1-g7c22 From ed5a4be4f4a677015f82692e5b4da0763391ff4f Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 20 Oct 2016 18:49:09 +0300 Subject: Add link to Wekan fork announcement --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index f62f818a..cb2bd410 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 -- cgit v1.2.3-1-g7c22 From 253c482b9cc12f3e678e69a303ffd7c30ed2a2b0 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 20 Oct 2016 21:01:30 +0300 Subject: Add link to roadmap --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index cb2bd410..dadd5045 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/.... -- cgit v1.2.3-1-g7c22 From b159e9b3d1b83b23ff858290f528cc68827c8177 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 20 Oct 2016 21:58:40 +0300 Subject: 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 dadd5045..ea2cc488 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 -- cgit v1.2.3-1-g7c22 From 8bbcbea235ef515862885e882a853fe5c37030cb Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 20 Oct 2016 22:06:32 +0300 Subject: Fix screenshot link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ea2cc488..8b98c080 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 -- cgit v1.2.3-1-g7c22 From d874ce70f7e13ba4fef5b5271350b126aa16f3be Mon Sep 17 00:00:00 2001 From: Pierre Ozoux Date: Fri, 21 Oct 2016 15:57:19 +0100 Subject: Move back IndieHosters --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 8b98c080..4f5f9410 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). -- cgit v1.2.3-1-g7c22 From 91f9cf12b7dfbdf7a7d2cfa53821964e3fbb9a04 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 1 Nov 2016 09:59:28 +0200 Subject: 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 4f5f9410..51f2a64f 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 -- cgit v1.2.3-1-g7c22 From 87ce042c63b403780bcd5c5a50967925d433a1a1 Mon Sep 17 00:00:00 2001 From: Drew Fisher Date: Mon, 11 Jul 2016 15:20:10 -0700 Subject: 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 d9e7da3d..17b27a8a 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}}") ] ); -- cgit v1.2.3-1-g7c22 From 0f62fe0c6e5a151be0aa7baf60405ef2e878a0d8 Mon Sep 17 00:00:00 2001 From: Drew Fisher Date: Mon, 11 Jul 2016 15:21:19 -0700 Subject: 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 | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/models/users.js b/models/users.js index 790ee0a1..bdc5ddfe 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, - }, - }; - - 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); + 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) => { + + ['welcome-list1', 'welcome-list2'].forEach((title) => { + Lists.insert({ title: TAPi18n.__(title), boardId }, fakeUser); + }); }); }); }); - }); + } } -- cgit v1.2.3-1-g7c22 From 9f4300d38b248a147ac0fdf39bb607ffed5bae7e Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Wed, 21 Sep 2016 11:16:07 -0400 Subject: 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 e7a67f76..d1b7b300 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 -- cgit v1.2.3-1-g7c22 From 1ad44de8c6774a7caee43eeecdafe1893234e890 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Mon, 26 Sep 2016 11:40:43 -0400 Subject: 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 4f5586cb..51600acf 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 0af32f8f..f32a27c5 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 d1b7b300..40a80dc6 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. -- cgit v1.2.3-1-g7c22 From 95680ef43abafd8d6cce9d879519bc8ba5091c8a Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Tue, 27 Sep 2016 10:49:02 -0400 Subject: 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 51600acf..f3fdd1bc 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 -- cgit v1.2.3-1-g7c22 From 4d6ab3094c842f42ef12b8eb1595e0f947b3f5a8 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Wed, 28 Sep 2016 13:40:54 -0400 Subject: 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 40a80dc6..b511155c 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; -- cgit v1.2.3-1-g7c22 From 349cdd4bf9b08f07a00d0576c78a3e71a18c1eb3 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Thu, 6 Oct 2016 13:55:58 -0400 Subject: 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 17b27a8a..2db5b6b6 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 b511155c..dc4a0796 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; -- cgit v1.2.3-1-g7c22 From 43c180c247a82ed20b2bc9e2de493305f7f5a43b Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Sun, 9 Oct 2016 18:55:51 -0400 Subject: 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 dc4a0796..5a800b24 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); -- cgit v1.2.3-1-g7c22 From 33cfee8d5f58bbb03281a140d746ad37624fd252 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Mon, 7 Nov 2016 14:01:05 -0500 Subject: 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 00000000..0ee50fa4 Binary files /dev/null and b/meta/dwrensha-pgp-sig differ diff --git a/meta/keyring b/meta/keyring index e34b146d..b4d58533 100644 Binary files a/meta/keyring and b/meta/keyring differ diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp index 2db5b6b6..80b761e2 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", -- cgit v1.2.3-1-g7c22 From 89eb156529fb869312abc20544dbdfd843e3d88c Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Tue, 8 Nov 2016 09:47:36 -0500 Subject: 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 80b761e2..0aaaed56 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 5a800b24..07007be1 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(); -- cgit v1.2.3-1-g7c22 From 300b40ed87fd3603a00888f83f19c588d2868273 Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Sun, 13 Nov 2016 17:23:49 +0100 Subject: 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 9007af59..24abe990 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 -- cgit v1.2.3-1-g7c22 From 5a23c962d2d2c8a4ef3f30a3b0965039808924e8 Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Sun, 13 Nov 2016 20:38:14 +0100 Subject: 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 74305284..656f5fe2 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) { -- cgit v1.2.3-1-g7c22 From 5968792ad2d94291721fd0f95df6d66541150442 Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Sun, 13 Nov 2016 20:48:24 +0100 Subject: 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 2b326493..0a7fbfb0 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 f9cf7e82..c92d6a71 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", -- cgit v1.2.3-1-g7c22 From 7ad74eb1b5d6fbf9e2c7486a03368c9a2f4af1e4 Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Sun, 13 Nov 2016 20:54:50 +0100 Subject: 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 656f5fe2..afa992ab 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() { -- cgit v1.2.3-1-g7c22 From 4dc0ec07b8560d0814ed5cb72b2cac93722bb93c Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Sun, 13 Nov 2016 20:57:23 +0100 Subject: 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 0a7fbfb0..deefde82 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 -- cgit v1.2.3-1-g7c22 From 2f234953f678474c76de32a357be82f9f0dd4565 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 14 Nov 2016 17:58:24 +0200 Subject: Add travis build status badge. --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 51f2a64f..c5fdeaa2 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 -- cgit v1.2.3-1-g7c22 From 5657b6f8c76d615517953b6acb9e3481ec931e33 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 14 Nov 2016 18:01:45 +0200 Subject: Add travis build status badge. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c5fdeaa2..1a2ac555 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] -- cgit v1.2.3-1-g7c22 From 74e41e420fd99703bd38a831f80f1cde7058d96f Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Tue, 15 Nov 2016 14:34:37 -0500 Subject: [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 07007be1..dc5b10d6 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); -- cgit v1.2.3-1-g7c22 From 693053555547d417322973ccefc3ef63c5a0f743 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Tue, 15 Nov 2016 14:40:23 -0500 Subject: 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 0aaaed56..5c0961f8 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], -- cgit v1.2.3-1-g7c22 From 1c206d0d367cbb4b6aa2e350ce944397bd48b988 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Thu, 10 Nov 2016 10:10:06 -0500 Subject: 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 a03fb398..b8b8609d 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); + } } }); -- cgit v1.2.3-1-g7c22 From f56c55e75c657d6348c4231779d410f4cdea7a04 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Mon, 14 Nov 2016 21:26:01 -0500 Subject: Wait until Meteor.startup() to set the language. --- client/lib/i18n.js | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/client/lib/i18n.js b/client/lib/i18n.js index b8b8609d..f2709d15 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); +Meteor.startup(() => { + Tracker.autorun(() => { + const currentUser = Meteor.user(); + let language; + if (currentUser) { + language = currentUser.profile && currentUser.profile.language; + } else { + language = navigator.language || navigator.userLanguage; + } - // 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 { + if (language) { + TAPi18n.setLanguage(language); T9n.setLanguage(language); - } catch (e) { - console.error(e); } - } + }); }); -- cgit v1.2.3-1-g7c22 From 4b248151c3b1fbb763b5d95cd729fc99828be382 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Mon, 14 Nov 2016 22:06:58 -0500 Subject: 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 f2709d15..34a789e1 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; } -- cgit v1.2.3-1-g7c22 From 7e3173caea40ee31d93138e60a1f57589e05c15f Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Wed, 16 Nov 2016 11:52:48 +0200 Subject: Update screenshot. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1a2ac555..25479911 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 -- cgit v1.2.3-1-g7c22 From 3ce79582312f59e9401b7a7ddb9d05c9b971b96f Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Wed, 16 Nov 2016 08:41:29 -0500 Subject: 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 afa992ab..8129776b 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; } } -- cgit v1.2.3-1-g7c22 From d2646a58200293d08d9ed037d56a49a25022786c Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 17 Nov 2016 13:01:40 +0200 Subject: Update screenshot. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 25479911..e40922d0 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 -- cgit v1.2.3-1-g7c22 From 4d3a40bf4f2ddd39185dc2638465a4a9c57d5582 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 17 Nov 2016 15:09:12 +0200 Subject: Add link to Wekan fork FAQ. --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index e40922d0..5b7d5d3f 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 -- cgit v1.2.3-1-g7c22 From 1ec72ba189b6ea33ebe8cae87b866b16706bdcc9 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 17 Nov 2016 15:16:45 +0200 Subject: 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 5b7d5d3f..38b23943 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 -- cgit v1.2.3-1-g7c22 From a635ac9818f72046bbc03b0e38ecdd3bc23eb77b Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 17 Nov 2016 16:16:27 +0200 Subject: 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 38b23943..9ea5f2fb 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 -- cgit v1.2.3-1-g7c22 From b89a0e2d4deb663df6310e0e84ea47247023f482 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Thu, 17 Nov 2016 09:19:49 -0500 Subject: 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 38b23943..a5704ca9 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 -- cgit v1.2.3-1-g7c22 From 33913cf1ce9b5971144802060d1169143d2fec6b Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 17 Nov 2016 16:46:58 +0200 Subject: Update screenshot. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6305c9e5..c2b1243b 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 -- cgit v1.2.3-1-g7c22 From 94cdcff79f79079263056905f6a3f1128088e0a8 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 17 Nov 2016 17:17:18 +0200 Subject: Update screenshot. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c2b1243b..756103bd 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 -- cgit v1.2.3-1-g7c22 From d11f069b6076de8b81d8228f76a8cf0012f8ffad Mon Sep 17 00:00:00 2001 From: fmonthel Date: Thu, 17 Nov 2016 21:18:35 -0500 Subject: [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 ce6edf3c..ccad14f7 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, -- cgit v1.2.3-1-g7c22 From f71d2538fa15c9d8eb915d7b4dd9eb6a337d203d Mon Sep 17 00:00:00 2001 From: fmonthel Date: Thu, 17 Nov 2016 21:23:39 -0500 Subject: [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 ccad14f7..2cadb65e 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) => { -- cgit v1.2.3-1-g7c22 From 584ab26aee7e242913ea3f9d901fec0c950225f0 Mon Sep 17 00:00:00 2001 From: fmonthel Date: Thu, 17 Nov 2016 21:25:49 -0500 Subject: [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 2cadb65e..070c148e 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, -- cgit v1.2.3-1-g7c22 From 69fbd31abc5772f7d092caf501e536e88cdc0e2d Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Fri, 18 Nov 2016 23:18:16 +0100 Subject: 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 a71e7fc7..ce8cf1af 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 10fdf699..e060c13a 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 c92d6a71..54e6b394 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", -- cgit v1.2.3-1-g7c22 From 828d34b70eeb4a86d9a18564e703a28001b4601e Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Fri, 18 Nov 2016 23:23:13 +0100 Subject: 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 e060c13a..17d9eb5f 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(); -- cgit v1.2.3-1-g7c22 From 8290dcb249fa9044a6d491c618dbe9c727d41214 Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Sat, 19 Nov 2016 19:02:33 +0100 Subject: 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 0bd6a272..6600849c 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 a71e7fc7..21c3c382 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 10fdf699..a2682a5f 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 c92d6a71..4697b536 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 bdc5ddfe..6c9ad297 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 38c61ebf..eb5415cf 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 -- cgit v1.2.3-1-g7c22 From 4359f66ecee8003f0fa625fd5e293ba38cc133e3 Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Sat, 19 Nov 2016 19:19:24 +0100 Subject: 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 a2682a5f..1f2f1d9b 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 6c9ad297..a65a2566 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 eb5415cf..14459bf8 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}, + }); +}); -- cgit v1.2.3-1-g7c22 From 89df0bda9bcdebea2a9129beafe653c38949ab29 Mon Sep 17 00:00:00 2001 From: shoetten Date: Fri, 29 Jan 2016 21:10:22 +0100 Subject: 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 84fbb6c2..9e7d58c8 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) { -- cgit v1.2.3-1-g7c22 From 182c9af123c1f7e2fb7318d704f740f93a3da12f Mon Sep 17 00:00:00 2001 From: shoetten Date: Fri, 5 Feb 2016 20:09:21 +0100 Subject: 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 00000000..fb56652e --- /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 00000000..3238d263 --- /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; +} -- cgit v1.2.3-1-g7c22 From d4497d7aeb968dbb9f8c4b84fbcc0f7cc3668167 Mon Sep 17 00:00:00 2001 From: shoetten Date: Fri, 5 Feb 2016 20:23:09 +0100 Subject: 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 00000000..ca074879 --- /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 00000000..4a24941d --- /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 00000000..e9d56f79 --- /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 734fc7e3..69725d76 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 b6f17c23..32980926 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 d7d29551..f209862c 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 6e2098c4..fc7ae24b 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.", -- cgit v1.2.3-1-g7c22 From 7b5d08afd143baa835ecc40eab115d353e5d87dd Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Mon, 21 Nov 2016 22:49:53 -0500 Subject: 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 cd3ef238..fd352552 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(); -- cgit v1.2.3-1-g7c22 From be47357cd4c88072c5ab5ebdfb790d06d92691ae Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Tue, 22 Nov 2016 10:34:31 -0500 Subject: 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 fd352552..89681978 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 } })); } }); -- cgit v1.2.3-1-g7c22 From 80b93ce7117326464b55a76a9efbeeff36f28248 Mon Sep 17 00:00:00 2001 From: shoetten Date: Fri, 5 Feb 2016 21:01:43 +0100 Subject: 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 4a24941d..4152d618 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 1dfd2f8e..edc7d2d3 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 0f6f8ad2..a61f6067 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 -- cgit v1.2.3-1-g7c22 From 5dd554b99960ebd3ac599fa5afc52838c8b7155f Mon Sep 17 00:00:00 2001 From: shoetten Date: Fri, 5 Feb 2016 22:35:56 +0100 Subject: 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 ca074879..a2a28bbd 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 4152d618..6bdfaa1b 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 e9d56f79..ab182207 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 -- cgit v1.2.3-1-g7c22 From aa5ed6e48466b2ed3dc83696a6e18d7997b1c01e Mon Sep 17 00:00:00 2001 From: shoetten Date: Wed, 10 Feb 2016 15:51:55 +0100 Subject: 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 6bdfaa1b..10bc54ff 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 ab182207..51acdaab 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 69725d76..f4212d83 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 fc7ae24b..83ff2975 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", -- cgit v1.2.3-1-g7c22 From 6064393ad339333f02ce90fa1814ea47c18e78c2 Mon Sep 17 00:00:00 2001 From: shoetten Date: Thu, 11 Feb 2016 15:02:26 +0100 Subject: 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 10bc54ff..f7cd502f 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 51acdaab..1631baa5 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 -- cgit v1.2.3-1-g7c22 From 33b74a465e142c7a2b5d435dd35b7cea56a2d18b Mon Sep 17 00:00:00 2001 From: shoetten Date: Tue, 23 Feb 2016 15:21:36 +0100 Subject: 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 f7cd502f..4d129e8e 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); }, -- cgit v1.2.3-1-g7c22 From de3be14d014f900358b118d91a1d90d849c6382c Mon Sep 17 00:00:00 2001 From: shoetten Date: Tue, 22 Nov 2016 21:26:25 +0100 Subject: 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 e57bdb19..32d7389c 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 e1c0b9cf..4ca2f780 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 fb56652e..00000000 --- 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 3238d263..00000000 --- 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; -} -- cgit v1.2.3-1-g7c22 From cacaa0ee8c8811145df9a888ca5bce3c9178397d Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Tue, 22 Nov 2016 22:20:39 -0500 Subject: 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 dc5b10d6..3e04d79f 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 -- cgit v1.2.3-1-g7c22 From 6090ede8c98d98ba5d3664169cae4f2696ccd557 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Wed, 23 Nov 2016 20:57:33 -0500 Subject: 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 b6f17c23..303f1632 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 [{ -- cgit v1.2.3-1-g7c22 From 606dbbbbf2e5ef4bccaadc4584d05c67d7148fc8 Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Fri, 25 Nov 2016 21:45:11 +0100 Subject: 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 f9fe065f..4171f824 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 c7ae8e62..4d468f21 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 83d4d693..13834644 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 f7f6222a..ad41e8aa 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 1c390395..65b7e8c3 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 6e2098c4..141b6dfb 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 a65a2566..278d069c 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) { -- cgit v1.2.3-1-g7c22 From 35778d26737c5ca1702c6c1f3ca1be0a90a9e8b8 Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Fri, 25 Nov 2016 21:53:18 +0100 Subject: 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 13834644..38fd83ec 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 65b7e8c3..98053ed1 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 278d069c..58513231 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) { -- cgit v1.2.3-1-g7c22 From aa97867b3637b681e0b6dc5ffd4ec86bbc230fbd Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Mon, 28 Nov 2016 21:17:04 -0500 Subject: 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 5c0961f8..b70b3be6 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, -- cgit v1.2.3-1-g7c22 From 4bbc6d8a7d62aa17e2e187e1bc1cb78d27e427f4 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Wed, 30 Nov 2016 22:28:05 +0200 Subject: Update platforms on README.md --- README.md | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 756103bd..1caa0b59 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 -- cgit v1.2.3-1-g7c22 From b75e5ef4c41d242345cc6d194ef0a964df3e14f7 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 1 Dec 2016 00:04:03 +0200 Subject: Add already committed features and bugfixes. --- CHANGELOG.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa4f3b02..abf3e324 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: -- cgit v1.2.3-1-g7c22 From 2fd010b04d317a0b1745e734e81f46a5d4e6d5f0 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 1 Dec 2016 00:05:46 +0200 Subject: Fix typo. --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index abf3e324..130af6d4 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. -- cgit v1.2.3-1-g7c22 From 8050c7c6c67b95e490c42b8cfd56521c8a36fd1e Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 13 Dec 2016 09:37:53 +0200 Subject: 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 9238fdd3..5027c7e6 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 1caa0b59..a2529548 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 00000000..634e5369 --- /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 00000000..a561db4b --- /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 00000000..c9d0b95b --- /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 00000000..04b5a455 --- /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 00000000..b7f004e4 --- /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 -- cgit v1.2.3-1-g7c22 From 51002bed7406d490b7d5de359dc8371ef85cbeb1 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 13 Dec 2016 12:36:08 +0200 Subject: 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 9479acd3..dc838041 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 +} -- cgit v1.2.3-1-g7c22 From 08ec85e3941a7e9464b5fcc38d5f5b6b32254bcb Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 13 Dec 2016 16:51:23 +0200 Subject: Update translations. --- .tx/config | 2 +- i18n/cmn.i18n.json | 263 --------------------------------------------------- i18n/fa.i18n.json | 263 +++++++++++++++++++++++++++++++++++++++++++++++++++ i18n/fa_IR.i18n.json | 263 --------------------------------------------------- i18n/fi.i18n.json | 94 ++++++++++++++---- i18n/ro.i18n.json | 263 +++++++++++++++++++++++++++++++++++++++++++++++++++ i18n/ro_RO.i18n.json | 263 --------------------------------------------------- 7 files changed, 602 insertions(+), 809 deletions(-) delete mode 100644 i18n/cmn.i18n.json create mode 100644 i18n/fa.i18n.json delete mode 100644 i18n/fa_IR.i18n.json create mode 100644 i18n/ro.i18n.json delete mode 100644 i18n/ro_RO.i18n.json diff --git a/.tx/config b/.tx/config index 5027c7e6..1f95dacd 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 a561db4b..00000000 --- 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.i18n.json b/i18n/fa.i18n.json new file mode 100644 index 00000000..c9d0b95b --- /dev/null +++ b/i18n/fa.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/fa_IR.i18n.json b/i18n/fa_IR.i18n.json deleted file mode 100644 index c9d0b95b..00000000 --- a/i18n/fa_IR.i18n.json +++ /dev/null @@ -1,263 +0,0 @@ -{ - "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 index caab4faf..e8ecb66f 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.i18n.json b/i18n/ro.i18n.json new file mode 100644 index 00000000..04b5a455 --- /dev/null +++ b/i18n/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/ro_RO.i18n.json b/i18n/ro_RO.i18n.json deleted file mode 100644 index 04b5a455..00000000 --- a/i18n/ro_RO.i18n.json +++ /dev/null @@ -1,263 +0,0 @@ -{ - "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 -- cgit v1.2.3-1-g7c22 From 22b54d3f083804edbefd0b8a38c0712e32295322 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Wed, 14 Dec 2016 21:56:28 +0200 Subject: 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 07026fd4..48dd2642 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 dc838041..0cd4565c 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": "已標記看板", -- cgit v1.2.3-1-g7c22 From fd18ca314a29b34a12761282385b98c7c7495ad3 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 16 Dec 2016 14:03:29 +0200 Subject: 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 130af6d4..22a8dcd8 --- 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 0a69681f..795f0e5d 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": { -- cgit v1.2.3-1-g7c22 From be3995716cc0404f599f3055cedec41ad4d79e67 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 16 Dec 2016 15:29:29 +0200 Subject: 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 a2529548..16acaa42 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] -- cgit v1.2.3-1-g7c22 From 2ee7f1383c5a3b728b4a0365575e9899660025c3 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 16 Dec 2016 15:38:30 +0200 Subject: 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 16acaa42..fb1df21f 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 -- cgit v1.2.3-1-g7c22 From bdd88f486e28c02fa21a8c582a27e7d543e9c040 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Tue, 10 Jan 2017 18:06:03 +0200 Subject: 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 | 89 +++++++++++++++--- 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, 1318 insertions(+), 251 deletions(-) diff --git a/.tx/config b/.tx/config index 1f95dacd..0d6318bc 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 225b0975..a09721bc 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 634e5369..5e313ac2 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 fa223d02..83b82d42 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 30c84748..10bcc456 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 43e12d88..cb5190d4 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 22aeb704..4e3e5623 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 b4af8f5a..a88ac829 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 c9d0b95b..bef0935f 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 adc4baa4..e743280a 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 f08f430b..272c5486 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 6cde68c6..bd21c65d 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 823a221d..ac8a3049 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 d44bccdb..f7d00b70 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 189d4298..5f43b287 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 04b5a455..ec7f55de 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 a2319a27..c99d2bad 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-black": "черный", + "color-blue": "синий", "color-green": "зеленый", - "color-yellow": "желтый", + "color-lime": "лимоновый", "color-orange": "оранджевый", - "color-red": "красный", + "color-pink": "зорозвый", "color-purple": "фиолетовый", - "color-blue": "синий", + "color-red": "красный", "color-sky": "голубой", - "color-lime": "лимоновый", - "color-pink": "зорозвый", - "color-black": "черный", + "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 b7f004e4..e3d4dd0e 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 c05833bb..24869280 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 4cfd03f0..03a9dede 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 0cd4565c..4cb73857 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": "進階", -- cgit v1.2.3-1-g7c22 From a7aa7e931825c7ce133fc19588cb6550af8543d7 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 12 Jan 2017 23:07:07 +0200 Subject: Add release dates to changelog. --- CHANGELOG.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22a8dcd8..979fb7c9 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 -- cgit v1.2.3-1-g7c22