diff options
98 files changed, 7006 insertions, 1358 deletions
diff --git a/.eslintrc.json b/.eslintrc.json index 939f7b46..4808d873 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -74,6 +74,7 @@ "Avatars": true, "BlazeComponent": false, "BlazeLayout": false, + "CollectionHooks": false, "DocHead": false, "ESSearchResults": false, "FastRender": false, @@ -116,6 +117,8 @@ "Notifications": true, "allowIsBoardAdmin": true, "allowIsBoardMember": true, - "Emoji": true + "allowIsBoardMemberByCard": true, + "Emoji": true, + "Checklists": true } } @@ -1,7 +1,8 @@ *~ *.swp .meteor-spk -.tx/ *.sublime-workspace tmp/ node_modules/ +.vscode/ +.build/*
\ No newline at end of file diff --git a/.meteor/.finished-upgraders b/.meteor/.finished-upgraders index 61ee3132..7bd71978 100644 --- a/.meteor/.finished-upgraders +++ b/.meteor/.finished-upgraders @@ -10,3 +10,5 @@ notices-for-facebook-graph-api-2 1.2.0-meteor-platform-split 1.2.0-cordova-changes 1.2.0-breaking-changes +1.3.0-split-minifiers-package +1.3.5-remove-old-dev-bundle-link diff --git a/.meteor/.gitignore b/.meteor/.gitignore index 40830374..501f92e4 100644 --- a/.meteor/.gitignore +++ b/.meteor/.gitignore @@ -1 +1,2 @@ +dev_bundle local diff --git a/.meteor/packages b/.meteor/packages index f6e11fcf..32d7389c 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -8,7 +8,8 @@ meteor-base # Build system ecmascript stylus -standard-minifiers +standard-minifier-css +standard-minifier-js mquandalle:jade # Polyfills @@ -74,3 +75,4 @@ seriousm:emoji-continued templates:tabs verron:autosize simple:json-routes +rajit:bootstrap3-datepicker diff --git a/.meteor/release b/.meteor/release index aa93b69d..fcf9d2d7 100644 --- a/.meteor/release +++ b/.meteor/release @@ -1 +1 @@ -METEOR@1.2.2-faster-rebuilds.0 +METEOR@1.3.5.1 diff --git a/.meteor/versions b/.meteor/versions index 6c8051a7..4ca2f780 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -1,26 +1,26 @@ 3stack:presence@1.0.5 -accounts-base@1.2.2 -accounts-password@1.1.4 -aldeed:collection2@2.8.0 -aldeed:collection2-core@1.0.0 +accounts-base@1.2.8 +accounts-password@1.1.13 +aldeed:collection2@2.9.1 +aldeed:collection2-core@1.1.1 aldeed:schema-deny@1.0.1 aldeed:schema-index@1.0.1 aldeed:simple-schema@1.5.3 -alethes:pages@1.8.4 -arillo:flow-router-helpers@0.4.7 -audit-argument-checks@1.0.4 -autoupdate@1.2.4 -babel-compiler@5.8.25-faster-rebuild.0 -babel-runtime@0.1.4 -base64@1.0.4 -binary-heap@1.0.4 -blaze@2.1.3 -blaze-html-templates@1.0.1 -blaze-tools@1.0.4 -boilerplate-generator@1.0.4 -caching-compiler@1.0.1-faster-rebuild.0 -caching-html-compiler@1.0.2 -callback-hook@1.0.4 +alethes:pages@1.8.6 +allow-deny@1.0.5 +arillo:flow-router-helpers@0.5.2 +audit-argument-checks@1.0.7 +autoupdate@1.2.11 +babel-compiler@6.8.5 +babel-runtime@0.1.9_1 +base64@1.0.9 +binary-heap@1.0.9 +blaze@2.1.8 +blaze-tools@1.0.9 +boilerplate-generator@1.0.9 +caching-compiler@1.0.6 +caching-html-compiler@1.0.6 +callback-hook@1.0.9 cfs:access-point@0.1.49 cfs:base-package@0.0.30 cfs:collection@0.5.5 @@ -28,7 +28,7 @@ cfs:collection-filters@0.2.4 cfs:data-man@0.0.6 cfs:file@0.1.17 cfs:gridfs@0.0.33 -cfs:http-methods@0.0.30 +cfs:http-methods@0.0.32 cfs:http-publish@0.0.13 cfs:power-queue@0.9.11 cfs:reactive-list@0.0.9 @@ -38,115 +38,121 @@ cfs:storage-adapter@0.2.3 cfs:tempstore@0.1.5 cfs:upload-http@0.0.20 cfs:worker@0.1.4 -check@1.1.0 +check@1.2.3 chuangbo:cookie@1.1.0 -coffeescript@1.0.12-faster-rebuild.0 -cosmos:browserify@0.9.3 -cottz:publish-relations@2.0.0 +coffeescript@1.1.4 +cottz:publish-relations@2.0.6 dburles:collection-helpers@1.0.4 -ddp@1.2.2 -ddp-client@1.2.2-faster-rebuild.0 -ddp-common@1.2.2 -ddp-rate-limiter@1.0.0 -ddp-server@1.2.3-faster-rebuild.0 -deps@1.0.9 -diff-sequence@1.0.1 -ecmascript@0.1.7-faster-rebuild.0 -ecmascript-runtime@0.2.6 -ejson@1.0.7 -email@1.0.9-faster-rebuild.0 -es5-shim@4.1.14 -fastclick@1.0.7 +ddp@1.2.5 +ddp-client@1.2.9 +ddp-common@1.2.6 +ddp-rate-limiter@1.0.5 +ddp-server@1.2.10 +deps@1.0.12 +diff-sequence@1.0.6 +ecmascript@0.4.8 +ecmascript-runtime@0.2.12 +ejson@1.0.12 +email@1.0.16 +es5-shim@4.5.13 +fastclick@1.0.12 fortawesome:fontawesome@4.5.0 -geojson-utils@1.0.4 -hot-code-push@1.0.0 -html-tools@1.0.5 -htmljs@1.0.5 -http@1.1.2-faster-rebuild.0 -id-map@1.0.4 +geojson-utils@1.0.9 +hot-code-push@1.0.4 +html-tools@1.0.10 +htmljs@1.0.10 +http@1.1.8 +id-map@1.0.8 idmontie:migrations@1.0.1 -jquery@1.11.4 +jquery@1.11.9 kadira:blaze-layout@2.3.0 -kadira:dochead@1.4.0 -kadira:flow-router@2.10.1 -kenton:accounts-sandstorm@0.1.8 -launch-screen@1.0.4 -livedata@1.0.15 -localstorage@1.0.5 -logging@1.0.9-faster-rebuild.0 +kadira:dochead@1.5.0 +kadira:flow-router@2.12.1 +kenton:accounts-sandstorm@0.5.1 +launch-screen@1.0.12 +livedata@1.0.18 +localstorage@1.0.11 +logging@1.0.14 matb33:collection-hooks@0.8.1 matteodem:easy-search@1.6.4 mdg:validation-error@0.2.0 -meteor@1.1.11-faster-rebuild.0 -meteor-base@1.0.1 -meteor-platform@1.2.3 +meteor@1.1.16 +meteor-base@1.0.4 +meteor-platform@1.2.6 meteorhacks:aggregate@1.3.0 meteorhacks:collection-utils@1.2.0 -meteorhacks:fast-render@2.11.0 -meteorhacks:inject-data@1.4.1 +meteorhacks:fast-render@2.14.0 +meteorhacks:inject-data@2.0.0 +meteorhacks:meteorx@1.4.1 meteorhacks:picker@1.0.3 -meteorhacks:subs-manager@1.6.3 +meteorhacks:subs-manager@1.6.4 meteorspark:util@0.2.0 +minifier-css@1.1.13 +minifier-js@1.1.13 minifiers@1.1.8-faster-rebuild.0 -minimongo@1.0.10 -mobile-status-bar@1.0.6 -mongo@1.1.4-faster-rebuild.0 -mongo-id@1.0.1 -mongo-livedata@1.0.9 +minimongo@1.0.17 +mobile-status-bar@1.0.12 +modules@0.6.5 +modules-runtime@0.6.5 +mongo@1.1.9_1 +mongo-id@1.0.5 +mongo-livedata@1.0.12 mousetrap:mousetrap@1.4.6_1 mquandalle:autofocus@1.0.0 mquandalle:collection-mutations@0.1.0 -mquandalle:jade@0.4.8 +mquandalle:jade@0.4.9 mquandalle:jade-compiler@0.4.5 mquandalle:jquery-textcomplete@0.8.0_1 mquandalle:jquery-ui-drag-drop-sort@0.2.0 mquandalle:moment@1.0.1 mquandalle:mousetrap-bindglobal@0.0.1 mquandalle:perfect-scrollbar@0.6.5_2 -npm-bcrypt@0.7.8_2 -npm-mongo@1.4.40-faster-rebuild.0 -observe-sequence@1.0.7 +npm-bcrypt@0.8.6_3 +npm-mongo@1.4.45 +observe-sequence@1.0.12 ongoworks:speakingurl@1.1.0 -ordered-dict@1.0.4 +ordered-dict@1.0.8 peerlibrary:assert@0.2.5 peerlibrary:base-component@0.14.0 peerlibrary:blaze-components@0.15.1 peerlibrary:computed-field@0.3.1 peerlibrary:reactive-field@0.1.0 perak:markdown@1.0.5 -promise@0.5.2-faster-rebuild.0 +promise@0.7.3 raix:eventemitter@0.1.3 raix:handlebar-helpers@0.2.5 -random@1.0.5 -rate-limit@1.0.0 -reactive-dict@1.1.3 -reactive-var@1.0.6 -reload@1.1.4 -retry@1.0.4 -routepolicy@1.0.6 +rajit:bootstrap3-datepicker@1.5.1 +random@1.0.10 +rate-limit@1.0.5 +reactive-dict@1.1.8 +reactive-var@1.0.10 +reload@1.1.10 +retry@1.0.8 +routepolicy@1.0.11 seriousm:emoji-continued@1.4.0 -service-configuration@1.0.5 -session@1.1.1 -sha@1.0.4 +service-configuration@1.0.10 +session@1.1.6 +sha@1.0.8 simple:json-routes@1.0.4 -softwarerero:accounts-t9n@1.1.7 -spacebars@1.0.7 -spacebars-compiler@1.0.7 -srp@1.0.4 -standard-minifiers@1.0.3-faster-rebuild.0 -stylus@2.511.2-faster-rebuild.0 -tap:i18n@1.7.0 -templates:tabs@2.2.0 -templating@1.1.6-faster-rebuild.0 -templating-tools@1.0.0 -tracker@1.0.9 -ui@1.0.8 -underscore@1.0.4 -url@1.0.5 -useraccounts:core@1.13.1 -useraccounts:flow-routing@1.13.1 -useraccounts:unstyled@1.13.1 +softwarerero:accounts-t9n@1.3.4 +spacebars@1.0.12 +spacebars-compiler@1.0.12 +srp@1.0.9 +standard-minifier-css@1.0.8 +standard-minifier-js@1.0.8 +stylus@2.512.5 +tap:i18n@1.8.2 +templates:tabs@2.2.2 +templating@1.1.14 +templating-tools@1.0.4 +tracker@1.0.15 +ui@1.0.11 +underscore@1.0.9 +url@1.0.10 +useraccounts:core@1.14.2 +useraccounts:flow-routing@1.14.2 +useraccounts:unstyled@1.14.2 verron:autosize@3.0.8 -webapp@1.2.4-faster-rebuild.0 -webapp-hashing@1.0.5 +webapp@1.2.11 +webapp-hashing@1.0.9 zimme:active-route@2.3.2 diff --git a/.tx/config b/.tx/config new file mode 100644 index 00000000..f2527c8f --- /dev/null +++ b/.tx/config @@ -0,0 +1,55 @@ +# This is the configuration of the Transifex tool that we use to manage the +# translations on Wekan. Documentation at: http://docs.transifex.com/client. +# +# Push +# ==== +# +# It is recommended that contributors use the Transifex web UI to create and +# edit translated strings. However in case a contributor has directly jumped +# into the code and made its translations in the corresponding i18n.json file +# we can push it using +# +# > tx push -t -l ar +# +# Where `ar` is the language identifier. In addition, the project maintainer +# should push the English source file to Transifex at least before each release +# candidate using: +# +# > tx push -s +# +# Pull +# ==== +# +# The set of accepted language is directly managed in Transifex, the only +# restriction we define to bundle a new language in the application, is that its +# completion is at least at 75%. +# +# We use: +# +# > tx pull +# +# to download new versions of existing translations, and +# +# > tx pull -a --minimum-perc=75 +# +# to download new sufficiently advanced translations. + +[main] +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, pt_BR:pt-BR, ro_RO:ro, zh_CN:zh-CN, zh_TW:zh-TW + +[wekan.application] +file_filter = i18n/<lang>.i18n.json +source_lang = en +type = KEYVALUEJSON + +# We might have a dedicated second resource later to translate the “Welcome +# Board” data. +# +# [wekan.welcomeBoard] +# file_filter = private/welcomeBoard/<lang>.json +# source_lang = en +# type = KEYVALUEJSON diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..c61d0e19 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,12 @@ +{ + "editor.tabSize": 2, + "editor.rulers": [80], + "files.trimTrailingWhitespace": true, + "files.insertFinalNewline": true, + "files.exclude": { + "**/.git": true, + "**/.DS_Store": true, + "node_modules": true, + ".meteor/local": true + } +} diff --git a/CHANGELOG.md b/CHANGELOG.md index 684fba6f..1102673e 100755..100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,67 @@ -# v0.11 +# v0.11.1 Upcoming Wekan release + +2017-01-29 mquandalle gave Wekan access to xet7, +so at 2017-01-31 xet7 started merging Wefork back to Wekan. +At 2017-02-03 all Wefork code and pull requests are now +merged back to Wekan. + +This release adds the following supported platforms: + +* Docker; +* Docker on SLES12SP1. + +and adds the following new features: + +* Checklists; +* Remove a list. + +and fixes the following bugs: + +* Typos in boards.js and boardHeader.js; +* Build warning in jade template; +* Using older version of MongoDB because of newer + version breaks uploading files and avatars. + +and adds the following new documentation to Wefork wiki, +to be moved to Wekan wiki: + +* Developer Documentation +* Docker +* Docker NginxProxy + +Thanks to GitHub users BaobabCoder, jLouzado, lkisme, mario-orlicky, +martingabelmann, mquandalle, stephenmoloney, umbertooo, xet7 and +qge for their contributions. + +# v0.11.0 2016-12-16 Wekan fork first release + +This release adds the following new features: + +* 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. +* Translation updates + +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 indicators on new users. + +Thanks to GitHub users dwrencha, fmonthel, mario-orlicky, pierreozoux, +shoetten, and xet7 for their contributions. + +# v0.11.0-rc2 2016-07-21 This release adds the following new features: @@ -7,30 +70,35 @@ This release adds the following new features: * Show the exact time when hovering the activity time; * Allow to edit more easily longer card titles by resizing the input box; * Add shortcuts to move cards to the top or the bottom of a list; +* Add a warning indicator when the application is offline; * A new log-in button on the public board view to sign in, even if the board is published; * New link to the keyboard shortcuts in the board sidebar; and fixes the following bugs: -* Fix the syntax of the docker-compose.yml; +* Fix the syntax of the `docker-compose.yml`; * Use the correct pluralization of emoji; * Only publish required user data and keep the hashed passwords confidential; * Fix the generation and alignment of the initials avatars; -* Only display the buttons in the board header, if the data is avialable +* Fix the “welcome board” feature; +* Only display the buttons in the board header, if the data is available and the user is able to use it; +* Fix the scaling of cover images; +* Fix bugs on Internet Explorer v11 that blocked card creation and activity feed + visualization. Thanks to GitHub users alayek, AlexanderS, choclin, floatinghotpot, ForNeVeR, -seschwar, and TheElf for their contributions. +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: @@ -52,7 +120,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 diff --git a/Contributing.md b/Contributing.md index a6da0cb0..82440260 100644 --- a/Contributing.md +++ b/Contributing.md @@ -1,62 +1,5 @@ # Contributing -We’re glad you’re interested in helping the Wekan project! We welcome bug -reports, enhancement ideas, and pull requests, in our GitHub bug tracker. Before -opening a new thread please verify that your issue hasn’t already been reported. +Please see wiki for all documentation: -<https://github.com/wekan/wekan> - -## Security Disclosure - -Security is very important to us. If discover any issue regarding security, -please disclose the information responsibly by sending an email to -security@wekan.io and not by creating a GitHub issue. - -## Translations - -You are encouraged to translate (or improve the translation of) Wekan in your -locale language. For that purpose we rely on -[Transifex](https://www.transifex.com/projects/p/wekan). So the first step is to -create a Transifex account if you don’t have one already. You can then send a -request to join one of the translation teams. If there we will create a new one. - -Once you are in a team you can start translating the application. Please take a -look at the glossary so you can agree with other (present and future) -contributors on words to use to translate key concepts in the application like -“boards” and “cards”. - -The original application is written in English, and if you want to contribute to -the application itself, you are asked to fill the `i18n/en.i18n.json` file. When -you do that the new strings of text to translate automatically appears on -Transifex to be translated (the refresh may take a few hours). - -We pull all translations from Transifex before every new Wekan release -candidate, ask the translators to review the app, and pull all translations -again for the final release. - -## Installation - -Wekan is made with [Meteor](https://www.meteor.com). Thus the easiest way to -start hacking is by installing the framework, cloning the git repository, and -launching the application: - -```bash -$ curl https://install.meteor.com/ | sh # On Mac or Linux -$ git clone https://github.com/wekan/wekan.git -$ cd wekan -$ meteor -``` - -As for any Meteor application, Wekan is automatically refreshed when you change -any file of the source code, just play with it to see how it behaves! - -## Style guide - -We follow the -[meteor style guide](https://github.com/meteor/meteor/wiki/Meteor-Style-Guide). - -Please read the meteor style guide before making any significant contribution. - -## Code organisation - -TODO +<https://github.com/wekan/wekan/wiki> @@ -1,7 +1,98 @@ -FROM meteorhacks/meteord:onbuild -MAINTAINER Maxime Quandalle <mquandalle@wekan.io> +FROM debian:wheezy +MAINTAINER wefork -# Run as you wish! -# docker run -d --name wekan-db mongo -# docker run -d --link "wekan-db:db" -e "MONGO_URL=mongodb://db" \ -# -e "ROOT_URL=http://example.com" -p 8080:80 mquandalle/wekan +# Declare Arguments +ARG NODE_VERSION +ARG METEOR_RELEASE +ARG NPM_VERSION +ARG ARCHITECTURE +ARG SRC_PATH + +# Set the environment variables (defaults where required) +ENV BUILD_DEPS="wget curl bzip2 build-essential python git ca-certificates" +ENV GOSU_VERSION=1.10 +ENV NODE_VERSION ${NODE_VERSION:-v0.10.48} +ENV METEOR_RELEASE ${METEOR_RELEASE:-1.3.5.1} +ENV NPM_VERSION ${NPM_VERSION:-3.10.10} +ENV ARCHITECTURE ${ARCHITECTURE:-linux-x64} +ENV SRC_PATH ${SRC_PATH:-./} + +# Copy the app to the image +COPY ${SRC_PATH} /home/wekan/app + +RUN \ + # Add non-root user wekan + useradd --user-group --system --home-dir /home/wekan wekan && \ + \ + # OS dependencies + apt-get update -y && apt-get install -y --no-install-recommends ${BUILD_DEPS} && \ + \ + # Gosu installation + GOSU_ARCHITECTURE="$(dpkg --print-architecture | awk -F- '{ print $NF }')" && \ + wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/${GOSU_VERSION}/gosu-${GOSU_ARCHITECTURE}" && \ + wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/${GOSU_VERSION}/gosu-${GOSU_ARCHITECTURE}.asc" && \ + export GNUPGHOME="$(mktemp -d)" && \ + gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 && \ + gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu && \ + rm -R "$GNUPGHOME" /usr/local/bin/gosu.asc && \ + chmod +x /usr/local/bin/gosu && \ + \ + # Download nodejs + wget https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \ + wget https://nodejs.org/dist/${NODE_VERSION}/SHASUMS256.txt.asc && \ + \ + # Verify nodejs authenticity + grep ${NODE_VERSION}-${ARCHITECTURE}.tar.gz SHASUMS256.txt.asc | shasum -a 256 -c - && \ + export GNUPGHOME="$(mktemp -d)" && \ + gpg --keyserver pool.sks-keyservers.net --recv-keys 9554F04D7259F04124DE6B476D5A82AC7E37093B && \ + gpg --keyserver pool.sks-keyservers.net --recv-keys 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 && \ + gpg --keyserver pool.sks-keyservers.net --recv-keys FD3A5288F042B6850C66B31F09FE44734EB7990E && \ + gpg --keyserver pool.sks-keyservers.net --recv-keys 71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 && \ + gpg --keyserver pool.sks-keyservers.net --recv-keys DD8F2338BAE7501E3DD5AC78C273792F7D83545D && \ + gpg --keyserver pool.sks-keyservers.net --recv-keys C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 && \ + gpg --keyserver pool.sks-keyservers.net --recv-keys B9AE9905FFD7803F25714661B63B535A4C206CA9 && \ + gpg --refresh-keys pool.sks-keyservers.net && \ + gpg --verify SHASUMS256.txt.asc && \ + rm -R "$GNUPGHOME" SHASUMS256.txt.asc && \ + \ + # Install Node + tar xvzf node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \ + rm node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \ + mv node-${NODE_VERSION}-${ARCHITECTURE} /opt/nodejs && \ + ln -s /opt/nodejs/bin/node /usr/bin/node && \ + ln -s /opt/nodejs/bin/npm /usr/bin/npm && \ + \ + # Install Node dependencies + npm install npm@${NPM_VERSION} -g && \ + npm install -g node-gyp && \ + npm install -g fibers && \ + \ + # Change user to wekan and install meteor + cd /home/wekan/ && \ + chown wekan:wekan --recursive /home/wekan && \ + curl https://install.meteor.com -o ./install_meteor.sh && \ + sed -i "s|RELEASE=.*|RELEASE=${METEOR_RELEASE}\"\"|g" ./install_meteor.sh && \ + echo "Starting meteor ${METEOR_RELEASE} installation... \n" && \ + chown wekan:wekan ./install_meteor.sh && \ + gosu wekan:wekan sh ./install_meteor.sh && \ + \ + # Build app + cd /home/wekan/app && \ + gosu wekan /home/wekan/.meteor/meteor npm install --save xss && \ + gosu wekan /home/wekan/.meteor/meteor build --directory /home/wekan/app_build && \ + cd /home/wekan/app_build/bundle/programs/server/ && \ + gosu wekan npm install && \ + mv /home/wekan/app_build/bundle /build && \ + \ + # Cleanup + apt-get remove --purge -y ${BUILD_DEPS} && \ + apt-get autoremove -y && \ + rm -R /var/lib/apt/lists/* && \ + rm -R /home/wekan/.meteor && \ + rm -R /home/wekan/app && \ + rm -R /home/wekan/app_build && \ + rm /home/wekan/install_meteor.sh + +ENV PORT=80 + +CMD ["node", "/build/main.js"] @@ -1,6 +1,20 @@ # Wekan -[![Join the chat][gitter_badge]][gitter_chat] +[![Wekan chat][vanila_badge]][vanila_chat] + +[Donations][donations] + +2017-02-08 News: All of Wefork is now merged and moved back to official +Wekan. Wefork will not accept any new issues and pull requests. +All development happens on Wekan. + +[Wefork announcement and merging back][fork_announcement] + +[![Wefork Build Status][travis_badge]][travis_status] + +[Wefork FAQ][fork_faq] + +[Translate Wekan at Transifex][translate_wekan] Wekan is an open-source and collaborative kanban board application. @@ -10,33 +24,145 @@ 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] - Wekan supports most features you would expect of it including a real-time user -interface, cards comments, member assignations, customizable labels, filtered -views, and more. +interface, import from Trello (on standalone Wekan), cards comments, checklists, +member assignations, customizable labels, closing lists, filtered views, and more. + +SSO options like LDAP, passwordless email, SAML, GitHub and Google Auth are +already available on Sandstorm, not standalone Wekan. Sandstorm is Enterprise +scale highly secure platform with grains, logging, admin settings, +server clustering, App Market and it's now fully Open Source. Sandstorm is +preferred platform for Wekan, as it would take a lot of work to reimplement +everything in standalone Wekan. + +You don’t have to trust us with your data and can install Wekan on your own +computer or server. In fact we encourage you to do that by providing +one-click installation on various platforms. + +## Roadmap + +Upcoming Wekan App Development Platform will make possible +many use cases like kanban workflows, dependencies, gantt charts, +WIP limits, time tracking, managing website, Rocket.Chat support +and custom apps with themes by providing Teams/Organizations, +APIs, admin interface, custom fields, calendar view, time tracking, +vote on cards, move cards to another board and board templates. +Some of these don't even have feature requests in Wekan issues, +so we do need detailed descriptions, screenshots and links to +videos how these should work. -Since it is a free software, you don’t have to trust us with your data and can +We are very welcoming to new developers and teams to submit new pull +requests to devel branch to make this Wekan App Development Platform possible +faster. Please see [Developer Documentation][dev_docs] to get started. +We also welcome sponsors for features. By working directly with Wekan you +get the benefit of active maintenance and new features added by +growing Wekan developer community. + +[Roadmap is self-hosted on Wekan][roadmap_wefork] + +At roadmap there is links to [Wekan GitHub issues][wekan_issues] where actual +work happens. If you don't see your feature request at GitHub issues, +please add it. Not all feature requests have been added to roadmap board yet. + +## Screenshot + +[![Screenshot of Wefork][screenshot_wefork]][roadmap_wefork] + +Content is being copied from [old Wekan roadmap][roadmap_wekan] to +new one in process of merging Wefork back to Wekan. + +Since Wekan is a free software, you don’t have to trust us with your data and can install Wekan on your own computer or server. In fact we encourage you to do -that by providing one-click installation on Heroku or [Sandstorm] -[sandstorm_market] platforms and verified [Docker][docker_image] images. +that by providing one-click installation on various platforms. -[![Deploy][heroku_button]][heroku_deploy] +## Supported Platforms -[![SignUp][indiehosters_button]][indiehosters_saas] +Automatic generated newest builds are available for Docker, and some others that +install directly from this repo. Automatic builds will be added later for more +platforms. + +### Docker: [Docker image][docker_image], [Docs at wiki][wekan_wiki] + +Docker example, running latest Wekan using docker-compose: + +#### Running from remote dockerhub images +``` +sudo docker-compose pull && sudo docker-compose up -d --no-build +``` +#### Running from locally built dockerhub images +``` +sudo docker-compose up -d --build +``` + +#### Running from locally built dockerhub images and modified `ARG` variables (not recommended) +``` +echo 'NODE_VERSION=v6.6.0' >> .env && \ +echo 'METEOR_RELEASE=1.4.2.3' >> .env && \ +echo 'NPM_VERSION=4.1.2' >> .env && \ +echo 'ARCHITECTURE=linux-x64' >> .env && \ +echo 'SRC_PATH=./' >> .env && \ +sudo docker-compose up -d --build +``` + +Docker example, running latest Wekan using docker run commands alone: +``` +docker run -d --restart=always --name wekan-db mongo:3.2.11 + +docker run -d --restart=always --name wekan --link "wekan-db:db" -e "MONGO_URL=mongodb://db" -e "ROOT_URL=http://localhost:8080" -p 8080:80 mquandalle/wekan:latest +``` + +[Docker on SUSE Linux Enterprise Server 12 SP1][sles] + +[Install from source][install_source] + +[VirtualBox][virtualbox] + +[Debian Wheezy 64bit][debian_wheezy] + +[![Deploy][heroku_button]][heroku_deploy] +[![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] + + +## Upcoming Platforms + +[Autoinstall script][autoinstall] based on [this issue][autoinstall_issue] + +[Create Sandstorm .spk file from source][sandstorm_spk] + +Email to work on already working Heroku: Use 3rd party +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 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] - -[screenshot]: http://i.imgur.com/cI4jW2h.png -[gitter_badge]: https://badges.gitter.im/Join%20Chat.svg -[gitter_chat]: https://gitter.im/wekan/wekan -[roadmap]: http://try.wekan.io/b/MeSsFJaSqeuo9M6bs/wekan-roadmap -[sandstorm_market]: https://oasis.sandstorm.io/appdemo/m86q05rdvj14yvn78ghaxynqz7u2svw6rnttptxx49g1785cdv1h +[vanila_badge]: https://vanila.io/img/join-chat-button2.png +[vanila_chat]: https://chat.vanila.io/channel/wekan +[fork_faq]: https://github.com/wefork/wekan/wiki/FAQ +[fork_announcement]: https://github.com/wekan/wekan/issues/640#issuecomment-276383458 +[screenshot_wekan]: http://i.imgur.com/cI4jW2h.png +[screenshot_wefork]: http://i.imgur.com/auWUKxO.png +[roadmap_wekan]: http://try.wekan.io/b/MeSsFJaSqeuo9M6bs/wekan-roadmap +[roadmap_wefork]: https://wekan.indie.host/b/t2YaGmyXgNkppcFBq/wekan-fork-roadmap +[wekan_issues]: https://github.com/wekan/wekan/issues +[wefork_issues]: https://github.com/wefork/wekan/issues +[sandstorm_button]: https://img.shields.io/badge/try-Wekan%20on%20Sandstorm-783189.svg +[sandstorm_appdemo]: https://demo.sandstorm.io/appdemo/m86q05rdvj14yvn78ghaxynqz7u2svw6rnttptxx49g1785cdv1h [docker_image]: https://hub.docker.com/r/mquandalle/wekan/ [heroku_button]: https://www.herokucdn.com/deploy/button.png [heroku_deploy]: https://heroku.com/deploy?template=https://github.com/wekan/wekan/tree/master @@ -44,3 +170,19 @@ with [Meteor](https://www.meteor.com). [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 +[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/wekan/wekan.svg?branch=devel +[travis_status]: https://travis-ci.org/wekan/wekan +[install_source]: https://github.com/wekan/wekan/wiki/Install-and-Update#install-manually-from-source +[sles]: https://github.com/wekan/wekan/wiki/Install-Wekan-Docker-on-SUSE-Linux-Enterprise-Server-12-SP1 +[virtualbox]: https://github.com/wekan/wekan/wiki/virtual-appliance +[sandstorm_spk]: https://github.com/wekan/wekan/issues/823 +[docker_image]: https://hub.docker.com/r/mquandalle/wekan/ +[wekan_wiki]: https://github.com/wekan/wekan/wiki +[translate_wekan]: https://www.transifex.com/wekan/wekan/ +[autoinstall]: https://github.com/wekan/wekan-autoinstall +[autoinstall_issue]: https://github.com/anselal/wekan/issues/18 +[dev_docs]: https://github.com/wekan/wekan/wiki/Developer-Documentation +[donations]: http://www.xet7.org/wekan diff --git a/client/components/activities/activities.jade b/client/components/activities/activities.jade index 9ff73864..fad147fc 100644 --- a/client/components/activities/activities.jade +++ b/client/components/activities/activities.jade @@ -26,6 +26,12 @@ template(name="boardActivities") +viewer = comment.text + if($eq activityType 'addChecklist') + | {{{_ 'activity-checklist-added' cardLink}}}. + .activity-checklist(href="{{ card.absoluteUrl }}") + +viewer + = checklist.title + if($eq activityType 'archivedCard') | {{{_ 'activity-archived' cardLink}}}. @@ -41,6 +47,9 @@ template(name="boardActivities") if($eq activityType 'createList') | {{_ 'activity-added' list.title boardLabel}}. + if($eq activityType 'removeList') + | {{_ 'activity-removed' title boardLabel}}. + if($eq activityType 'importBoard') | {{{_ 'activity-imported-board' boardLabel sourceLink}}}. @@ -103,6 +112,11 @@ template(name="cardActivities") | {{{_ 'activity-attached' attachmentLink cardLabel}}}. if attachment.isImage img.attachment-image-preview(src=attachment.url) + if($eq activityType 'addChecklist') + | {{{_ 'activity-checklist-added' cardLabel}}}. + .activity-checklist + +viewer + = checklist.title if($eq activityType 'addComment') +inlinedForm(classNames='js-edit-comment') diff --git a/client/components/activities/activities.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/activities/activities.styl b/client/components/activities/activities.styl index 1f0494c7..2285fc0a 100644 --- a/client/components/activities/activities.styl +++ b/client/components/activities/activities.styl @@ -26,6 +26,14 @@ margin-top: 5px padding: 5px + .activity-checklist + display: block + border-radius: 3px + background: white + text-decoration: none + box-shadow: 0 1px 2px rgba(0,0,0,.2) + margin-top: 5px + padding: 5px .activity-meta font-size: 0.8em color: darken(white, 40%) diff --git a/client/components/boards/boardBody.js b/client/components/boards/boardBody.js index 15268a6b..4703bc91 100644 --- a/client/components/boards/boardBody.js +++ b/client/components/boards/boardBody.js @@ -163,8 +163,11 @@ Template.boardBody.onRendered(function() { // Disable drag-dropping while in multi-selection mode, or if the current user // is not a board member self.autorun(() => { - $(self.listsDom).sortable('option', 'disabled', - MultiSelection.isActive() || !userIsMember()); + const $listDom = $(self.listsDom); + if ($listDom.data('sortable')) { + $(self.listsDom).sortable('option', 'disabled', + MultiSelection.isActive() || !userIsMember()); + } }); // If there is no data in the board (ie, no lists) we autofocus the list diff --git a/client/components/boards/boardHeader.jade b/client/components/boards/boardHeader.jade index e61831a1..03768b36 100644 --- a/client/components/boards/boardHeader.jade +++ b/client/components/boards/boardHeader.jade @@ -89,7 +89,7 @@ template(name="boardHeaderBar") span {{#if MultiSelection.isActive}}{{_ 'multi-selection-on'}}{{else}}{{_ 'multi-selection'}}{{/if}} if MultiSelection.isActive a.board-header-btn-close.js-multiselection-reset(title="{{_ 'filter-clear'}}") - i.fa.fa-times-thin + i.fa.fa-times-thin .separator a.board-header-btn.js-open-board-menu diff --git a/client/components/boards/boardHeader.js b/client/components/boards/boardHeader.js index b72bb162..a76b566a 100644 --- a/client/components/boards/boardHeader.js +++ b/client/components/boards/boardHeader.js @@ -33,7 +33,7 @@ Template.boardChangeTitlePopup.events({ const newDesc = tpl.$('.js-board-desc').val().trim(); if (newTitle) { this.rename(newTitle); - this.setDesciption(newDesc); + this.setDescription(newDesc); Popup.close(); } evt.preventDefault(); diff --git a/client/components/cards/attachments.jade b/client/components/cards/attachments.jade index 2cb3bb85..da728114 100644 --- a/client/components/cards/attachments.jade +++ b/client/components/cards/attachments.jade @@ -49,4 +49,5 @@ template(name="attachmentsGalery") | {{_ 'delete'}} if currentUser.isBoardMember - a.attachment-item.add-attachment.js-add-attachment {{_ 'add-attachment' }} + li.attachment-item.add-attachment + a.js-add-attachment {{_ 'add-attachment' }} diff --git a/client/components/cards/attachments.styl b/client/components/cards/attachments.styl index f322ebc8..9a5d0645 100644 --- a/client/components/cards/attachments.styl +++ b/client/components/cards/attachments.styl @@ -20,6 +20,10 @@ display: flex align-items: center + a + display: block + margin: auto + .attachment-thumbnail height: 80px display: flex @@ -28,8 +32,8 @@ position: relative .attachment-thumbnail-img - height: 100% - width: 100% + max-height: 100% + max-width: 100% .attachment-thumbnail-ext text-transform: uppercase @@ -39,7 +43,7 @@ font-size: 0.75em margin: 3px - .attachment-details-actions + .attachment-details-actions a display: block .attachment-image-preview diff --git a/client/components/cards/cardDate.jade b/client/components/cards/cardDate.jade new file mode 100644 index 00000000..a2a28bbd --- /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}}" class="{{classes}}") + time(datetime="{{showISODate}}") + | {{showDate}} diff --git a/client/components/cards/cardDate.js b/client/components/cards/cardDate.js new file mode 100644 index 00000000..4d129e8e --- /dev/null +++ b/client/components/cards/cardDate.js @@ -0,0 +1,228 @@ +// 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() { + const $picker = this.$('.js-datepicker').datepicker({ + todayHighlight: true, + todayBtn: 'linked', + language: TAPi18n.getLanguage(), + }).on('changeDate', function(evt) { + this.find('#date').value = moment(evt.date).format('L'); + this.error.set(''); + this.find('#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'); + return ''; + }, + showTime() { + if (this.date.get().isValid()) + return this.date.get().format('LT'); + return ''; + }, + dateFormat() { + return moment.localeData().longDateFormat('L'); + }, + timeFormat() { + return moment.localeData().longDateFormat('LT'); + }, + + events() { + return [{ + 'keyup .js-date-field'() { + // parse for localized date format in strict mode + 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'() { + // parse for localized time format in strict mode + const dateMoment = moment(this.find('#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 + 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()); + 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.onCreated(); + this.data().startAt && this.date.set(moment(this.data().startAt)); + } + + _storeDate(date) { + this.card.setStart(date); + } + + _deleteDate() { + this.card.unsetStart(); + } +}).register('editCardStartDatePopup'); + +// editCardDueDatePopup +(class extends EditCardDate { + onCreated() { + super.onCreated(); + this.data().dueAt && this.date.set(moment(this.data().dueAt)); + } + + onRendered() { + super.onRendered(); + 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() { + const self = this; + self.date = ReactiveVar(); + self.now = ReactiveVar(moment()); + window.setInterval(() => { + self.now.set(moment()); + }, 60000); + }, + + 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', + }); + }, + + showISODate() { + return this.date.get().toISOString(); + }, +}); + +class CardStartDate extends CardDate { + onCreated() { + super.onCreated(); + const self = this; + self.autorun(() => { + self.date.set(moment(self.data().startAt)); + }); + } + + classes() { + if (this.date.get().isBefore(this.now.get(), 'minute') && + this.now.get().isBefore(this.data().dueAt)) { + return 'current'; + } + return ''; + } + + showTitle() { + return `${TAPi18n.__('card-start-on')} ${this.date.get().format('LLLL')}`; + } + + events() { + return super.events().concat({ + 'click .js-edit-date': Popup.open('editCardStartDate'), + }); + } +} +CardStartDate.register('cardStartDate'); + +class CardDueDate extends CardDate { + onCreated() { + super.onCreated(); + const self = this; + self.autorun(() => { + self.date.set(moment(self.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'; + return ''; + } + + showTitle() { + return `${TAPi18n.__('card-due-on')} ${this.date.get().format('LLLL')}`; + } + + events() { + return super.events().concat({ + 'click .js-edit-date': Popup.open('editCardDueDate'), + }); + } +} +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/cardDate.styl b/client/components/cards/cardDate.styl new file mode 100644 index 00000000..1631baa5 --- /dev/null +++ b/client/components/cards/cardDate.styl @@ -0,0 +1,58 @@ +.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, &.almost-due, &.due, &.long-overdue + color: #fff + + &.current + background-color: #5ba639 + &:hover, &.is-active + background-color: darken(#5ba639, 10) + + &.almost-due + background-color: #edc909 + &:hover, &.is-active + background-color: darken(#edc909, 10) + + &.due + background-color: #fa3f00 + &:hover, &.is-active + background-color: darken(#fa3f00, 10) + + &.long-overdue + background-color: #fd5d47 + &:hover, &.is-active + background-color: darken(#fd5d47, 7) + + 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..cf113951 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 {{_ 'card-start'}} + +cardStartDate + + if dueAt + .card-details-item.card-details-item-due + h3.card-details-item-title {{_ 'card-due'}} + +cardDueDate + + //- XXX We should use "editable" to avoid repetiting ourselves if currentUser.isBoardMember h3.card-details-item-title {{_ 'description'}} @@ -61,6 +72,10 @@ template(name="cardDetails") h3.card-details-item-title {{_ 'description'}} +viewer = description + + hr + +checklists(cardId = _id) + if attachments.count hr h2 @@ -91,6 +106,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 299bbf34..b7e0ef76 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -62,6 +62,9 @@ BlazeComponent.extendComponent({ events() { const events = { + [`${CSSEvents.transitionend} .js-card-details`]() { + this.isLoaded.set(true); + }, [`${CSSEvents.animationend} .js-card-details`]() { this.isLoaded.set(true); }, @@ -143,16 +146,18 @@ 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(); const minOrder = _.min(this.list().cards().map((c) => c.sort)); - this.move(this.listId, minOrder / 2); + this.move(this.listId, minOrder - 1); }, 'click .js-move-card-to-bottom'(evt) { evt.preventDefault(); const maxOrder = _.max(this.list().cards().map((c) => c.sort)); - this.move(this.listId, Math.floor(maxOrder) + 1); + this.move(this.listId, maxOrder + 1); }, 'click .js-archive'(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/client/components/cards/checklists.jade b/client/components/cards/checklists.jade new file mode 100644 index 00000000..987e6cd9 --- /dev/null +++ b/client/components/cards/checklists.jade @@ -0,0 +1,61 @@ +template(name="checklists") + h2 {{_ 'checklists'}} + .card-checklist-items + each checklist in currentCard.checklists + +checklistDetail(checklist = checklist) + +inlinedForm(classNames="js-add-checklist" cardId = cardId) + +addChecklistItemForm + else + a.js-open-inlined-form + i.fa.fa-plus + | {{_ 'add-checklist'}}... + +template(name="checklistDetail") + +inlinedForm(classNames="js-edit-checklist-title" checklist = checklist) + +editChecklistItemForm(checklist = checklist) + else + .checklist-title + .checkbox.fa.fa-check-square-o + a.js-delete-checklist {{_ "delete"}}... + span.checklist-stat(class="{{#if checklist.isFinished}}is-finished{{/if}}") {{checklist.finishedCount}}/{{checklist.itemCount}} + h2.title.js-open-inlined-form.is-editable {{checklist.title}} + +checklistItems(checklist = checklist) + +template(name="addChecklistItemForm") + textarea.js-add-checklist-item(rows='1' autofocus) + .edit-controls.clearfix + button.primary.confirm.js-submit-add-checklist-item-form(type="submit") {{_ 'save'}} + a.fa.fa-times-thin.js-close-inlined-form + +template(name="editChecklistItemForm") + textarea.js-edit-checklist-item(rows='1' autofocus) + if $eq type 'item' + = item.title + else + = checklist.title + .edit-controls.clearfix + button.primary.confirm.js-submit-edit-checklist-item-form(type="submit") {{_ 'save'}} + a.fa.fa-times-thin.js-close-inlined-form + span(title=createdAt) {{ moment createdAt }} + if currentUser.isBoardMember + a.js-delete-checklist-item {{_ "delete"}}... + +template(name="checklistItems") + .checklist-items + each item in checklist.items + +inlinedForm(classNames="js-edit-checklist-item" item = item checklist = checklist) + +editChecklistItemForm(type = 'item' item = item checklist = checklist) + else + +itemDetail(item = item checklist = checklist) + if currentUser.isBoardMember + +inlinedForm(classNames="js-add-checklist-item" checklist = checklist) + +addChecklistItemForm + else + a.add-checklist-item.js-open-inlined-form + i.fa.fa-plus + | {{_ 'add-checklist-item'}}... + +template(name='itemDetail') + .item + .check-box.materialCheckBox(class="{{#if item.isFinished }}is-checked{{/if}}") + .item-title.js-open-inlined-form.is-editable(class="{{#if item.isFinished }}is-checked{{/if}}") {{item.title}} diff --git a/client/components/cards/checklists.js b/client/components/cards/checklists.js new file mode 100644 index 00000000..5dac7bd3 --- /dev/null +++ b/client/components/cards/checklists.js @@ -0,0 +1,89 @@ +BlazeComponent.extendComponent({ + addChecklist(event) { + event.preventDefault(); + const textarea = this.find('textarea.js-add-checklist-item'); + const title = textarea.value.trim(); + const cardId = this.currentData().cardId; + Checklists.insert({ + cardId, + title, + }); + }, + + addChecklistItem(event) { + event.preventDefault(); + const textarea = this.find('textarea.js-add-checklist-item'); + const title = textarea.value.trim(); + const checklist = this.currentData().checklist; + checklist.addItem(title); + }, + + editChecklist(event) { + event.preventDefault(); + const textarea = this.find('textarea.js-edit-checklist-item'); + const title = textarea.value.trim(); + const checklist = this.currentData().checklist; + checklist.setTitle(title); + }, + + editChecklistItem(event) { + event.preventDefault(); + + const textarea = this.find('textarea.js-edit-checklist-item'); + const title = textarea.value.trim(); + const itemId = this.currentData().item._id; + const checklist = this.currentData().checklist; + checklist.editItem(itemId, title); + }, + + deleteItem() { + const checklist = this.currentData().checklist; + const item = this.currentData().item; + if (checklist && item && item._id) { + checklist.removeItem(item._id); + } + }, + + deleteChecklist() { + const checklist = this.currentData().checklist; + if (checklist && checklist._id) { + Checklists.remove(checklist._id); + } + }, + + pressKey(event) { + //If user press enter key inside a form, submit it, so user doesn't have to leave keyboard to submit a form. + if (event.keyCode === 13) { + event.preventDefault(); + const $form = $(event.currentTarget).closest('form'); + $form.find('button[type=submit]').click(); + } + }, + + events() { + return [{ + 'submit .js-add-checklist': this.addChecklist, + 'submit .js-edit-checklist-title': this.editChecklist, + 'submit .js-add-checklist-item': this.addChecklistItem, + 'submit .js-edit-checklist-item': this.editChecklistItem, + 'click .js-delete-checklist-item': this.deleteItem, + 'click .js-delete-checklist': this.deleteChecklist, + keydown: this.pressKey, + }]; + }, +}).register('checklists'); + +BlazeComponent.extendComponent({ + toggleItem() { + const checklist = this.currentData().checklist; + const item = this.currentData().item; + if (checklist && item && item._id) { + checklist.toggleItem(item._id); + } + }, + events() { + return [{ + 'click .item .check-box': this.toggleItem, + }]; + }, +}).register('itemDetail'); diff --git a/client/components/cards/checklists.styl b/client/components/cards/checklists.styl new file mode 100644 index 00000000..885d7528 --- /dev/null +++ b/client/components/cards/checklists.styl @@ -0,0 +1,68 @@ +.js-add-checklist + color: #8c8c8c + +textarea.js-add-checklist-item, textarea.js-edit-checklist-item + overflow: hidden + word-wrap: break-word + resize: none + height: 34px + +.delete-text + color: #8c8c8c + text-decoration: underline + word-wrap: break-word + float: right + padding-top: 6px + &:hover + color: inherit + +.checklist-title + .checkbox + float: left + width: 30px + height 30px + font-size: 18px + line-height: 30px + + .title + font-size: 18px + line-height: 30px + + .checklist-stat + margin: 0 0.5em + float: right + padding-top: 6px + &.is-finished + color: #3cb500 + + .js-delete-checklist + @extends .delete-text + +.checklist-items + margin: 0 0 0.5em 1.33em + + .item + line-height: 25px + font-size: 1.1em + margin-top: 3px + display: flex + + .check-box + margin-top: 5px + &.is-checked + border-bottom: 2px solid #3cb500 + border-right: 2px solid #3cb500 + + .item-title + padding-left: 10px; + &.is-checked + color: #8c8c8c + font-style: italic + + .js-delete-checklist-item + @extends .delete-text + padding: 12px 0 0 0 + + .add-checklist-item + padding-top: 0.5em + display: inline-block diff --git a/client/components/cards/labels.js b/client/components/cards/labels.js index 20d95bc6..cdd5a700 100644 --- a/client/components/cards/labels.js +++ b/client/components/cards/labels.js @@ -9,9 +9,7 @@ BlazeComponent.extendComponent({ }, labels() { - return labelColors.map((color) => { - return { color, name: '' }; - }); + return labelColors.map((color) => ({ color, name: '' })); }, isSelected(color) { diff --git a/client/components/cards/minicard.jade b/client/components/cards/minicard.jade index 573b3da1..8b46ee74 100644 --- a/client/components/cards/minicard.jade +++ b/client/components/cards/minicard.jade @@ -1,8 +1,7 @@ template(name="minicard") .minicard if cover - .minicard-cover - img(src="{{pathFor cover.url}}") + .minicard-cover(style="background-image: url('{{pathFor cover.url}}');") if labels .minicard-labels each labels @@ -15,7 +14,7 @@ template(name="minicard") .badges if comments.count .badge(title="{{_ 'card-comments-title' comments.count }}") - span.badge-icon.fa.fa-comment-o + span.badge-icon.fa.fa-comment-o.badge-comment span.badge-text= comments.count if description .badge.badge-state-image-only(title=description) @@ -24,3 +23,14 @@ template(name="minicard") .badge span.badge-icon.fa.fa-paperclip span.badge-text= attachments.count + if startAt + .badge + +minicardStartDate + if dueAt + .badge + +minicardDueDate + if checklists.count + .badge(class="{{#if checklistFinished}}is-finished{{/if}}") + span.badge-icon.fa.fa-check-square-o + span.badge-text.check-list-text {{checklistFinishedCount}}/{{checklistItemCount}} + diff --git a/client/components/cards/minicard.styl b/client/components/cards/minicard.styl index 3b8c8a9a..12a89785 100644 --- a/client/components/cards/minicard.styl +++ b/client/components/cards/minicard.styl @@ -62,16 +62,11 @@ .minicard-cover background-position: center background-repeat: no-repeat - background-size: cover + background-size: contain height: 145px user-select: none margin: -6px -8px 6px -8px border-radius: top 2px - position: relative - - img - height: 100% - width: 100% .minicard-labels float: right @@ -96,15 +91,34 @@ 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 + + &.is-finished + background: #3cb500 + padding: 0px 3px + border-radius: 3px + color: white + + .badge-icon, + .badge-text + vertical-align: middle//didn't figure why use top, it'd be easier to fill bg if it's middle. This was introduced in commit "91cfcf7b12b5e7c137c2e765b2c378dde6b82966" & "* Improve the design of the minicards badges" was mentioned. + &.badge-comment + margin-bottom: 0.1rem .badge-text font-size: 0.9em padding-left: 2px line-height: 14px + .check-list-text + padding-left: 0px + line-height: 12px + .minicard-members float: right diff --git a/client/components/import/import.jade b/client/components/import/import.jade index e10072b4..d4def7d8 100644 --- a/client/components/import/import.jade +++ b/client/components/import/import.jade @@ -55,10 +55,10 @@ template(name="importMapMembersAddPopup") ul.pop-over-list +esEach(index="users") li.item.js-member-item - a.name.js-select-import(title="{{profile.name}} ({{username}})" data-id="{{_id}}") + a.name.js-select-import(title="{{profile.fullname}} ({{username}})" data-id="{{_id}}") +userAvatar(userId=_id esSearch=true) span.full-name - = profile.name + = profile.fullname | (<span class="username">{{username}}</span>) +ifEsIsSearching(index='users') +spinner diff --git a/client/components/lists/list.js b/client/components/lists/list.js index e1909783..187d8ec3 100644 --- a/client/components/lists/list.js +++ b/client/components/lists/list.js @@ -44,7 +44,7 @@ BlazeComponent.extendComponent({ placeholder: 'minicard-wrapper placeholder', start(evt, ui) { ui.placeholder.height(ui.helper.height()); - EscapeActions.executeUpTo('popup'); + EscapeActions.executeUpTo('popup-close'); boardComponent.setIsDragging(true); }, stop(evt, ui) { diff --git a/client/components/lists/listHeader.jade b/client/components/lists/listHeader.jade index f9fe065f..29aa4282 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 @@ -29,6 +33,9 @@ template(name="listActionPopup") hr ul.pop-over-list li: a.js-close-list {{_ 'archive-list'}} + hr + ul.pop-over-list + li: a.js-remove-list {{_ 'remove-list'}} template(name="boardLists") ul.pop-over-list diff --git a/client/components/lists/listHeader.js b/client/components/lists/listHeader.js index c7ae8e62..f352022d 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'), @@ -52,4 +60,10 @@ Template.listActionPopup.events({ this.archive(); Popup.close(); }, + 'click .js-remove-list'(evt) { + const currentList = this; + evt.preventDefault(); + Lists.remove(currentList._id); + Popup.close(); + }, }); diff --git a/client/components/main/editor.js b/client/components/main/editor.js index da66bb74..da15407a 100755 --- a/client/components/main/editor.js +++ b/client/components/main/editor.js @@ -10,7 +10,7 @@ Template.editor.onRendered(() => { search(term, callback) { callback(Emoji.values.map((emoji) => { return emoji.includes(term) ? emoji : null; - })); + }).filter(Boolean)); }, template(value) { const imgSrc = Emoji.baseImagePath + value; @@ -31,7 +31,7 @@ Template.editor.onRendered(() => { callback(currentBoard.activeMembers().map((member) => { const username = Users.findOne(member.userId).username; return username.includes(term) ? username : null; - })); + }).filter(Boolean)); }, template(value) { return value; @@ -44,6 +44,8 @@ Template.editor.onRendered(() => { ]); }); +import sanitizeXss from 'xss'; + // XXX I believe we should compute a HTML rendered field on the server that // would handle markdown, emoji and user mentions. We can simply have two // fields, one source, and one compiled version (in HTML) and send only the @@ -86,19 +88,14 @@ Blaze.Template.registerHelper('mentions', new Template('mentions', function() { content = content.replace(fullMention, Blaze.toHTML(link)); } - return HTML.Raw(content); + return HTML.Raw(sanitizeXss(content)); })); Template.viewer.events({ - 'click .js-open-member'(evt, tpl) { - const userId = evt.currentTarget.dataset.userid; - Popup.open('member').call({ userId }, evt, tpl); - }, - // Viewer sometimes have click-able wrapper around them (for instance to edit // the corresponding text). Clicking a link shouldn't fire these actions, stop // we stop these event at the viewer component level. - 'click a'(evt) { + 'click a'(evt, tpl) { evt.stopPropagation(); // XXX We hijack the build-in browser action because we currently don't have @@ -106,9 +103,16 @@ Template.viewer.events({ // handled by a third party package that we can't configure easily. Fix that // by using directly `_blank` attribute in the rendered HTML. evt.preventDefault(); - const href = evt.currentTarget.href; - if (href) { - window.open(href, '_blank'); + + const userId = evt.currentTarget.dataset.userid; + if (userId) { + Popup.open('member').call({ userId }, evt, tpl); + } + else { + const href = evt.currentTarget.href; + if (href) { + window.open(href, '_blank'); + } } }, }); diff --git a/client/components/main/header.jade b/client/components/main/header.jade index 711e272c..bd0af880 100644 --- a/client/components/main/header.jade +++ b/client/components/main/header.jade @@ -45,3 +45,12 @@ template(name="header") else a.wekan-logo(href="{{pathFor 'home'}}" title="{{_ 'header-logo-title'}}") img(src="{{pathFor '/wekan-logo-header.png'}}" alt="Wekan") + + if appIsOffline + +offlineWarning + +template(name="offlineWarning") + .offline-warning + p + i.fa.fa-warning + | {{_ 'app-is-offline'}} diff --git a/client/components/main/header.js b/client/components/main/header.js index 73024aa9..0337c72b 100644 --- a/client/components/main/header.js +++ b/client/components/main/header.js @@ -6,6 +6,10 @@ Template.header.helpers({ hideLogo() { return Utils.isMiniScreen() && Session.get('currentBoard'); }, + + appIsOffline() { + return !Meteor.status().connected; + }, }); Template.header.events({ diff --git a/client/components/main/header.styl b/client/components/main/header.styl index 0b2ad860..0e35d38a 100644 --- a/client/components/main/header.styl +++ b/client/components/main/header.styl @@ -196,3 +196,15 @@ li height: 28px + +.offline-warning + width: 100% + text-align: center + padding: 0 + margin: 0 + background: #F8ECBD + clear: both + + p + margin: 7px + padding: 0 diff --git a/client/components/main/layouts.styl b/client/components/main/layouts.styl index 83d4d693..1bc92b42 100644 --- a/client/components/main/layouts.styl +++ b/client/components/main/layouts.styl @@ -3,7 +3,7 @@ global-reset() html, body, input, select, textarea, button - font: 14px Roboto, "Helvetica Neue", Arial, Helvetica, sans-serif + font: 14px Roboto, "Helvetica Neue", Arial, Helvetica, "Yu Gothic", "Meiryo", sans-serif line-height: 18px color: #4d4d4d @@ -351,6 +351,11 @@ a background: darken(white, 13%) overflow-y: auto + a + text-decoration: underline + &:hover + color: #333 + .basicTabs-container .tabs-content-container padding: 0 padding-top: 15px @@ -374,3 +379,8 @@ a .wrapper height: 100% margin: 0px + +.inline-input + height: 37px + margin: 8px 10px 0 0 + width: 50px diff --git a/client/components/sidebar/sidebar.jade b/client/components/sidebar/sidebar.jade index 0702b7b9..cb0845af 100644 --- a/client/components/sidebar/sidebar.jade +++ b/client/components/sidebar/sidebar.jade @@ -35,10 +35,13 @@ 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 + if isSandstorm + 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 .clearfix if isInvited hr @@ -107,7 +110,7 @@ template(name="addMemberPopup") ul.pop-over-list +esEach(index="users") li.item.js-member-item(class="{{#if isBoardMember}}disabled{{/if}}") - a.name.js-select-member(title="{{profile.name}} ({{username}})") + a.name.js-select-member(title="{{profile.fullname}} ({{username}})") +userAvatar(userId=_id esSearch=true) span.full-name = profile.fullname diff --git a/client/components/sidebar/sidebar.js b/client/components/sidebar/sidebar.js index 2f66d738..9eab1656 100644 --- a/client/components/sidebar/sidebar.js +++ b/client/components/sidebar/sidebar.js @@ -137,8 +137,8 @@ Template.memberPopup.events({ Popup.close(); }), 'click .js-leave-member'() { - const currentBoard = Boards.findOne(Session.get('currentBoard')); - Meteor.call('quitBoard', currentBoard, (err, ret) => { + const boardId = Session.get('currentBoard'); + Meteor.call('quitBoard', boardId, (err, ret) => { if (!ret && ret) { Popup.close(); FlowRouter.go('home'); @@ -166,6 +166,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/client/components/sidebar/sidebar.styl b/client/components/sidebar/sidebar.styl index 95f1239b..8f2f493e 100644 --- a/client/components/sidebar/sidebar.styl +++ b/client/components/sidebar/sidebar.styl @@ -59,6 +59,7 @@ .member, .card-label margin-right: 7px + margin-top: 5px .sidebar-list-item-description flex: 1 diff --git a/client/components/sidebar/sidebarFilters.jade b/client/components/sidebar/sidebarFilters.jade index 2b326493..9a9774bb 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}}") @@ -86,4 +98,3 @@ template(name="disambiguateMultiMemberPopup") template(name="moveSelectionPopup") +boardLists - diff --git a/client/components/users/userHeader.jade b/client/components/users/userHeader.jade index a71e7fc7..ad41e8aa 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'}} @@ -27,6 +28,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'}} @@ -61,3 +64,16 @@ 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 + 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 10fdf699..98053ed1 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'), @@ -26,11 +27,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(); }, }); @@ -82,3 +90,26 @@ Template.changeLanguagePopup.events({ evt.preventDefault(); }, }); + +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(), 10); + if (!isNaN(minLimit)) { + Meteor.call('changeLimitToShowCardsCount', minLimit); + Popup.back(); + } + }, +}); diff --git a/client/config/gecko-fix.js b/client/config/gecko-fix.js new file mode 100644 index 00000000..00e28970 --- /dev/null +++ b/client/config/gecko-fix.js @@ -0,0 +1,4 @@ +if (Object.prototype.hasOwnProperty('watch')) { + Object.prototype.watch = undefined; + Object.prototype.unwatch = undefined; +} diff --git a/client/lib/escapeActions.js b/client/lib/escapeActions.js index 49b80422..dc6b05b7 100644 --- a/client/lib/escapeActions.js +++ b/client/lib/escapeActions.js @@ -44,7 +44,7 @@ EscapeActions = { executeLowest() { return this._execute({ - multipleAction: false, + multipleActions: false, }); }, diff --git a/client/lib/filter.js b/client/lib/filter.js index 74305284..8129776b 100644 --- a/client/lib/filter.js +++ b/client/lib/filter.js @@ -63,6 +63,17 @@ class SetFilter { this._dep.depend(); return { $in: this._selectedElements }; } + + _getEmptySelector() { + this._dep.depend(); + let includeEmpty = false; + this._selectedElements.forEach((el) => { + if (el === undefined) { + includeEmpty = true; + } + }); + return includeEmpty ? { $eq: [] } : null; + } } // The global Filter object. @@ -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) { diff --git a/client/lib/i18n.js b/client/lib/i18n.js index a03fb398..34a789e1 100644 --- a/client/lib/i18n.js +++ b/client/lib/i18n.js @@ -2,20 +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; - } +Meteor.startup(() => { + Tracker.autorun(() => { + const currentUser = Meteor.user(); + let language; + if (currentUser && currentUser.profile && currentUser.profile.language) { + language = currentUser.profile.language; + } else { + language = navigator.language || navigator.userLanguage; + } - if (language) { - TAPi18n.setLanguage(language); - - // XXX - const shortLanguage = language.split('-')[0]; - T9n.setLanguage(shortLanguage); - } + if (language) { + TAPi18n.setLanguage(language); + T9n.setLanguage(language); + } + }); }); diff --git a/client/lib/inlinedform.js b/client/lib/inlinedform.js index 2732a2e3..56768a13 100644 --- a/client/lib/inlinedform.js +++ b/client/lib/inlinedform.js @@ -28,7 +28,9 @@ InlinedForm = BlazeComponent.extendComponent({ currentlyOpenedForm.set(null); }, - open() { + open(evt) { + evt && evt.preventDefault(); + // Close currently opened form, if any EscapeActions.executeUpTo('inlinedForm'); this.isOpen.set(true); diff --git a/client/lib/popup.js b/client/lib/popup.js index 3166ca30..3658d883 100644 --- a/client/lib/popup.js +++ b/client/lib/popup.js @@ -75,7 +75,7 @@ window.Popup = new class { // If there are no popup currently opened we use the Blaze API to render // one into the DOM. We use a reactive function as the data parameter that - // return the the complete along with its top element and depends on our + // return the complete along with its top element and depends on our // internal dependency that is being invalidated every time the top // element of the stack has changed and we want to update the popup. // diff --git a/docker-compose.yml b/docker-compose.yml index b9f02a48..35c5bfd1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,31 +1,49 @@ -# You can read the Docker Compose documentation at: -# -# https://docs.docker.com/compose/ -# -# Run with file with `docker-compose up -d`. -# -# We use two separate Docker containers: one for the database and one for the -# Wekan application. The Wekan container doensn’t contain any mutable state -# (all the user data, even uploads, are saved in the database) so updating it -# is as simple as stoping the old version and starting the new one. If you want -# to update the database you need to uncomment the volume section below. +version: '2' -wekandb: - image: mongo -# volumes: -# - ./data/runtime/db:/data/db -# - ./data/dump:/dump - command: mongod --smallfiles --oplogSize 128 - ports: - - 27017 +services: -wekan: - image: mquandalle/wekan - links: - - wekandb - environment: - - MONGO_URL=mongodb://wekandb/wekan - - ROOT_URL=http://localhost:80 - ports: - - 80:80 + wekandb: + image: mongo:3.2.11 + container_name: wekan-db + restart: always + command: mongod --smallfiles --oplogSize 128 + networks: + - wekan-tier + expose: + - 27017 + volumes: + - wekan-db:/data/db + - wekan-db-dump:/dump + wekan: + image: mquandalle/wekan:latest + container_name: wekan-app + restart: always + networks: + - wekan-tier + build: + context: . + dockerfile: Dockerfile + args: + - NODE_VERSION=${NODE_VERSION} + - METEOR_RELEASE=${METEOR_RELEASE} + - NPM_VERSION=${NPM_VERSION} + - ARCHITECTURE=${ARCHITECTURE} + - SRC_PATH=${SRC_PATH} + ports: + - 80:80 + environment: + - MONGO_URL=mongodb://wekandb:27017/wekan + - ROOT_URL=http://localhost + depends_on: + - wekandb + +volumes: + wekan-db: + driver: local + wekan-db-dump: + driver: local + +networks: + wekan-tier: + driver: bridge diff --git a/i18n/ar.i18n.json b/i18n/ar.i18n.json index 225b0975..f534592e 100755..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": "النشاط", @@ -16,10 +36,13 @@ "activity-removed": "حذف %s إلى %s", "activity-sent": "إرسال %s إلى %s", "activity-unjoined": "غادر %s", + "activity-checklist-added": "added checklist to %s", "add": "أضف", "add-attachment": "إرفاق ملف", "add-board": "إضافة لوحة", "add-card": "إضافة بطاقة", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "إضافة غلاف", "add-label": "إضافة علامة", "add-list": "إضافة قائمة", @@ -31,6 +54,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 +71,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 +82,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 +92,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,10 +112,13 @@ "change-avatar": "تعديل الصورة الشخصية", "change-password": "تغيير كلمة المرور", "change-permissions": "تعديل الصلاحيات", + "change-settings": "Change Settings", "changeAvatarPopup-title": "تعديل الصورة الشخصية", "changeLanguagePopup-title": "تغيير اللغة", "changePasswordPopup-title": "تغيير كلمة المرور", "changePermissionsPopup-title": "تعديل الصلاحيات", + "changeSettingsPopup-title": "Change Settings", + "checklists": "Checklists", "click-to-star": "اضغط لإضافة اللوحة للمفضلة.", "click-to-unstar": "اضغط لحذف اللوحة من المفضلة.", "clipboard": "Clipboard or drag & drop", @@ -109,6 +142,7 @@ "createBoardPopup-title": "إنشاء لوحة", "createLabelPopup-title": "إنشاء علامة", "current": "الحالي", + "date": "Date", "decline": "Decline", "default-avatar": "صورة شخصية افتراضية", "delete": "حذف", @@ -122,7 +156,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 +183,33 @@ "error-user-doesNotExist": "This user does not exist", "error-user-notAllowSelf": "This action on self is not allowed", "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", "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 +229,20 @@ "listImportCardPopup-title": "Import a Trello card", "lists": "القائمات", "log-out": "تسجيل الخروج", + "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 +251,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": "قدتكون هذه الصفحة خاصة . قد تستطيع مشاهدتها ب <a href='%s'>تسجيل الدخول</a>.", "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", @@ -223,6 +272,7 @@ "remove-cover": "حذف الغلاف", "remove-from-board": "حذف من اللوحة", "remove-label": "حذف هذه العلامة", + "remove-list": "Remove the list", "remove-member": "حذف العضو", "remove-member-from-card": "حذف من البطاقة", "remove-member-pop": "حذف __name__ (__username__) من __boardTitle__ ? سيتم حذف هذا العضو من جميع بطاقة اللوحة مع إرسال إشعار له بذاك.", @@ -242,6 +292,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 +301,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": "ماذا تريد أن تنجز?" -} +}
\ No newline at end of file diff --git a/i18n/br.i18n.json b/i18n/br.i18n.json new file mode 100644 index 00000000..8e638b38 --- /dev/null +++ b/i18n/br.i18n.json @@ -0,0 +1,324 @@ +{ + "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", + "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", + "activity-checklist-added": "added checklist to %s", + "add": "Ouzhpenn", + "add-attachment": "Add an attachment", + "add-board": "Add a new board", + "add-card": "Ouzhpenn ur gartenn", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", + "add-cover": "Ouzphenn ur golo", + "add-label": "Ouzhpenn an titl", + "add-list": "Ouzhpenn ur roll", + "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", + "apply": "Apply", + "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", + "archive": "Archive", + "archive-all": "Archive All", + "archive-board": "Archive Board", + "archive-card": "Archive Card", + "archive-list": "Archive this list", + "archive-selection": "Archive selection", + "archiveBoardPopup-title": "Archive Board?", + "archived-items": "Archived Items", + "archives": "Archives", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when create it", + "avatar-too-big": "The avatar is too large (70Kb max)", + "back": "Back", + "board-change-color": "Kemmañ al liv", + "board-nb-stars": "%s stered", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Menu", + "boards": "Boards", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is archived.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.", + "card-due": "Due", + "card-due-on": "Due on", + "card-edit-attachments": "Edit attachments", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardDeletePopup-title": "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", + "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", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", + "color-black": "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", + "date": "Date", + "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", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "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", + "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-json-placeholder": "Paste your valid JSON data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick the Wekan user you want to use as this member", + "importMapMembersAddPopup-title": "Select Wekan member", + "info": "Infos", + "initials": "Initials", + "invalid-date": "Invalid date", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create a new label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "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", + "log-in": "Log In", + "loginPopup-title": "Log In", + "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.", + "no-archived-lists": "No archived lists.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "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", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove the label", + "remove-list": "Remove the list", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "select-color": "Select a color", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "time": "Time", + "title": "Title", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "username": "Username", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an archived list", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "what-to-do": "What do you want to do?" +}
\ No newline at end of file diff --git a/i18n/ca.i18n.json b/i18n/ca.i18n.json index fa223d02..188edcf6 100755..100644 --- a/i18n/ca.i18n.json +++ b/i18n/ca.i18n.json @@ -1,5 +1,25 @@ { "accept": "Accepta", + "act-activity-notify": "[Wekan] Notificació d'activitat", + "act-addAttachment": "adjuntat __attachment__ a __card__", + "act-addComment": "comentat a __card__: __comment__", + "act-createBoard": "creat __board__", + "act-createCard": "afegit/da __card__ a __list__", + "act-createList": "afegit/da __list__ a __board__", + "act-addBoardMember": "afegit/da __member__ a __board__", + "act-archivedBoard": "__board__ arxivat", + "act-archivedCard": "__card__ arxivat/da", + "act-archivedList": "__list__ arxivat/da", + "act-importBoard": "__board__ importat", + "act-importCard": "__card__ importat", + "act-importList": "__list__ importat", + "act-joinMember": "afegit/da __member__ a __card__", + "act-moveCard": "mou __card__ de __oldList__ a __list__", + "act-removeBoardMember": "elimina __member__ de __board__", + "act-restoredCard": "recupera __card__ a __board__", + "act-unjoinMember": "elimina __member__ de __card__", + "act-withBoardTitle": "[Wekan] __board__", + "act-withCardTitle": "[__board__] __card__", "actions": "Accions", "activities": "Activitats", "activity": "Activitat", @@ -16,10 +36,13 @@ "activity-removed": "ha eliminat %s de %s", "activity-sent": "ha enviat %s %s", "activity-unjoined": "desassignat %s", + "activity-checklist-added": "Checklist afegida a %s", "add": "Afegeix", "add-attachment": "Afegeix arxiu adjunt", "add-board": "Afegeix un nou tauler", "add-card": "Afegeix fitxa", + "add-checklist": "Afegeix una checklist", + "add-checklist-item": "Afegeix un ítem", "add-cover": "Afegeix coberta", "add-label": "Afegeix etiqueta", "add-list": "Afegeix llista", @@ -31,6 +54,8 @@ "all-boards": "Tots els taulers", "and-n-other-card": "And __count__ other card", "and-n-other-card_plural": "And __count__ other cards", + "apply": "Aplica", + "app-is-offline": "L'aplicació éstà fora de línia. Si refresca la pàgina perdrà les dades.", "archive": "Desa", "archive-all": "Desa Tot", "archive-board": "Arxiva tauler", @@ -46,6 +71,7 @@ "attachment-delete-pop": "L'esborrat d'un arxiu adjunt és permanent. No es pot desfer.", "attachmentDeletePopup-title": "Esborrar adjunt?", "attachments": "Adjunts", + "auto-watch": "Veure els taulers automàticament després de crear-los", "avatar-too-big": "L'avatar és massa gran (70Kb max)", "back": "Enrere", "board-change-color": "Canvia el color", @@ -56,7 +82,7 @@ "boardChangeColorPopup-title": "Canvia fons", "boardChangeTitlePopup-title": "Canvia el nom tauler", "boardChangeVisibilityPopup-title": "Canvia visibilitat", - "boardImportBoardPopup-title": "Importa tauler des de Trello", + "boardChangeWatchPopup-title": "Canvia seguiment", "boardMenuPopup-title": "Menú del tauler", "boards": "Taulers", "bucket-example": "Igual que “Bucket List”, per exemple", @@ -66,11 +92,15 @@ "card-delete-notice": "L'esborrat és permanent. Perdreu totes les accions associades a aquesta fitxa.", "card-delete-pop": "Totes les accions s'eliminaran de l'activitat i no podreu tornar a obrir la fitxa. No es pot desfer.", "card-delete-suggest-archive": "Podeu arxivar una fitxa per extreure-la del tauler i preservar l'activitat.", + "card-due": "Finalitza", + "card-due-on": "Finalitza a", "card-edit-attachments": "Edita arxius adjunts", "card-edit-labels": "Edita etiquetes", "card-edit-members": "Edita membres", "card-labels-title": "Canvia les etiquetes de la fitxa", "card-members-title": "Afegeix o eliminar membres del tauler des de la fitxa.", + "card-start": "Comença", + "card-start-on": "Comença a", "cardAttachmentsPopup-title": "Adjunta des de", "cardDeletePopup-title": "Esborrar fitxa?", "cardDetailsActionsPopup-title": "Accions de fitxes", @@ -82,10 +112,13 @@ "change-avatar": "Canvia Avatar", "change-password": "Canvia la clau", "change-permissions": "Canvia permisos", + "change-settings": "Canvia configuració", "changeAvatarPopup-title": "Canvia Avatar", "changeLanguagePopup-title": "Canvia idioma", "changePasswordPopup-title": "Canvia la contrasenya", "changePermissionsPopup-title": "Canvia permisos", + "changeSettingsPopup-title": "Canvia configuració", + "checklists": "Checklists", "click-to-star": "Fes clic per destacar aquest tauler.", "click-to-unstar": "Fes clic per deixar de destacar aquest tauler.", "clipboard": "Portaretalls o estirar i amollar", @@ -109,6 +142,7 @@ "createBoardPopup-title": "Crea tauler", "createLabelPopup-title": "Crea etiqueta", "current": "Actual", + "date": "Data", "decline": "Declina", "default-avatar": "Avatar per defecte", "delete": "Esborra", @@ -122,7 +156,10 @@ "edit": "Edita", "edit-avatar": "Canvia Avatar", "edit-profile": "Edita el teu Perfil", + "editCardStartDatePopup-title": "Canvia data d'inici", + "editCardDueDatePopup-title": "Canvia data de finalització", "editLabelPopup-title": "Canvia etiqueta", + "editNotificationPopup-title": "Edita la notificació", "editProfilePopup-title": "Edita teu Perfil", "email": "Correu electrònic", "email-enrollAccount-subject": "An account created for you on __siteName__", @@ -146,27 +183,33 @@ "error-user-doesNotExist": "L'usuari no existeix", "error-user-notAllowSelf": "Aquesta acció no està permesa", "error-user-notCreated": "L'usuari no s'ha creat", - "export-board": "Export board", + "error-username-taken": "Aquest usuari ja existeix", + "export-board": "Exporta tauler", "filter": "Filtre", "filter-cards": "Fitxes de filtre", "filter-clear": "Elimina filtre", + "filter-no-label": "Sense etiqueta", + "filter-no-member": "Sense membres", "filter-on": "Filtra per", "filter-on-desc": "Estau filtrant fitxes en aquest tauler. Feu clic aquí per editar el filtre.", "filter-to-selection": "Filtra selecció", "fullname": "Nom complet", "header-logo-title": "Torna a la teva pàgina de taulers", + "hide-system-messages": "Oculta missatges del sistema", "home": "Inici", "import": "importa", "import-board": "Importa des de Trello", + "import-board-title": "Importa tauler des de Trello", "import-board-trello-instruction": "En el teu tauler Trello, ves a 'Menú', 'Més'.' Imprimir i Exportar', 'Exportar JSON', i copia el text resultant.", - "import-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": "Mapeja el membres", "import-members-map": "El tauler importat conté membres. Assigna els membres que vulguis importar a usuaris Wekan", "import-show-user-mapping": "Revisa l'assignació de membres", "import-user-select": "Selecciona l'usuari Wekan que vulguis associar a aquest membre", + "importMapMembersAddPopup-title": "Selecciona un membre de Wekan", "info": "Informacions", "initials": "Inicials", + "invalid-date": "Data invàlida", "joined": "s'ha unit", "just-invited": "Has estat convidat a aquest tauler", "keyboard-shortcuts": "Dreceres de teclat", @@ -186,17 +229,20 @@ "listImportCardPopup-title": "importa una fitxa de Trello", "lists": "Llistes", "log-out": "Finalitza la sessió", + "log-in": "Ingresa", "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": "Mou a la part inferior", + "moveCardToTop-title": "Mou a la part superior", "moveSelectionPopup-title": "Move selection", "multi-selection": "Multi-Selecció", "multi-selection-on": "Multi-Selecció està activada", + "muted": "En silenci", + "muted-info": "No seràs notificat dels canvis en aquest tauler", "my-boards": "Els meus taulers", "name": "Nom", "no-archived-cards": "No hi ha fitxes arxivades.", @@ -205,12 +251,15 @@ "normal": "Normal", "normal-desc": "Podeu veure i editar fitxes. No podeu canviar la configuració.", "not-accepted-yet": "La invitació no ha esta acceptada encara", + "notify-participate": "Rebre actualitzacions per a cada fitxa de la qual n'ets creador o membre", + "notify-watch": "Rebre actualitzacions per qualsevol tauler, llista o fitxa en observació", "optional": "opcional", "or": "o", "page-maybe-private": "Aquesta pàgina és privada. Per veure-la <a href='%s'> entra </a>.", "page-not-found": "Pàgina no trobada.", "password": "Contrasenya", "paste-or-dragdrop": "aferra, o estira i amolla la imatge (només imatge)", + "participating": "Participant", "preview": "Vista prèvia", "previewAttachedImagePopup-title": "Vista prèvia", "previewClipboardImagePopup-title": "Vista prèvia", @@ -223,6 +272,7 @@ "remove-cover": "Elimina coberta", "remove-from-board": "Elimina del tauler", "remove-label": "Eliminia etiqueta", + "remove-list": "Elimina la llista", "remove-member": "Elimina membre", "remove-member-from-card": "Elimina de la fitxa", "remove-member-pop": "Eliminar __name__ (__username__) de __boardTitle__ ? El membre serà eliminat de totes les fitxes d'aquest tauler. Ells rebran una notificació.", @@ -242,6 +292,7 @@ "shortcut-show-shortcuts": "Mostra aquesta lista d'accessos directes", "shortcut-toggle-filterbar": "Canvia la barra lateral del tauler", "shortcut-toggle-sidebar": "Canvia Sidebar del Tauler", + "show-cards-minimum-count": "Mostra contador de fitxes si la llista en conté més de", "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 +301,24 @@ "team": "Equip", "this-board": "aquest tauler", "this-card": "aquesta fitxa", + "time": "Hora", "title": "Títol", + "tracking": "En seguiment", + "tracking-info": "Seràs notificat per cada canvi a aquelles fitxes de les que n'eres creador o membre", "unassign-member": "Desassignar membre", "unsaved-description": "Tens una descripció sense desar.", + "unwatch": "Suprimeix observació", "upload": "Puja", "upload-avatar": "Actualitza avatar", "uploaded-avatar": "Avatar actualitzat", "username": "Nom d'Usuari", "view-it": "Vist", "warn-list-archived": "Avís: aquesta fitxa està en una llista arxivada", + "watch": "Observa", + "watching": "En observació", + "watching-info": "Seràs notificat de cada canvi en aquest tauler", + "welcome-board": "Tauler de benvinguda", + "welcome-list1": "Bàsics", + "welcome-list2": "Avançades", "what-to-do": "Què vols fer?" -} +}
\ No newline at end of file diff --git a/i18n/cs.i18n.json b/i18n/cs.i18n.json new file mode 100644 index 00000000..3db88d56 --- /dev/null +++ b/i18n/cs.i18n.json @@ -0,0 +1,324 @@ +{ + "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", + "activity-added": "%s přidáno k %s", + "activity-archived": "%s archivováno", + "activity-attached": "přiloženo %s k %s", + "activity-created": "%s vytvořeno", + "activity-excluded": "%s vyjmuto z %s", + "activity-imported": "importován %s do %s z %s", + "activity-imported-board": "importován %s z %s", + "activity-joined": "spojen %s", + "activity-moved": "%s přesunuto z %s do %s", + "activity-on": "na %s", + "activity-removed": "odstraněn %s z %s", + "activity-sent": "%s posláno na %s", + "activity-unjoined": "odpojen %s", + "activity-checklist-added": "added checklist to %s", + "add": "Přidat", + "add-attachment": "Přidat přílohu", + "add-board": "Přidat nové tablo", + "add-card": "Přidat kartu", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", + "add-cover": "Přidat obal", + "add-label": "Přidat štítek", + "add-list": "Přidat seznam", + "add-members": "Přidat členy", + "added": "Přidán", + "addMemberPopup-title": "Členové", + "admin": "Administrátor", + "admin-desc": "Může zobrazovat a upravovat karty, mazat členy a měnit nastavení tabla.", + "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", + "archive-card": "Archivovat kartu", + "archive-list": "Archivovat tento seznam", + "archive-selection": "Archivovat výběr", + "archiveBoardPopup-title": "Archivovat tablo?", + "archived-items": "Archivované položky", + "archives": "Archivy", + "assign-member": "Přiřadit člena", + "attached": "přiloženo", + "attachment": "Příloha", + "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", + "board-nb-stars": "%s hvězdiček", + "board-not-found": "Tablo nenalezeno", + "board-private-info": "Toto tablo bude <strong>soukromé</strong>.", + "board-public-info": "Toto tablo bude <strong>veřejné</strong>.", + "boardChangeColorPopup-title": "Změnit pozadí tabla", + "boardChangeTitlePopup-title": "Přejmenovat tablo", + "boardChangeVisibilityPopup-title": "Upravit viditelnost", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Menu tabla", + "boards": "Tabla", + "bucket-example": "Například \"Než mě odvedou\"", + "cancel": "Zrušit", + "card-archived": "Tato karta je archivována.", + "card-comments-title": "Tato karta má %s komentářů.", + "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", + "cardLabelsPopup-title": "Štítky", + "cardMembersPopup-title": "Členové", + "cardMorePopup-title": "Více", + "cards": "Karty", + "change": "Změnit", + "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", + "checklists": "Checklists", + "click-to-star": "Kliknutím přidat hvězdičku tomuto tablu.", + "click-to-unstar": "Kliknutím odebrat hvězdičku tomuto tablu.", + "clipboard": "Schránka nebo potáhnout a pustit", + "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.", + "color-black": "černá", + "color-blue": "modrá", + "color-green": "zelená", + "color-lime": "světlezelená", + "color-orange": "oranžová", + "color-pink": "růžová", + "color-purple": "fialová", + "color-red": "červená", + "color-sky": "nebeská", + "color-yellow": "žlutá", + "comment": "Komentář", + "comment-placeholder": "Zapsat komentář", + "computer": "Počítač", + "create": "Vytvořit", + "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", + "deleteLabelPopup-title": "Smazat štítek?", + "description": "Popis", + "disambiguateMultiLabelPopup-title": "Dvojznačný štítek akce", + "disambiguateMultiMemberPopup-title": "Dvojznačná akce člena", + "discard": "Zahodit", + "done": "Hotovo", + "download": "Stáhnout", + "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__", + "email-enrollAccount-text": "Ahoj __user__,\n\nMůžeš začít používat službu kliknutím na odkaz níže.\n\n__url__\n\nDěkujeme.", + "email-fail": "Odeslání emailu selhalo", + "email-invalid": "Neplatný email", + "email-invite": "Pozvat pomocí emailu", + "email-invite-subject": "__inviter__ odeslal pozvánku", + "email-invite-text": "Ahoj __user__,\n\n__inviter__ tě přizval ke spolupráci na tablu \"__board__\".\n\nNásleduj prosím odkaz níže:\n\n__url__\n\nDěkujeme.", + "email-resetPassword-subject": "Změň své heslo na __siteName__", + "email-resetPassword-text": "Ahoj __user__,\n\nPro změnu hesla klikni na odkaz níže.\n\n__url__\n\nDěkujeme.", + "email-sent": "Email byl odeslán", + "email-verifyEmail-subject": "Ověř svou emailovou adresu na", + "email-verifyEmail-text": "Ahoj __user__,\n\nPro ověření emailové adresy klikni na odkaz níže.\n\n__url__\n\nDěkujeme.", + "error-board-doesNotExist": "Toto tablo neexistuje", + "error-board-notAdmin": "K provedení změny musíš být administrátor tohoto tabla", + "error-board-notAMember": "K provedení změny musíš být členem tohoto tabla", + "error-json-malformed": "Tvůj text není validní JSON", + "error-json-schema": "Tato JSON data neobsahují správné informace v platném formátu", + "error-list-doesNotExist": "Tento seznam neexistuje", + "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-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", + "label-create": "Vytvořit nový štítek", + "label-default": "%s štítek (výchozí)", + "label-delete-pop": "Nelze vrátit zpět. Toto odebere tento štítek ze všech karet a zničí jeho historii.", + "labels": "Štítky", + "language": "Jazyk", + "last-admin-desc": "Nelze změnit role, protože musí existovat alespoň jeden administrátor.", + "leave-board": "Opustit tablo", + "link-card": "Odkázat na tuto kartu", + "list-archive-cards": "Archivovat všechny karty na tomto seznamu", + "list-archive-cards-pop": "Toto odstraní z tabla všechny karty z tohoto seznamu. Pro zobrazení archivovaných karet a jejich opětovné obnovení, klikni v \"Menu\" > \"Archivované položky\".", + "list-move-cards": "Přesunout všechny karty v tomto seznamu", + "list-select-cards": "Vybrat všechny karty v tomto seznamu", + "listActionPopup-title": "Vypsat akce", + "listImportCardPopup-title": "Importovat Trello kartu", + "lists": "Seznamy", + "log-out": "Odhlásit", + "log-in": "Přihlásit", + "loginPopup-title": "Přihlásit", + "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.", + "no-archived-lists": "Žádné archivované seznamy.", + "no-results": "Žádné výsledky", + "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 <a href='%s'>přihlášení</a>.", + "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", + "private": "Soukromý", + "private-desc": "Toto tablo je soukromé. Pouze vybraní uživatelé ho mohou zobrazit a upravovat.", + "profile": "Profil", + "public": "Veřejný", + "public-desc": "Toto tablo je veřejné. Je viditelné pro každého, kdo na něj má odkaz a bude zobrazeno ve vyhledávačích jako je Google. Pouze vybraní uživatelé ho mohou upravovat.", + "quick-access-description": "Pro přidání odkazu do této lišty označ tablo hvězdičkou.", + "remove-cover": "Odstranit obal", + "remove-from-board": "Odstranit z tabla", + "remove-label": "Odstranit štítek", + "remove-list": "Remove the list", + "remove-member": "Odebrat uživatele", + "remove-member-from-card": "Odstranit z karty", + "remove-member-pop": "Odstranit __name__ (__username__) z __boardTitle__? Uživatel bude odebrán ze všech karet na tomto tablu. Na tuto skutečnost bude upozorněn.", + "removeMemberPopup-title": "Odstranit člena?", + "rename": "Přejmenovat", + "rename-board": "Přejmenovat tablo", + "restore": "Obnovit", + "save": "Uložit", + "search": "Hledat", + "select-color": "Vybrat barvu", + "shortcut-assign-self": "Přiřadit sebe k aktuální kartě", + "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", + "shortcut-filter-my-cards": "Filtrovat mé karty", + "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", + "starred-boards-description": "Tabla s hvězdičkou jsou zobrazena navrchu seznamu.", + "subscribe": "Odebírat", + "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..c91a53db 100755..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,51 @@ "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", + "activity-checklist-added": "Checklist zu %s hinzugefügt", "add": "Hinzufügen", "add-attachment": "Anhang hinzufügen", "add-board": "Neues Board erstellen", - "add-card": "Karte hinzufügen...", + "add-card": "Karte hinzufügen", + "add-checklist": "Füge eine Checklist hinzu", + "add-checklist-item": "Füge einen Punkt zu Checklist hinzu", "add-cover": "Cover hinzufügen", "add-label": "Label hinzufügen", - "add-list": "Liste hinzufügen...", - "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 +82,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 +108,23 @@ "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", + "checklists": "Checklists", + "click-to-star": "Klicken um dem Board einen Stern zu geben.", + "click-to-unstar": "Klicken um den Stern von dem Board zu entfernen.", + "clipboard": "Zwischenablage oder Drag & Drop", "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 +139,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 +151,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.", + "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.", + "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.", + "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.", + "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 +250,75 @@ "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 <a href='%s'>einloggst</a>.", + "page-maybe-private": "Diese Seite könnte privat sein. Vielleicht können Sie sie sehen, wenn Sie sich <a href='%s'>einloggen</a>.", "page-not-found": "Seite nicht gefunden.", "password": "Passwort", - "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", - "preview": "Preview", - "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-list": "Liste 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?" -} +}
\ No newline at end of file diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index b171bdf9..5d52e390 100755..100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -36,10 +36,13 @@ "activity-removed": "removed %s from %s", "activity-sent": "sent %s to %s", "activity-unjoined": "unjoined %s", + "activity-checklist-added": "added checklist to %s", "add": "Add", "add-attachment": "Add an attachment", "add-board": "Add a new board", "add-card": "Add a card", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "Add Cover", "add-label": "Add the label", "add-list": "Add a list", @@ -51,6 +54,8 @@ "all-boards": "All boards", "and-n-other-card": "And __count__ other card", "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", "archive": "Archive", "archive-all": "Archive All", "archive-board": "Archive Board", @@ -87,11 +92,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", @@ -103,13 +112,16 @@ "change-avatar": "Change Avatar", "change-password": "Change Password", "change-permissions": "Change permissions", + "change-settings": "Change Settings", "changeAvatarPopup-title": "Change Avatar", "changeLanguagePopup-title": "Change Language", "changePasswordPopup-title": "Change Password", "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "checklists": "Checklists", "click-to-star": "Click to star this board.", "click-to-unstar": "Click to unstar this board.", - "clipboard" : "Clipboard or drag & drop", + "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.", @@ -130,6 +142,7 @@ "createBoardPopup-title": "Create Board", "createLabelPopup-title": "Create Label", "current": "current", + "date": "Date", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -143,22 +156,24 @@ "edit": "Edit", "edit-avatar": "Change Avatar", "edit-profile": "Edit Profile", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", "editLabelPopup-title": "Change Label", "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", "email-enrollAccount-subject": "An account created for you on __siteName__", - "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.\n", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", "email-fail": "Sending email failed", "email-invalid": "Invalid email", "email-invite": "Invite via Email", "email-invite-subject": "__inviter__ sent you an invitation", - "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.\n", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", "email-resetPassword-subject": "Reset your password on __siteName__", - "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.\n", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", "email-sent": "Email sent", "email-verifyEmail-subject": "Verify your email address on __siteName__", - "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.\n", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", "error-board-doesNotExist": "This board does not exist", "error-board-notAdmin": "You need to be admin of this board to do that", "error-board-notAMember": "You need to be a member of this board to do that", @@ -168,15 +183,19 @@ "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", @@ -190,6 +209,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", @@ -252,6 +272,7 @@ "remove-cover": "Remove Cover", "remove-from-board": "Remove from Board", "remove-label": "Remove the label", + "remove-list": "Remove the list", "remove-member": "Remove Member", "remove-member-from-card": "Remove from Card", "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", @@ -271,6 +292,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", @@ -279,6 +301,7 @@ "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.", @@ -294,5 +317,8 @@ "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/es-ES.i18n.json b/i18n/es-ES.i18n.json new file mode 100644 index 00000000..578db27d --- /dev/null +++ b/i18n/es-ES.i18n.json @@ -0,0 +1,320 @@ +{ + "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", + "activity-added": "ha añadido %s a %s", + "activity-archived": "ha archivado %s", + "activity-attached": "ha adjuntado %s a %s", + "activity-created": "ha creado %s", + "activity-excluded": "ha excluido %s de %s", + "activity-imported": "importado %s en %s desde %s", + "activity-imported-board": "importado %s desde %s", + "activity-joined": "se ha unido %s", + "activity-moved": "ha movido %s de %s a %s", + "activity-on": "en %s", + "activity-removed": "ha eliminado %s de %s", + "activity-sent": "ha enviado %s a %s", + "activity-unjoined": "ha abandonado %s", + "add": "Añadir", + "add-attachment": "Añadir archivo adjunto", + "add-board": "Añadir nuevo tablero", + "add-card": "Añadir tarjeta", + "add-cover": "Añadir cubierta", + "add-label": "Añadir etiqueta", + "add-list": "Añadir lista", + "add-members": "Añadir Miembros", + "added": "Añadido", + "addMemberPopup-title": "Miembros", + "admin": "Administrador", + "admin-desc": "Puedes ver y editar tarjetas, eliminar miembros y cambiar los ajustes del tablero.", + "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", + "archive-card": "Archivar tarjeta", + "archive-list": "Archivar esta lista", + "archive-selection": "Archivar selección", + "archiveBoardPopup-title": "¿Archivar tablero?", + "archived-items": "Objetos archivados", + "archives": "Archivadas", + "assign-member": "Assignar miembro", + "attached": "adjuntado", + "attachment": "Adjunto", + "attachment-delete-pop": "El borrado de un archivo adjunto es permanente. No se puede deshacer.", + "attachmentDeletePopup-title": "¿Borrar adjunto?", + "attachments": "Adjuntos", + "auto-watch": "Automatically watch boards when create it", + "avatar-too-big": "El avatar es demasiado grande (70Kb max)", + "back": "Atrás", + "board-change-color": "Cambiar color", + "board-nb-stars": "%s estrellas", + "board-not-found": "tablero no encontrado", + "board-private-info": "Este tablero será <strong>privado</strong>.", + "board-public-info": "Este tablero será <strong>público</strong>.", + "boardChangeColorPopup-title": "Cambiar fondo", + "boardChangeTitlePopup-title": "Renombrar tablero", + "boardChangeVisibilityPopup-title": "Cambiar visibilidad", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Menú del tablero", + "boards": "Tableros", + "bucket-example": "Al igual que “Bucket List”, por ejemplo", + "cancel": "Cancelar", + "card-archived": "Esta tarjeta está archivada.", + "card-comments-title": "Esta tarjeta tiene %s comentarios.", + "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", + "cardLabelsPopup-title": "Etiquetas", + "cardMembersPopup-title": "Miembros", + "cardMorePopup-title": "Más", + "cards": "Tarjetas", + "change": "Cambiar", + "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", + "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.", + "color-black": "negro", + "color-blue": "azul", + "color-green": "verde", + "color-lime": "lima", + "color-orange": "naranja", + "color-pink": "rosa", + "color-purple": "violeta", + "color-red": "rojo", + "color-sky": "cielo", + "color-yellow": "amarillo", + "comment": "Comentario", + "comment-placeholder": "Escribir un comentario", + "computer": "Ordenador", + "create": "Crear", + "createBoardPopup-title": "Crear tablero", + "createLabelPopup-title": "Crear etiqueta", + "current": "actual", + "date": "Date", + "decline": "Denegar", + "default-avatar": "Avatar por defecto", + "delete": "Borrar", + "deleteLabelPopup-title": "¿Borrar etiqueta?", + "description": "Descripción", + "disambiguateMultiLabelPopup-title": "Deshacer ambigüedad en las etiquetas", + "disambiguateMultiMemberPopup-title": "Deshacer ambigüedad en los miembros", + "discard": "Descartar", + "done": "Hecho", + "download": "Descargar", + "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__", + "email-enrollAccount-text": "Hola __user__,\n\nPara comenzar a utilizar el servicio, haz clic en el siguiente enlace.\n\n__url__\n\nGracias.", + "email-fail": "Fallo el envío del correo", + "email-invalid": "Correo no válido", + "email-invite": "Invitar mediante correo", + "email-invite-subject": "__inviter__ te ha enviado una invitación", + "email-invite-text": "Estimado __user__,\n\n__inviter__ te ha invitado a unirte al tablero \"__board__\" para colaborar.\n\nPor favor sigue el siguiente enlace:\n\n__url__\n\nGracias.", + "email-resetPassword-subject": "Restablecer tu contraseña en __siteName__", + "email-resetPassword-text": "Hola __user__,\n\nPara restablecer tu contraseña, haz clic en el siguiente enlace.\n\n__url__\n\nGracias.", + "email-sent": "Correo enviado", + "email-verifyEmail-subject": "Verificar tu dirección de correo en __siteName__", + "email-verifyEmail-text": "Hola __user__,\n\nPara verificar tu dirección de correo, haz clic en el siguiente enlace.\n\n__url__\n\nGracias.", + "error-board-doesNotExist": "Este tablero no existe", + "error-board-notAdmin": "Necesitas permiso de administrador en este tablero para hacer eso", + "error-board-notAMember": "Tienes que ser miembro de este tablero para hacer eso", + "error-json-malformed": "Tu texto no es JSON válido", + "error-json-schema": "Tus datos JSON no contienen la información adecuada y/o no están en el formato correcto", + "error-list-doesNotExist": "Esta lista no existe", + "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-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", + "label-create": "Crear una etiqueta nueva", + "label-default": "%s etiqueta (por defecto)", + "label-delete-pop": "No se puede deshacer. Esto eliminará esta etiqueta de todas las tarjetas y destruirá su historial.", + "labels": "Etiquetas", + "language": "Idioma", + "last-admin-desc": "No puedes cambiar roles porque debe haber al menos un administrador.", + "leave-board": "Abandonar Tablero", + "link-card": "Enlace a esta tarjeta", + "list-archive-cards": "Archivar todas las tarjetas en esta lista", + "list-archive-cards-pop": "Esto eliminara todas las tarjetas de esta lista del tablero. Para ver tarjetas archivadas y recuperarlas en el tablero, haz clic en \"Menu\" / \"Objetos Archivados\".", + "list-move-cards": "Mover todas las tarjetas en esta lista", + "list-select-cards": "Seleccionar todas las tarjetas en esta lista", + "listActionPopup-title": "Acciones de la lista", + "listImportCardPopup-title": "Importar tarjeta de Trello", + "lists": "Listas", + "log-out": "Finalizar la sesión", + "log-in": "Log In", + "loginPopup-title": "Iniciar sesión", + "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.", + "no-archived-lists": "No hay listas archivadas.", + "no-results": "Sin resultados", + "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 <a href='%s'>entrar</a>.", + "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", + "private": "Privado", + "private-desc": "Este tablero es privado. Sólo las personas añadidas pueden ver y editar.", + "profile": "Perfil", + "public": "Público", + "public-desc": "Este tablero es público. Es visible para cualquier persona con el enlace y se mostrará en los motores de búsqueda como Google. Sólo personas añadidas al tablero pueden editar.", + "quick-access-description": "Iniciar un tablero para agregar un acceso directo en este barra", + "remove-cover": "Eliminar cubierta", + "remove-from-board": "Eliminar del tablero", + "remove-label": "Eliminar etiqueta", + "remove-list": "Remove the list", + "remove-member": "Eliminar Miembro", + "remove-member-from-card": "Eliminar de la Tarjeta", + "remove-member-pop": "Eliminar __name__ (__username__) de __boardTitle__? El miembro será eliminado de todas las tarjetas de este tablero. Ellos recibirán una notificación.", + "removeMemberPopup-title": "¿Eliminar miembro?", + "rename": "Renombrar", + "rename-board": "Renombrar tablero", + "restore": "Restaurar", + "save": "Guardar", + "search": "Buscar", + "select-color": "Selecciona un color", + "shortcut-assign-self": "Asignarme la tarjeta actual", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocompletar miembros", + "shortcut-clear-filters": "Eliminar todos los filters", + "shortcut-close-dialog": "Cierra el Dialogo", + "shortcut-filter-my-cards": "Filtrar mis tarjetas", + "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", + "starred-boards-description": "Los tableros destacados se mostrarán en la parte superior de tu lista de tableros.", + "subscribe": "Suscribir", + "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?" +} diff --git a/i18n/es.i18n.json b/i18n/es.i18n.json index b4af8f5a..4f20036b 100755..100644 --- a/i18n/es.i18n.json +++ b/i18n/es.i18n.json @@ -1,5 +1,25 @@ { - "accept": "Accept", + "accept": "Aceptar", + "act-activity-notify": "[Wekan] Notificación de Actividad", + "act-addAttachment": "adjuntado __attachment__ a __card__", + "act-addComment": "comentado en __card__: __comment__", + "act-createBoard": "creado __board__", + "act-createCard": "añadido __card__ a __list__", + "act-createList": "añadido __list__ a __board__", + "act-addBoardMember": "añadido __member__ a __board__", + "act-archivedBoard": "__board__ archivado", + "act-archivedCard": "__card__ archivada", + "act-archivedList": "__list__ archivada", + "act-importBoard": "__board__ importado", + "act-importCard": "__card__ importada", + "act-importList": "__list__ importada", + "act-joinMember": "añadido __member__ to __card__", + "act-moveCard": "movida __card__ desde __oldList__ a __list__", + "act-removeBoardMember": "borrado __member__ de __board__", + "act-restoredCard": "restaurada __card__ en __board__", + "act-unjoinMember": "borrado __member__ de __card__", + "act-withBoardTitle": "[Wekan] __board__", + "act-withCardTitle": "[__board__] __card__", "actions": "Acciones", "activities": "Activities", "activity": "Actividad", @@ -16,10 +36,13 @@ "activity-removed": "eliminado %s de %s", "activity-sent": "enviado %s a %s", "activity-unjoined": "unjoined %s", + "activity-checklist-added": "added checklist to %s", "add": "Añadir", "add-attachment": "Añadir un adjunto", "add-board": "Añadir un nuevo tablero", "add-card": "Add a card", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "Añadir cubierta", "add-label": "Add the label", "add-list": "Add a list", @@ -31,6 +54,8 @@ "all-boards": "Tableros", "and-n-other-card": "And __count__ other card", "and-n-other-card_plural": "And __count__ other cards", + "apply": "Aplicar", + "app-is-offline": "La aplicación esta actualmente fuera de servicio, refrescar la página causará pérdida de datos", "archive": "Guardar", "archive-all": "Guardar Todo", "archive-board": "Archive Board", @@ -40,12 +65,13 @@ "archiveBoardPopup-title": "Archive Board?", "archived-items": "Items archivados", "archives": "Archives", - "assign-member": "Assign member", + "assign-member": "Asignar miembros", "attached": "adjuntado", "attachment": "Adjunto", "attachment-delete-pop": "El borrado de un archivo adjunto es permanente. No se puede deshacer.", "attachmentDeletePopup-title": "¿Borrar adjunto?", "attachments": "Adjuntos", + "auto-watch": "Vigilar tableros automáticamente cuando se crean", "avatar-too-big": "The avatar is too large (70Kb max)", "back": "Atrás", "board-change-color": "Cambiar color", @@ -56,7 +82,7 @@ "boardChangeColorPopup-title": "Change Board Background", "boardChangeTitlePopup-title": "Renombrar tablero", "boardChangeVisibilityPopup-title": "Cambiar visibilidad", - "boardImportBoardPopup-title": "Import board from Trello", + "boardChangeWatchPopup-title": "Cambiar Vigilancia", "boardMenuPopup-title": "Board Menu", "boards": "Tableros", "bucket-example": "Like “Bucket List” for example", @@ -66,11 +92,15 @@ "card-delete-notice": "El borrado es permanente. Perderás todas las acciones asociadas a esta ficha.", "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.", + "card-due": "Motivo", + "card-due-on": "Debido a", "card-edit-attachments": "Edit attachments", "card-edit-labels": "Edit labels", - "card-edit-members": "Edit members", + "card-edit-members": "Editar miembros", "card-labels-title": "Cambia las etiquetas de la ficha", "card-members-title": "Añadir o eliminar miembros del tablero desde la ficha.", + "card-start": "Empezar", + "card-start-on": "Empieza", "cardAttachmentsPopup-title": "Attach From", "cardDeletePopup-title": "¿Borrar ficha?", "cardDetailsActionsPopup-title": "Card Actions", @@ -82,12 +112,15 @@ "change-avatar": "Cambiar Avatar", "change-password": "Cambiar la clave", "change-permissions": "Cambiar permisos", + "change-settings": "Cambiar Preferencias", "changeAvatarPopup-title": "Cambiar Avatar", "changeLanguagePopup-title": "Cambiar idioma", "changePasswordPopup-title": "Cambiar la clave", "changePermissionsPopup-title": "Cambiar permisos", - "click-to-star": "Haz clic para destacar este tablero. ", - "click-to-unstar": "Haz clic para dejar de destacar este tablero. ", + "changeSettingsPopup-title": "Cambiar Preferencias", + "checklists": "Checklists", + "click-to-star": "Haz clic para destacar este tablero.", + "click-to-unstar": "Haz clic para dejar de destacar este tablero.", "clipboard": "Clipboard or drag & drop", "close": "Cerrar", "close-board": "Cerrar el tablero", @@ -109,6 +142,7 @@ "createBoardPopup-title": "Crear tablero", "createLabelPopup-title": "Crear etiqueta", "current": "actual", + "date": "Fecha", "decline": "Decline", "default-avatar": "Avatar por defecto", "delete": "Borrar", @@ -122,7 +156,10 @@ "edit": "Editar", "edit-avatar": "Cambiar Avatar", "edit-profile": "Edit Profile", + "editCardStartDatePopup-title": "Cambiar fecha de inicio", + "editCardDueDatePopup-title": "Cambiar fecha de motivo", "editLabelPopup-title": "Cambiar etiqueta", + "editNotificationPopup-title": "Editar Notificación", "editProfilePopup-title": "Edit Profile", "email": "Correo electrónico", "email-enrollAccount-subject": "An account created for you on __siteName__", @@ -146,74 +183,86 @@ "error-user-doesNotExist": "This user does not exist", "error-user-notAllowSelf": "This action on self is not allowed", "error-user-notCreated": "This user is not created", + "error-username-taken": "Este nombre de usuario ya está en uso", "export-board": "Export board", "filter": "Filter", "filter-cards": "Fichas de filtro", "filter-clear": "Clear filter", - "filter-on": "Filter is on", + "filter-no-label": "Sin etiqueta", + "filter-no-member": "Sin miembro", + "filter-on": "Filtro activo", "filter-on-desc": "Estás filtrando fichas en este tablero. Haz clic aquí para editar el filtro.", "filter-to-selection": "Filter to selection", "fullname": "Nombre Completo", "header-logo-title": "Volver a tu página de tableros", + "hide-system-messages": "Ocultar los mensajes del sistema", "home": "Inicio", - "import": "Import", - "import-board": "import from Trello", + "import": "Importar", + "import-board": "importar desde Trello", + "import-board-title": "Importar tablero desde Trello", "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text", - "import-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": "Mapa de miembros", "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users", "import-show-user-mapping": "Review members mapping", "import-user-select": "Pick the Wekan user you want to use as this member", + "importMapMembersAddPopup-title": "Seleccionar un miembro de Wekan", "info": "Informaciones", - "initials": "Initials", + "initials": "Iniciales", + "invalid-date": "Fecha no Válida", "joined": "se ha unido", "just-invited": "You are just invited to this board", - "keyboard-shortcuts": "Keyboard shortcuts", - "label-create": "Crear una etiqueta nueva ", + "keyboard-shortcuts": "Atajos de teclado", + "label-create": "Crear una etiqueta nueva", "label-default": "%s etiqueta (por Defecto)", "label-delete-pop": "No se puede deshacer. Esto eliminará esta etiqueta de todas las fichas y destruirá su historia.", "labels": "Etiquetas", "language": "Idioma", "last-admin-desc": "No puedes cambiar roles porque debe haber al menos un administrador.", - "leave-board": "Leave Board", + "leave-board": "Dejar el Tablero", "link-card": "Enlace a esta ficha", "list-archive-cards": "Archive all cards in this list", "list-archive-cards-pop": "Esto eliminara todas las fichas de esta lista del tablero. Para ver fichas archivadas y recuperarlas en el tablero, haz clic en \"Menu\" / \"Artículos Archivados\".", "list-move-cards": "Move all cards in this list", "list-select-cards": "Select all cards in this list", "listActionPopup-title": "Acciones de la lista", - "listImportCardPopup-title": "Import a Trello card", - "lists": "Lists", + "listImportCardPopup-title": "Importar una tarjeta de Trello", + "lists": "Listas", "log-out": "Finalizar la sesion", + "log-in": "Iniciar sesion", "loginPopup-title": "Iniciar sesion", - "mapMembersAddPopup-title": "Select Wekan member", - "mapMembersPopup-title": "Map members", - "memberMenuPopup-title": "Member Settings", + "memberMenuPopup-title": "Preferencias de Miembro", "members": "Miembros", "menu": "Menu", - "move-selection": "Move selection", + "move-selection": "Mover selección", "moveCardPopup-title": "Move Card", - "moveSelectionPopup-title": "Move selection", - "multi-selection": "Multi-Selection", - "multi-selection-on": "Multi-Selection is on", + "moveCardToBottom-title": "Mover al Final", + "moveCardToTop-title": "Movel al Principio", + "moveSelectionPopup-title": "Mover selección", + "multi-selection": "Multi-Selección", + "multi-selection-on": "Multi-Selección activada", + "muted": "Silenciado", + "muted-info": "No serás notificado de ningún cambio en este tablero", "my-boards": "Mis tableros", "name": "Nombre", - "no-archived-cards": "No archived cards.", - "no-archived-lists": "No archived lists.", + "no-archived-cards": "No hay tarjetas archivadas.", + "no-archived-lists": "No hay listas archivadas.", "no-results": "Sin resultados", "normal": "Normal", "normal-desc": "Puedes ver y editar fichas. No puedes cambiar la configuración.", "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Recibir actualizaciones de cualquier tarjeta en la que participas como creador o miembro", + "notify-watch": "Recibir actuaizaciones de cualquier tablero, lista o tarjeta que estés vigilando", "optional": "opcional", - "or": "or", + "or": "o", "page-maybe-private": "Esta página puede ser privada. Puedes verla por <a href='%s'>logging in</a>.", "page-not-found": "Página no encontrada.", "password": "Clave", "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", - "preview": "Preview", - "previewAttachedImagePopup-title": "Preview", - "previewClipboardImagePopup-title": "Preview", + "participating": "Participando", + "preview": "Previsualizar", + "previewAttachedImagePopup-title": "Previsualizar", + "previewClipboardImagePopup-title": "Previsualizar", "private": "Privado", "private-desc": "Este tablero es privado. Sólo las personas añadidas al tablero pueden verlo y editarlo.", "profile": "Perfil", @@ -221,43 +270,55 @@ "public-desc": "Este tablero es público. Es visible para cualquier persona con el enlace y se mostrará en los motores de búsqueda como Google. Sólo personas añadidas al tablero pueden editarlo.", "quick-access-description": "Star a board to add a shortcut in this bar.", "remove-cover": "Eliminar cubierta", - "remove-from-board": "Remove from Board", - "remove-label": "Remove the label", + "remove-from-board": "Borrar del Tablero", + "remove-label": "Borrar la etiqueta", + "remove-list": "Remove the list", "remove-member": "Eliminar Miembro", "remove-member-from-card": "Eliminar de la Ficha", "remove-member-pop": "Eliminar __nombre__ (__usuario__) de __Título del tablero__? El miembro será eliminado de todas las tarjetas de este tablero. Ellos recibirán una notificación.", "removeMemberPopup-title": "¿Eliminar miembro?", "rename": "Renombrar", "rename-board": "Renombrar tablero", - "restore": "Restore", + "restore": "Restaurar", "save": "Guardar", "search": "Buscar", "select-color": "Selecciona un color", - "shortcut-assign-self": "Assign yourself to current card", - "shortcut-autocomplete-emoji": "Autocomplete emoji", - "shortcut-autocomplete-members": "Autocomplete members", - "shortcut-clear-filters": "Clear all filters", - "shortcut-close-dialog": "Close Dialog", - "shortcut-filter-my-cards": "Filter my cards", + "shortcut-assign-self": "Asignarte a ti mismo a la tarjeta actual", + "shortcut-autocomplete-emoji": "Autocompletar emoji", + "shortcut-autocomplete-members": "Autocompletar miembros", + "shortcut-clear-filters": "Limpiar todos los filtros", + "shortcut-close-dialog": "Cerrar Diálogo", + "shortcut-filter-my-cards": "Filtrar mis tarjetas", "shortcut-show-shortcuts": "Bring up this shortcuts list", "shortcut-toggle-filterbar": "Toggle Filter Sidebar", "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Mostrar recuento de tarjetas si la lista contiene más de", "signupPopup-title": "Crear una Cuenta", "star-board-title": "Haz clic para destacar este tablero. Se mostrará en la parte superior de tu lista de tableros.", "starred-boards": "Tableros Destacados", "starred-boards-description": "Los tableros destacados se mostrarán en la parte superior de tu lista de tableros.", - "subscribe": "Suscribe", + "subscribe": "Suscribirse", "team": "Equipo", "this-board": "este tablero", "this-card": "esta ficha", + "time": "Hora", "title": "Título", - "unassign-member": "Unassign member", - "unsaved-description": "You have an unsaved description.", - "upload": "Upload", - "upload-avatar": "Upload an avatar", - "uploaded-avatar": "Uploaded an avatar", + "tracking": "Seguimiento", + "tracking-info": "Serás notificado de cualquier cambio en las tarjetas que estás envuelto como creador o miembro.", + "unassign-member": "Desasignar miembro", + "unsaved-description": "Tienes unas descripción no guardada.", + "unwatch": "Dejar de vigilar", + "upload": "Cargar", + "upload-avatar": "Cargar un avatar", + "uploaded-avatar": "Avatar cargado", "username": "Nombre de Usuario", - "view-it": "View it", + "view-it": "Verlo", "warn-list-archived": "warning: this card is in an archived list", + "watch": "Vigilar", + "watching": "Vigilando", + "watching-info": "Serás notificado de cualquier cambio en este tablero", + "welcome-board": "Tablero de Bienvenida", + "welcome-list1": "Basicos", + "welcome-list2": "Avanzados", "what-to-do": "What do you want to do?" -} +}
\ No newline at end of file diff --git a/i18n/fa.i18n.json b/i18n/fa.i18n.json new file mode 100644 index 00000000..cb0beffe --- /dev/null +++ b/i18n/fa.i18n.json @@ -0,0 +1,324 @@ +{ + "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-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", + "activity-checklist-added": "added checklist to %s", + "add": "افزودن", + "add-attachment": "افزودن ضمیمه", + "add-board": "افزودن برد جدید", + "add-card": "افزودن کارت", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", + "add-cover": "افزودن کاور", + "add-label": "افزودن برچسب", + "add-list": "افزودن لیست", + "add-members": "افزودن اعضا", + "added": "اضافه گردید", + "addMemberPopup-title": "اعضا", + "admin": "مدیر", + "admin-desc": "امکان دیدن و ویرایش کارتها،پاک کردن کاربران و تغییر تنظیمات برای تخته", + "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": "بایگانی برد", + "archive-card": "بایگانی کارت", + "archive-list": "بایگانی این لیست", + "archive-selection": "بایگانی موارد انتخاب شده ها", + "archiveBoardPopup-title": "آیا می خواهید بایگانی شود؟", + "archived-items": "آیتم های بایگانی شده", + "archives": "آرشیوها", + "assign-member": "تعیین عضو", + "attached": "وابسته", + "attachment": "ضمائم", + "attachment-delete-pop": "حذف پیوست دایمی خواهد بود، بدون بازگشت", + "attachmentDeletePopup-title": "آیا می خواهید ضمیمه را حذف کنید؟", + "attachments": "ضمائم", + "auto-watch": "Automatically watch boards when create it", + "avatar-too-big": "حجم تصویر انتخاب شده بیشتر از حد مجاز است .(حد مجاز 70Kb)", + "back": "بازگشت", + "board-change-color": "تغییر رنگ", + "board-nb-stars": "%s ستاره", + "board-not-found": "برد مورد نظر پیدا نشد", + "board-private-info": "این برد <strong>خصوصی</strong> خواهد بود.", + "board-public-info": "این برد <strong>عمومی</strong> خواهد بود.", + "boardChangeColorPopup-title": "تغییر پس زمینه برد", + "boardChangeTitlePopup-title": "تغییر نام برد", + "boardChangeVisibilityPopup-title": "تغغیر وضعیت نمایش", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "منوی برد", + "boards": "بردها", + "bucket-example": "مانند \"لیست سبدها\" برای مثال", + "cancel": "انصراف", + "card-archived": "این کارت بایگانی شده است.", + "card-comments-title": "این کارت دارای %s نظر می باشد.", + "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": "اعمال کارت", + "cardLabelsPopup-title": "برچسب ها", + "cardMembersPopup-title": "اعضا", + "cardMorePopup-title": "بیشتر", + "cards": "کارت ها", + "change": "تغییر", + "change-avatar": "تغییر آواتار", + "change-password": "تغییر کلمه عبور", + "change-permissions": "تغییر دسترسی ها", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "تغییر آواتار", + "changeLanguagePopup-title": "تغییر زبان", + "changePasswordPopup-title": "تغییر کلمه عبور", + "changePermissionsPopup-title": "تغییر دسترسی ها", + "changeSettingsPopup-title": "Change Settings", + "checklists": "Checklists", + "click-to-star": "جهت افزودن ستاره کلیک کنید .", + "click-to-unstar": "جهت کاهش ستاره کلیک کنید.", + "clipboard": "ذخیره در حافظه ویا بکش-رهاکن", + "close": "بستن", + "close-board": "بستن برد", + "close-board-pop": "شما می توانید با کلیک بر دکمه \"بایگانی\" از قسمت بالای خانه، تخته را بازگذاری نمایید.", + "color-black": "مشکی", + "color-blue": "آبی", + "color-green": "سبز", + "color-lime": "لیمویی", + "color-orange": "نارنجی", + "color-pink": "صورتی", + "color-purple": "بنفش", + "color-red": "قرمز", + "color-sky": "آبی آسمانی", + "color-yellow": "زرد", + "comment": "نظر", + "comment-placeholder": "ثبت یک نظر", + "computer": "کامپیوتر", + "create": "ایجاد", + "createBoardPopup-title": "ایجاد برد", + "createLabelPopup-title": "ایجاد برچسب", + "current": "جاری", + "date": "Date", + "decline": "رد", + "default-avatar": "آواتار پیش فرض", + "delete": "حذف", + "deleteLabelPopup-title": "آیا می خواهید برچسب را حذف کنید؟", + "description": "توضیحات", + "disambiguateMultiLabelPopup-title": "عمل ابهام زدایی از برچسب", + "disambiguateMultiMemberPopup-title": "عمل ابهام زدایی از کاربر", + "discard": "انصراف", + "done": "پایان", + "download": "دریافت", + "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__ ایجاد شد", + "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": "این کاربر ایجاد نشده است", + "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-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": "میانبر کلیدها", + "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": "خروج", + "log-in": "ورود", + "loginPopup-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": "کارتی در بایگانی نیست", + "no-archived-lists": "لیستی در بایگانی نیست", + "no-results": "نتیجه ای ندارد", + "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": "این صفحه ممکن است خصوصی باشد.شما با<a href='%s'>ورود</a> می توانید آنرا ملاحظه نمایید.", + "page-not-found": "صفحه پیدا نشد.", + "password": "کلمه عبور", + "paste-or-dragdrop": "جهت چسباندن، یا کشیدن-رهاسازی فایل تصویر به آن (تصویر)", + "participating": "Participating", + "preview": "نمایش", + "previewAttachedImagePopup-title": "نمایش", + "previewClipboardImagePopup-title": "نمایش", + "private": "خصوصی", + "private-desc": "این تخته خصوصی است. فقط تنها افراد اضافه شده به آن می توانند مشاهده و ویرایش کنند.", + "profile": "پروفایل", + "public": "عمومی", + "public-desc": "این تخته عمومی است. برای هر کسی با لینک ویا جستجو درموتورها مانند گوگل قابل مشاهده است . فقط افرادی که به آن اضافه شده اند امکان ویرایش دارند.", + "quick-access-description": "جهت افزودن یک تخته به اینجا،آنرا ستاره دار نمایید.", + "remove-cover": "حذف کاور", + "remove-from-board": "حذف از برد", + "remove-label": "حذف برچسب", + "remove-list": "Remove the list", + "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-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "تکمیل خودکار کاربرها", + "shortcut-clear-filters": "حذف تمامی فیلترها", + "shortcut-close-dialog": "بستن دیالوگ", + "shortcut-filter-my-cards": "کارت های من", + "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": "تخته های ستاره دار در بالای لیست تخته ها نمایش داده می شود.", + "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": "چه کاری می خواهید انجام دهید؟" +}
\ No newline at end of file diff --git a/i18n/fi.i18n.json b/i18n/fi.i18n.json index caab4faf..5d52e390 100755..100644 --- a/i18n/fi.i18n.json +++ b/i18n/fi.i18n.json @@ -1,263 +1,324 @@ { - "accept": "Hyväksy", - "actions": "Toimet", - "activities": "Toimet", - "activity": "Toiminta", - "activity-added": "lisätty %s kohteeseen %s", - "activity-archived": "arkistoitu %s", - "activity-attached": "liitetty %s kohteeseen %s", - "activity-created": "luotu %s", - "activity-excluded": "poistettu %s kohteesta %s", - "activity-imported": "tuotu %s kohteeseen %s lähteestä %s", - "activity-imported-board": "tuotu %s lähteestä %s", - "activity-joined": "liitytty kohteeseen %s", - "activity-moved": "siirretty %s kohteesta %s kohteeseen %s", - "activity-on": "kohteessa %s", - "activity-removed": "poistettu %s kohteesta %s", - "activity-sent": "lähetetty %s kohteeseen %s", - "activity-unjoined": "peruttu %s liityminen", - "add": "Lisää", - "add-attachment": "Lisää liitetiedosto", - "add-board": "Lisää uusi taulu", - "add-card": "Lisää kortti", - "add-cover": "Lisää kansi", - "add-label": "Lisää tunniste", - "add-list": "Lisää lista", - "add-members": "Lisää jäseniä", - "added": "Lisätty", - "addMemberPopup-title": "Jäsenet", - "admin": "Ylläpitäjä", - "admin-desc": "Voi nähfä ja muokata kortteja, poistaa jäseniä, ja muuttaa taulun asetuksia.", - "all-boards": "Kaikki taulut", - "and-n-other-card": "Ja __count__ muu kortti", - "and-n-other-card_plural": "Ja __count__ muuta korttia", - "archive": "Arkistoi", - "archive-all": "Arkistoi kaikki", - "archive-board": "Arkistoi taulu", - "archive-card": "Arkistoi kortti", - "archive-list": "Arkistoi tämä lista", - "archive-selection": "Arkistoi valinta", - "archiveBoardPopup-title": "Arkistoi taulu?", - "archived-items": "Arkistoidut kohteet", - "archives": "Arkistot", - "assign-member": "Valitse jäsen", - "attached": "liitetty", - "attachment": "Liitetiedosto", - "attachment-delete-pop": "Liitetiedoston poistaminen on lopullista. Tätä ei pysty peruuttamaan.", - "attachmentDeletePopup-title": "Poista liitetiedosto?", - "attachments": "Liitetiedostot", - "avatar-too-big": "Profiilikuva on liian suuri (70Kb maksimi)", - "back": "Takaisin", - "board-change-color": "Vaihda väri", - "board-nb-stars": "%s tähteä", - "board-not-found": "Taulua ei löytynyt", - "board-private-info": "Tämä taulu tulee olemaan <strong>yksityinen</strong>.", - "board-public-info": "Tämä taulu tulee olemaan <strong>julkinen</strong>.", - "boardChangeColorPopup-title": "Vaihda taulun tausta", - "boardChangeTitlePopup-title": "Nimeä taulu uudelleen", - "boardChangeVisibilityPopup-title": "Vaihda näkyvyyttä", - "boardImportBoardPopup-title": "Tuo taulu Trellosta", - "boardMenuPopup-title": "Taulu valikko", - "boards": "Taulut", - "bucket-example": "Kuten “Laatikko lista” esimerkiksi", - "cancel": "Peruuta", - "card-archived": "Tämä kortti on arkistoitu.", - "card-comments-title": "Tässä kortissa on %s kommenttia.", - "card-delete-notice": "Poistaminen on lopullista. Menetät kaikki toimet jotka on liitetty tähän korttiin.", - "card-delete-pop": "Kaikki toimet poistetaan toimintasyötteestä ja et tule pystymään uudelleenavaamaan korttia. Tätä ei voi peruuttaa.", - "card-delete-suggest-archive": "Voit arkistoida kortin poistaaksesi sen taululta ja säilyttääksesi toimet.", - "card-edit-attachments": "Muokkaa liitetiedostoja", - "card-edit-labels": "Muokkaa tunnisteita", - "card-edit-members": "Muokkaa jäseniä", - "card-labels-title": "Vaihda kortin tunnisteita.", - "card-members-title": "Lisää tai poista taulun jäseniä tältä kortilta.", - "cardAttachmentsPopup-title": "Liitä mistä", - "cardDeletePopup-title": "Poista kortti?", - "cardDetailsActionsPopup-title": "Kortti toimet", - "cardLabelsPopup-title": "Tunnisteet", - "cardMembersPopup-title": "Jäsenet", - "cardMorePopup-title": "Lisää", - "cards": "Kortit", - "change": "Muuta", - "change-avatar": "Vaihda profiilikuva", - "change-password": "Vaihda salasana", - "change-permissions": "Muuta oikeuksia", - "changeAvatarPopup-title": "Vaihda profiilikuva", - "changeLanguagePopup-title": "Vaihda kieltä", - "changePasswordPopup-title": "Vaihda salasana", - "changePermissionsPopup-title": "Vaihda oikeuksia", - "click-to-star": "Klikkaa merkataksesi tämä taulu tähdellä.", - "click-to-unstar": "Klikkaa poistaaksesi tähtimerkintä taululta.", - "clipboard": "Leikepöytä tai raahaa ja pudota", - "close": "Sulje", - "close-board": "Sulje taulu", - "close-board-pop": "Voit palauttaa taulun klikkaamalla “Arkistot” painiketta kotiotsikosta.", - "color-black": "musta", - "color-blue": "sininen", - "color-green": "vihreä", + "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", + "activity-added": "added %s to %s", + "activity-archived": "archived %s", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-checklist-added": "added checklist to %s", + "add": "Add", + "add-attachment": "Add an attachment", + "add-board": "Add a new board", + "add-card": "Add a card", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", + "add-cover": "Add Cover", + "add-label": "Add the label", + "add-list": "Add a list", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", + "archive": "Archive", + "archive-all": "Archive All", + "archive-board": "Archive Board", + "archive-card": "Archive Card", + "archive-list": "Archive this list", + "archive-selection": "Archive selection", + "archiveBoardPopup-title": "Archive Board?", + "archived-items": "Archived Items", + "archives": "Archives", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when create it", + "avatar-too-big": "The avatar is too large (70Kb max)", + "back": "Back", + "board-change-color": "Change color", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Menu", + "boards": "Boards", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is archived.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.", + "card-due": "Due", + "card-due-on": "Due on", + "card-edit-attachments": "Edit attachments", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardDeletePopup-title": "Delete Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cards": "Cards", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", + "color-black": "black", + "color-blue": "blue", + "color-green": "green", "color-lime": "lime", - "color-orange": "oranssi", - "color-pink": "vaaleanpunainen", - "color-purple": "violetti", - "color-red": "punainen", - "color-sky": "taivas", - "color-yellow": "keltainen", - "comment": "Kommentti", - "comment-placeholder": "Kirjoita kommentti", - "computer": "Tietokone", - "create": "Luo", - "createBoardPopup-title": "Luo taulu", - "createLabelPopup-title": "Luo tunniste", - "current": "nykyinen", - "decline": "Kieltäydy", - "default-avatar": "Oletus profiilikuva", - "delete": "Poista", - "deleteLabelPopup-title": "Poista tunniste?", - "description": "Kuvaus", - "disambiguateMultiLabelPopup-title": "Yksikäsitteistä tunniste toiminta", - "disambiguateMultiMemberPopup-title": "Yksikäsitteistä jäsen toiminta", - "discard": "Hylkää", - "done": "Valmis", - "download": "Lataa", - "edit": "Muokkaa", - "edit-avatar": "Vaihda profiilikuva", - "edit-profile": "Muokkaa profiilia", - "editLabelPopup-title": "Vaihda tunniste", - "editProfilePopup-title": "Muokkaa profiilia", - "email": "Sähköposti", + "color-orange": "orange", + "color-pink": "pink", + "color-purple": "purple", + "color-red": "red", + "color-sky": "sky", + "color-yellow": "yellow", + "comment": "Comment", + "comment-placeholder": "Write a comment", + "computer": "Computer", + "create": "Create", + "createBoardPopup-title": "Create Board", + "createLabelPopup-title": "Create Label", + "current": "current", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", "email-enrollAccount-subject": "An account created for you on __siteName__", - "email-enrollAccount-text": "Hei __user__,\n\nAlkaaksesi käyttämään palvelua, klikkaa allaolevaa linkkiä.\n\n__url__\n\nKiitos.", - "email-fail": "Sähköpostin lähettäminen epäonnistui", - "email-invalid": "Virheellinen sähköposti", - "email-invite": "Kutsu sähköpostilla", - "email-invite-subject": "__inviter__ lähetti sinulle kutsun", - "email-invite-text": "Hyvä __user__,\n\n__inviter__ kutsuu sinut liittymään taululle \"__board__\" yhteistyötä varten.\n\nOle hyvä ja seuraa allaolevaa linkkiä:\n\n__url__\n\nKiitos.", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", "email-resetPassword-subject": "Reset your password on __siteName__", - "email-resetPassword-text": "Hei __user__,\n\nNollataksesi salasanasi, klikkaa allaolevaa linkkiä.\n\n__url__\n\nKiitos.", - "email-sent": "Sähköposti lähetetty", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", "email-verifyEmail-subject": "Verify your email address on __siteName__", - "email-verifyEmail-text": "Hei __user__,\n\nvahvistaaksesi sähköpostiosoitteesi, klikkaa allaolevaa linkkiä.\n\n__url__\n\nKiitos.", - "error-board-doesNotExist": "Tämä taulu ei ole olemassa", - "error-board-notAdmin": "Tehdäksesi tämän sinun täytyy olla tämän taulun ylläpitäjä", - "error-board-notAMember": "Tehdäksesi tämän sinun täytyy olla tämän taulun jäsen", - "error-json-malformed": "Tekstisi ei ole kelvollisessa JSON muodossa", - "error-json-schema": "JSON tietosi ei sisällä oikeaa tietoa oikeassa muodossa", - "error-list-doesNotExist": "Tätä listaa ei ole olemassa", - "error-user-doesNotExist": "Tätä käyttäjää ei ole olemassa", - "error-user-notAllowSelf": "Tämä toiminto itseäsi kohtaan ei ole sallittu", - "error-user-notCreated": "Tätä käyttäjää ei ole luotu", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "This action on self is not allowed", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", "export-board": "Export board", - "filter": "Suodata", - "filter-cards": "Suodata kortit", - "filter-clear": "Poista suodatin", - "filter-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.", - "home": "Koti", - "import": "Tuo", - "import-board": "tuo 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-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ä", - "info": "Tietoja", - "initials": "Nimikirjaimet", - "joined": "liittyi", - "just-invited": "Sinut on juuri kutsuttu tälle taululle", - "keyboard-shortcuts": "Pikanäppäimet", - "label-create": "Luo uusi tunniste", - "label-default": "%s tunniste (oletus)", - "label-delete-pop": "Tätä ei voi peruuttaa. Tämä poistaa tämän tunnisteen kaikista korteista ja tuhoaa sen historian.", - "labels": "Tunnisteet", - "language": "Kieli", - "last-admin-desc": "Et voi vaihtaa rooleja koska täytyy olla olemassa ainakin yksi ylläpitäjä.", - "leave-board": "Jää pois taululta", - "link-card": "Linkki tähän korttiin", - "list-archive-cards": "Arkistoi kaikki kortit tässä listassa", - "list-archive-cards-pop": "Tämä poistaa kaikki tämän listan kortit tältä taululta. Nähdäksesi arkistoidut kortit ja tuodaksesi ne takaisin taululle, klikkaa “Valikko” > “Arkistoidut kohteet”.", - "list-move-cards": "Siirrä kaikki kortit tässä listassa", - "list-select-cards": "Valitse kaikki kortit tässä listassa", - "listActionPopup-title": "Listaa toimet", - "listImportCardPopup-title": "Tuo Trello kortti", - "lists": "Listat", - "log-out": "Kirjaudu ulos", - "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", + "filter": "Filter", + "filter-cards": "Filter Cards", + "filter-clear": "Clear filter", + "filter-no-label": "No label", + "filter-no-member": "No member", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "home": "Home", + "import": "Import", + "import-board": "import from Trello", + "import-board-title": "Import board from Trello", + "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick the Wekan user you want to use as this member", + "importMapMembersAddPopup-title": "Select Wekan member", + "info": "Infos", + "initials": "Initials", + "invalid-date": "Invalid date", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create a new label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "link-card": "Link to this card", + "list-archive-cards": "Archive all cards in this list", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view archived cards and bring them back to the board, click “Menu” > “Archived Items”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "listActionPopup-title": "List Actions", + "listImportCardPopup-title": "Import a Trello card", + "lists": "Lists", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", "move-selection": "Move selection", - "moveCardPopup-title": "Siirrä kortti", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "multi-selection": "Monivalinta", - "multi-selection-on": "Monivalinta on päällä", - "my-boards": "Tauluni", - "name": "Nimi", - "no-archived-cards": "Ei arkistoituja kortteja.", - "no-archived-lists": "Ei arkistoituja listoja.", - "no-results": "Ei tuloksia", - "normal": "Normaali", - "normal-desc": "Voi nähdä ja muokata kortteja. Ei voi muokata asetuksia.", - "not-accepted-yet": "Kutsua ei ole hyväksytty vielä", - "optional": "valinnainen", - "or": "tai", - "page-maybe-private": "Tämä sivu voi olla yksityinen. Voit ehkä pystyä näkemään sen <a href='%s'>kirjautumalla sisään</a>.", - "page-not-found": "Sivua ei löytynyt.", - "password": "Salasana", - "paste-or-dragdrop": "liittääksesi, tai vedä & pudota kuvatiedosto siihen (vain kuva)", - "preview": "Esikatsele", - "previewAttachedImagePopup-title": "Esikatsele", - "previewClipboardImagePopup-title": "Esikatsele", - "private": "Yksityinen", - "private-desc": "Tämä taulu on yksityinen. Vain taululle lisätyt henkilöt voivat nähdä ja muokata sitä.", - "profile": "Profiili", - "public": "Julkinen", - "public-desc": "Tämä taulu on julkinen. Se näkyy kenelle tahansa jolla on linkki ja näkyy myös hakukoneissa kuten Google. Vain taululle lisätyt henkilöt voivat muokata sitä.", - "quick-access-description": "Merkkaa taulu tähdellä lisätäksesi pikavalinta tähän palkkiin.", - "remove-cover": "Poista kansi", - "remove-from-board": "Poista taululta", - "remove-label": "Poista tunniste", - "remove-member": "Poista jäsen", - "remove-member-from-card": "Poista kortilta", - "remove-member-pop": "Poista __name__ (__username__) taululta __boardTitle__? Jäsen poistetaan kaikilta taulun korteilta. Heille lähetetään ilmoitus.", - "removeMemberPopup-title": "Poista jäsen?", - "rename": "Nimeä uudelleen", - "rename-board": "Nimeä taulu uudelleen", - "restore": "Palauta", - "save": "Tallenna", - "search": "Etsi", - "select-color": "Valitse väri", - "shortcut-assign-self": "Valitse itsesi nykyiselle kortille", - "shortcut-autocomplete-emoji": "Automaattinen täydennys emojille", - "shortcut-autocomplete-members": "Automaattinen täydennys jäsenille", - "shortcut-clear-filters": "Poista kaikki suodattimet", - "shortcut-close-dialog": "Sulje valintaikkuna", - "shortcut-filter-my-cards": "Suodata korttini", - "shortcut-show-shortcuts": "Tuo esiin tämä pikavalinta lista", - "shortcut-toggle-filterbar": "Vaihda suodatus sivupalkin näkyvyys", - "shortcut-toggle-sidebar": "Vaihda taulu sivupalkin näkyvyys", - "signupPopup-title": "Luo tili", - "star-board-title": "Klikkaa merkataksesi taulu tähdellä. Se tulee näkymään ylimpänä taululistallasi.", - "starred-boards": "Tähdellä merkatut taulut", - "starred-boards-description": "Tähdellä merkatut taulut näkyvät ylimpänä taululistallasi.", - "subscribe": "Tilaa", - "team": "Tiimi", - "this-board": "tämä taulu", - "this-card": "tämä kortti", - "title": "Otsikko", - "unassign-member": "Peru jäsenvalinta", - "unsaved-description": "Sinulla on tallentamaton kuvaus.", - "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", - "what-to-do": "Mitä haluat tehdä?" -} + "multi-selection": "Multi-Selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No archived cards.", + "no-archived-lists": "No archived lists.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove the label", + "remove-list": "Remove the list", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "select-color": "Select a color", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "time": "Time", + "title": "Title", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "username": "Username", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an archived list", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "what-to-do": "What do you want to do?" +}
\ No newline at end of file diff --git a/i18n/fr.i18n.json b/i18n/fr.i18n.json index 0642308c..985681a2 100755..100644 --- a/i18n/fr.i18n.json +++ b/i18n/fr.i18n.json @@ -1,7 +1,27 @@ { "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ées", + "activities": "Activités", "activity": "Activité", "activity-added": "a ajouté %s à %s", "activity-archived": "a archivé %s", @@ -16,10 +36,13 @@ "activity-removed": "a supprimé %s vers %s", "activity-sent": "a envoyé %s vers %s", "activity-unjoined": "a quitté %s", + "activity-checklist-added": "added checklist to %s", "add": "Ajouter", "add-attachment": "Joindre un fichier", "add-board": "Ajouter un nouveau tableau", "add-card": "Ajouter une carte", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "Ajouter la couverture", "add-label": "Ajouter une étiquette", "add-list": "Ajouter une liste", @@ -31,13 +54,15 @@ "all-boards": "Tous les tableaux", "and-n-other-card": "Et __count__ autre carte", "and-n-other-card_plural": "Et __count__ autres cartes", + "apply": "Appliquer", + "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", "archive-card": "Archiver la carte", "archive-list": "Archiver cette liste", "archive-selection": "Archiver la selection", - "archiveBoardPopup-title": "Archive Board?", + "archiveBoardPopup-title": "Archiver le tableau ?", "archived-items": "Éléments archivés", "archives": "Archives", "assign-member": "Assigner un membre", @@ -46,6 +71,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 +82,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 +92,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": "Début", + "card-start-on": "Commence le", "cardAttachmentsPopup-title": "Joindre depuis", "cardDeletePopup-title": "Supprimer la carte ?", "cardDetailsActionsPopup-title": "Actions sur la carte", @@ -82,26 +112,29 @@ "change-avatar": "Changer l'avatar", "change-password": "Changer le mot de passe", "change-permissions": "Changer les permissions", + "change-settings": "Modifier les paramètres", "changeAvatarPopup-title": "Changer l'avatar", "changeLanguagePopup-title": "Changer la langue", "changePasswordPopup-title": "Changer le mot de passe", "changePermissionsPopup-title": "Changer les permissions", + "changeSettingsPopup-title": "Modifier les paramètres", + "checklists": "Checklists", "click-to-star": "Cliquez pour ajouter ce tableau aux favoris.", "click-to-unstar": "Cliquez pour retirer ce tableau des favoris.", - "clipboard": "Clipboard or drag & drop", + "clipboard": "Presse-papier ou glisser-déposer", "close": "Fermer", "close-board": "Fermer le tableau", - "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", + "close-board-pop": "Vous pouvez restaurer le tableau en cliquant sur le bouton « Archives » depuis le menu en entête.", + "color-black": "noir", + "color-blue": "bleu", "color-green": "vert", - "color-yellow": "jaune", + "color-lime": "citron vert", "color-orange": "orange", - "color-red": "rouge", + "color-pink": "rose", "color-purple": "violet", - "color-blue": "bleu", + "color-red": "rouge", "color-sky": "ciel", - "color-lime": "citron vert", - "color-pink": "rose", - "color-black": "noir", + "color-yellow": "jaune", "comment": "Commentaire", "comment-placeholder": "Rédiger un commentaire", "computer": "Ordinateur", @@ -109,6 +142,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,48 +156,60 @@ "edit": "Éditer", "edit-avatar": "Changer l'avatar", "edit-profile": "Éditer le profil", + "editCardStartDatePopup-title": "Modifier la date de début", + "editCardDueDatePopup-title": "Change due date", "editLabelPopup-title": "Changer l'étiquette", + "editNotificationPopup-title": "Modifier la Notification", "editProfilePopup-title": "Éditer le profil", "email": "Email", - "email-enrollAccount-subject": "An account created for you on __url__", - "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", - "email-fail": "Sending email failed", - "email-invalid": "Invalid email", - "email-invite": "Invite via Email", - "email-invite-subject": "__inviter__ sent you an invitation", - "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", - "email-resetPassword-subject": "Reset your password on __url__", - "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", - "email-verifyEmail-subject": "Verify your email address on __url__", - "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", - "email-sent": "Email sent", - "error-board-doesNotExist": "This board does not exist", - "error-board-notAdmin": "You need to be admin of this board to do that", - "error-board-notAMember": "You need to be a member of this board to do that", - "error-json-malformed": "Your text is not valid JSON", - "error-json-schema": "Your JSON data does not include the proper information in the correct format", - "error-list-doesNotExist": "This list does not exist", - "error-user-doesNotExist": "This user does not exist", + "email-enrollAccount-subject": "Un compte a été créé pour vous sur __siteName__", + "email-enrollAccount-text": "Bonjour __user__,\n\nPour commencer à utiliser ce service, il suffit de cliquer sur le lien ci-dessous.\n\n__url__\n\nMerci.", + "email-fail": "Échec de l’envoi du courriel.", + "email-invalid": "Courriel incorrect.", + "email-invite": "Inviter par email", + "email-invite-subject": "__inviter__ vous a envoyé une invitation", + "email-invite-text": "Cher __user__,\n\n__inviter__ vous invite à rejoindre le tableau \"__board__\" pour collaborer.\n\nVeuillez suivre le lien ci-dessous :\n\n__url__\n\nMerci.", + "email-resetPassword-subject": "Réinitialiser le mot de passe sur __siteName__", + "email-resetPassword-text": "Bonjour __user__,\n\nPour réinitialiser votre mot de passe, cliquez sur le lien ci-dessous.\n\n__url__\n\nMerci.", + "email-sent": "Courriel envoyé", + "email-verifyEmail-subject": "Vérifier votre adresse de courriel sur __siteName__", + "email-verifyEmail-text": "Bonjour __user__,\n\nPour vérifier votre compte courriel, il suffit de cliquer sur le lien ci-dessous.\n\n__url__\n\nMerci.", + "error-board-doesNotExist": "Ce tableau n’existe pas", + "error-board-notAdmin": "Vous devez être admin de ce tableau pour faire cela", + "error-board-notAMember": "Vous devez être participant à ce tableau pour faire cela", + "error-json-malformed": "Votre texte JSON n’est pas valide", + "error-json-schema": "Vos données JSON ne contiennent pas l’information appropriée dans un format correct", + "error-list-doesNotExist": "Cette liste n’existe pas", + "error-user-doesNotExist": "Cet utilisateur n’existe pas", "error-user-notAllowSelf": "This action on self is not allowed", - "error-user-notCreated": "This user is not created", + "error-user-notCreated": "Cet utilisateur n’a pas encore été créé.", + "error-username-taken": "Ce nom d'utilisateur est déjà pris", + "export-board": "Exporter le tableau", "filter": "Filtrer", "filter-cards": "Filtrer les cartes", "filter-clear": "Retirer les filtres", + "filter-no-label": "Aucun libellé", + "filter-no-member": "Aucun membre", "filter-on": "Le filtre est actif", "filter-on-desc": "Vous êtes en train de filtrer les cartes sur ce tableau. Cliquez ici pour changer les filtres.", "filter-to-selection": "Filtre vers la sélection", "fullname": "Nom complet", "header-logo-title": "Retourner à la page des tableaux", + "hide-system-messages": "Masquer les messages système", "home": "Accueil", - "import": "Import", - "import-board": "import from Trello", + "import": "Importer", + "import-board": "Importer depuis Trello", + "import-board-title": "Importer le tableau depuis Trello", "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text", - "import-json-placeholder": "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-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": "Sélectionner le membre Wekan", "info": "Infos", "initials": "Initiales", + "invalid-date": "Date invalide", "joined": "a joint", "just-invited": "You are just invited to this board", "keyboard-shortcuts": "Raccourcis clavier", @@ -180,17 +226,23 @@ "list-move-cards": "Déplacer les cartes de cette liste", "list-select-cards": "Sélectionner les cartes de cette liste", "listActionPopup-title": "Liste des actions", + "listImportCardPopup-title": "Importer une carte Trello", "lists": "Listes", "log-out": "Déconnexion", + "log-in": "Connexion", "loginPopup-title": "Connexion", - "mapMembersPopup-title": "Associer les membres", - "mapMembersAddPopup-title": "Sélectioner le membre Wekan", "memberMenuPopup-title": "Préférence de membre", "members": "Membres", "menu": "Menu", + "move-selection": "Déplacer la sélection", "moveCardPopup-title": "Déplacer la carte", + "moveCardToBottom-title": "Aller en bas", + "moveCardToTop-title": "Aller en haut", + "moveSelectionPopup-title": "Déplacer la sélection", "multi-selection": "Sélection multiple", "multi-selection-on": "Multi-Selection active", + "muted": "Muted", + "muted-info": "Vous ne serez jamais averti des modifications effectuées dans ce tableau", "my-boards": "Mes tableaux", "name": "Nom", "no-archived-cards": "Pas de carte archivée.", @@ -199,15 +251,18 @@ "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 <a href='%s'>connectant</a>.", "page-not-found": "Page non trouvée", "password": "Mot de passe", - "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", - "preview": "Preview", - "previewClipboardImagePopup-title": "Preview", - "previewAttachedImagePopup-title": "Preview", + "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", "private": "Privé", "private-desc": "Ce tableau est privé. Seul les membres peuvent y accéder.", "profile": "Profil", @@ -217,6 +272,7 @@ "remove-cover": "Enlever la couverture", "remove-from-board": "Retirer du tableau", "remove-label": "Retirer cette étiquette", + "remove-list": "Supprimer la liste", "remove-member": "Supprimer le membre", "remove-member-from-card": "Supprimer de la carte", "remove-member-pop": "Supprimer __name__ (__username__) de __boardTitle__ ? Ce membre sera supprimé de toutes les cartes du tableau et recevra une notification.", @@ -228,14 +284,15 @@ "search": "Chercher", "select-color": "Choisissez une couleur", "shortcut-assign-self": "Assign yourself to current card", - "shortcut-autocomplete-emoji": "Auto-complétion des emoji", + "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", "shortcut-filter-my-cards": "Filtrer mes cartes", "shortcut-show-shortcuts": "Afficher cette liste de raccourcis", - "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "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", @@ -244,14 +301,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", - "upload": "Upload", + "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 new file mode 100644 index 00000000..be7ef0a0 --- /dev/null +++ b/i18n/he.i18n.json @@ -0,0 +1,324 @@ +{ + "accept": "אישור", + "act-activity-notify": "[Wekan] Activity Notification", + "act-addAttachment": " __attachment__ שוייך ל- __card__", + "act-addComment": "commented on __card__: __comment__", + "act-createBoard": "הלוח __board__ נוצר", + "act-createCard": "הכרטיס __card__ התווסף לרשימה __list__", + "act-createList": "הרשימה __list__ התווספה ללוח __board__", + "act-addBoardMember": "המשתמש __member__ שויך ללוח __board__", + "act-archivedBoard": "הלוח __board__ הועבר לארכיון", + "act-archivedCard": "הכרטיס __card__ הועבר לארכיון", + "act-archivedList": "הרשימה __card__ הועברה לארכיון", + "act-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": "המשתמש __member__ הוסר מהכרטיס __card__", + "act-withBoardTitle": "[Wekan] __board__", + "act-withCardTitle": "[__board__] __card__", + "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", + "activity-checklist-added": "רשימת משימות התווספה ל- %s", + "add": "הוסף", + "add-attachment": "הוסף קובץ", + "add-board": "הוסף לוח חדש", + "add-card": "הוסף כרטיס", + "add-checklist": "הוסף רשימת משימות", + "add-checklist-item": "הוסף פריט לרשימת משימות", + "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__ כרטיסים אחרים", + "apply": "אשר שינויים", + "app-is-offline": "המערכת למטה כרגע, ריענון של הדף יגרום לאבדן מידע", + "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": "קבצים מצורפים", + "auto-watch": "עקוב באופן אוטומטי אחרי לוחות אחרי שהם נוצרים", + "avatar-too-big": "האווטאר גדול מידי (מקס 70Kb)", + "back": "חזור", + "board-change-color": "שנה צבע", + "board-nb-stars": "%s כוכבים", + "board-not-found": "לוח לא נמצא", + "board-private-info": "לוח זה יהיה <strong>פרטי</strong>.", + "board-public-info": "לוח זה יהיה <strong>ציבורי</strong>.", + "boardChangeColorPopup-title": "שנה רקע ללוח", + "boardChangeTitlePopup-title": "שנה שם ללוח", + "boardChangeVisibilityPopup-title": "שנה תצוגה", + "boardChangeWatchPopup-title": "שנה את הגדרת המעקב", + "boardMenuPopup-title": "תפריט לוח", + "boards": "לוחות", + "bucket-example": "כמו “Bucket List” לדוגמא", + "cancel": "בטל", + "card-archived": "כרטיס זה מאוחסן בארכיון", + "card-comments-title": "לכרטיס זה %s תגובות.", + "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": "פעולות על הכרטיס", + "cardLabelsPopup-title": "תוויות", + "cardMembersPopup-title": "חברים", + "cardMorePopup-title": "עוד", + "cards": "כרטיסים", + "change": "שנה", + "change-avatar": "שנה אווטאר", + "change-password": "שנה סיסמא", + "change-permissions": "שנה הרשאות", + "change-settings": "שנה הגדרות", + "changeAvatarPopup-title": "שנה אווטאר", + "changeLanguagePopup-title": "שנה שפה", + "changePasswordPopup-title": "שנה סיסמא", + "changePermissionsPopup-title": "שנה הרשאות", + "changeSettingsPopup-title": "שנה הגדרות", + "checklists": "רשימות", + "click-to-star": "לחץ להוספת הלוח למועדפים", + "click-to-unstar": "לחץ להסרת הלוח מהמועדפים.", + "clipboard": "Clipboard or drag & drop", + "close": "סגור", + "close-board": "סגור לוח", + "close-board-pop": "תוכלו לשחזר את הלוח בלחיצה על כפתור \"ארכיונים\" מהכותרת העליונה.", + "color-black": "שחור", + "color-blue": "כחול", + "color-green": "ירוק", + "color-lime": "ליים", + "color-orange": "כתום", + "color-pink": "ורוד", + "color-purple": "סגול", + "color-red": "אדום", + "color-sky": "תכלת", + "color-yellow": "צהוב", + "comment": "הערה", + "comment-placeholder": "כתוב הערה", + "computer": "מחשב", + "create": "צור", + "createBoardPopup-title": "צור לוח", + "createLabelPopup-title": "צור תווית", + "current": "נוכחי", + "date": "תאריך", + "decline": "סרב", + "default-avatar": "אווטאר דיפולטי", + "delete": "מחק", + "deleteLabelPopup-title": "למחוק תווית?", + "description": "תיאור", + "disambiguateMultiLabelPopup-title": "הבהרת פעולת תווית", + "disambiguateMultiMemberPopup-title": "הבהרת פעולת חבר", + "discard": "בטל", + "done": "בוצע", + "download": "הורד", + "edit": "ערוך", + "edit-avatar": "שנה אווטאר", + "edit-profile": "ערוך פרופיל", + "editCardStartDatePopup-title": "שנה זמן התחלה", + "editCardDueDatePopup-title": "שנה זמן סיום", + "editLabelPopup-title": "שנה תווית", + "editNotificationPopup-title": "שנה התראה", + "editProfilePopup-title": "ערוך פרופיל", + "email": "אמייל", + "email-enrollAccount-subject": "חשבון נוצר עבורך ב __siteName__", + "email-enrollAccount-text": "שלום __user__,\n\nלהתחלת השימוש בשירות, לחץ על הקישור המופיע מטה.\n\n__url__\n\nתודה.", + "email-fail": "שליחת אמייל נכשלה", + "email-invalid": "כתובת אמייל לא חוקית", + "email-invite": "הזמן באמצעות אמייל", + "email-invite-subject": "__inviter__ שלח לך הזמנה", + "email-invite-text": "שלום __user__,\n\n__inviter__ הזמין אותך להצטרף ללוח \"__board__\" להמשך שיתוף הפעולה.\n\nאנא לחץ על הקישור המופיע מטה:\n\n__url__\n\nתודה.", + "email-resetPassword-subject": "אפס את סיסמתך ב __siteName__", + "email-resetPassword-text": "שלום __user__,\n\nלאיפוס סיסמתך, לחץ על הקישור המופיע מטה.\n\n__url__\n\nתודה.", + "email-sent": "אמייל נשלח", + "email-verifyEmail-subject": "אמת את כתובת האמייל שלך ב __siteName__", + "email-verifyEmail-text": "שלום __user__,\n\nלאימות כתובת האמייל של חשבונך, פשוט לחץ על הקישור המופיע מטה.\n\n__url__\n\nתודה.", + "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": "משתמש זה לא נוצר", + "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": "ייבא מטרלו", + "import-board-title": "ייבא לוח מטרלו", + "import-board-trello-instruction": "בלוח הטרלו שלך, עבור ל 'Menu', ואז ל 'More', 'Print and Export', 'Export JSON' והעתק את הטקסט שנוצר", + "import-json-placeholder": "הדבק נתוני JSON תקינים כאן", + "import-map-members": "מפֱה חברים", + "import-members-map": "הלוחות המיובאים שלך מכילים חברים. בבקשה מפה את החברים שתרצה לייבא כמשתמשים", + "import-show-user-mapping": "צפה במיפוי חברים", + "import-user-select": "בחר במשתמש עבור חבר זה", + "importMapMembersAddPopup-title": "בחר משתמש", + "info": "אינפורמציה", + "initials": "ראשי תיבות", + "invalid-date": "תאריך שגוי", + "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": "כל הכרטיסים מרשימה זו יוסרו מהלוח. לצפייה בכרטיסים המאוחסנים בארכיון ולהחזירם ללוח, לחצו \"תפריט\" > \"כרטיסים מאוחסנים בארכיון\".", + "list-move-cards": "הזז את כל הכרטיסים ברשימה זו", + "list-select-cards": "בחר את כל הכרטיסים ברשימה זו", + "listActionPopup-title": "פעולות רשימה", + "listImportCardPopup-title": "ייבא כרטיס מטרלו", + "lists": "רשימות", + "log-out": "התנתק", + "log-in": "התחבר", + "loginPopup-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": "אין כרטיסים מאוחסנים בארכיון.", + "no-archived-lists": "אין רשימות מאוחסנות בארכיון.", + "no-results": "אין תוצאות", + "normal": "נורמלי", + "normal-desc": "יכול לצפות ולערוך כרטיסים. לא יכול לשנות הגדרות.", + "not-accepted-yet": "הזמנה לא התקבלה עדיין", + "notify-participate": "קבל התראות על שינויים בכרטיסים שיצרת או שבהם אתה חבר", + "notify-watch": "קבל התראות על עדכונים בכל לוח, רשימה או כרטיס שבהם אתה חבר", + "optional": "אופציונלי", + "or": "או", + "page-maybe-private": "יתכן שדף זה פרטי. תוכלו לצפות על ידי <a href='%s'>התחברות למערכת</a>", + "page-not-found": "דף לא נמצא.", + "password": "סיסמא", + "paste-or-dragdrop": "בכדי להדביק או drag & drop קובץ תמונה (תמונה בלבד)", + "participating": "Participating", + "preview": "תצוגה מקדימה", + "previewAttachedImagePopup-title": "תצוגה מקדימה", + "previewClipboardImagePopup-title": "תצוגה מקדימה", + "private": "פרטי", + "private-desc": "לוח זה פרטי. רק אנשים שנוספו ללוח יכולים לצפות ולערוך אותו.", + "profile": "פרופיל", + "public": "ציבורי", + "public-desc": "לוח זה ציבורי. כל מי שמחזיק בקישור יכול לצפות בלוח זה והלוח יופיע בתוצאות מנועי חיפוש כגון גוגל. רק אנשים שנוספו ללוח יכולים לערוך אותו.", + "quick-access-description": "בלחיצה על הכוכב יתווסף קיצור דרך ללוח בשורה זו.", + "remove-cover": "הסר כיסוי", + "remove-from-board": "הסר מהלוח", + "remove-label": "הסר תווית", + "remove-list": "הסר מהרשימה", + "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-emoji": "השלמה אוטומטית לפרצופונים (Emoji)", + "shortcut-autocomplete-members": "השלמה אוטומטית של חברים", + "shortcut-clear-filters": "נקה את כל המסננים", + "shortcut-close-dialog": "סגור חלון", + "shortcut-filter-my-cards": "סנן את הכרטיסים שלי", + "shortcut-show-shortcuts": "הבא רשימת קיצורי דרך זו", + "shortcut-toggle-filterbar": "החלף מצבי מסנן", + "shortcut-toggle-sidebar": "החלף מצבי מסנן", + "show-cards-minimum-count": "הצג מספר כרטיסים אם הרשימה מכיל יותר כרטיסים מ-", + "signupPopup-title": "צור חשבון", + "star-board-title": "בלחיצה על הכווכב של הלוח יתווסף הלוח לראש רשימת הלוחות שלך.", + "starred-boards": "לוחות שסומנו בכוכב", + "starred-boards-description": "לוחות מסומנים בכוכב מופיעים בראש רשימת הלוחות שלך.", + "subscribe": "הירשם", + "team": "צוות", + "this-board": "לוח זה", + "this-card": "כרטיס זה", + "time": "זמן", + "title": "כותרת", + "tracking": "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": "Basics", + "welcome-list2": "Advanced", + "what-to-do": "מה תרצה לעשות?" +}
\ No newline at end of file diff --git a/i18n/it.i18n.json b/i18n/it.i18n.json index 07026fd4..7ddfa678 100755 --- a/i18n/it.i18n.json +++ b/i18n/it.i18n.json @@ -1,25 +1,48 @@ { - "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", + "activity-checklist-added": "aggiunta checklist a %s", "add": "Aggiungere", "add-attachment": "Aggiungi allegato", "add-board": "Aggiungi una nuova bachecha", "add-card": "Aggiungi una scheda", + "add-checklist": "Aggiungi una checklist", + "add-checklist-item": "Aggiungi un elemento alla checklist", "add-cover": "Aggiungi copertina", "add-label": "Aggiungi l'etichetta", "add-list": "Aggiungi una lista", @@ -31,21 +54,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,208 +82,243 @@ "boardChangeColorPopup-title": "Cambia sfondo della bacheca", "boardChangeTitlePopup-title": "Rinomina bacheca", "boardChangeVisibilityPopup-title": "Cambia visibilità", - "boardImportBoardPopup-title": "Import board from Trello", + "boardChangeWatchPopup-title": "Cambia faccia", "boardMenuPopup-title": "Menu bacheca", "boards": "Bacheche", - "bucket-example": "Like “Bucket List” for example", + "bucket-example": "Per esempio come \"una lista di cose da fare\"", "cancel": "Cancella", "card-archived": "Questa scheda è archiviata.", "card-comments-title": "Questa scheda ha %s commenti.", "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", + "checklists": "Checklist", + "click-to-star": "Clicca per stellare questa bacheca", + "click-to-unstar": "Clicca per togliere la stella da questa bacheca", + "clipboard": "Clipboard o drag & drop", + "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", - "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", + "create": "Crea", + "createBoardPopup-title": "Crea bacheca", + "createLabelPopup-title": "Crea etichetta", + "current": "corrente", + "date": "Data", + "decline": "Declina", + "default-avatar": "Avatar predefinito", + "delete": "Elimina", + "deleteLabelPopup-title": "Eliminare etichetta?", + "description": "Descrizione", + "disambiguateMultiLabelPopup-title": "Disambiguare l'azione Etichetta", + "disambiguateMultiMemberPopup-title": "Disambiguare l'azione Membro", + "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", - "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.", + "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.", + "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.", + "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.", + "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.", + "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": "Questa azione su se stessa non è permessa", + "error-user-notCreated": "L'utente non è stato creato", + "error-username-taken": "Questo username è già utilizzato", + "export-board": "Esporta bacheca", + "filter": "Filtra", + "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-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", + "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": "Mappatura dei membri", + "import-members-map": "La bacheca che hai importato ha alcuni membri. Per favore scegli i membri che vuoi vengano importati negli utenti di Wekan", + "import-show-user-mapping": "Rivedi la mappatura dei membri", + "import-user-select": "Scegli l'utente Wekan che vuoi utilizzare come questo membro", + "importMapMembersAddPopup-title": "Seleziona i membri di Wekan", + "info": "Info", + "initials": "Iniziali", + "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 <a href='%s'>logging in</a>.", - "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 <a href='%s'>facendo il log-in</a>.", + "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-list": "Rimuovi la lista", + "remove-member": "Rimuovi utente", + "remove-member-from-card": "Rimuovi dalla scheda", + "remove-member-pop": "Rimuovere __name__ (__username__) da __boardTitle__? L'utente sarà rimosso da tutte le schede in questa bacheca. Riceveranno una notifica.", + "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", - "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", + "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": "Attiva il filtro nella barra laterale", + "shortcut-toggle-sidebar": "Attiva la bacheca nella barra laterale", + "show-cards-minimum-count": "Mostra il contatore delle schede se la lista ne contiene più di", + "signupPopup-title": "Crea un account", + "star-board-title": "Clicca per stellare questa bacheca. Sarà mostrata all'inizio della tua lista bacheche.", + "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?" +}
\ No newline at end of file diff --git a/i18n/ja.i18n.json b/i18n/ja.i18n.json index 6cde68c6..da89a5d3 100755..100644 --- a/i18n/ja.i18n.json +++ b/i18n/ja.i18n.json @@ -1,7 +1,27 @@ { - "accept": "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", + "activities": "アクティビティ", "activity": "アクティビティ", "activity-added": "%s を %s に追加しました", "activity-archived": "%s をアーカイブしました", @@ -15,49 +35,55 @@ "activity-on": "%s", "activity-removed": "%s を %s から削除しました", "activity-sent": "%s を %s に送りました", - "activity-unjoined": "unjoined %s", + "activity-unjoined": "%s への参加を止めました", + "activity-checklist-added": "%s にチェックリストを追加しました", "add": "追加", - "add-attachment": "Add an attachment", + "add-attachment": "添付ファイルの追加", "add-board": "ボード追加", - "add-card": "Add a card", + "add-card": "カードの追加", + "add-checklist": "チェックリストの追加", + "add-checklist-item": "チェックリストに項目を追加", "add-cover": "カバーの追加", - "add-label": "Add the label", - "add-list": "Add a list", - "add-members": "Add Members", + "add-label": "ラベルの追加", + "add-list": "リストの追加", + "add-members": "メンバーの追加", "added": "追加しました", "addMemberPopup-title": "メンバー", "admin": "管理", "admin-desc": "カードの閲覧と編集、メンバーの削除、ボードの設定変更が可能", - "all-boards": "All boards", + "all-boards": "全てのボード", "and-n-other-card": "And __count__ other card", "and-n-other-card_plural": "And __count__ other cards", + "apply": "適用", + "app-is-offline": "現在オフラインです。ページを更新すると保存していないデータは失われます。", "archive": "アーカイブ", "archive-all": "すべてをアーカイブ", - "archive-board": "Archive Board", - "archive-card": "Archive Card", + "archive-board": "ボードをアーカイブ", + "archive-card": "カードをアーカイブ", "archive-list": "このリストをアーカイブ", - "archive-selection": "Archive selection", - "archiveBoardPopup-title": "Archive Board?", + "archive-selection": "選択したものをアーカイブ", + "archiveBoardPopup-title": "ボードをアーカイブしますか?", "archived-items": "アーカイブされたアイテム", - "archives": "Archives", - "assign-member": "Assign member", + "archives": "アーカイブ", + "assign-member": "メンバーの割当", "attached": "添付されました", "attachment": "添付ファイル", "attachment-delete-pop": "添付ファイルの削除をすると取り消しできません。", "attachmentDeletePopup-title": "添付ファイルを削除しますか?", "attachments": "添付ファイル", - "avatar-too-big": "The avatar is too large (70Kb max)", + "auto-watch": "作成したボードは自動的に監視する", + "avatar-too-big": "アバターが大きすぎます(最大70KB)", "back": "戻る", - "board-change-color": "Change color", + "board-change-color": "色の変更", "board-nb-stars": "%s stars", "board-not-found": "ボードが見つかりません", "board-private-info": "This board will be <strong>private</strong>.", "board-public-info": "ボードは公開されます。", - "boardChangeColorPopup-title": "Change Board Background", + "boardChangeColorPopup-title": "ボードの背景を変更", "boardChangeTitlePopup-title": "ボード名の変更", "boardChangeVisibilityPopup-title": "公開範囲の変更", - "boardImportBoardPopup-title": "Import board from Trello", - "boardMenuPopup-title": "Board Menu", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "ボードメニュー", "boards": "ボード", "bucket-example": "Like “Bucket List” for example", "cancel": "キャンセル", @@ -66,70 +92,81 @@ "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-edit-attachments": "Edit attachments", - "card-edit-labels": "Edit labels", - "card-edit-members": "Edit members", + "card-due": "期限", + "card-due-on": "Due on", + "card-edit-attachments": "添付ファイルの編集", + "card-edit-labels": "ラベルの編集", + "card-edit-members": "メンバーの編集", "card-labels-title": "カードのラベルを変更する", "card-members-title": "カードからボードメンバーを追加・削除する", + "card-start": "開始", + "card-start-on": "Starts on", "cardAttachmentsPopup-title": "Attach From", "cardDeletePopup-title": "カードを削除しますか?", - "cardDetailsActionsPopup-title": "Card Actions", + "cardDetailsActionsPopup-title": "カード操作", "cardLabelsPopup-title": "ラベル", "cardMembersPopup-title": "メンバー", "cardMorePopup-title": "さらに見る", - "cards": "Cards", - "change": "Change", + "cards": "カード", + "change": "変更", "change-avatar": "アバターの変更", "change-password": "パスワードの変更", - "change-permissions": "Change permissions", + "change-permissions": "権限の変更", + "change-settings": "設定の変更", "changeAvatarPopup-title": "アバターの変更", "changeLanguagePopup-title": "言語の変更", "changePasswordPopup-title": "パスワードの変更", "changePermissionsPopup-title": "パーミッションの変更", + "changeSettingsPopup-title": "設定の変更", + "checklists": "チェックリスト", "click-to-star": "ボードにスターをつける", "click-to-unstar": "ボードからスターを外す", - "clipboard": "Clipboard or drag & drop", + "clipboard": "クリップボードもしくはドラッグ&ドロップ", "close": "閉じる", - "close-board": "Close Board", + "close-board": "ボードを閉じる", "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.", - "color-black": "black", - "color-blue": "blue", - "color-green": "green", - "color-lime": "lime", - "color-orange": "orange", - "color-pink": "pink", - "color-purple": "purple", - "color-red": "red", - "color-sky": "sky", - "color-yellow": "yellow", + "color-black": "黒", + "color-blue": "青", + "color-green": "緑", + "color-lime": "ライム", + "color-orange": "オレンジ", + "color-pink": "ピンク", + "color-purple": "紫", + "color-red": "赤", + "color-sky": "空", + "color-yellow": "黄", "comment": "コメント", - "comment-placeholder": "Write a comment", + "comment-placeholder": "コメントを書く", "computer": "コンピューター", "create": "作成", "createBoardPopup-title": "ボードの作成", "createLabelPopup-title": "ラベルの作成", - "current": "current", - "decline": "Decline", - "default-avatar": "Default avatar", + "current": "現在", + "date": "日付", + "decline": "拒否", + "default-avatar": "デフォルトのアバター", "delete": "削除", "deleteLabelPopup-title": "ラベルを削除しますか?", "description": "詳細", "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", - "discard": "Discard", - "done": "Done", + "discard": "捨てる", + "done": "完了", "download": "ダウンロード", "edit": "編集", "edit-avatar": "アバターの変更", - "edit-profile": "Edit Profile", + "edit-profile": "プロフィールの編集", + "editCardStartDatePopup-title": "開始日の変更", + "editCardDueDatePopup-title": "期限の変更", "editLabelPopup-title": "ラベルの変更", - "editProfilePopup-title": "Edit Profile", + "editNotificationPopup-title": "通知の変更", + "editProfilePopup-title": "プロフィールの編集", "email": "メールアドレス", "email-enrollAccount-subject": "An account created for you on __siteName__", "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", - "email-fail": "Sending email failed", - "email-invalid": "Invalid email", - "email-invite": "Invite via Email", + "email-fail": "メールの送信に失敗しました", + "email-invalid": "無効なメールアドレス", + "email-invite": "メールで招待", "email-invite-subject": "__inviter__ sent you an invitation", "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", "email-resetPassword-subject": "Reset your password on __siteName__", @@ -137,83 +174,95 @@ "email-sent": "Email sent", "email-verifyEmail-subject": "Verify your email address on __siteName__", "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", - "error-board-doesNotExist": "This board does not exist", + "error-board-doesNotExist": "ボードがありません", "error-board-notAdmin": "You need to be admin of this board to do that", "error-board-notAMember": "You need to be a member of this board to do that", "error-json-malformed": "Your text is not valid JSON", "error-json-schema": "Your JSON data does not include the proper information in the correct format", "error-list-doesNotExist": "This list does not exist", - "error-user-doesNotExist": "This user does not exist", - "error-user-notAllowSelf": "This action on self is not allowed", - "error-user-notCreated": "This user is not created", - "export-board": "Export board", - "filter": "Filter", + "error-user-doesNotExist": "ユーザーが存在しません", + "error-user-notAllowSelf": "この操作は許可されていません", + "error-user-notCreated": "ユーザーが作成されていません", + "error-username-taken": "このユーザ名は既に使用されています", + "export-board": "ボードのエクスポート", + "filter": "フィルター", "filter-cards": "カードをフィルターする", - "filter-clear": "Clear filter", - "filter-on": "Filter is on", + "filter-clear": "フィルターの解除", + "filter-no-label": "ラベルなし", + "filter-no-member": "メンバーなし", + "filter-on": "フィルター有効", "filter-on-desc": "このボードのカードをフィルターしています。フィルターを編集するにはこちらをクリックしてください。", "filter-to-selection": "Filter to selection", "fullname": "フルネーム", "header-logo-title": "自分のボードページに戻る。", + "hide-system-messages": "システムメッセージを隠す", "home": "ホーム", - "import": "Import", - "import-board": "import from Trello", + "import": "インポート", + "import-board": "Trelloからインポート", + "import-board-title": "Trelloからボードをインポート", "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text", - "import-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": "無効な日付", "joined": "参加しました", "just-invited": "You are just invited to this board", - "keyboard-shortcuts": "Keyboard shortcuts", + "keyboard-shortcuts": "キーボード・ショートカット", "label-create": "ラベル作成", "label-default": "%s ラベル(デフォルト)", "label-delete-pop": "この操作は取り消しできません。このラベルはすべてのカードから外され履歴からも見えなくなります。", "labels": "ラベル", "language": "言語", "last-admin-desc": "最低でも1人以上の管理者が必要なためロールを変更できません。", - "leave-board": "Leave Board", + "leave-board": "ボードから退出する", "link-card": "このカードへのリンク", - "list-archive-cards": "Archive all cards in this list", + "list-archive-cards": "リストの全カードをアーカイブする", "list-archive-cards-pop": "ボードのこのリスト内のすべてのカードを取り除きます。アーカイブされたカードの確認やそれをボードに戻すには、メニューをクリックし、\"アーカイブされたアイテム\"をクリックしてください。", - "list-move-cards": "Move all cards in this list", - "list-select-cards": "Select all cards in this list", + "list-move-cards": "リストの全カードを移動する", + "list-select-cards": "リストの全カードを選択", "listActionPopup-title": "操作一覧", - "listImportCardPopup-title": "Import a Trello card", - "lists": "Lists", + "listImportCardPopup-title": "Trelloのカードをインポート", + "lists": "リスト", "log-out": "ログアウト", + "log-in": "ログイン", "loginPopup-title": "ログイン", - "mapMembersAddPopup-title": "Select Wekan member", - "mapMembersPopup-title": "Map members", - "memberMenuPopup-title": "Member Settings", + "memberMenuPopup-title": "メンバー設定", "members": "メンバー", "menu": "メニュー", "move-selection": "Move selection", - "moveCardPopup-title": "Move Card", - "moveSelectionPopup-title": "Move selection", - "multi-selection": "Multi-Selection", - "multi-selection-on": "Multi-Selection is on", + "moveCardPopup-title": "カードの移動", + "moveCardToBottom-title": "最下部に移動", + "moveCardToTop-title": "先頭に移動", + "moveSelectionPopup-title": "選択箇所に移動", + "multi-selection": "複数選択", + "multi-selection-on": "複数選択有効", + "muted": "ミュート", + "muted-info": "このボードの変更は通知されません", "my-boards": "自分のボード", "name": "名前", - "no-archived-cards": "No archived cards.", - "no-archived-lists": "No archived lists.", + "no-archived-cards": "アーカイブされたボードはありません", + "no-archived-lists": "アーカイブされたリストはありません", "no-results": "該当するものはありません", "normal": "通常", "normal-desc": "カードの閲覧と編集が可能。設定変更不可。", - "not-accepted-yet": "Invitation not accepted yet", + "not-accepted-yet": "招待はアクセプトされていません", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", "optional": "任意", "or": "or", "page-maybe-private": "このページはプライベートです。<a href='%s'>ログイン</a>して見てください。", "page-not-found": "ページが見つかりません。", "password": "パスワード", "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", - "preview": "Preview", - "previewAttachedImagePopup-title": "Preview", - "previewClipboardImagePopup-title": "Preview", + "participating": "参加", + "preview": "プレビュー", + "previewAttachedImagePopup-title": "プレビュー", + "previewClipboardImagePopup-title": "プレビュー", "private": "プライベート", "private-desc": "このボードはプライベートです。ボードメンバーのみが閲覧・編集可能です。", "profile": "プロフィール", @@ -221,10 +270,11 @@ "public-desc": "このボードはパブリックです。リンクを知っていれば誰でもアクセス可能でGoogleのような検索エンジンの結果に表示されます。このボードに追加されている人だけがカード追加が可能です。", "quick-access-description": "Star a board to add a shortcut in this bar.", "remove-cover": "カバーの削除", - "remove-from-board": "Remove from Board", - "remove-label": "Remove the label", + "remove-from-board": "ボードから外す", + "remove-label": "ラベルを外す", + "remove-list": "リストの除去", "remove-member": "メンバーを外す", - "remove-member-from-card": "カードから取り除く", + "remove-member-from-card": "カードから外す", "remove-member-pop": "__boardTitle__ から __name__ (__username__) を外しますか?メンバーはこのボードのすべてのカードから外れ、通知を受けます。", "removeMemberPopup-title": "メンバーを外しますか?", "rename": "名前変更", @@ -233,15 +283,16 @@ "save": "保存", "search": "検索", "select-color": "色を選択", - "shortcut-assign-self": "Assign yourself to current card", + "shortcut-assign-self": "自分をこのカードに割り当てる", "shortcut-autocomplete-emoji": "Autocomplete emoji", "shortcut-autocomplete-members": "Autocomplete members", - "shortcut-clear-filters": "Clear all filters", - "shortcut-close-dialog": "Close Dialog", + "shortcut-clear-filters": "すべてのフィルターを解除する", + "shortcut-close-dialog": "ダイアログを閉じる", "shortcut-filter-my-cards": "Filter my cards", "shortcut-show-shortcuts": "Bring up this shortcuts list", - "shortcut-toggle-filterbar": "Toggle Filter Sidebar", - "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "shortcut-toggle-filterbar": "フィルターサイドバーの切り替え", + "shortcut-toggle-sidebar": "ボードサイドバーの切り替え", + "show-cards-minimum-count": "Show cards count if list contains more than", "signupPopup-title": "アカウント作成", "star-board-title": "ボードにスターをつけると自分のボード一覧のトップに表示されます。", "starred-boards": "スターのついたボード", @@ -250,14 +301,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": "Unassign member", "unsaved-description": "You have an unsaved description.", - "upload": "Upload", - "upload-avatar": "Upload an avatar", - "uploaded-avatar": "Uploaded an avatar", + "unwatch": "アンウォッチ", + "upload": "アップロード", + "upload-avatar": "アバターのアップロード", + "uploaded-avatar": "アップロードされたアバター", "username": "ユーザー名", "view-it": "View it", "warn-list-archived": "warning: this card is in an archived list", - "what-to-do": "What do you want to do?" -} + "watch": "ウォッチ", + "watching": "ウォッチしています", + "watching-info": "このボードの変更が通知されます", + "welcome-board": "ウェルカムボード", + "welcome-list1": "基本", + "welcome-list2": "高度", + "what-to-do": "何をしたいですか?" +}
\ No newline at end of file diff --git a/i18n/ko.i18n.json b/i18n/ko.i18n.json index 823a221d..315aef0e 100755..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": "활동 상태", @@ -16,10 +36,13 @@ "activity-removed": "%s를 %s에서 삭제함", "activity-sent": "%s를 %s로 보냄", "activity-unjoined": "unjoined %s", + "activity-checklist-added": "added checklist to %s", "add": "추가", "add-attachment": "Add an attachment", "add-board": "새로운 보드를 추가", "add-card": "Add a card", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "커버 추가", "add-label": "Add the label", "add-list": "Add a list", @@ -31,6 +54,8 @@ "all-boards": "All boards", "and-n-other-card": "And __count__ other card", "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", "archive": "보관", "archive-all": "모두 보관", "archive-board": "Archive Board", @@ -46,6 +71,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 +82,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 +92,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,10 +112,13 @@ "change-avatar": "아바타 변경", "change-password": "암호 변경", "change-permissions": "Change permissions", + "change-settings": "Change Settings", "changeAvatarPopup-title": "아바타 변경", "changeLanguagePopup-title": "언어 변경", "changePasswordPopup-title": "암호 변경", "changePermissionsPopup-title": "권한 변경", + "changeSettingsPopup-title": "Change Settings", + "checklists": "Checklists", "click-to-star": "보드 별 추가.", "click-to-unstar": "보드 별 삭제.", "clipboard": "Clipboard or drag & drop", @@ -109,6 +142,7 @@ "createBoardPopup-title": "보드 생성", "createLabelPopup-title": "라벨 생성", "current": "current", + "date": "Date", "decline": "Decline", "default-avatar": "Default avatar", "delete": "삭제", @@ -122,7 +156,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 +183,33 @@ "error-user-doesNotExist": "This user does not exist", "error-user-notAllowSelf": "This action on self is not allowed", "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", "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 +229,20 @@ "listImportCardPopup-title": "Import a Trello card", "lists": "Lists", "log-out": "로그아웃", + "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 +251,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": "이 페이지를 비공개일 수 있습니다. 이것을 보고 싶으면 <a href='%s'>로그인</a>을 하십시오.", "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", @@ -223,6 +272,7 @@ "remove-cover": "커버 제거", "remove-from-board": "Remove from Board", "remove-label": "Remove the label", + "remove-list": "Remove the list", "remove-member": "멤버 제거", "remove-member-from-card": "카드에서 제거", "remove-member-pop": "__boardTitle__에서 __name__(__username__) 을 제거합니까? 그 멤버는 이 보드의 모든 카드에서 제거됩니다. 그에대한 알람을 받게됩니다.", @@ -242,6 +292,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 +301,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": "무엇을 원하나요?" +}
\ No newline at end of file diff --git a/i18n/pl.i18n.json b/i18n/pl.i18n.json new file mode 100644 index 00000000..53367442 --- /dev/null +++ b/i18n/pl.i18n.json @@ -0,0 +1,324 @@ +{ + "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ść", + "activity-added": "dodano %s z %s", + "activity-archived": "zarchiwizowano %s", + "activity-attached": "załączono %s z %s", + "activity-created": "utworzono %s", + "activity-excluded": "wyłączono %s z %s", + "activity-imported": "zaimportowano %s to %s z %s", + "activity-imported-board": "zaimportowano %s z %s", + "activity-joined": "dołączono %s", + "activity-moved": "przeniesiono % z %s to %s", + "activity-on": "w %s", + "activity-removed": "usunięto %s z %s", + "activity-sent": "wysłano %s z %s", + "activity-unjoined": "odłączono %s", + "activity-checklist-added": "added checklist to %s", + "add": "Dodaj", + "add-attachment": "Dodaj załącznik", + "add-board": "Dodaj nową tablicę", + "add-card": "Dodaj kartę", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", + "add-cover": "Dodaj okładkę", + "add-label": "Dodaj etykietę", + "add-list": "Dodaj listę", + "add-members": "Dodaj członka", + "added": "Dodano", + "addMemberPopup-title": "Członkowie", + "admin": "Admin", + "admin-desc": "Może widzieć i edytować karty, usuwać członków oraz zmieniać ustawienia tablicy.", + "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ę", + "archive-card": "Zarchiwizuj kartę", + "archive-list": "Zarchiwizuj tę listę", + "archive-selection": "Zarchiwizuj zaznaczone", + "archiveBoardPopup-title": "Zarchiwizować tablicę?", + "archived-items": "Archived Items", + "archives": "Zarchiwizowane", + "assign-member": "Dodaj członka", + "attached": "załączono", + "attachment": "Załącznik", + "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", + "board-nb-stars": "%s odznaczeń", + "board-not-found": "Nie znaleziono tablicy", + "board-private-info": "Ta tablica będzie <strong>prywatna</strong>.", + "board-public-info": "Ta tablica będzie <strong>publiczna<strong>.", + "boardChangeColorPopup-title": "Zmień tło tablicy", + "boardChangeTitlePopup-title": "Zmień nazwę tablicy", + "boardChangeVisibilityPopup-title": "Zmień widoczność", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Menu tablicy", + "boards": "Tablice", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Anuluj", + "card-archived": "Ta karta jest zarchiwizowana.", + "card-comments-title": "Ta karta ma %s komentarzy.", + "card-delete-notice": "Usunięcie jest trwałe. Stracisz wszystkie akcje powiązane z tą kartą.", + "card-delete-pop": "Wszystkie akcje będą usunięte z widoku aktywności, nie można będzie ponownie otworzyć karty. Usunięcie jest nieodwracalne.", + "card-delete-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", + "cardLabelsPopup-title": "Etykiety", + "cardMembersPopup-title": "Członkowie", + "cardMorePopup-title": "Więcej", + "cards": "Karty", + "change": "Zmień", + "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", + "checklists": "Checklists", + "click-to-star": "Kliknij by odznaczyć tę tablicę.", + "click-to-unstar": "Kliknij by usunąć odznaczenie tej tablicy.", + "clipboard": "Schowek lub przeciągnij & upuść", + "close": "Zamknij", + "close-board": "Zamknij tablicę", + "close-board-pop": "Możesz przywrócić tablicę klikając przycisk \"Zarchiwizowane\" z głównej belki.", + "color-black": "czarny", + "color-blue": "niebieski", + "color-green": "zielony", + "color-lime": "limonkowy", + "color-orange": "pomarańczowy", + "color-pink": "różowy", + "color-purple": "fioletowy", + "color-red": "czerwony", + "color-sky": "błękitny", + "color-yellow": "żółty", + "comment": "Komentarz", + "comment-placeholder": "Napisz komentarz", + "computer": "Komputer", + "create": "Utwórz", + "createBoardPopup-title": "Utwórz tablicę", + "createLabelPopup-title": "Utwórz etykietę", + "current": "obecny", + "date": "Date", + "decline": "Odrzuć", + "default-avatar": "Domyślny avatar", + "delete": "Usuń", + "deleteLabelPopup-title": "Usunąć etykietę?", + "description": "Opis", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Odrzuć", + "done": "Zrobiono", + "download": "Pobierz", + "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__", + "email-enrollAccount-text": "Witaj __user__,\nAby zacząć korzystać z serwisu, kliknij w link poniżej.\n__url__\nDzięki.", + "email-fail": "Wysyłanie emaila nie powiodło się.", + "email-invalid": "Nieprawidłowy email", + "email-invite": "Zaproś przez email", + "email-invite-subject": "__inviter__ wysłał Ci zaproszenie", + "email-invite-text": "Drogi __user__,\n__inviter__ zaprosił Cię do współpracy w tablicy \"__board__\".\nZobacz więcej:\n__url__\nDzięki.", + "email-resetPassword-subject": "Zresetuj swoje hasło na __siteName__", + "email-resetPassword-text": "Witaj __user__,\nAby zresetować hasło, kliknij w link poniżej.\n__url__\nDzięki.", + "email-sent": "Email wysłany", + "email-verifyEmail-subject": "Zweryfikuj swój adres email na __siteName__", + "email-verifyEmail-text": "Witaj __user__,\nAby zweryfikować adres email, kliknij w link poniżej.\n__url__\nDzięki.", + "error-board-doesNotExist": "Ta tablica nie istnieje", + "error-board-notAdmin": "Musisz być administratorem tej tablicy żeby to zrobić", + "error-board-notAMember": "Musisz być członkiem tej tablicy żeby to zrobić", + "error-json-malformed": "Twój tekst nie jest poprawnym JSONem", + "error-json-schema": "Twój JSON nie zawiera prawidłowych informacji w poprawnym formacie", + "error-list-doesNotExist": "Ta lista nie isnieje", + "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-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", + "label-create": "Utwórz nową etykietę", + "label-default": "%s etykieta (domyślna)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Etykiety", + "language": "Język", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Opuść tablicę", + "link-card": "Link do tej karty", + "list-archive-cards": "Zarchiwizuj wszystkie karty z tej listy", + "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": "Przenieś wszystkie karty z tej listy", + "list-select-cards": "Zaznacz wszystkie karty z tej listy", + "listActionPopup-title": "Lista akcji", + "listImportCardPopup-title": "Zaimportuj kartę z Trello", + "lists": "Listy", + "log-out": "Wyloguj", + "log-in": "Zaloguj", + "loginPopup-title": "Zaloguj", + "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.", + "no-archived-lists": "Brak zarchiwizowanych list.", + "no-results": "Brak wyników", + "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 <a href='%s'>zalogowaniu</a>.", + "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", + "private": "Prywatny", + "private-desc": "Ta tablica jest prywatna. Tylko osoby dodane do tej tablicy mogą ją zobaczyć i edytować.", + "profile": "Profil", + "public": "Publiczny", + "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": "Odznacz tablicę aby dodać skrót na tym pasku.", + "remove-cover": "Usuń okładkę", + "remove-from-board": "Usuń z tablicy", + "remove-label": "Usuń etykietę", + "remove-list": "Remove the list", + "remove-member": "Usuń członka", + "remove-member-from-card": "Usuń z karty", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Usunąć członka?", + "rename": "Zmień nazwę", + "rename-board": "Zmień nazwę tablicy", + "restore": "Przywróć", + "save": "Zapisz", + "search": "Wyszukaj", + "select-color": "Wybierz kolor", + "shortcut-assign-self": "Przypisz siebie do obecnej karty", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Usuń wszystkie filtry", + "shortcut-close-dialog": "Zamknij okno", + "shortcut-filter-my-cards": "Filtruj moje karty", + "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", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Zapisz się", + "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 51c62f5b..2912787d 100755..100644 --- a/i18n/pt-BR.i18n.json +++ b/i18n/pt-BR.i18n.json @@ -1,5 +1,25 @@ { - "accept": "Accept", + "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", @@ -8,18 +28,21 @@ "activity-attached": "anexou %s a %s", "activity-created": "criou %s", "activity-excluded": "excluiu %s de %s", - "activity-imported": "imported %s into %s from %s", - "activity-imported-board": "imported %s from %s", + "activity-imported": "importado %s em %s de %s", + "activity-imported-board": "importado %s de %s", "activity-joined": "juntou-se a %s", "activity-moved": "moveu %s de %s para %s", "activity-on": "em %s", "activity-removed": "removeu %s de %s", "activity-sent": "enviou %s de %s", - "activity-unjoined": "unjoined %s", + "activity-unjoined": "saiu de %s", + "activity-checklist-added": "added checklist to %s", "add": "Novo", "add-attachment": "Adicionar um anexo", "add-board": "Criar um quadro novo", "add-card": "Adicionar um cartão", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "Adicionar Capa", "add-label": "Adicionar a Etiqueta", "add-list": "Adicionar uma lista", @@ -31,13 +54,15 @@ "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", "archive-card": "Arquivar Cartão", "archive-list": "Arquivar esta lista", "archive-selection": "Arquivar seleção", - "archiveBoardPopup-title": "Archive Board?", + "archiveBoardPopup-title": "Arquivar Quadro?", "archived-items": "Itens Arquivados", "archives": "Arquivos", "assign-member": "Atribuir Membro", @@ -46,6 +71,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 +82,7 @@ "boardChangeColorPopup-title": "Alterar Tela de Fundo", "boardChangeTitlePopup-title": "Renomear Quadro", "boardChangeVisibilityPopup-title": "Alterar Visibilidade", - "boardImportBoardPopup-title": "Import board from Trello", + "boardChangeWatchPopup-title": "Change Watch", "boardMenuPopup-title": "Menu do Quadro", "boards": "Quadros", "bucket-example": "\"Bucket List\", por exemplo", @@ -66,11 +92,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", @@ -78,30 +108,33 @@ "cardMembersPopup-title": "Membros", "cardMorePopup-title": "Mais", "cards": "Cartões", - "change": "Change", + "change": "Alterar", "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", + "checklists": "Checklists", "click-to-star": "Marcar quadro como favorito.", "click-to-unstar": "Remover quadro dos favoritos.", - "clipboard": "Clipboard or drag & drop", + "clipboard": "Área de Transferência ou arraste e solte", "close": "Fechar", "close-board": "Fechar Quadro", - "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", + "close-board-pop": "Você estará habilitado para restaurar o quadro clicando no botão \"Arquivos\" à partir da barra de início.", + "color-black": "preto", + "color-blue": "azul", + "color-green": "verde", + "color-lime": "verde limão", + "color-orange": "laranja", + "color-pink": "cor-de-rosa", + "color-purple": "roxo", + "color-red": "vermelho", + "color-sky": "céu", + "color-yellow": "amarelo", "comment": "Comentário", "comment-placeholder": "Escrever um comentário", "computer": "Computador", @@ -109,7 +142,8 @@ "createBoardPopup-title": "Criar Quadro", "createLabelPopup-title": "Criar Etiqueta", "current": "atual", - "decline": "Decline", + "date": "Date", + "decline": "Rejeitar", "default-avatar": "Avatar padrão", "delete": "Excluir", "deleteLabelPopup-title": "Excluir Etiqueta?", @@ -117,58 +151,67 @@ "disambiguateMultiLabelPopup-title": "Desambiguar ações de etiquetas", "disambiguateMultiMemberPopup-title": "Desambiguar ações de membros", "discard": "Descartar", - "done": "Done", + "done": "Feito", "download": "Baixar", "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": "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-enrollAccount-subject": "Uma conta foi criada para você em __siteName__", + "email-enrollAccount-text": "Olá __user__\npara iniciar utilizando o serviço basta clicar no link abaixo.\n__url__\nMuito Obrigado.", + "email-fail": "Falhou ao enviar email", + "email-invalid": "Email inválido", + "email-invite": "Convite via Email", + "email-invite-subject": "__inviter__ lhe enviou um convite", + "email-invite-text": "Caro __user__\n__inviter__ lhe convidou para ingressar no quadro \"__board__\" como colaborador.\nPor favor prossiga através do link abaixo:\n__url__\nMuito obrigado.", + "email-resetPassword-subject": "Redefina sua senha em __siteName__", + "email-resetPassword-text": "Olá __user__\nPara redefinir sua senha, por favor clique no link abaixo.\n__url__\nMuito obrigado.", + "email-sent": "Email enviado", + "email-verifyEmail-subject": "Verifique seu endereço de email em __siteName__", + "email-verifyEmail-text": "Olá __user__\nPara verificar sua conta de email, clique no link abaixo.\n__url__\nObrigado.", + "error-board-doesNotExist": "Este quadro não existe", + "error-board-notAdmin": "Você precisa ser administrador desse quadro para fazer isto", + "error-board-notAMember": "Você precisa ser um membro desse quadro para fazer isto", + "error-json-malformed": "Seu texto não é um JSON válido", + "error-json-schema": "Seu JSON não inclui as informações no formato correto", + "error-list-doesNotExist": "Esta lista não existe", + "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": "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", + "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-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": "You are just invited to this board", + "just-invited": "Você já foi convidado para este quadro", "keyboard-shortcuts": "Atalhos do teclado", "label-create": "Criar uma nova etiqueta", "label-default": "%s etiqueta (padrão)", @@ -183,20 +226,23 @@ "list-move-cards": "Mover todos os cartões desta lista", "list-select-cards": "Selecionar todos os cartões nesta lista", "listActionPopup-title": "Listar Ações", - "listImportCardPopup-title": "Import a Trello card", + "listImportCardPopup-title": "Importe um cartão do Trello", "lists": "Listas", "log-out": "Sair", + "log-in": "Entrar", "loginPopup-title": "Entrar", - "mapMembersAddPopup-title": "Select Wekan member", - "mapMembersPopup-title": "Map members", "memberMenuPopup-title": "Configuração de Membros", "members": "Membros", "menu": "Menu", - "move-selection": "Move selection", + "move-selection": "Mover seleção", "moveCardPopup-title": "Mover Cartão", - "moveSelectionPopup-title": "Move selection", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Mover seleção", "multi-selection": "Multi-Seleção", - "multi-selection-on": "Multi-Selection is on", + "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", @@ -204,16 +250,19 @@ "no-results": "Nenhum resultado.", "normal": "Normal", "normal-desc": "Pode ver e editar cartões. Não pode alterar configurações.", - "not-accepted-yet": "Invitation not accepted yet", + "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": "or", + "or": "ou", "page-maybe-private": "Esta página pode ser privada. Você poderá vê-la se estiver <a href='%s'>logado</a>.", "page-not-found": "Página não encontrada.", "password": "Senha", - "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": "para colar, ou arraste e solte o arquivo da imagem para ca (somente imagens)", + "participating": "Participating", + "preview": "Previsualizar", + "previewAttachedImagePopup-title": "Previsualizar", + "previewClipboardImagePopup-title": "Previsualizar", "private": "Privado", "private-desc": "Este quadro é privado. Apenas seus membros podem acessar e editá-lo.", "profile": "Perfil", @@ -223,6 +272,7 @@ "remove-cover": "Remover Capa", "remove-from-board": "Remover do Quadro", "remove-label": "Remover Etiqueta", + "remove-list": "Remove the list", "remove-member": "Remover Membro", "remove-member-from-card": "Remover do Cartão", "remove-member-pop": "Remover __name__ (__username__) de __boardTitle__? O membro será removido de todos os cartões neste quadro e será notificado.", @@ -233,15 +283,16 @@ "save": "Salvar", "search": "Buscar", "select-color": "Selecione uma cor", - "shortcut-assign-self": "Assign yourself to current card", - "shortcut-autocomplete-emoji": "Preenchimento automático de emoji", + "shortcut-assign-self": "Atribuir a si o cartão atual", + "shortcut-autocomplete-emoji": "Autocomplete emoji", "shortcut-autocomplete-members": "Preenchimento automático de membros", "shortcut-clear-filters": "Limpar todos filtros", "shortcut-close-dialog": "Fechar dialogo", "shortcut-filter-my-cards": "Filtrar meus cartões", "shortcut-show-shortcuts": "Mostrar lista de atalhos", - "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "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 +301,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 new file mode 100644 index 00000000..da2f3bb6 --- /dev/null +++ b/i18n/ro.i18n.json @@ -0,0 +1,324 @@ +{ + "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", + "activity-added": "added %s to %s", + "activity-archived": "archived %s", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-checklist-added": "added checklist to %s", + "add": "Add", + "add-attachment": "Add an attachment", + "add-board": "Add a new board", + "add-card": "Add a card", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", + "add-cover": "Add Cover", + "add-label": "Add the label", + "add-list": "Add a list", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", + "archive": "Archive", + "archive-all": "Archive All", + "archive-board": "Archive Board", + "archive-card": "Archive Card", + "archive-list": "Archive this list", + "archive-selection": "Archive selection", + "archiveBoardPopup-title": "Archive Board?", + "archived-items": "Archived Items", + "archives": "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", + "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", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be <strong>private</strong>.", + "board-public-info": "This board will be <strong>public</strong>.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Menu", + "boards": "Boards", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is archived.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.", + "card-due": "Due", + "card-due-on": "Due on", + "card-edit-attachments": "Edit attachments", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardDeletePopup-title": "Delete Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cards": "Cards", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Î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", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "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", + "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-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", + "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", + "log-in": "Log In", + "loginPopup-title": "Log In", + "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.", + "no-archived-lists": "No archived lists.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.", + "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", + "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-list": "Remove the list", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Salvează", + "search": "Caută", + "select-color": "Select a color", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "time": "Time", + "title": "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..fd98b49f 100755..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": "Активность", @@ -16,10 +36,13 @@ "activity-removed": "удалено %s из %s", "activity-sent": "отправлено %s в %s", "activity-unjoined": "вышел из %s", + "activity-checklist-added": "added checklist to %s", "add": "Создать", "add-attachment": "Добавить вложение", "add-board": "Создать новую доску", "add-card": "Добавить карточку", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "Прикрепить", "add-label": "Добавить метку", "add-list": "Добавить список", @@ -31,6 +54,8 @@ "all-boards": "Все доски", "and-n-other-card": "И __count__ другая карточка", "and-n-other-card_plural": "И __count__ другие карточки", + "apply": "Apply", + "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", "archive": "Архивировать", "archive-all": "Архивировать все", "archive-board": "Архивировать доску", @@ -46,6 +71,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 +82,7 @@ "boardChangeColorPopup-title": "Изменить фон доски", "boardChangeTitlePopup-title": "Переименовать доску", "boardChangeVisibilityPopup-title": "Изменить настройки видимости", - "boardImportBoardPopup-title": "Импортировать доску с Trello", + "boardChangeWatchPopup-title": "Change Watch", "boardMenuPopup-title": "Меню доски", "boards": "Доски", "bucket-example": "Например “Список дел”", @@ -66,11 +92,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 +112,29 @@ "change-avatar": "Изменить аватар", "change-password": "Изменить пароль", "change-permissions": "Изменить права доступа", + "change-settings": "Change Settings", "changeAvatarPopup-title": "Изменить аватар", "changeLanguagePopup-title": "Сменить язык", "changePasswordPopup-title": "Изменить пароль", "changePermissionsPopup-title": "Изменить настройки доступа", + "changeSettingsPopup-title": "Change Settings", + "checklists": "Checklists", "click-to-star": "Добавить в «Избранное»", "click-to-unstar": "Удалить из «Избранного»", "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 +142,7 @@ "createBoardPopup-title": "Создать доску", "createLabelPopup-title": "Создать метку", "current": "Текущий", + "date": "Date", "decline": "Понизить", "default-avatar": "Стандартный аватар", "delete": "Удалить", @@ -122,7 +156,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 +171,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 +183,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-members-map": "Вы ипортировали доску с пользователями. Пожалуйста, составьте карту пользователей, которых вы хотите импортировать в Wekan пользователей ", + "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 +229,20 @@ "listImportCardPopup-title": "Импортировать Trello карточку", "lists": "Списки", "log-out": "Выйти", + "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 +251,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": "Возможно, эта страница скрыта от незарегистрированных пользователей. Попробуйте <a href='%s'>войти на сайт</a>.", "page-not-found": "Страница не найдена.", "password": "Пароль", "paste-or-dragdrop": "вставьте, или перетащите файл с изображением сюда (только графический фай)", + "participating": "Participating", "preview": "Предпросмотр", - "previewClipboardImagePopup-title": "Предпросмотр", "previewAttachedImagePopup-title": "Предпросмотр", + "previewClipboardImagePopup-title": "Предпросмотр", "private": "Закрытая", "private-desc": "Эта доска с ограниченным доступом. Только участники могут работать с ней.", "profile": "Профиль", @@ -220,6 +272,7 @@ "remove-cover": "Открепить", "remove-from-board": "Удалить с доски", "remove-label": "Удалить метку", + "remove-list": "Remove the list", "remove-member": "Удалить участника", "remove-member-from-card": "Удалить из карточки", "remove-member-pop": "Удалить участника __name__ (__username__) из доски __boardTitle__? Участник будет удален из всех карточек. Также он получит уведомление о совершаемом действии.", @@ -239,22 +292,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": "Что вы хотите сделать?" -} +}
\ No newline at end of file diff --git a/i18n/sr.i18n.json b/i18n/sr.i18n.json new file mode 100644 index 00000000..af7b4efc --- /dev/null +++ b/i18n/sr.i18n.json @@ -0,0 +1,324 @@ +{ + "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", + "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", + "activity-checklist-added": "added checklist to %s", + "add": "Dodaj", + "add-attachment": "Dodaj dokument", + "add-board": "Dodaj novu tablu", + "add-card": "Dodaj karticu", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", + "add-cover": "Dodaj zaglavlje", + "add-label": "Dodaj natpis", + "add-list": "Dodaj listu", + "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", + "apply": "Primeni", + "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", + "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", + "auto-watch": "Automatically watch boards when create it", + "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 <strong>privatna<strong>.", + "board-public-info": "Ova tabla će biti <strong>javna<strong>.", + "boardChangeColorPopup-title": "Promeni pozadinu table", + "boardChangeTitlePopup-title": "Preimenuj tablu", + "boardChangeVisibilityPopup-title": "Promeni Vidljivost", + "boardChangeWatchPopup-title": "Change Watch", + "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-due": "Krajnji datum", + "card-due-on": "Završava se", + "card-edit-attachments": "Uredi priloge", + "card-edit-labels": "Uredi natpise", + "card-edit-members": "Uredi članove", + "card-labels-title": "Promeni natpis na kartici.", + "card-members-title": "Dodaj ili ukloni članove table sa kartice.", + "card-start": "Početak", + "card-start-on": "Počinje", + "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", + "change-settings": "Izmeni podešavanja", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Izmeni podešavanja", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "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", + "date": "Datum", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "editCardStartDatePopup-title": "Izmeni početni datum", + "editCardDueDatePopup-title": "Izmeni krajnji datum", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Izmeni notifikaciju", + "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", + "error-username-taken": "Korisničko ime je već zauzeto", + "export-board": "Export board", + "filter": "Filter", + "filter-cards": "Filter Cards", + "filter-clear": "Clear filter", + "filter-no-label": "No label", + "filter-no-member": "Nema člana", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Sakrij sistemske poruke", + "home": "Home", + "import": "Import", + "import-board": "import from Trello", + "import-board-title": "Import board from Trello", + "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text", + "import-json-placeholder": "Paste your valid JSON data here", + "import-map-members": "Mapiraj članove", + "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick the Wekan user you want to use as this member", + "importMapMembersAddPopup-title": "Izaberi člana Wekan-a", + "info": "Infos", + "initials": "Initials", + "invalid-date": "Neispravan datum", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create a new label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "link-card": "Link to this card", + "list-archive-cards": "Archive all cards in this list", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view archived cards and bring them back to the board, click “Menu” > “Archived Items”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "listActionPopup-title": "List Actions", + "listImportCardPopup-title": "Import a Trello card", + "lists": "Lists", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Članovi", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Premesti na dno", + "moveCardToTop-title": "Premesti na vrh", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Utišano", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No archived cards.", + "no-archived-lists": "No archived lists.", + "no-results": "Nema rezultata", + "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 <a href='%s'>logging in</a>.", + "page-not-found": "Stranica nije pronađena.", + "password": "Lozinka", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Učestvujem", + "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-list": "Ukloni listu", + "remove-member": "Ukloni člana", + "remove-member-from-card": "Ukloni iz kartice", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "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-emoji": "Autocomplete emoji", + "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", + "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", + "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", + "time": "Vreme", + "title": "Naslov", + "tracking": "Praćenje", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "unassign-member": "Unassign member", + "unsaved-description": "Imaš nesnimljen opis.", + "unwatch": "Ne posmatraj", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "username": "Korisničko ime", + "view-it": "Pregledaj je", + "warn-list-archived": "upozorenje: ova kartica je u arhiviranoj listi", + "watch": "Posmatraj", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-list1": "Osnove", + "welcome-list2": "Napredno", + "what-to-do": "Šta želiš da uradiš ?" +}
\ No newline at end of file diff --git a/i18n/tr.i18n.json b/i18n/tr.i18n.json index c05833bb..47336f66 100755..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", @@ -16,10 +36,13 @@ "activity-removed": "removed %s from %s", "activity-sent": "sent %s to %s", "activity-unjoined": "unjoined %s", + "activity-checklist-added": "added checklist to %s", "add": "Ekle", "add-attachment": "Add an attachment", "add-board": "Yeni bir pano ekle", "add-card": "Add a card", + "add-checklist": "Add a checklist", + "add-checklist-item": "Add an item to checklist", "add-cover": "Add Cover", "add-label": "Add the label", "add-list": "Add a list", @@ -31,6 +54,8 @@ "all-boards": "All boards", "and-n-other-card": "And __count__ other card", "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.", "archive": "Arşiv", "archive-all": "Tümünü Arşivle", "archive-board": "Archive Board", @@ -46,6 +71,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 +82,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 +92,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,10 +112,13 @@ "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", + "checklists": "Checklists", "click-to-star": "Bu panoyu yıldızlamak için tıkla.", "click-to-unstar": "Bu panunun yıldızını kaldırmak için tıkla.", "clipboard": "Clipboard or drag & drop", @@ -109,6 +142,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 +156,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 +183,33 @@ "error-user-doesNotExist": "This user does not exist", "error-user-notAllowSelf": "This action on self is not allowed", "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", "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 +229,20 @@ "listImportCardPopup-title": "Import a Trello card", "lists": "Lists", "log-out": "Oturum Kapat", + "log-in": "Oturum Aç", "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 +251,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. <a href='%s'>Oturum açarak</a> 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", @@ -223,6 +272,7 @@ "remove-cover": "Remove Cover", "remove-from-board": "Remove from Board", "remove-label": "Remove the label", + "remove-list": "Remove the list", "remove-member": "Üyeyi Çıkar", "remove-member-from-card": "Karttan Çıkar", "remove-member-pop": "__boardTitle__ panosundan __name__ (__username__) çıkarılsın mı? Üye, bu panodaki tüm kartlardan çıkarılacak ve bir bildirim alacak.", @@ -242,6 +292,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 +301,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?" -} +}
\ No newline at end of file diff --git a/i18n/zh-CN.i18n.json b/i18n/zh-CN.i18n.json index 32eb1516..0f5871c3 100755..100644 --- a/i18n/zh-CN.i18n.json +++ b/i18n/zh-CN.i18n.json @@ -1,25 +1,48 @@ { "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 关联", + "activity-checklist-added": "已经将清单添加到 %s", "add": "添加", "add-attachment": "添加附件", "add-board": "添加新看板", "add-card": "添加卡片", + "add-checklist": "添加清单", + "add-checklist-item": "扩充清单", "add-cover": "添加封面", "add-label": "添加标签", "add-list": "添加清单", @@ -31,14 +54,16 @@ "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": "回收箱", + "apply": "应用", + "app-is-offline": "处于离线状态,刷新页面将导致数据丢失。", + "archive": "归档", + "archive-all": "全部归档", + "archive-board": "归档看板", + "archive-card": "归档卡片", + "archive-list": "归档该清单", + "archive-selection": "归档所选内容", + "archiveBoardPopup-title": "确定要归档看板吗?", + "archived-items": "已归档项目", "archives": "回收箱", "assign-member": "分配成员", "attached": "附加", @@ -46,6 +71,7 @@ "attachment-delete-pop": "删除附件的操作不可逆。", "attachmentDeletePopup-title": "删除附件?", "attachments": "附件", + "auto-watch": "创建看板时自动关注", "avatar-too-big": "头像太大 (最大 70 Kb)", "back": "返回", "board-change-color": "更改颜色", @@ -56,21 +82,25 @@ "boardChangeColorPopup-title": "修改看板背景", "boardChangeTitlePopup-title": "重命名看板", "boardChangeVisibilityPopup-title": "更改可视级别", - "boardImportBoardPopup-title": "从 Trello 导入看板", + "boardChangeWatchPopup-title": "更改关注状态", "boardMenuPopup-title": "看板菜单", "boards": "看板", "bucket-example": "例如 “目标清单”", "cancel": "取消", - "card-archived": "该卡片已被删除", + "card-archived": "该卡片已被归档", "card-comments-title": "该卡片有 %s 条评论", "card-delete-notice": "彻底删除的操作不可恢复,你将会丢失该卡片相关的所有操作记录。", "card-delete-pop": "所有的动作将从活动动态中被移除且您将无法重新打开该卡片。此操作无法撤销。", - "card-delete-suggest-archive": "你可以将卡片从看板中删除至回收箱,但保留相关活动。", + "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,10 +112,13 @@ "change-avatar": "更改头像", "change-password": "更改密码", "change-permissions": "更改权限", + "change-settings": "更改设置", "changeAvatarPopup-title": "更改头像", "changeLanguagePopup-title": "更改语言", "changePasswordPopup-title": "更改密码", "changePermissionsPopup-title": "更改权限", + "changeSettingsPopup-title": "更改设置", + "checklists": "清单", "click-to-star": "点此来标记该看板", "click-to-unstar": "点此来去除该看板的标记", "clipboard": "剪贴板或者拖放文件", @@ -109,6 +142,7 @@ "createBoardPopup-title": "创建看板", "createLabelPopup-title": "创建标签", "current": "当前", + "date": "日期", "decline": "拒绝", "default-avatar": "默认头像", "delete": "删除", @@ -122,20 +156,23 @@ "edit": "编辑", "edit-avatar": "更改头像", "edit-profile": "编辑资料", + "editCardStartDatePopup-title": "修改起始日期", + "editCardDueDatePopup-title": "修改截止日期", "editLabelPopup-title": "更改标签", + "editNotificationPopup-title": "编辑通知", "editProfilePopup-title": "编辑资料", "email": "邮箱", - "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-subject": "已为您在 __siteName__ 创建帐号", "email-enrollAccount-text": "尊敬的 __user__,\n\n点击下面的链接,即刻开始使用这项服务。\n\n__url__\n\n谢谢。", "email-fail": "邮件发送失败", "email-invalid": "邮件地址错误", "email-invite": "发送邮件邀请", "email-invite-subject": "__inviter__ 向您发出邀请", "email-invite-text": "尊敬的 __user__,\n\n__inviter__ 邀请您加入看板 \"__board__\" 参与协作。\n\n请点击下面的链接访问看板:\n\n__url__\n\n谢谢。", - "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-subject": "重置您的 __siteName__ 密码", "email-resetPassword-text": "尊敬的 __user__,\n\n点击下面的链接,重置您的密码:\n\n__url__\n\n谢谢。", "email-sent": "邮件已发送", - "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-subject": "在 __siteName__ 验证您的邮件地址", "email-verifyEmail-text": "尊敬的 __user__,\n\n点击下面的链接,验证您的邮件地址:\n\n__url__\n\n谢谢。", "error-board-doesNotExist": "该看板不存在", "error-board-notAdmin": "需要成为管理员才能执行此操作", @@ -146,27 +183,33 @@ "error-user-doesNotExist": "该用户不存在", "error-user-notAllowSelf": "不允许对自己执行此操作", "error-user-notCreated": "该用户未能成功创建", - "export-board": "Export board", + "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": "键盘快捷键", @@ -178,39 +221,45 @@ "last-admin-desc": "你不能更改角色,因为至少需要一名管理员。", "leave-board": "离开看板", "link-card": "关联至该卡片", - "list-archive-cards": "删除清单中的所有卡片", - "list-archive-cards-pop": "这将会从本看板中移除该清单中的所有卡片。如果需要浏览已删除的卡片并且将其恢复至看板,请点击\"菜单\">\"回收箱\"", + "list-archive-cards": "归档清单中的所有卡片", + "list-archive-cards-pop": "这将会从本看板中移除该清单中的所有卡片。如果需要浏览已归档的卡片并且将其恢复至看板,请点击\"菜单\">\"回收箱\"", "list-move-cards": "移动清单中的所有卡片", "list-select-cards": "选择清单中的所有卡片", "listActionPopup-title": "清单操作", "listImportCardPopup-title": "导入 Trello 卡片", "lists": "清单", "log-out": "登出", + "log-in": "登录", "loginPopup-title": "登录", - "mapMembersAddPopup-title": "选择 Wekan 成员", - "mapMembersPopup-title": "映射成员", "memberMenuPopup-title": "成员设置", "members": "成员", "menu": "菜单", - "move-selection": "Move selection", + "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": "没有已删除的卡片", - "no-archived-lists": "没有已删除的清单", + "no-archived-cards": "没有已归档的卡片", + "no-archived-lists": "没有已归档的清单", "no-results": "无结果", "normal": "普通", "normal-desc": "可以创建以及编辑卡片,无法更改设置。", "not-accepted-yet": "邀请尚未接受", + "notify-participate": "接收以创建者或成员身份参与的卡片的更新", + "notify-watch": "接收所有关注的面板、列表、及卡片的更新", "optional": "可选", "or": "或", "page-maybe-private": "本页面被设为私有. 您必须 <a href='%s'>登录</a>以浏览其中内容。", "page-not-found": "页面不存在。", "password": "密码", "paste-or-dragdrop": "从剪贴板粘贴,或者拖放文件到它上面 (仅限于图片)", + "participating": "参与", "preview": "预览", "previewAttachedImagePopup-title": "预览", "previewClipboardImagePopup-title": "预览", @@ -223,6 +272,7 @@ "remove-cover": "移除封面", "remove-from-board": "从看板中删除", "remove-label": "移除标签", + "remove-list": "删除清单", "remove-member": "移除成员", "remove-member-from-card": "从该卡片中移除", "remove-member-pop": "确定从 __boardTitle__ 中移除 __name__ (__username__) 吗? 该成员将被从该看板的所有卡片中移除,同时他会收到一条提醒。", @@ -234,7 +284,7 @@ "search": "搜索", "select-color": "选择颜色", "shortcut-assign-self": "分配当前卡片给自己", - "shortcut-autocomplete-emoji": "自动补全表情", + "shortcut-autocomplete-emoji": "表情符号自动补全", "shortcut-autocomplete-members": "自动补全成员", "shortcut-clear-filters": "清空全部过滤器", "shortcut-close-dialog": "关闭对话框", @@ -242,7 +292,8 @@ "shortcut-show-shortcuts": "显示此快捷键列表", "shortcut-toggle-filterbar": "切换过滤器边栏", "shortcut-toggle-sidebar": "切换面板边栏", - "signupPopup-title": " 创建账户", + "show-cards-minimum-count": "当列表中的卡片多于此阈值时将显示数量", + "signupPopup-title": "创建账户", "star-board-title": "点此来标记该看板,它将会出现在您的看板列表顶部。", "starred-boards": "已标记看板", "starred-boards-description": "已标记看板将会出现在您的看板列表顶部。", @@ -250,14 +301,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": "警告: 该卡片位于已删除的清单中", + "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 new file mode 100644 index 00000000..6658bea7 --- /dev/null +++ b/i18n/zh-TW.i18n.json @@ -0,0 +1,324 @@ +{ + "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": "在__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": "操作", + "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", + "activity-checklist-added": "新增待辦清單至 %s", + "add": "新增", + "add-attachment": "新增附件", + "add-board": "新增看板", + "add-card": "新增卡片", + "add-checklist": "新增待辦清單", + "add-checklist-item": "新增項目", + "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__ 個卡片", + "apply": "送出", + "app-is-offline": "目前狀態為離線,若整重將會造成資料遺失", + "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": "附件", + "auto-watch": "新增看板時自動加入觀察", + "avatar-too-big": "大頭貼太大 (最大 70 Kb)", + "back": "返回", + "board-change-color": "更改顏色", + "board-nb-stars": "%s 星號標記", + "board-not-found": "看板不存在", + "board-private-info": "該看板將被設為 <strong>私有</strong>.", + "board-public-info": "該看板將被設為 <strong>公開</strong>.", + "boardChangeColorPopup-title": "修改看板背景", + "boardChangeTitlePopup-title": "重新命名看板", + "boardChangeVisibilityPopup-title": "更改可視級別", + "boardChangeWatchPopup-title": "更改觀察", + "boardMenuPopup-title": "看板選單", + "boards": "看板", + "bucket-example": "例如 “目標清單”", + "cancel": "取消", + "card-archived": "該卡片已被刪除", + "card-comments-title": "該卡片有 %s 則評論", + "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": "卡片動作", + "cardLabelsPopup-title": "標籤", + "cardMembersPopup-title": "成員", + "cardMorePopup-title": "更多", + "cards": "卡片", + "change": "變更", + "change-avatar": "更改大頭貼", + "change-password": "更改密碼", + "change-permissions": "更改許可權", + "change-settings": "更改設定", + "changeAvatarPopup-title": "更改大頭貼", + "changeLanguagePopup-title": "更改語言", + "changePasswordPopup-title": "更改密碼", + "changePermissionsPopup-title": "更改許可權", + "changeSettingsPopup-title": "更改設定", + "checklists": "待辦清單", + "click-to-star": "點此來標記該看板", + "click-to-unstar": "點此來去除該看板的標記", + "clipboard": "剪貼簿貼上或者拖曳檔案", + "close": "關閉", + "close-board": "關閉看板", + "close-board-pop": "您可以透過點選主介面上方的”回收筒“按鈕來還原看板。", + "color-black": "黑色", + "color-blue": "藍色", + "color-green": "綠色", + "color-lime": "綠黃", + "color-orange": "橙色", + "color-pink": "粉紅", + "color-purple": "紫色", + "color-red": "紅色", + "color-sky": "天藍", + "color-yellow": "黃色", + "comment": "評論", + "comment-placeholder": "新增評論", + "computer": "從本機上傳", + "create": "建立", + "createBoardPopup-title": "建立看板", + "createLabelPopup-title": "建立標籤", + "current": "目前", + "date": "日期", + "decline": "拒絕", + "default-avatar": "預設大頭貼", + "delete": "刪除", + "deleteLabelPopup-title": "刪除標籤?", + "description": "描述", + "disambiguateMultiLabelPopup-title": "清除標籤動作歧義", + "disambiguateMultiMemberPopup-title": "清除成員動作歧義", + "discard": "取消", + "done": "完成", + "download": "下載", + "edit": "編輯", + "edit-avatar": "更改大頭貼", + "edit-profile": "編輯資料", + "editCardStartDatePopup-title": "更改開始日期", + "editCardDueDatePopup-title": "更改到期日期", + "editLabelPopup-title": "更改標籤", + "editNotificationPopup-title": "更改通知", + "editProfilePopup-title": "編輯資料", + "email": "電子郵件", + "email-enrollAccount-subject": "您在 __siteName__ 的帳號已經建立", + "email-enrollAccount-text": "親愛的 __user__,\n\n點選下面的連結,即刻開始使用這項服務。\n\n__url__\n\n謝謝。", + "email-fail": "郵件寄送失敗", + "email-invalid": "電子郵件地址錯誤", + "email-invite": "寄送郵件邀請", + "email-invite-subject": "__inviter__ 向您發出邀請", + "email-invite-text": "親愛的 __user__,\n\n__inviter__ 邀請您加入看板 \"__board__\" 參與協作。\n\n請點選下面的連結訪問看板:\n\n__url__\n\n謝謝。", + "email-resetPassword-subject": "重設您在 __siteName__ 的密碼", + "email-resetPassword-text": "親愛的 __user__,\n\n點選下面的連結,重置您的密碼:\n\n__url__\n\n謝謝。", + "email-sent": "郵件已寄送", + "email-verifyEmail-subject": "驗證您在 __siteName__ 的電子郵件", + "email-verifyEmail-text": "親愛的 __user__,\n\n點選下面的連結,驗證您的電子郵件地址:\n\n__url__\n\n謝謝。", + "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": "該使用者未能成功建立", + "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-title": "匯入在 Trello 的看板", + "import-board-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": "鍵盤快速鍵", + "label-create": "建立新標籤", + "label-default": "%s 標籤 (預設)", + "label-delete-pop": "此操作無法還原,這將會刪除該標籤並清除它的歷史記錄。", + "labels": "標籤", + "language": "語言", + "last-admin-desc": "你不能更改角色,因為至少需要一名管理員。", + "leave-board": "離開看板", + "link-card": "關聯至該卡片", + "list-archive-cards": "刪除清單中的所有卡片", + "list-archive-cards-pop": "這將會從本看板中移除該清單中的所有卡片。如果需要瀏覽已刪除的卡片並且將其回復至看板,請點選\"選單\">\"回收筒\"", + "list-move-cards": "移動清單中的所有卡片", + "list-select-cards": "選擇清單中的所有卡片", + "listActionPopup-title": "清單操作", + "listImportCardPopup-title": "匯入 Trello 卡片", + "lists": "清單", + "log-out": "登出", + "log-in": "登入", + "loginPopup-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": "沒有已刪除的卡片", + "no-archived-lists": "沒有已刪除的清單", + "no-results": "無結果", + "normal": "普通", + "normal-desc": "可以建立以及編輯卡片,無法更改。", + "not-accepted-yet": "邀請尚未接受", + "notify-participate": "接收與你有關的卡片更新", + "notify-watch": "接收您關注的看板、清單或卡片的更新", + "optional": "選擇性的", + "or": "或", + "page-maybe-private": "本頁面被設為私有. 您必須 <a href='%s'>登入</a>以瀏覽其中內容。", + "page-not-found": "頁面不存在。", + "password": "密碼", + "paste-or-dragdrop": "從剪貼簿貼上,或者拖曳檔案到它上面 (僅限於圖片)", + "participating": "參與", + "preview": "預覽", + "previewAttachedImagePopup-title": "預覽", + "previewClipboardImagePopup-title": "預覽", + "private": "私有", + "private-desc": "該看板將被設為私有。只有該看板成員才可以進行檢視和編輯。", + "profile": "資料", + "public": "公開", + "public-desc": "該看板將被公開。任何人均可透過連結檢視,並且將對Google和其他搜尋引擎開放。只有加入至該看板的成員才可進行編輯。", + "quick-access-description": "被星號標記的看板在導航列中新增快速啟動方式", + "remove-cover": "移除封面", + "remove-from-board": "從看板中刪除", + "remove-label": "移除標籤", + "remove-list": "移除清單", + "remove-member": "移除成員", + "remove-member-from-card": "從該卡片中移除", + "remove-member-pop": "確定從 __boardTitle__ 中移除 __name__ (__username__) 嗎? 該成員將被從該看板的所有卡片中移除,同時他會收到一則提醒。", + "removeMemberPopup-title": "刪除成員?", + "rename": "重新命名", + "rename-board": "重新命名看板", + "restore": "還原", + "save": "儲存", + "search": "搜尋", + "select-color": "選擇顏色", + "shortcut-assign-self": "分配目前卡片給自己", + "shortcut-autocomplete-emoji": "自動完成表情符號", + "shortcut-autocomplete-members": "自動補齊成員", + "shortcut-clear-filters": "清空全部過濾條件", + "shortcut-close-dialog": "關閉對話方塊", + "shortcut-filter-my-cards": "過濾我的卡片", + "shortcut-show-shortcuts": "顯示此快速鍵清單", + "shortcut-toggle-filterbar": "切換過濾程式邊欄", + "shortcut-toggle-sidebar": "切換面板邊欄", + "show-cards-minimum-count": "顯示卡片數量,當內容超過數量", + "signupPopup-title": "建立帳戶", + "star-board-title": "點此標記該看板,它將會出現在您的看板列表上方。", + "starred-boards": "已標記看板", + "starred-boards-description": "已標記看板將會出現在您的看板列表上方。", + "subscribe": "訂閱", + "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/meta/dwrensha-pgp-sig b/meta/dwrensha-pgp-sig Binary files differnew file mode 100644 index 00000000..0ee50fa4 --- /dev/null +++ b/meta/dwrensha-pgp-sig diff --git a/meta/icons/wekan-150.png b/meta/icons/wekan-150.png Binary files differindex baca8d9d..e8e89c62 100644 --- a/meta/icons/wekan-150.png +++ b/meta/icons/wekan-150.png diff --git a/meta/keyring b/meta/keyring Binary files differindex e34b146d..b4d58533 100644 --- a/meta/keyring +++ b/meta/keyring diff --git a/models/activities.js b/models/activities.js index ad920149..7d262ec6 100644 --- a/models/activities.js +++ b/models/activities.js @@ -35,18 +35,23 @@ Activities.helpers({ attachment() { return Attachments.findOne(this.attachmentId); }, + checklist() { + return Checklists.findOne(this.checklistId); + }, }); Activities.before.insert((userId, doc) => { doc.createdAt = new Date(); }); -// For efficiency create an index on the date of creation. if (Meteor.isServer) { + // For efficiency create indexes on the date of creation, and on the date of + // creation in conjunction with the card or board id, as corresponding views + // are largely used in the App. See #524. Meteor.startup(() => { - Activities._collection._ensureIndex({ - createdAt: -1, - }); + Activities._collection._ensureIndex({ createdAt: -1 }); + Activities._collection._ensureIndex({ cardId: 1, createdAt: -1 }); + Activities._collection._ensureIndex({ boardId: 1, createdAt: -1 }); }); Activities.after.insert((userId, doc) => { @@ -100,6 +105,10 @@ if (Meteor.isServer) { const attachment = activity.attachment(); params.attachment = attachment._id; } + if (activity.checklistId) { + const checklist = activity.checklist(); + params.checklist = checklist.title; + } if (board) { const watchingUsers = _.pluck(_.where(board.watchers, {level: 'watching'}), 'userId'); const trackingUsers = _.pluck(_.where(board.watchers, {level: 'tracking'}), 'userId'); diff --git a/models/boards.js b/models/boards.js index 52272cce..14943d61 100644 --- a/models/boards.js +++ b/models/boards.js @@ -6,25 +6,77 @@ Boards.attachSchema(new SimpleSchema({ }, slug: { type: String, + autoValue() { // eslint-disable-line consistent-return + // XXX We need to improve slug management. Only the id should be necessary + // to identify a board in the code. + // XXX If the board title is updated, the slug should also be updated. + // In some cases (Chinese and Japanese for instance) the `getSlug` function + // return an empty string. This is causes bugs in our application so we set + // a default slug in this case. + if (this.isInsert && !this.isSet) { + let slug = 'board'; + const title = this.field('title'); + if (title.isSet) { + slug = getSlug(title.value) || slug; + } + return slug; + } + }, }, archived: { type: Boolean, + autoValue() { // eslint-disable-line consistent-return + if (this.isInsert && !this.isSet) { + return false; + } + }, }, createdAt: { type: Date, - denyUpdate: true, + autoValue() { // eslint-disable-line consistent-return + if (this.isInsert) { + return new Date(); + } else { + this.unset(); + } + }, }, // XXX Inconsistent field naming modifiedAt: { type: Date, - denyInsert: true, optional: true, + autoValue() { // eslint-disable-line consistent-return + if (this.isUpdate) { + return new Date(); + } else { + this.unset(); + } + }, }, // De-normalized number of users that have starred this board stars: { type: Number, + autoValue() { // eslint-disable-line consistent-return + if (this.isInsert) { + return 0; + } + }, }, // De-normalized label system + 'labels': { + type: [Object], + autoValue() { // eslint-disable-line consistent-return + if (this.isInsert && !this.isSet) { + const colors = Boards.simpleSchema()._schema['labels.$.color'].allowedValues; + const defaultLabelsColors = _.clone(colors).splice(0, 6); + return defaultLabelsColors.map((color) => ({ + color, + _id: Random.id(6), + name: '', + })); + } + }, + }, 'labels.$._id': { // We don't specify that this field must be unique in the board because that // will cause performance penalties and is not necessary since this field is @@ -47,6 +99,18 @@ Boards.attachSchema(new SimpleSchema({ // XXX We might want to maintain more informations under the member sub- // documents like de-normalized meta-data (the date the member joined the // board, the number of contributions, etc.). + 'members': { + type: [Object], + autoValue() { // eslint-disable-line consistent-return + if (this.isInsert && !this.isSet) { + return [{ + userId: this.userId, + isAdmin: true, + isActive: true, + }]; + } + }, + }, 'members.$.userId': { type: String, }, @@ -70,6 +134,11 @@ Boards.attachSchema(new SimpleSchema({ 'wisteria', 'midnight', ], + autoValue() { // eslint-disable-line consistent-return + if (this.isInsert && !this.isSet) { + return Boards.simpleSchema()._schema.color.allowedValues[0]; + } + }, }, description: { type: String, @@ -180,7 +249,7 @@ Boards.mutations({ return { $set: { title }}; }, - setDesciption(description) { + setDescription(description) { return { $set: {description} }; }, @@ -338,41 +407,6 @@ if (Meteor.isServer) { }); } -Boards.before.insert((userId, doc) => { - // XXX We need to improve slug management. Only the id should be necessary - // to identify a board in the code. - // XXX If the board title is updated, the slug should also be updated. - // In some cases (Chinese and Japanese for instance) the `getSlug` function - // return an empty string. This is causes bugs in our application so we set - // a default slug in this case. - doc.slug = doc.slug || getSlug(doc.title) || 'board'; - doc.createdAt = new Date(); - doc.archived = false; - doc.members = doc.members || [{ - userId, - isAdmin: true, - isActive: true, - }]; - doc.stars = 0; - doc.color = Boards.simpleSchema()._schema.color.allowedValues[0]; - - // Handle labels - const colors = Boards.simpleSchema()._schema['labels.$.color'].allowedValues; - const defaultLabelsColors = _.clone(colors).splice(0, 6); - doc.labels = defaultLabelsColors.map((color) => { - return { - color, - _id: Random.id(6), - name: '', - }; - }); -}); - -Boards.before.update((userId, doc, fieldNames, modifier) => { - modifier.$set = modifier.$set || {}; - modifier.$set.modifiedAt = new Date(); -}); - if (Meteor.isServer) { // Let MongoDB ensure that a member is not included twice in the same board Meteor.startup(() => { @@ -415,17 +449,76 @@ if (Meteor.isServer) { ); }); + const foreachRemovedMember = (doc, modifier, callback) => { + Object.keys(modifier).forEach((set) => { + if (modifier[set] !== false) { + return; + } + + const parts = set.split('.'); + if (parts.length === 3 && parts[0] === 'members' && parts[2] === 'isActive') { + callback(doc.members[parts[1]].userId); + } + }); + }; + + // Remove a member from all objects of the board before leaving the board + Boards.before.update((userId, doc, fieldNames, modifier) => { + if (!_.contains(fieldNames, 'members')) { + return; + } + + if (modifier.$set) { + const boardId = doc._id; + foreachRemovedMember(doc, modifier.$set, (memberId) => { + Cards.update( + { boardId }, + { + $pull: { + members: memberId, + watchers: memberId, + }, + }, + { multi: true } + ); + + Lists.update( + { boardId }, + { + $pull: { + watchers: memberId, + }, + }, + { multi: true } + ); + + const board = Boards._transform(doc); + board.setWatcher(memberId, false); + + // Remove board from users starred list + if (!board.isPublic()) { + Users.update( + memberId, + { + $pull: { + 'profile.starredBoards': boardId, + }, + } + ); + } + }); + } + }); + // Add a new activity if we add or remove a member to the board Boards.after.update((userId, doc, fieldNames, modifier) => { if (!_.contains(fieldNames, 'members')) { return; } - let memberId; - // Say hello to the new member if (modifier.$push && modifier.$push.members) { - memberId = modifier.$push.members.userId; + const memberId = modifier.$push.members.userId; Activities.insert({ userId, memberId, @@ -436,14 +529,15 @@ if (Meteor.isServer) { } // Say goodbye to the former member - if (modifier.$pull && modifier.$pull.members) { - memberId = modifier.$pull.members.userId; - Activities.insert({ - userId, - memberId, - type: 'member', - activityType: 'removeBoardMember', - boardId: doc._id, + if (modifier.$set) { + foreachRemovedMember(doc, modifier.$set, (memberId) => { + Activities.insert({ + userId, + memberId, + type: 'member', + activityType: 'removeBoardMember', + boardId: doc._id, + }); }); } }); diff --git a/models/cardComments.js b/models/cardComments.js index 224deb03..070c148e 100644 --- a/models/cardComments.js +++ b/models/cardComments.js @@ -16,10 +16,22 @@ CardComments.attachSchema(new SimpleSchema({ createdAt: { type: Date, denyUpdate: false, + autoValue() { // eslint-disable-line consistent-return + if (this.isInsert) { + return new Date(); + } else { + this.unset(); + } + }, }, // XXX Should probably be called `authorId` userId: { type: String, + autoValue() { // eslint-disable-line consistent-return + if (this.isInsert && !this.isSet) { + return this.userId; + } + }, }, })); @@ -44,12 +56,13 @@ CardComments.helpers({ CardComments.hookOptions.after.update = { fetchPrevious: false }; -CardComments.before.insert((userId, doc) => { - doc.createdAt = new Date(); - doc.userId = userId; -}); - 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, diff --git a/models/cards.js b/models/cards.js index 09c86191..f6bd0b06 100644 --- a/models/cards.js +++ b/models/cards.js @@ -9,6 +9,11 @@ Cards.attachSchema(new SimpleSchema({ }, archived: { type: Boolean, + autoValue() { // eslint-disable-line consistent-return + if (this.isInsert && !this.isSet) { + return false; + } + }, }, listId: { type: String, @@ -25,10 +30,19 @@ Cards.attachSchema(new SimpleSchema({ }, createdAt: { type: Date, - denyUpdate: true, + autoValue() { // eslint-disable-line consistent-return + if (this.isInsert) { + return new Date(); + } else { + this.unset(); + } + }, }, dateLastActivity: { type: Date, + autoValue() { + return new Date(); + }, }, description: { type: String, @@ -42,10 +56,23 @@ 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: { type: String, + autoValue() { // eslint-disable-line consistent-return + if (this.isInsert && !this.isSet) { + return this.userId; + } + }, }, sort: { type: Number, @@ -114,6 +141,36 @@ Cards.helpers({ return cover && cover.url() && cover; }, + checklists() { + return Checklists.find({ cardId: this._id }, { sort: { createdAt: 1 }}); + }, + + checklistItemCount() { + const checklists = this.checklists().fetch(); + return checklists.map((checklist) => { + return checklist.itemCount(); + }).reduce((prev, next) => { + return prev + next; + }, 0); + }, + + checklistFinishedCount() { + const checklists = this.checklists().fetch(); + return checklists.map((checklist) => { + return checklist.finishedCount(); + }).reduce((prev, next) => { + return prev + next; + }, 0); + }, + + checklistFinished() { + return this.hasChecklist() && this.checklistItemCount() === this.checklistFinishedCount(); + }, + + hasChecklist() { + return this.checklistItemCount() !== 0; + }, + absoluteUrl() { const board = this.board(); return FlowRouter.url('card', { @@ -188,20 +245,31 @@ Cards.mutations({ unsetCover() { return { $unset: { coverId: '' }}; }, -}); -Cards.before.insert((userId, doc) => { - doc.createdAt = new Date(); - doc.dateLastActivity = new Date(); - if(!doc.hasOwnProperty('archived')){ - doc.archived = false; - } - if (!doc.userId) { - doc.userId = userId; - } + setStart(startAt) { + return { $set: { startAt }}; + }, + + unsetStart() { + return { $unset: { startAt: '' }}; + }, + + setDue(dueAt) { + return { $set: { dueAt }}; + }, + + unsetDue() { + return { $unset: { dueAt: '' }}; + }, }); if (Meteor.isServer) { + // Cards are often fetched within a board, so we create an index to make these + // queries more efficient. + Meteor.startup(() => { + Cards._collection._ensureIndex({ boardId: 1 }); + }); + Cards.after.insert((userId, doc) => { Activities.insert({ userId, diff --git a/models/checklists.js b/models/checklists.js new file mode 100644 index 00000000..35be4dcc --- /dev/null +++ b/models/checklists.js @@ -0,0 +1,164 @@ +Checklists = new Mongo.Collection('checklists'); + +Checklists.attachSchema(new SimpleSchema({ + cardId: { + type: String, + }, + title: { + type: String, + }, + items: { + type: [Object], + defaultValue: [], + }, + 'items.$._id': { + type: String, + }, + 'items.$.title': { + type: String, + }, + 'items.$.isFinished': { + type: Boolean, + defaultValue: false, + }, + finishedAt: { + type: Date, + optional: true, + }, + createdAt: { + type: Date, + denyUpdate: false, + }, +})); + +Checklists.helpers({ + itemCount () { + return this.items.length; + }, + finishedCount () { + return this.items.filter((item) => { + return item.isFinished; + }).length; + }, + isFinished () { + return 0 !== this.itemCount() && this.itemCount() === this.finishedCount(); + }, + getItem (_id) { + return _.findWhere(this.items, { _id }); + }, + itemIndex(itemId) { + return _.pluck(this.items, '_id').indexOf(itemId); + }, +}); + +Checklists.allow({ + insert(userId, doc) { + return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId)); + }, + update(userId, doc) { + return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId)); + }, + remove(userId, doc) { + return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId)); + }, + fetch: ['userId', 'cardId'], +}); + +Checklists.before.insert((userId, doc) => { + doc.createdAt = new Date(); + if (!doc.userId) { + doc.userId = userId; + } +}); + +Checklists.mutations({ + //for checklist itself + setTitle(title){ + return { $set: { title }}; + }, + //for items in checklist + addItem(title) { + const itemCount = this.itemCount(); + const _id = `${this._id}${itemCount}`; + return { $addToSet: {items: {_id, title, isFinished: false}} }; + }, + removeItem(itemId) { + return {$pull: {items: {_id : itemId}}}; + }, + editItem(itemId, title) { + if (this.getItem(itemId)) { + const itemIndex = this.itemIndex(itemId); + return { + $set: { + [`items.${itemIndex}.title`]: title, + }, + }; + } + return {}; + }, + finishItem(itemId) { + if (this.getItem(itemId)) { + const itemIndex = this.itemIndex(itemId); + return { + $set: { + [`items.${itemIndex}.isFinished`]: true, + }, + }; + } + return {}; + }, + resumeItem(itemId) { + if (this.getItem(itemId)) { + const itemIndex = this.itemIndex(itemId); + return { + $set: { + [`items.${itemIndex}.isFinished`]: false, + }, + }; + } + return {}; + }, + toggleItem(itemId) { + const item = this.getItem(itemId); + if (item) { + const itemIndex = this.itemIndex(itemId); + return { + $set: { + [`items.${itemIndex}.isFinished`]: !item.isFinished, + }, + }; + } + return {}; + }, +}); + +if (Meteor.isServer) { + Checklists.after.insert((userId, doc) => { + Activities.insert({ + userId, + activityType: 'addChecklist', + cardId: doc.cardId, + boardId: Cards.findOne(doc.cardId).boardId, + checklistId: doc._id, + }); + }); + + //TODO: so there will be no activity for adding item into checklist, maybe will be implemented in the future. + // Checklists.after.update((userId, doc) => { + // console.log('update:', doc) + // Activities.insert({ + // userId, + // activityType: 'addChecklist', + // boardId: doc.boardId, + // cardId: doc.cardId, + // checklistId: doc._id, + // }); + // }); + + Checklists.before.remove((userId, doc) => { + const activity = Activities.findOne({ checklistId: doc._id }); + if (activity) { + Activities.remove(activity._id); + } + }); +} diff --git a/models/lists.js b/models/lists.js index 4e4a1134..682fb096 100644 --- a/models/lists.js +++ b/models/lists.js @@ -6,13 +6,24 @@ Lists.attachSchema(new SimpleSchema({ }, archived: { type: Boolean, + autoValue() { // eslint-disable-line consistent-return + if (this.isInsert && !this.isSet) { + return false; + } + }, }, boardId: { type: String, }, createdAt: { type: Date, - denyUpdate: true, + autoValue() { // eslint-disable-line consistent-return + if (this.isInsert) { + return new Date(); + } else { + this.unset(); + } + }, }, sort: { type: Number, @@ -22,8 +33,14 @@ Lists.attachSchema(new SimpleSchema({ }, updatedAt: { type: Date, - denyInsert: true, optional: true, + autoValue() { // eslint-disable-line consistent-return + if (this.isUpdate) { + return new Date(); + } else { + this.unset(); + } + }, }, })); @@ -73,19 +90,11 @@ Lists.mutations({ Lists.hookOptions.after.update = { fetchPrevious: false }; -Lists.before.insert((userId, doc) => { - doc.createdAt = new Date(); - doc.archived = false; - if (!doc.userId) - doc.userId = userId; -}); - -Lists.before.update((userId, doc, fieldNames, modifier) => { - modifier.$set = modifier.$set || {}; - modifier.$set.modifiedAt = new Date(); -}); - if (Meteor.isServer) { + Meteor.startup(() => { + Lists._collection._ensureIndex({ boardId: 1 }); + }); + Lists.after.insert((userId, doc) => { Activities.insert({ userId, @@ -96,6 +105,17 @@ if (Meteor.isServer) { }); }); + Lists.before.remove((userId, doc) => { + Activities.insert({ + userId, + type: 'list', + activityType: 'removeList', + boardId: doc.boardId, + listId: doc._id, + title: doc.title, + }); + }); + Lists.after.update((userId, doc) => { if (doc.archived) { Activities.insert({ diff --git a/models/unsavedEdits.js b/models/unsavedEdits.js index 87a70e22..25952fb5 100644 --- a/models/unsavedEdits.js +++ b/models/unsavedEdits.js @@ -14,6 +14,11 @@ UnsavedEditCollection.attachSchema(new SimpleSchema({ }, userId: { type: String, + autoValue() { // eslint-disable-line consistent-return + if (this.isInsert && !this.isSet) { + return this.userId; + } + }, }, })); @@ -28,7 +33,3 @@ if (Meteor.isServer) { fetch: ['userId'], }); } - -UnsavedEditCollection.before.insert((userId, doc) => { - doc.userId = userId; -}); diff --git a/models/users.js b/models/users.js index 4e4a0fac..58513231 100644 --- a/models/users.js +++ b/models/users.js @@ -1,5 +1,107 @@ +// 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({ + username: { + type: String, + optional: true, + autoValue() { // eslint-disable-line consistent-return + if (this.isInsert && !this.isSet) { + const name = this.field('profile.fullname'); + if (name.isSet) { + return name.value.toLowerCase().replace(/\s/g, ''); + } + } + }, + }, + emails: { + type: [Object], + optional: true, + }, + 'emails.$.address': { + type: String, + regEx: SimpleSchema.RegEx.Email, + }, + 'emails.$.verified': { + type: Boolean, + }, + createdAt: { + type: Date, + autoValue() { // eslint-disable-line consistent-return + if (this.isInsert) { + return new Date(); + } else { + this.unset(); + } + }, + }, + profile: { + type: Object, + optional: true, + autoValue() { // eslint-disable-line consistent-return + if (this.isInsert && !this.isSet) { + return {}; + } + }, + }, + 'profile.avatarUrl': { + type: String, + optional: true, + }, + 'profile.emailBuffer': { + type: [String], + optional: true, + }, + 'profile.fullname': { + type: String, + optional: true, + }, + 'profile.hiddenSystemMessages': { + type: Boolean, + optional: true, + }, + 'profile.initials': { + type: String, + optional: true, + }, + 'profile.invitedBoards': { + type: [String], + optional: true, + }, + 'profile.language': { + type: String, + optional: true, + }, + 'profile.notifications': { + type: [String], + optional: true, + }, + 'profile.showCardsCountAt': { + type: Number, + optional: true, + }, + 'profile.starredBoards': { + type: [String], + optional: true, + }, + 'profile.tags': { + type: [String], + optional: true, + }, + services: { + type: Object, + optional: true, + blackbox: true, + }, + heartbeat: { + type: Date, + optional: true, + }, +})); + // Search a user in the complete server database by its name or username. This // is used for instance to add a new user to a board. const searchInFields = ['username', 'profile.fullname']; @@ -57,6 +159,11 @@ Users.helpers({ return _.contains(notifications, activityId); }, + hasHiddenSystemMessages() { + const profile = this.profile || {}; + return profile.hiddenSystemMessages || false; + }, + getEmailBuffer() { const {emailBuffer = []} = this.profile; return emailBuffer; @@ -77,6 +184,11 @@ Users.helpers({ } }, + getLimitToShowCardsCount() { + const profile = this.profile || {}; + return profile.showCardsCountAt; + }, + getName() { const profile = this.profile || {}; return profile.fullname || this.username; @@ -137,6 +249,14 @@ Users.mutations({ this.addTag(tag); }, + toggleSystem(value = false) { + return { + $set: { + 'profile.hiddenSystemMessages': !value, + }, + }; + }, + addNotification(activityId) { return { $addToSet: { @@ -172,6 +292,10 @@ Users.mutations({ setAvatarUrl(avatarUrl) { return { $set: { 'profile.avatarUrl': avatarUrl }}; }, + + setShowCardsCountAt(limit) { + return { $set: { 'profile.showCardsCountAt': limit } }; + }, }); Meteor.methods({ @@ -184,6 +308,14 @@ Meteor.methods({ Users.update(this.userId, {$set: { username }}); } }, + toggleSystemMessages() { + const user = Meteor.user(); + user.toggleSystem(user.hasHiddenSystemMessages()); + }, + changeLimitToShowCardsCount(limit) { + check(limit, Number); + Meteor.user().setShowCardsCountAt(limit); + }, }); if (Meteor.isServer) { @@ -259,14 +391,6 @@ if (Meteor.isServer) { }); } -Users.before.insert((userId, doc) => { - doc.profile = doc.profile || {}; - - if (!doc.username && doc.profile.name) { - doc.username = doc.profile.name.toLowerCase().replace(/\s/g, ''); - } -}); - if (Meteor.isServer) { // Let mongoDB ensure username unicity Meteor.startup(() => { @@ -306,33 +430,32 @@ if (Meteor.isServer) { incrementBoards(_.difference(newIds, oldIds), +1); }); - // XXX i18n - Users.after.insert((userId, doc) => { - const ExampleBoard = { - title: 'Welcome Board', - userId: doc._id, - permission: 'private', - }; - - // Insert the Welcome Board - Boards.insert(ExampleBoard, (err, boardId) => { - - ['Basics', 'Advanced'].forEach((title) => { - const list = { - title, - boardId, - userId: ExampleBoard.userId, - - // XXX Not certain this is a bug, but we except these fields get - // inserted by the Lists.before.insert collection-hook. Since this - // hook is not called in this case, we have to dublicate the logic and - // set them here. - archived: false, - createdAt: new Date(), - }; - - Lists.insert(list); + const fakeUserId = new Meteor.EnvironmentVariable(); + const getUserId = CollectionHooks.getUserId; + CollectionHooks.getUserId = () => { + return fakeUserId.get() || getUserId(); + }; + + 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); + }); + }); }); }); - }); + } } diff --git a/package.json b/package.json index dcf7cbb2..facbda35 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "Wekan", - "version": "0.10.1", + "name": "wekan", + "version": "0.11.0", "description": "The open-source Trello-like kanban", "private": true, "scripts": { @@ -9,14 +9,17 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/wekan/wekan.git" + "url": "git+https://github.com/wefork/wekan.git" }, "license": "MIT", "bugs": { - "url": "https://github.com/wekan/wekan/issues" + "url": "https://github.com/wefork/wekan/issues" }, - "homepage": "https://wekan.io", + "homepage": "https://github.com/wefork/wekan", "devDependencies": { "eslint": "^2.0.0" + }, + "dependencies": { + "xss": "^0.2.13" } } diff --git a/public/wekan-favicon.png b/public/wekan-favicon.png Binary files differindex bd66f554..8beb85f4 100644 --- a/public/wekan-favicon.png +++ b/public/wekan-favicon.png diff --git a/public/wekan-logo-header.png b/public/wekan-logo-header.png Binary files differindex 441b6007..16ffa102 100644 --- a/public/wekan-logo-header.png +++ b/public/wekan-logo-header.png diff --git a/public/wekan-logo.png b/public/wekan-logo.png Binary files differindex 1d98f176..6a2740f2 100644 --- a/public/wekan-logo.png +++ b/public/wekan-logo.png diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp index 8d692a49..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 = 10, + appVersion = 17, # Increment this for every release. - appMarketingVersion = (defaultText = "0.10.1"), + appMarketingVersion = (defaultText = "0.11.0~2016-11-28"), # Human-readable presentation of the app version. minUpgradableAppVersion = 0, @@ -58,13 +58,14 @@ 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], 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", @@ -173,8 +174,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, ), ); @@ -184,6 +225,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}}") ] ); diff --git a/sandstorm.js b/sandstorm.js index e7a67f76..3e04d79f 100644 --- a/sandstorm.js +++ b/sandstorm.js @@ -21,6 +21,187 @@ 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 = + Capnp.importSystem('sandstorm/sandstorm-http-bridge.capnp').SandstormHttpBridge; + + 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'); + 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(), + httpBridge.saveIdentity(identity)]; + 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 } }); + + updateUserPermissions(login.userId, permissions); + done(); + }); + }); + }).catch((e) => { + done(e, null); + }); + })(); + }, + }); + + 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) => { + // 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 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); + 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; @@ -58,29 +239,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 +284,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 @@ -137,6 +318,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. @@ -176,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 diff --git a/server/lib/utils.js b/server/lib/utils.js index b59671fb..bc3807bb 100644 --- a/server/lib/utils.js +++ b/server/lib/utils.js @@ -5,3 +5,8 @@ allowIsBoardAdmin = function(userId, board) { allowIsBoardMember = function(userId, board) { return board && board.hasMember(userId); }; + +allowIsBoardMemberByCard = function(userId, card) { + const board = card.board(); + return board && board.hasMember(userId); +}; diff --git a/server/publications/activities.js b/server/publications/activities.js index 38c61ebf..14459bf8 100644 --- a/server/publications/activities.js +++ b/server/publications/activities.js @@ -3,16 +3,16 @@ // 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, - }, { + const selector = (hideSystem) ? {$and: [{activityType: 'addComment'}, {[`${kind}Id`]: id}]} : {[`${kind}Id`]: id}; + return Activities.find(selector, { limit, sort: {createdAt: -1}, }); diff --git a/server/publications/boards.js b/server/publications/boards.js index cd3ef238..133082dd 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, @@ -97,22 +98,28 @@ Meteor.publishRelations('board', function(boardId) { this.cursor(Cards.find({ boardId }), function(cardId) { this.cursor(CardComments.find({ cardId })); this.cursor(Attachments.find({ cardId })); + this.cursor(Checklists.find({ cardId })); }); - // 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. + 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: _.without(memberIds, thisUserId)}, + }, { fields: { + 'username': 1, + 'profile.fullname': 1, + 'profile.avatarUrl': 1, + }})); + + this.cursor(presences.find({ userId: { $in: memberIds } })); + } }); return this.ready(); |