summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.eslintrc.json12
-rw-r--r--.gitmodules3
-rw-r--r--.meteor/.finished-upgraders3
-rw-r--r--.meteor/packages42
-rw-r--r--.meteor/release2
-rw-r--r--.meteor/versions185
-rw-r--r--.travis.yml28
-rw-r--r--.tx/config2
-rw-r--r--CHANGELOG.md300
-rw-r--r--Dockerfile67
-rw-r--r--README.md186
-rwxr-xr-xapp.env3
-rw-r--r--app.json2
-rw-r--r--client/components/boards/boardBody.jade2
-rw-r--r--client/components/boards/boardBody.js6
-rw-r--r--client/components/boards/boardHeader.jade8
-rw-r--r--client/components/boards/boardHeader.js52
-rw-r--r--client/components/cards/cardDate.jade12
-rw-r--r--client/components/cards/cardDate.js6
-rw-r--r--client/components/cards/cardDetails.jade45
-rw-r--r--client/components/cards/cardDetails.js8
-rw-r--r--client/components/cards/checklists.jade34
-rw-r--r--client/components/cards/checklists.js10
-rw-r--r--client/components/cards/minicard.jade14
-rw-r--r--client/components/cards/minicard.styl27
-rw-r--r--client/components/lists/list.js6
-rw-r--r--client/components/lists/listBody.jade2
-rw-r--r--client/components/lists/listBody.js7
-rw-r--r--client/components/lists/listHeader.jade23
-rw-r--r--client/components/main/header.js2
-rw-r--r--client/components/main/layouts.jade1
-rw-r--r--client/components/main/layouts.js2
-rw-r--r--client/components/main/layouts.styl5
-rw-r--r--client/components/settings/invitationCode.jade5
-rw-r--r--client/components/settings/invitationCode.js6
-rw-r--r--client/components/settings/settingBody.jade79
-rw-r--r--client/components/settings/settingBody.js132
-rw-r--r--client/components/settings/settingBody.styl112
-rw-r--r--client/components/settings/settingHeader.jade21
-rw-r--r--client/components/settings/settingHeader.styl25
-rw-r--r--client/components/sidebar/sidebar.jade34
-rw-r--r--client/components/sidebar/sidebar.js41
-rw-r--r--client/components/sidebar/sidebar.styl22
-rw-r--r--client/components/users/userHeader.jade2
-rw-r--r--client/components/users/userHeader.js3
-rw-r--r--client/config/blazeHelpers.js4
-rw-r--r--client/lib/escapeActions.js4
-rw-r--r--client/lib/i18n.js14
-rw-r--r--client/lib/utils.js2
-rw-r--r--config/accounts.js13
-rw-r--r--config/router.js20
-rw-r--r--docker-compose.yml6
-rw-r--r--fix-download-unicode/cfs_access-point.txt914
-rw-r--r--i18n/ar.i18n.json64
-rw-r--r--i18n/br.i18n.json62
-rw-r--r--i18n/ca.i18n.json66
-rw-r--r--i18n/cs.i18n.json66
-rw-r--r--i18n/de.i18n.json100
-rw-r--r--i18n/en.i18n.json69
-rw-r--r--i18n/eo.i18n.json355
-rw-r--r--i18n/es-ES.i18n.json64
-rw-r--r--i18n/es.i18n.json69
-rw-r--r--i18n/eu.i18n.json355
-rw-r--r--i18n/fa.i18n.json328
-rw-r--r--i18n/fi.i18n.json56
-rw-r--r--i18n/fr.i18n.json302
-rw-r--r--i18n/he.i18n.json464
-rw-r--r--[-rwxr-xr-x]i18n/it.i18n.json78
-rw-r--r--i18n/ja.i18n.json304
-rw-r--r--i18n/ko.i18n.json452
-rw-r--r--i18n/no.i18n.json355
-rw-r--r--i18n/pl.i18n.json66
-rw-r--r--i18n/pt-BR.i18n.json182
-rw-r--r--i18n/ro.i18n.json62
-rw-r--r--i18n/ru.i18n.json192
-rw-r--r--i18n/sr.i18n.json140
-rw-r--r--i18n/sv.i18n.json355
-rw-r--r--i18n/ta.i18n.json355
-rw-r--r--i18n/th.i18n.json355
-rw-r--r--i18n/tr.i18n.json482
-rw-r--r--i18n/zh-CN.i18n.json104
-rw-r--r--i18n/zh-TW.i18n.json64
-rw-r--r--meta/screenshots/board-view.jpgbin33060 -> 0 bytes
-rwxr-xr-xmeta/screenshots/board_view_01.pngbin0 -> 129922 bytes
-rwxr-xr-xmeta/screenshots/board_view_02.pngbin0 -> 111954 bytes
-rw-r--r--models/activities.js2
-rw-r--r--models/boards.js136
-rw-r--r--models/cardComments.js62
-rw-r--r--models/cards.js131
-rw-r--r--models/checklists.js104
-rw-r--r--models/export.js80
-rw-r--r--models/import.js44
-rw-r--r--models/invitationCodes.js45
-rw-r--r--models/lists.js69
-rw-r--r--models/settings.js145
-rw-r--r--models/unsavedEdits.js3
-rw-r--r--models/users.js174
-rw-r--r--package.json22
m---------packages/kadira:flow-router0
-rw-r--r--sandstorm-pkgdef.capnp20
-rw-r--r--sandstorm.js3
-rw-r--r--server/authentication.js52
-rw-r--r--server/lib/utils.js4
-rw-r--r--server/logger.js66
-rw-r--r--server/notifications/email.js2
-rw-r--r--server/observableChanges.js100
-rw-r--r--server/publications/settings.js13
-rw-r--r--server/publications/users.js8
108 files changed, 7701 insertions, 2116 deletions
diff --git a/.eslintrc.json b/.eslintrc.json
index 4808d873..5fa05a38 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -51,7 +51,9 @@
"object-shorthand": 2,
"prefer-const": 2,
"prefer-spread": 2,
- "prefer-template": 2
+ "prefer-template": 2,
+ "no-console": 0,
+ "no-unused-vars" : "warn"
},
"globals": {
"Meteor": false,
@@ -118,7 +120,13 @@
"allowIsBoardAdmin": true,
"allowIsBoardMember": true,
"allowIsBoardMemberByCard": true,
+ "allowIsBoardMemberNonComment": true,
"Emoji": true,
- "Checklists": true
+ "Checklists": true,
+ "Settings": true,
+ "InvitationCodes": true,
+ "Winston":true,
+ "JsonRoutes": true,
+ "Authentication": true
}
}
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 00000000..3db61f5f
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "packages/kadira:flow-router"]
+ path = packages/kadira:flow-router
+ url = https://github.com/wekan/flow-router.git
diff --git a/.meteor/.finished-upgraders b/.meteor/.finished-upgraders
index 7bd71978..a8020370 100644
--- a/.meteor/.finished-upgraders
+++ b/.meteor/.finished-upgraders
@@ -12,3 +12,6 @@ notices-for-facebook-graph-api-2
1.2.0-breaking-changes
1.3.0-split-minifiers-package
1.3.5-remove-old-dev-bundle-link
+1.4.0-remove-old-dev-bundle-link
+1.4.1-add-shell-server-package
+1.4.3-split-account-service-packages
diff --git a/.meteor/packages b/.meteor/packages
index 32d7389c..f5fce1f6 100644
--- a/.meteor/packages
+++ b/.meteor/packages
@@ -3,17 +3,17 @@
# 'meteor add' and 'meteor remove' will edit this file for you,
# but you can also edit it by hand.
-meteor-base
+meteor-base@1.0.4
# Build system
-ecmascript
-stylus
-standard-minifier-css
-standard-minifier-js
+ecmascript@0.7.2
+stylus@2.513.9
+standard-minifier-css@1.3.4
+standard-minifier-js@2.0.0
mquandalle:jade
# Polyfills
-es5-shim
+es5-shim@4.6.15
# Collections
aldeed:collection2
@@ -24,33 +24,32 @@ dburles:collection-helpers
idmontie:migrations
matb33:collection-hooks
matteodem:easy-search
-mongo
+mongo@1.1.16
mquandalle:collection-mutations
# Account system
-accounts-password
+accounts-password@1.3.5
kenton:accounts-sandstorm
-service-configuration
+service-configuration@1.0.11
useraccounts:core
useraccounts:unstyled
useraccounts:flow-routing
-email
+email@1.2.0
# Utilities
-check
-jquery
-random
-reactive-dict
-session
-tracker
-underscore
+check@1.2.5
+jquery@1.11.10
+random@1.0.10
+reactive-dict@1.1.8
+session@1.1.7
+tracker@1.1.2
+underscore@1.0.10
3stack:presence
alethes:pages
arillo:flow-router-helpers
-audit-argument-checks
+audit-argument-checks@1.0.7
kadira:blaze-layout
kadira:dochead
-kadira:flow-router
meteorhacks:fast-render
meteorhacks:picker
meteorhacks:subs-manager
@@ -62,7 +61,7 @@ tap:i18n
# UI components
blaze
-reactive-var
+reactive-var@1.0.11
fortawesome:fontawesome
mousetrap:mousetrap
mquandalle:jquery-textcomplete
@@ -76,3 +75,6 @@ templates:tabs
verron:autosize
simple:json-routes
rajit:bootstrap3-datepicker
+kadira:flow-router
+shell-server@0.2.3
+simple:rest-accounts-password
diff --git a/.meteor/release b/.meteor/release
index fcf9d2d7..605b4e1f 100644
--- a/.meteor/release
+++ b/.meteor/release
@@ -1 +1 @@
-METEOR@1.3.5.1
+METEOR@1.4.4.1
diff --git a/.meteor/versions b/.meteor/versions
index 4ca2f780..4c1fccf4 100644
--- a/.meteor/versions
+++ b/.meteor/versions
@@ -1,26 +1,26 @@
3stack:presence@1.0.5
-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
+accounts-base@1.2.16
+accounts-password@1.3.5
+aldeed:collection2@2.10.0
+aldeed:collection2-core@1.2.0
+aldeed:schema-deny@1.1.0
+aldeed:schema-index@1.1.1
aldeed:simple-schema@1.5.3
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
+autoupdate@1.3.12
+babel-compiler@6.18.2
+babel-runtime@1.0.1
+base64@1.0.10
+binary-heap@1.0.10
+blaze@2.3.2
+blaze-tools@1.0.10
+boilerplate-generator@1.0.11
+caching-compiler@1.1.9
+caching-html-compiler@1.1.2
+callback-hook@1.0.10
cfs:access-point@0.1.49
cfs:base-package@0.0.30
cfs:collection@0.5.5
@@ -38,64 +38,64 @@ cfs:storage-adapter@0.2.3
cfs:tempstore@0.1.5
cfs:upload-http@0.0.20
cfs:worker@0.1.4
-check@1.2.3
+check@1.2.5
chuangbo:cookie@1.1.0
-coffeescript@1.1.4
-cottz:publish-relations@2.0.6
-dburles:collection-helpers@1.0.4
+coffeescript@1.12.3_1
+cottz:publish-relations@2.0.7
+dburles:collection-helpers@1.1.0
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
+ddp-client@1.3.4
+ddp-common@1.2.8
+ddp-rate-limiter@1.0.7
+ddp-server@1.3.14
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.9
+diff-sequence@1.0.7
+ecmascript@0.7.3
+ecmascript-runtime@0.3.15
+ejson@1.0.13
+email@1.2.1
+es5-shim@4.6.15
+fastclick@1.0.13
+fortawesome:fontawesome@4.7.0
+geojson-utils@1.0.10
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.9
+html-tools@1.0.11
+htmljs@1.0.11
+http@1.2.12
+id-map@1.0.9
+idmontie:migrations@1.0.3
+jquery@1.11.10
kadira:blaze-layout@2.3.0
kadira:dochead@1.5.0
kadira:flow-router@2.12.1
-kenton:accounts-sandstorm@0.5.1
-launch-screen@1.0.12
+kenton:accounts-sandstorm@0.6.0
+launch-screen@1.1.1
livedata@1.0.18
-localstorage@1.0.11
-logging@1.0.14
-matb33:collection-hooks@0.8.1
+localstorage@1.0.12
+logging@1.1.17
+matb33:collection-hooks@0.8.4
matteodem:easy-search@1.6.4
-mdg:validation-error@0.2.0
-meteor@1.1.16
+mdg:validation-error@0.5.1
+meteor@1.6.1
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.14.0
+meteorhacks:fast-render@2.16.0
meteorhacks:inject-data@2.0.0
meteorhacks:meteorx@1.4.1
meteorhacks:picker@1.0.3
meteorhacks:subs-manager@1.6.4
meteorspark:util@0.2.0
-minifier-css@1.1.13
-minifier-js@1.1.13
+minifier-css@1.2.16
+minifier-js@2.0.0
minifiers@1.1.8-faster-rebuild.0
-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
+minimongo@1.0.21
+mobile-status-bar@1.0.14
+modules@0.8.2
+modules-runtime@0.7.10
+mongo@1.1.16
+mongo-id@1.0.6
mongo-livedata@1.0.12
mousetrap:mousetrap@1.4.6_1
mquandalle:autofocus@1.0.0
@@ -107,52 +107,59 @@ 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.8.6_3
-npm-mongo@1.4.45
-observe-sequence@1.0.12
+npm-bcrypt@0.9.2
+npm-mongo@2.2.24
+observe-sequence@1.0.16
ongoworks:speakingurl@1.1.0
-ordered-dict@1.0.8
+ordered-dict@1.0.9
peerlibrary:assert@0.2.5
-peerlibrary:base-component@0.14.0
+peerlibrary:base-component@0.16.0
peerlibrary:blaze-components@0.15.1
-peerlibrary:computed-field@0.3.1
-peerlibrary:reactive-field@0.1.0
+peerlibrary:computed-field@0.6.1
+peerlibrary:reactive-field@0.3.0
perak:markdown@1.0.5
-promise@0.7.3
+promise@0.8.8
raix:eventemitter@0.1.3
raix:handlebar-helpers@0.2.5
-rajit:bootstrap3-datepicker@1.5.1
+rajit:bootstrap3-datepicker@1.6.4
random@1.0.10
-rate-limit@1.0.5
+rate-limit@1.0.8
reactive-dict@1.1.8
-reactive-var@1.0.10
-reload@1.1.10
-retry@1.0.8
-routepolicy@1.0.11
+reactive-var@1.0.11
+reload@1.1.11
+retry@1.0.9
+routepolicy@1.0.12
seriousm:emoji-continued@1.4.0
-service-configuration@1.0.10
-session@1.1.6
-sha@1.0.8
-simple:json-routes@1.0.4
-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
+service-configuration@1.0.11
+session@1.1.7
+sha@1.0.9
+shell-server@0.2.3
+simple:authenticate-user-by-token@1.0.1
+simple:json-routes@2.1.0
+simple:rest-accounts-password@1.1.2
+simple:rest-bearer-token-parser@1.0.1
+simple:rest-json-error-handler@1.0.1
+softwarerero:accounts-t9n@1.3.9
+spacebars@1.0.15
+spacebars-compiler@1.1.2
+srp@1.0.10
+standard-minifier-css@1.3.4
+standard-minifier-js@2.0.0
+stylus@2.513.9
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
+templates:tabs@2.3.0
+templating@1.3.2
+templating-compiler@1.3.2
+templating-runtime@1.3.2
+templating-tools@1.1.2
+tracker@1.1.2
+ui@1.0.13
+underscore@1.0.10
+url@1.1.0
useraccounts:core@1.14.2
useraccounts:flow-routing@1.14.2
useraccounts:unstyled@1.14.2
verron:autosize@3.0.8
-webapp@1.2.11
+webapp@1.3.15
webapp-hashing@1.0.9
zimme:active-route@2.3.2
diff --git a/.travis.yml b/.travis.yml
index a8724631..1bdc5b25 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,8 +1,32 @@
-sudo: false
+dist: trusty
+sudo: required
+
+env:
+ TRAVIS_DOCKER_COMPOSE_VERSION: 1.12.0
+ TRAVIS_NODE_VERSION: 4.8.1
+ TRAVIS_NPM_VERSION: 4.4.4
+
+before_install:
+ - sudo apt-get update -y
+ - npm install -g npm@${TRAVIS_NPM_VERSION}
+ - sudo curl -fsSL https://get.docker.com/ | sh
+ - if [ -e /usr/local/bin/docker-compose ]; then sudo rm /usr/local/bin/docker-compose; fi
+ - sudo curl -L https://github.com/docker/compose/releases/download/${TRAVIS_DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` > docker-compose
+ - sudo chmod +x docker-compose
+ - sudo mv docker-compose /usr/local/bin
+ - sudo docker-compose build --no-cache --force-rm
+ - sudo docker-compose up -d wekandb
+ - sudo docker-compose up -d wekan
+ # ^^ Note - need to come up with some way of checking the output from docker run
+ # that it was a success... perhaps the nodejs server can output a success message?
+
language: node_js
+
node_js:
- - "0.10.40"
+ - "${TRAVIS_NODE_VERSION}"
+
install:
- "npm install"
+
script:
- "npm test"
diff --git a/.tx/config b/.tx/config
index f2527c8f..95855893 100644
--- a/.tx/config
+++ b/.tx/config
@@ -39,7 +39,7 @@ host = https://www.transifex.com
# tap:i18n requires us to use `-` separator in the language identifiers whereas
# Transifex uses a `_` separator, without an option to customize it on one side
# or the other, so we need to do a Manual mapping.
-lang_map = es_ES:es-ES, fa_IR:fa, pt_BR:pt-BR, ro_RO:ro, zh_CN:zh-CN, zh_TW:zh-TW
+lang_map = es_ES:es-ES, fa_IR:fa, fi_FI:fi, hu_HU:hu, pt_BR:pt-BR, ro_RO:ro, zh_CN:zh-CN, zh_TW:zh-TW
[wekan.application]
file_filter = i18n/<lang>.i18n.json
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6d1deb86..9b2ec0d4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,37 +1,306 @@
-# v0.11.1 Upcoming Wekan release
+# Upcoming Wekan release
+
+This release adds the following new features:
+
+* [Change the way to delete a list (card-like)](https://github.com/wekan/wekan/pull/1050)
+
+Thanks to GitHub users BaobabCoder for contributions.
+
+# v0.23 2017-05-21 Wekan release
+
+This release adds the following new features:
+
+* [Add checklist and card comment to REST API](https://github.com/wekan/wekan/pull/1033);
+* [Add token authentication to REST API](https://github.com/wekan/wekan/pull/1033), this fixes
+ [Security flaws introduced by REST API](https://github.com/wekan/wekan/issues/1032);
+* [Authorization improvements etc to REST API](https://github.com/wekan/wekan/pull/1041);
+* [IE 11 support in unicode filename downloads](https://github.com/wekan/wekan/issues/1031).
+
+and fixes the following bugs:
+
+* [When Wekan starts, there's "here1 false" messages in
+ console](https://github.com/wekan/wekan/issues/1028);
+* [IE11 problem when closing cards, sidebar etc](https://github.com/wekan/wekan/pull/1042).
+
+Thanks to GitHub users huneau, mayjs and nztqa for their contributions.
+
+# v0.22 2017-05-07 Wekan release
+
+This release fixes the following bugs:
+
+* [Download file(unicode filename) cause crash with exception](https://github.com/wekan/wekan/issues/784)
+
+Thanks to GitHub user yatusiter for contributions.
+
+# v0.21 2017-05-07 Wekan release
+
+Known bugs:
+
+* https://github.com/wekan/wekan/issues/784
+
+This release fixes the following bugs:
+
+* Update release version number to package.json.
+
+Thanks to GitHub user xet7 for contributions.
+
+# v0.20 2017-05-07 Wekan release
+
+Known bugs:
+
+* https://github.com/wekan/wekan/issues/784
+
+This release fixes the following bugs:
+
+* Docker images missing latest Debian updates.
+
+Thanks to GitHub user xet7 for contributions.
+
+# v0.19 2017-05-06 Wekan release
+
+Known bugs:
+
+* https://github.com/wekan/wekan/issues/784
+
+This release adds the following new features:
+
+* Set first user as admin, it there is no existing
+ users and Wekan is not running at Sandstorm;
+* New Docker Compose [Wekan-MongoDB](https://github.com/wekan/wekan-mongodb)
+ and [Wekan-PostgreSQL](https://github.com/wekan/wekan-postgresql)
+ that use Meteor v1.4 and Node v4 based Wekan's meteor-1.4 branch;
+* [Console, file, and zulip logger on database changes](https://github.com/wekan/wekan/pull/1010);
+* [REST API first step](https://github.com/wekan/wekan/pull/1003);
+* [Install from source](https://github.com/wekan/wekan/wiki/Install-and-Update#install-manually-from-source)
+ has been updated to new meteor 1.4 version;
+* meteor-1.4 branch has been merged to devel and master branches,
+ where development continues from now on. Previous code has been moved to
+ meteor-1.3-2017-04-27 branch;
+* [VirtualBox image updated](https://wekan.xet7.org).
+
+and fixes the following bugs:
+
+* isCommentOnly false fix for Trello import;
+* Node version to 4.8.1 to solve 100% CPU issue;
+* Fix bson error on Docker and install from source;
+* Try other key servers on Dockerfile if ha.pool.sks-keyservers.net is unreachable.
+
+Thanks to GitHub users brylie, huneau, johnniesong, rhelsing, stephenmoloney,
+xet7 and Zokormazo for contributions.
+
+# v0.18 2017-04-02 Wekan release
+
+Known bugs:
+
+* https://github.com/wekan/wekan/issues/784
+
+This release adds the following new features:
+
+* Add TLS toggle option to smtp configuration;
+* [Comment permissions](https://github.com/wekan/wekan/issues/870);
+* Add bigger screenshots for Sandstorm.
+
+and fixes the following bugs:
+
+* Fix email settings loading:
+ MAIL_URL was overriden with database info all the time.
+ Now if MAIL_URL exists is not overwritten and if neither MAIL_URL nor
+ exists valid admin panel data MAIL_URL is not set.
+ MAIL_FROM was ignored. Same behaviour, env variable has bigger priority
+ than database configuration.
+ On both cases, althrought environment variable is set, updating admin-panel
+ mail settings will load new info and ignore the environment variable;
+* Dockerfile fix for local packages;
+* Don't send emails if missing smtp host;
+* Remove invitation code if email sending failed;
+* Show customized error msg while invitaion code is wrong during registration;
+* Fix "internal error" while registration is done;
+* Fix "cannot access disableRegistration of undefined" error;
+* Add high available server for getting the gpg keys - suppose it should lead
+ to fewer failures on getting the gpg keys leading to some rare build failures;
+* Add a docker build to the .travis.yml - this will help determine if pull
+ requests need further review before merging into devel;
+* Use navigator language by default instead of English.
+
+Thanks to GitHub users JamborJan, lkisme, rhelsing, Serubi, stephenmoloney,
+umbertooo and Zokormazo for their contributions.
+
+# v0.17 2017-03-25 Wekan release
+
+Known bugs:
+
+* https://github.com/wekan/wekan/issues/784
+
+This release fixes the following bugs:
+
+* Double slash problem on card pop-ups;
+* No need for Array.prototype if using rest operator;
+* Fix default font so Chinese is shown correctly.
+ Still looking for better solution for #914 although
+ commit had wrong number #707.
+
+Thanks to GitHub users mo-han, Serubin and vuxor for
+their contributions.
+
+# v0.16 2017-03-15 Wekan release
+
+Added missing changelog updates.
+
+# v0.15 2017-03-15 Wekan release
+
+Updated translations.
+
+# v0.14 2017-03-15 Wekan release
+
+Known bugs:
+
+* https://github.com/wekan/wekan/issues/785
+* https://github.com/wekan/wekan/issues/784
+
+This release fixes the following bug:
+
+* Set IE compatibility mode to Edge to so that
+ Wekan board loads correctly.
+
+Thanks to GitHub users immertroll and REJack for
+their contributions.
+
+# v0.13 2017-03-12 Wekan release
+
+Known bugs:
+
+* https://github.com/wekan/wekan/issues/785
+* https://github.com/wekan/wekan/issues/784
+
+This release fixes the following bug:
+
+* Admin Panel: Set mail-from to environment immediately after changed,
+ allow user set a blank username and password pair in SMTP setting.
+
+Thanks to GitHub user lkisme for contributions.
+
+# v0.12 2017-03-05 Wekan release
+
+Known bugs:
+
+* https://github.com/wekan/wekan/issues/785
+* https://github.com/wekan/wekan/issues/784
+
+This release adds the following new features:
+
+* Import Checklists from Trello;
+* Simplified release numbers of Wekan.
+
+Thanks to GitHub users whodafly and xet7 for
+their contributions.
+
+# v0.11.1-rc2 2017-03-05 Wekan prerelease
+
+Known bugs:
+
+* https://github.com/wekan/wekan/issues/785
+* https://github.com/wekan/wekan/issues/784
+
+This release adds the following supported platforms:
+
+* [Docker environment for Wekan development](https://github.com/wekan/wekan-dev);
+* [Wekan <=> MongoDB <=> ToroDB => PostgreSQL read-only
+ mirroring](https://github.com/wekan/wekan-postgresql)
+ for SQL access with any programming language
+ or Office package that has PostgreSQL support, like
+ newest LibreOffice 3.5;
+* [Install from source on
+ Windows](https://github.com/wekan/wekan/wiki/Install-Wekan-from-source-on-Windows).
+
+and adds the following new features:
+
+* Admin Panel:
+```
+ 1) Disable Self-Registration and invite users
+ 2) SMTP settings.
+
+ Adding Admin user in mongo cli:
+ 1) Use database that has wekan data, for example:
+ use admin;
+ 2) Add Admin rights to some Wekan username:
+ db.users.update({username:'admin-username-here'},{$set:{isAdmin:true}})
+ Hiding Admin panel by removing Admin rights:
+ use admin;
+ db.settings.remove({});
+```
+* Make Due Date layout nicer on minicard;
+* Added tooltip for board menu and sidebar buttons;
+* [Wekan database cleanup script](https://github.com/wekan/wekan-cleanup);
+* [Daily export script of Wekan changes as JSON to Logstash and
+ ElasticSearch / Kibana (ELK)](https://github.com/wekan/wekan-logstash);
+* [Wekan stats script](https://github.com/wekan/wekan-stats).
+
+and fixes the following bugs:
+
+* Dockerfile was missing EXPOSE $PORT;
+* Bug when removing user from board that generate activity for
+ all cards of the board. Add check before user is one owner
+ of the card before adding activity;
+* All new boards are automatically starred. Fixed to
+ only star header-bar new-boards;
+* Orphan documents were created when cards were deleted;
+* Improve Wekan performance by adding indexes to MongoDB;
+* Invite user with lower case email;
+* Typos.
+
+Thanks to GitHub users eemeli, entrptaher, fmonthel, jLouzado, lkisme,
+maulal, pra85, vuxor, whittssg2 and xet7 for their contributions.
+
+# v0.11.1-rc1 2017-02-10 Wekan prerelease
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.
+Known bugs:
+* https://github.com/wekan/wekan/issues/785
+* https://github.com/wekan/wekan/issues/784
+
This release adds the following supported platforms:
* Docker;
-* Docker on SLES12SP1.
+* Docker on SLES12SP1;
+* Install from source.
and adds the following new features:
* Checklists;
-* Remove a list.
+* Remove a list;
+* Admin of board can leave board if he/she
+ is not last admin in the board;
+* Shortcuts popup, link to it on
+ bottom right corner;
+* Links are now underlined and change
+ link color on hover;
+* Added YuGothic and Meiryo fonts to show
+ non-English text correctly.
and fixes the following bugs:
+* Update xss to v0.3.3;
* 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.
+* New MongoDB version breaks uploading files
+ and avatars, so using older version;
+* Tweaked .gitignore to exclude .build/*;
+* Fix executeUpTo label when dragging cards,
+ popup was not in the predefined hierarchy.
-and adds the following new documentation to Wefork wiki,
-to be moved to Wekan wiki:
+and adds the following new documentation:
-* Developer Documentation
-* Docker
-* Docker NginxProxy
+* Developer Documentation;
+* Docker;
+* and others.
-Thanks to GitHub users BaobabCoder, jLouzado, lkisme, mario-orlicky,
-martingabelmann, mquandalle, stephenmoloney, umbertooo, xet7 and
-qge for their contributions.
+Thanks to GitHub users AlexanderR, BaobabCoder, jLouzado, kamijin-fanta,
+lkisme, mario-orlicky, martingabelmann, mquandalle, stephenmoloney,
+umbertooo, xet7 and qge for their contributions.
# v0.11.0 2016-12-16 Wekan fork first release
@@ -73,6 +342,7 @@ This release adds the following new features:
* 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:
@@ -103,12 +373,12 @@ This release features:
* Trello boards importation, including card history, assigned members, labels,
comments, and attachments;
-* Invite new users to a board using a email address;
+* Invite new users to a board using an email address;
* Autocompletion in the minicard editor. Start with <kbd>@</kbd> to start a
board member autocompletion, or <kbd>#</kbd> for a label;
* Improve the user interface on small screens so that Wekan could be used on the
mobile web;
-* Accelerate the initial page rendering by sending the data on the intial HTTP
+* Accelerate the initial page rendering by sending the data on the initial HTTP
response instead of waiting for the DDP connection to open;
* Support images attachments copy pasting;
* On Sandstorm, expose the Wekan grain title and URL to the Sandstorm shell;
diff --git a/Dockerfile b/Dockerfile
index b6e8b3df..7ef90364 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,19 +1,23 @@
-FROM debian:wheezy
-MAINTAINER wefork
+FROM debian:8.7
+MAINTAINER wekan
# Declare Arguments
ARG NODE_VERSION
ARG METEOR_RELEASE
+ARG METEOR_EDGE
+ARG USE_EDGE
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 BUILD_DEPS="wget curl bzip2 build-essential python git ca-certificates gcc-4.9"
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 NODE_VERSION ${NODE_VERSION:-v4.8.1}
+ENV METEOR_RELEASE ${METEOR_RELEASE:-1.4.4.1}
+ENV USE_EDGE ${USE_EDGE:-false}
+ENV METEOR_EDGE ${METEOR_EDGE:-1.5-beta.17}
+ENV NPM_VERSION ${NPM_VERSION:-4.6.1}
ENV ARCHITECTURE ${ARCHITECTURE:-linux-x64}
ENV SRC_PATH ${SRC_PATH:-./}
@@ -25,7 +29,7 @@ RUN \
useradd --user-group --system --home-dir /home/wekan wekan && \
\
# OS dependencies
- apt-get update -y && apt-get install -y --no-install-recommends ${BUILD_DEPS} && \
+ apt-get update -y && apt-get dist-upgrade -y && apt-get install -y --no-install-recommends ${BUILD_DEPS} && \
\
# Gosu installation
GOSU_ARCHITECTURE="$(dpkg --print-architecture | awk -F- '{ print $NF }')" && \
@@ -44,14 +48,24 @@ RUN \
# Verify nodejs authenticity
grep ${NODE_VERSION}-${ARCHITECTURE}.tar.gz SHASUMS256.txt.asc | shasum -a 256 -c - && \
export GNUPGHOME="$(mktemp -d)" && \
- gpg --keyserver pool.sks-keyservers.net --recv-keys 9554F04D7259F04124DE6B476D5A82AC7E37093B && \
- gpg --keyserver pool.sks-keyservers.net --recv-keys 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 && \
- gpg --keyserver pool.sks-keyservers.net --recv-keys FD3A5288F042B6850C66B31F09FE44734EB7990E && \
- 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 && \
+
+ # Try other key servers if ha.pool.sks-keyservers.net is unreachable
+ # Code from https://github.com/chorrell/docker-node/commit/2b673e17547c34f17f24553db02beefbac98d23c
+ # gpg keys listed at https://github.com/nodejs/node#release-team
+ # and keys listed here from previous version of this Dockerfile
+ for key in \
+ 9554F04D7259F04124DE6B476D5A82AC7E37093B \
+ 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \
+ FD3A5288F042B6850C66B31F09FE44734EB7990E \
+ 71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \
+ DD8F2338BAE7501E3DD5AC78C273792F7D83545D \
+ C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \
+ B9AE9905FFD7803F25714661B63B535A4C206CA9 \
+ ; do \
+ gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key" || \
+ gpg --keyserver pgp.mit.edu --recv-keys "$key" || \
+ gpg --keyserver keyserver.pgp.com --recv-keys "$key" ; \
+ done && \
gpg --verify SHASUMS256.txt.asc && \
rm -R "$GNUPGHOME" SHASUMS256.txt.asc && \
\
@@ -63,7 +77,7 @@ RUN \
ln -s /opt/nodejs/bin/npm /usr/bin/npm && \
\
# Install Node dependencies
- npm install npm@${NPM_VERSION} -g && \
+ npm install -g npm@${NPM_VERSION} && \
npm install -g node-gyp && \
npm install -g fibers && \
\
@@ -74,12 +88,28 @@ RUN \
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 && \
+ \
+ # Check if opting for a release candidate instead of major release
+ if [ "$USE_EDGE" = false ]; then \
+ gosu wekan:wekan sh ./install_meteor.sh; \
+ else \
+ gosu wekan:wekan git clone --recursive git://github.com/meteor/meteor.git /home/wekan/.meteor && \
+ cd /home/wekan/.meteor && \
+ gosu wekan:wekan git checkout release/METEOR@${METEOR_EDGE} && \
+ gosu wekan /home/wekan/.meteor/meteor -- help; \
+ fi && \
\
# Build app
cd /home/wekan/app && \
- gosu wekan /home/wekan/.meteor/meteor npm install --save xss && \
+ gosu wekan /home/wekan/.meteor/meteor add standard-minifier-js && \
+ gosu wekan /home/wekan/.meteor/meteor npm install && \
gosu wekan /home/wekan/.meteor/meteor build --directory /home/wekan/app_build && \
+ cp /home/wekan/app/fix-download-unicode/cfs_access-point.txt /home/wekan/app_build/bundle/programs/server/packages/cfs_access-point.js && \
+ chown wekan:wekan /home/wekan/app_build/bundle/programs/server/packages/cfs_access-point.js && \
+ gosu wekan sed -i "s|build\/Release\/bson|browser_build\/bson|g" /home/wekan/app_build/bundle/programs/server/npm/node_modules/meteor/cfs_gridfs/node_modules/mongodb/node_modules/bson/ext/index.js && \
+ cd /home/wekan/app_build/bundle/programs/server/npm/node_modules/meteor/npm-bcrypt && \
+ gosu wekan rm -rf node_modules/bcrypt && \
+ gosu wekan npm install bcrypt && \
cd /home/wekan/app_build/bundle/programs/server/ && \
gosu wekan npm install && \
mv /home/wekan/app_build/bundle /build && \
@@ -94,5 +124,6 @@ RUN \
rm /home/wekan/install_meteor.sh
ENV PORT=80
+EXPOSE $PORT
CMD ["node", "/build/main.js"]
diff --git a/README.md b/README.md
index c2342f80..522cca93 100644
--- a/README.md
+++ b/README.md
@@ -1,20 +1,20 @@
# Wekan
-[![Wekan chat][vanila_badge]][vanila_chat]
+[![Wekan Build Status][travis_badge]][travis_status]
-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.
+Freenode IRC #wekan
-[Wefork announcement and merging back][fork_announcement]
+[![Wekan chat][vanila_badge]][vanila_chat]
-[![Wefork Build Status][travis_badge]][travis_status]
+[Translate Wekan at Transifex][translate_wekan]
-[Wefork FAQ][fork_faq]
+[Open Hub analysis of Wekan code](https://www.openhub.net/p/wekan)
-[Translate Wekan at Transifex][translate_wekan]
+Please read [FAQ](https://github.com/wekan/wekan/wiki/FAQ).
+Please don't feed the trolls and spammers that are mentioned in the FAQ :)
-Wekan is an open-source and collaborative kanban board application.
+Wekan is an completely [Open Source][open_source] and [Free software][free_software]
+collaborative kanban board application with MIT license.
Whether you’re maintaining a personal todo list, planning your holidays with
some friends, or working in a team on your next revolutionary idea, Kanban
@@ -22,161 +22,73 @@ boards are an unbeatable tool to keep your things organized. They give you a
visual overview of the current state of your project, and make you productive by
allowing you to focus on the few items that matter the most.
-Wekan supports most features you would expect of it including a real-time user
-interface, import from Trello (on standalone Wekan), cards comments, checklists,
-member assignations, customizable labels, closing lists, filtered views, and more.
+Wekan has real-time user interface. Not all features are implemented.
-SSO options like LDAP, passwordless email, SAML, GitHub and Google Auth are
-already available on Sandstorm, not standalone Wekan. Sandstorm is now completely
-Open Source, including server clustering.
+[Features][features]
-Since Wekan is a free software, you don’t have to trust us with your data and can
-install Wekan on your own computer or server. In fact we encourage you to do
-that by providing one-click installation on various platforms.
+Wekan supports many [Platforms][platforms], and plan is to add more.
+
+[Integrations][integrations]
+
+[Team](https://github.com/wekan/wekan/wiki/Team)
+
+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.
+many use cases. If you don't find your feature or integration in
+GitHub issues and [Features][features] or [Integrations][integrations]
+page at wiki, please add them.
We are very welcoming to new developers and teams to submit new pull
requests to devel branch to make this Wekan App Development Platform possible
-faster. By working directly with Wekan you get the benefit of active
-maintenance and new features added by growing Wekan developer community.
-Please see [Developer Documentation][dev_docs] to get started.
+faster. Please see [Developer Documentation][dev_docs] to get started.
+We also welcome sponsors for features, although we don't have any yet.
+By working directly with Wekan you get the benefit of active maintenance
+and new features added by growing Wekan developer community.
-Roadmap is handled using [Wekan GitHub issues][wekan_issues].
-If you don't see your feature request or use case there, please add it.
+[Roadmap is self-hosted on Wekan][roadmap_wefork]
-Newer [Wefork GitHub issues][wefork_issues] will be be moved to there also.
+Roadmaps is not currently up-to-date. You can find more up-to-date
+info from [Features][features] and [Integrations][integrations] pages,
+where is links to [Wekan GitHub issues][wekan_issues] where actual
+work happens.
+## Screenshot
-## Screenshots
+[![Screenshot of Wekan][screenshot_wefork]][roadmap_wefork]
-[![Screenshot of Wekan][screenshot_wekan]][roadmap_wekan]
-
-[![Screenshot of Wefork][screenshot_wefork]][roadmap_wefork]
+Content is being copied from [old Wekan roadmap][roadmap_wekan] to
+new one in process of merging Wefork back to Wekan.
Since Wekan is a free software, you don’t have to trust us with your data and can
install Wekan on your own computer or server. In fact we encourage you to do
that by providing one-click installation on various platforms.
-## Supported Platforms
-
-Automatic generated newest builds are available for Docker, and some others that
-install directly from this repo. Automatic builds will be added later for more
-platforms.
-
-### Docker: [Docker image][docker_image], [Docs][docker_docs], [Docker Nginx proxy][docker_nginxproxy], [Docker Issue][docker_issue]
-
-Docker 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).
-[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
+[platforms]: https://github.com/wekan/wekan/wiki/Platforms
+[dev_docs]: https://github.com/wekan/wekan/wiki/Developer-Documentation
[screenshot_wekan]: http://i.imgur.com/cI4jW2h.png
-[screenshot_wefork]: http://i.imgur.com/ShX2OTk.png
+[screenshot_wefork]: http://i.imgur.com/lzvpeS9.png
+[features]: https://github.com/wekan/wekan/wiki/Features
+[integrations]: https://github.com/wekan/wekan/wiki/Integrations
[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/wefork/wekan/tree/master
-[indiehosters_button]: https://indie.host/signup.png
-[indiehosters_saas]: https://indiehosters.net/shop/product/wekan-20
-[scalingo_button]: https://cdn.scalingo.com/deploy/button.svg
-[scalingo_deploy]: https://my.scalingo.com/deploy?source=https://github.com/wefork/wekan#master
-[cloudron_button]: https://cloudron.io/img/button.svg
-[cloudron_install]: https://cloudron.io/button.html?app=io.wekan.cloudronapp
-[debian_wheezy]: https://github.com/soohwa/sps/blob/master/example/docs/1/wekan.md
-[travis_badge]: https://travis-ci.org/wefork/wekan.svg?branch=devel
-[travis_status]: https://travis-ci.org/wefork/wekan
-[install_source]: https://github.com/wefork/wekan/wiki/Install-from-source
-[sles]: https://github.com/wekan/wekan/wiki/Install-Wekan-Docker-on-SUSE-Linux-Enterprise-Server-12-SP1
-[virtualbox]: https://github.com/wekan/wekan/wiki/virtual-appliance
-[sandstorm_spk]: https://github.com/wefork/wekan/issues/36
-[docker_image]: https://hub.docker.com/r/mquandalle/wekan/
-[docker_docs]: https://github.com/wefork/wekan/wiki/Docker
-[docker_nginxproxy]: https://github.com/wefork/wekan/wiki/Docker-NginxProxy
-[docker_issue]: https://github.com/wefork/wekan/issues/33
+[docker_image]: https://hub.docker.com/r/wekanteam/wekan/
+[travis_badge]: https://travis-ci.org/wekan/wekan.svg?branch=devel
+[travis_status]: https://travis-ci.org/wekan/wekan
+[wekan_wiki]: https://github.com/wekan/wekan/wiki
[translate_wekan]: https://www.transifex.com/wekan/wekan/
-[autoinstall]: https://github.com/wefork/wekan-autoinstall
-[autoinstall_issue]: https://github.com/anselal/wekan/issues/18
-[dev_docs]: https://github.com/wekan/wekan/wiki/Developer-Documentation
+[open_source]: https://en.wikipedia.org/wiki/Open-source_software
+[free_software]: https://en.wikipedia.org/wiki/Free_software
+[vanila_badge]: https://vanila.io/img/join-chat-button2.png
+[vanila_chat]: https://chat.vanila.io/channel/wekan
diff --git a/app.env b/app.env
new file mode 100755
index 00000000..b047d258
--- /dev/null
+++ b/app.env
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+export PACKAGE_DIRS="$(pwd)/packages"
diff --git a/app.json b/app.json
index 2bf5cf37..6d3ce917 100644
--- a/app.json
+++ b/app.json
@@ -4,7 +4,7 @@
"repository": "https://github.com/wekan/wekan",
"logo": "https://raw.githubusercontent.com/wekan/wekan/master/meta/icons/wekan-150.png",
"keywords": ["productivity", "tool", "team", "kanban"],
- "website": "http://wekan.io",
+ "website": "https://wekan.github.io",
"env": {
"BUILDPACK_URL": "https://github.com/AdmitHub/meteor-buildpack-horse.git",
"ROOT_URL": {
diff --git a/client/components/boards/boardBody.jade b/client/components/boards/boardBody.jade
index 288590da..fe10c921 100644
--- a/client/components/boards/boardBody.jade
+++ b/client/components/boards/boardBody.jade
@@ -25,7 +25,7 @@ template(name="boardBody")
+list(this)
if currentCardIsInThisList
+cardDetails(currentCard)
- if currentUser.isBoardMember
+ if canSeeAddList
+addListForm
template(name="addListForm")
diff --git a/client/components/boards/boardBody.js b/client/components/boards/boardBody.js
index 4703bc91..370db13b 100644
--- a/client/components/boards/boardBody.js
+++ b/client/components/boards/boardBody.js
@@ -204,3 +204,9 @@ BlazeComponent.extendComponent({
}];
},
}).register('addListForm');
+
+Template.boardBody.helpers({
+ canSeeAddList() {
+ return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
+ },
+});
diff --git a/client/components/boards/boardHeader.jade b/client/components/boards/boardHeader.jade
index 03768b36..e61aea35 100644
--- a/client/components/boards/boardHeader.jade
+++ b/client/components/boards/boardHeader.jade
@@ -65,7 +65,7 @@ template(name="boardHeaderBar")
if $eq watchLevel "muted"
i.fa.fa-bell-slash
span {{_ watchLevel}}
-
+
else
a.board-header-btn.js-log-in(
title="{{_ 'log-in'}}")
@@ -81,7 +81,7 @@ template(name="boardHeaderBar")
a.board-header-btn-close.js-filter-reset(title="{{_ 'filter-clear'}}")
i.fa.fa-times-thin
- if currentUser.isBoardMember
+ if canModifyBoard
a.board-header-btn.js-multiselection-activate(
title="{{#if MultiSelection.isActive}}{{_ 'multi-selection-on'}}{{else}}{{_ 'multi-selection'}}{{/if}}"
class="{{#if MultiSelection.isActive}}emphasis{{/if}}")
@@ -92,7 +92,7 @@ template(name="boardHeaderBar")
i.fa.fa-times-thin
.separator
- a.board-header-btn.js-open-board-menu
+ a.board-header-btn.js-open-board-menu(title="{{_ 'boardMenuPopup-title'}}")
i.board-header-btn-icon.fa.fa-navicon
template(name="boardMenuPopup")
@@ -170,7 +170,7 @@ template(name="boardChangeColorPopup")
if isSelected
i.fa.fa-check
-template(name="createBoardPopup")
+template(name="createBoard")
form
label
| {{_ 'title'}}
diff --git a/client/components/boards/boardHeader.js b/client/components/boards/boardHeader.js
index a76b566a..10d9925a 100644
--- a/client/components/boards/boardHeader.js
+++ b/client/components/boards/boardHeader.js
@@ -15,17 +15,17 @@ Template.boardMenuPopup.events({
}),
});
-Template.boardMenuPopup.helpers({
- exportUrl() {
- const boardId = Session.get('currentBoard');
- const loginToken = Accounts._storedLoginToken();
- return FlowRouter.url(`api/boards/${boardId}?authToken=${loginToken}`);
- },
- exportFilename() {
- const boardId = Session.get('currentBoard');
- return `wekan-export-board-${boardId}.json`;
- },
-});
+// Template.boardMenuPopup.helpers({
+// exportUrl() {
+// const boardId = Session.get('currentBoard');
+// const loginToken = Accounts._storedLoginToken();
+// return FlowRouter.url(`api/boards/${boardId}?authToken=${loginToken}`);
+// },
+// exportFilename() {
+// const boardId = Session.get('currentBoard');
+// return `wekan-export-board-${boardId}.json`;
+// },
+// });
Template.boardChangeTitlePopup.events({
submit(evt, tpl) {
@@ -97,6 +97,12 @@ BlazeComponent.extendComponent({
},
}).register('boardHeaderBar');
+Template.boardHeaderBar.helpers({
+ canModifyBoard() {
+ return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
+ },
+});
+
BlazeComponent.extendComponent({
backgroundColors() {
return Boards.simpleSchema()._schema.color.allowedValues;
@@ -119,10 +125,15 @@ BlazeComponent.extendComponent({
},
}).register('boardChangeColorPopup');
-BlazeComponent.extendComponent({
+const CreateBoard = BlazeComponent.extendComponent({
+ template() {
+ return 'createBoard';
+ },
+
onCreated() {
this.visibilityMenuIsOpen = new ReactiveVar(false);
this.visibility = new ReactiveVar('private');
+ this.boardId = new ReactiveVar('');
},
visibilityCheck() {
@@ -143,15 +154,12 @@ BlazeComponent.extendComponent({
const title = this.find('.js-new-board-title').value;
const visibility = this.visibility.get();
- const boardId = Boards.insert({
+ this.boardId.set(Boards.insert({
title,
permission: visibility,
- });
-
- Utils.goBoardId(boardId);
+ }));
- // Immediately star boards crated with the headerbar popup.
- Meteor.user().toggleBoardStar(boardId);
+ Utils.goBoardId(this.boardId.get());
},
events() {
@@ -166,6 +174,14 @@ BlazeComponent.extendComponent({
},
}).register('createBoardPopup');
+(class HeaderBarCreateBoard extends CreateBoard {
+ onSubmit(evt) {
+ super.onSubmit(evt);
+ // Immediately star boards crated with the headerbar popup.
+ Meteor.user().toggleBoardStar(this.boardId.get());
+ }
+}).register('headerBarCreateBoardPopup');
+
BlazeComponent.extendComponent({
visibilityCheck() {
const currentBoard = Boards.findOne(Session.get('currentBoard'));
diff --git a/client/components/cards/cardDate.jade b/client/components/cards/cardDate.jade
index a2a28bbd..525f27ed 100644
--- a/client/components/cards/cardDate.jade
+++ b/client/components/cards/cardDate.jade
@@ -15,6 +15,12 @@ template(name="editCardDate")
button.js-delete-date.negate.wide.right.js-delete-date {{_ 'delete'}}
template(name="dateBadge")
- a.js-edit-date.card-date(title="{{showTitle}}" class="{{classes}}")
- time(datetime="{{showISODate}}")
- | {{showDate}}
+ if canModifyCard
+ a.js-edit-date.card-date(title="{{showTitle}}" class="{{classes}}")
+ time(datetime="{{showISODate}}")
+ | {{showDate}}
+ else
+ a.card-date(title="{{showTitle}}" class="{{classes}}")
+ time(datetime="{{showISODate}}")
+ | {{showDate}}
+
diff --git a/client/components/cards/cardDate.js b/client/components/cards/cardDate.js
index 4d129e8e..3f69f384 100644
--- a/client/components/cards/cardDate.js
+++ b/client/components/cards/cardDate.js
@@ -86,6 +86,12 @@ const EditCardDate = BlazeComponent.extendComponent({
},
});
+Template.dateBadge.helpers({
+ canModifyCard() {
+ return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
+ },
+});
+
// editCardStartDatePopup
(class extends EditCardDate {
onCreated() {
diff --git a/client/components/cards/cardDetails.jade b/client/components/cards/cardDetails.jade
index cf113951..9c95e92f 100644
--- a/client/components/cards/cardDetails.jade
+++ b/client/components/cards/cardDetails.jade
@@ -8,7 +8,7 @@ template(name="cardDetails")
if currentUser.isBoardMember
a.fa.fa-navicon.card-details-menu.js-open-card-details-menu
h2.card-details-title.js-card-title(
- class="{{#if currentUser.isBoardMember}}js-open-inlined-form is-editable{{/if}}")
+ class="{{#if canModifyCard}}js-open-inlined-form is-editable{{/if}}")
= title
if isWatching
i.fa.fa-eye.card-details-watch
@@ -22,16 +22,16 @@ template(name="cardDetails")
each members
+userAvatar(userId=this cardId=../_id)
| {{! XXX Hack to hide syntaxic coloration /// }}
- if currentUser.isBoardMember
+ if canModifyCard
a.member.add-member.card-details-item-add-button.js-add-members(title="{{_ 'card-members-title'}}")
i.fa.fa-plus
.card-details-item.card-details-item-labels
h3.card-details-item-title {{_ 'labels'}}
- a(class="{{#if currentUser.isBoardMember}}js-add-labels{{else}}is-disabled{{/if}}" title="{{_ 'card-labels-title'}}")
+ a(class="{{#if canModifyCard}}js-add-labels{{else}}is-disabled{{/if}}" title="{{_ 'card-labels-title'}}")
each labels
span.card-label(class="card-label-{{color}}" title=name)= name
- if currentUser.isBoardMember
+ if canModifyCard
a.card-label.add-label.js-add-labels(title="{{_ 'card-labels-title'}}")
i.fa.fa-plus
@@ -47,7 +47,7 @@ template(name="cardDetails")
//- XXX We should use "editable" to avoid repetiting ourselves
- if currentUser.isBoardMember
+ if canModifyCard
h3.card-details-item-title {{_ 'description'}}
+inlinedCardDescription(classNames="card-description js-card-description")
+editor(autofocus=true)
@@ -101,23 +101,24 @@ template(name="editCardTitleForm")
template(name="cardDetailsActionsPopup")
ul.pop-over-list
li: a.js-toggle-watch-card {{#if isWatching}}{{_ 'unwatch'}}{{else}}{{_ 'watch'}}{{/if}}
- hr
- ul.pop-over-list
- 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'}}
- li: a.js-move-card-to-bottom {{_ 'moveCardToBottom-title'}}
- hr
- ul.pop-over-list
- li: a.js-move-card {{_ 'moveCardPopup-title'}}
- unless archived
- li: a.js-archive {{_ 'archive-card'}}
- li: a.js-more {{_ 'cardMorePopup-title'}}
+ if canModifyCard
+ hr
+ ul.pop-over-list
+ 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'}}
+ li: a.js-move-card-to-bottom {{_ 'moveCardToBottom-title'}}
+ hr
+ ul.pop-over-list
+ li: a.js-move-card {{_ 'moveCardPopup-title'}}
+ unless archived
+ li: a.js-archive {{_ 'archive-card'}}
+ li: a.js-more {{_ 'cardMorePopup-title'}}
template(name="moveCardPopup")
+boardLists
diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js
index b7e0ef76..b39f8e59 100644
--- a/client/components/cards/cardDetails.js
+++ b/client/components/cards/cardDetails.js
@@ -28,6 +28,10 @@ BlazeComponent.extendComponent({
return card.findWatcher(Meteor.userId());
},
+ canModifyCard() {
+ return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
+ },
+
scrollParentContainer() {
const cardPanelWidth = 510;
const bodyBoardComponent = this.parentComponent();
@@ -140,6 +144,10 @@ Template.cardDetailsActionsPopup.helpers({
isWatching() {
return this.findWatcher(Meteor.userId());
},
+
+ canModifyCard() {
+ return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
+ },
});
Template.cardDetailsActionsPopup.events({
diff --git a/client/components/cards/checklists.jade b/client/components/cards/checklists.jade
index 987e6cd9..a0d89351 100644
--- a/client/components/cards/checklists.jade
+++ b/client/components/cards/checklists.jade
@@ -3,12 +3,13 @@ template(name="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'}}...
+ if canModifyCard
+ +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)
@@ -16,9 +17,13 @@ template(name="checklistDetail")
else
.checklist-title
.checkbox.fa.fa-check-square-o
- a.js-delete-checklist {{_ "delete"}}...
+ if canModifyCard
+ 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}}
+ if canModifyCard
+ h2.title.js-open-inlined-form.is-editable {{checklist.title}}
+ else
+ h2.title {{checklist.title}}
+checklistItems(checklist = checklist)
template(name="addChecklistItemForm")
@@ -37,7 +42,7 @@ template(name="editChecklistItemForm")
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
+ if canModifyCard
a.js-delete-checklist-item {{_ "delete"}}...
template(name="checklistItems")
@@ -47,7 +52,7 @@ template(name="checklistItems")
+editChecklistItemForm(type = 'item' item = item checklist = checklist)
else
+itemDetail(item = item checklist = checklist)
- if currentUser.isBoardMember
+ if canModifyCard
+inlinedForm(classNames="js-add-checklist-item" checklist = checklist)
+addChecklistItemForm
else
@@ -57,5 +62,10 @@ template(name="checklistItems")
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}}
+ if canModifyCard
+ .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}}
+ else
+ .materialCheckBox(class="{{#if item.isFinished }}is-checked{{/if}}")
+ .item-title(class="{{#if item.isFinished }}is-checked{{/if}}") {{item.title}}
+
diff --git a/client/components/cards/checklists.js b/client/components/cards/checklists.js
index 5dac7bd3..b8f5e443 100644
--- a/client/components/cards/checklists.js
+++ b/client/components/cards/checklists.js
@@ -26,6 +26,10 @@ BlazeComponent.extendComponent({
checklist.setTitle(title);
},
+ canModifyCard() {
+ return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
+ },
+
editChecklistItem(event) {
event.preventDefault();
@@ -73,6 +77,12 @@ BlazeComponent.extendComponent({
},
}).register('checklists');
+Template.itemDetail.helpers({
+ canModifyCard() {
+ return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
+ },
+});
+
BlazeComponent.extendComponent({
toggleItem() {
const checklist = this.currentData().checklist;
diff --git a/client/components/cards/minicard.jade b/client/components/cards/minicard.jade
index 8b46ee74..5409ec62 100644
--- a/client/components/cards/minicard.jade
+++ b/client/components/cards/minicard.jade
@@ -7,6 +7,13 @@ template(name="minicard")
each labels
.minicard-label(class="card-label-{{color}}" title="{{name}}")
.minicard-title= title
+ .dates
+ if startAt
+ .date
+ +minicardStartDate
+ if dueAt
+ .date
+ +minicardDueDate
if members
.minicard-members.js-minicard-members
each members
@@ -23,14 +30,7 @@ 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 12a89785..a6aad896 100644
--- a/client/components/cards/minicard.styl
+++ b/client/components/cards/minicard.styl
@@ -77,7 +77,12 @@
height: @width
border-radius: 2px
margin-left: 3px
-
+ .dates
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ .date
+ margin-right: 3px
.badges
float: left
margin-top: 7px
@@ -91,25 +96,20 @@
margin-right: 11px
margin-bottom: 3px
font-size: 0.9em
-
+ &.is-finished
+ background: #3cb500
+ padding: 0px 3px
+ border-radius: 3px
+ color: white
+
&:last-of-type
margin-right: 0
.badge-icon,
.badge-text
vertical-align: middle
-
- &.is-finished
- background: #3cb500
- padding: 0px 3px
- border-radius: 3px
- color: white
-
- .badge-icon,
- .badge-text
- vertical-align: middle//didn't figure why use top, it'd be easier to fill bg if it's middle. This was introduced in commit "91cfcf7b12b5e7c137c2e765b2c378dde6b82966" & "* Improve the design of the minicards badges" was mentioned.
&.badge-comment
- margin-bottom: 0.1rem
+ margin-bottom: 0.1rem
.badge-text
font-size: 0.9em
@@ -119,7 +119,6 @@
padding-left: 0px
line-height: 12px
-
.minicard-members
float: right
margin: 2px -8px -2px 0
diff --git a/client/components/lists/list.js b/client/components/lists/list.js
index e1909783..9c191348 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) {
@@ -79,10 +79,10 @@ BlazeComponent.extendComponent({
});
function userIsMember() {
- return Meteor.user() && Meteor.user().isBoardMember();
+ return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
}
- // Disable drag-dropping if the current user is not a board member
+ // Disable drag-dropping if the current user is not a board member or is comment only
this.autorun(() => {
$cards.sortable('option', 'disabled', !userIsMember());
});
diff --git a/client/components/lists/listBody.jade b/client/components/lists/listBody.jade
index e659b179..01aa7179 100644
--- a/client/components/lists/listBody.jade
+++ b/client/components/lists/listBody.jade
@@ -12,7 +12,7 @@ template(name="listBody")
.materialCheckBox.multi-selection-checkbox.js-toggle-multi-selection(
class="{{#if MultiSelection.isSelected _id}}is-checked{{/if}}")
+minicard(this)
- if currentUser.isBoardMember
+ if canSeeAddCard
+inlinedForm(autoclose=false position="bottom")
+addCardForm(listId=_id position="bottom")
else
diff --git a/client/components/lists/listBody.js b/client/components/lists/listBody.js
index 34c2dcd6..bdc812c7 100644
--- a/client/components/lists/listBody.js
+++ b/client/components/lists/listBody.js
@@ -239,3 +239,10 @@ BlazeComponent.extendComponent({
});
},
}).register('addCardForm');
+
+
+Template.listBody.helpers({
+ canSeeAddCard() {
+ return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
+ },
+});
diff --git a/client/components/lists/listHeader.jade b/client/components/lists/listHeader.jade
index 81afebe1..11905586 100644
--- a/client/components/lists/listHeader.jade
+++ b/client/components/lists/listHeader.jade
@@ -25,17 +25,18 @@ template(name="editListTitleForm")
template(name="listActionPopup")
ul.pop-over-list
li: a.js-toggle-watch-list {{#if isWatching}}{{_ 'unwatch'}}{{else}}{{_ 'watch'}}{{/if}}
- hr
- ul.pop-over-list
- li: a.js-add-card {{_ 'add-card'}}
- if cards.count
- li: a.js-select-cards {{_ 'list-select-cards'}}
- hr
- ul.pop-over-list
- li: a.js-close-list {{_ 'archive-list'}}
- hr
- ul.pop-over-list
- li: a.js-more {{_ 'listMorePopup-title'}}
+ unless currentUser.isCommentOnly
+ hr
+ ul.pop-over-list
+ li: a.js-add-card {{_ 'add-card'}}
+ if cards.count
+ li: a.js-select-cards {{_ 'list-select-cards'}}
+ hr
+ ul.pop-over-list
+ li: a.js-close-list {{_ 'archive-list'}}
+ hr
+ ul.pop-over-list
+ li: a.js-more {{_ 'listMorePopup-title'}}
template(name="boardLists")
ul.pop-over-list
diff --git a/client/components/main/header.js b/client/components/main/header.js
index 0337c72b..49acbfef 100644
--- a/client/components/main/header.js
+++ b/client/components/main/header.js
@@ -13,5 +13,5 @@ Template.header.helpers({
});
Template.header.events({
- 'click .js-create-board': Popup.open('createBoard'),
+ 'click .js-create-board': Popup.open('headerBarCreateBoard'),
});
diff --git a/client/components/main/layouts.jade b/client/components/main/layouts.jade
index 943ebe0f..12fac0a8 100644
--- a/client/components/main/layouts.jade
+++ b/client/components/main/layouts.jade
@@ -2,6 +2,7 @@ head
title Wekan
meta(name="viewport"
content="maximum-scale=1.0,width=device-width,initial-scale=1.0,user-scalable=0")
+ meta(http-equiv="X-UA-Compatible" content="IE=edge")
//- XXX We should use pathFor in the following `href` to support the case
where the application is deployed with a path prefix, but it seems to be
difficult to do that cleanly with Blaze -- at least without adding extra
diff --git a/client/components/main/layouts.js b/client/components/main/layouts.js
index 3df17f41..1e50b01a 100644
--- a/client/components/main/layouts.js
+++ b/client/components/main/layouts.js
@@ -1,4 +1,6 @@
Meteor.subscribe('boards');
+Meteor.subscribe('setting');
+Meteor.subscribe('user-admin');
BlazeLayout.setRoot('body');
diff --git a/client/components/main/layouts.styl b/client/components/main/layouts.styl
index 38fd83ec..349ee743 100644
--- a/client/components/main/layouts.styl
+++ b/client/components/main/layouts.styl
@@ -351,6 +351,11 @@ a
background: darken(white, 13%)
overflow-y: auto
+ a
+ text-decoration: underline
+ &:hover
+ color: #333
+
.basicTabs-container .tabs-content-container
padding: 0
padding-top: 15px
diff --git a/client/components/settings/invitationCode.jade b/client/components/settings/invitationCode.jade
new file mode 100644
index 00000000..171a2663
--- /dev/null
+++ b/client/components/settings/invitationCode.jade
@@ -0,0 +1,5 @@
+template(name='invitationCode')
+ .at-input#invitationcode
+ label(for='at-field-code') {{_ 'invitation-code'}}
+
+ input#at-field-invitationcode(type="text" name='at-field-invitationcode' placeholder="{{_ 'invitation-code'}}")
diff --git a/client/components/settings/invitationCode.js b/client/components/settings/invitationCode.js
new file mode 100644
index 00000000..a403d8ab
--- /dev/null
+++ b/client/components/settings/invitationCode.js
@@ -0,0 +1,6 @@
+Template.invitationCode.onRendered(() => {
+ const setting = Settings.findOne();
+ if (!setting || !setting.disableRegistration) {
+ $('#invitationcode').hide();
+ }
+});
diff --git a/client/components/settings/settingBody.jade b/client/components/settings/settingBody.jade
new file mode 100644
index 00000000..d490ec93
--- /dev/null
+++ b/client/components/settings/settingBody.jade
@@ -0,0 +1,79 @@
+template(name="setting")
+ .setting-content
+ .content-title
+ span {{_ 'settings'}}
+ .content-body
+ .side-menu
+ ul
+ li.active
+ a.js-setting-menu(data-id="registration-setting") {{_ 'registration'}}
+ li
+ a.js-setting-menu(data-id="email-setting") {{_ 'email'}}
+ .main-body
+ if loading.get
+ +spinner
+ else if generalSetting.get
+ +general
+ else if emailSetting.get
+ +email
+
+template(name="general")
+ ul#registration-setting.setting-detail
+ li
+ a.flex.js-toggle-registration
+ .materialCheckBox(class="{{#if currentSetting.disableRegistration}}is-checked{{/if}}")
+
+ span {{_ 'disable-self-registration'}}
+ li
+ .invite-people(class="{{#if currentSetting.disableRegistration}}{{else}}hide{{/if}}")
+ ul
+ li
+ .title {{_ 'invite-people'}}
+ textarea#email-to-invite.form-control(rows='5', placeholder="{{_ 'email-addresses'}}")
+ li
+ .title {{_ 'to-boards'}}
+ .bg-white
+ each boards
+ a.option.flex.js-toggle-board-choose(id= _id)
+ .materialCheckBox(data-id= _id)
+
+ span= title
+
+ li
+ button.js-email-invite.primary {{_ 'invite'}}
+
+template(name='email')
+ ul#email-setting.setting-detail
+ li.smtp-form
+ .title {{_ 'smtp-host'}}
+ .description {{_ 'smtp-host-description'}}
+ .form-group
+ input.form-control#mail-server-host(type="text", placeholder="smtp.domain.com" value="{{currentSetting.mailServer.host}}")
+ li.smtp-form
+ .title {{_ 'smtp-port'}}
+ .description {{_ 'smtp-port-description'}}
+ .form-group
+ input.form-control#mail-server-port(type="text", placeholder="25" value="{{currentSetting.mailServer.port}}")
+ li.smtp-form
+ .title {{_ 'smtp-username'}}
+ .form-group
+ input.form-control#mail-server-username(type="text", placeholder="{{_ 'username'}}" value="{{currentSetting.mailServer.username}}")
+ li.smtp-form
+ .title {{_ 'smtp-password'}}
+ .form-group
+ input.form-control#mail-server-password(type="text", placeholder="{{_ 'password'}}" value="{{currentSetting.mailServer.password}}")
+ li.smtp-form
+ .title {{_ 'smtp-tls'}}
+ .form-group
+ a.flex.js-toggle-tls
+ .materialCheckBox#mail-server-tls(class="{{#if currentSetting.mailServer.enableTLS}}is-checked{{/if}}")
+
+ span {{_ 'smtp-tls-description'}}
+
+ li.smtp-form
+ .title {{_ 'send-from'}}
+ .form-group
+ input.form-control#mail-server-from(type="email", placeholder="no-reply@domain.com" value="{{currentSetting.mailServer.from}}")
+
+ li
+ button.js-save.primary Save
diff --git a/client/components/settings/settingBody.js b/client/components/settings/settingBody.js
new file mode 100644
index 00000000..f96312a5
--- /dev/null
+++ b/client/components/settings/settingBody.js
@@ -0,0 +1,132 @@
+Meteor.subscribe('setting');
+Meteor.subscribe('mailServer');
+
+BlazeComponent.extendComponent({
+ onCreated() {
+ this.error = new ReactiveVar('');
+ this.loading = new ReactiveVar(false);
+ this.generalSetting = new ReactiveVar(true);
+ this.emailSetting = new ReactiveVar(false);
+ },
+
+ setError(error) {
+ this.error.set(error);
+ },
+
+ setLoading(w) {
+ this.loading.set(w);
+ },
+
+ checkField(selector) {
+ const value = $(selector).val();
+ if(!value || value.trim() === ''){
+ $(selector).parents('li.smtp-form').addClass('has-error');
+ throw Error('blank field');
+ } else {
+ return value;
+ }
+ },
+
+ currentSetting(){
+ return Settings.findOne();
+ },
+
+ boards() {
+ return Boards.find({
+ archived: false,
+ 'members.userId': Meteor.userId(),
+ 'members.isAdmin': true,
+ }, {
+ sort: ['title'],
+ });
+ },
+ toggleRegistration(){
+ this.setLoading(true);
+ const registrationClosed = this.currentSetting().disableRegistration;
+ Settings.update(Settings.findOne()._id, {$set:{disableRegistration: !registrationClosed}});
+ this.setLoading(false);
+ if(registrationClosed){
+ $('.invite-people').slideUp();
+ }else{
+ $('.invite-people').slideDown();
+ }
+ },
+ toggleTLS(){
+ $('#mail-server-tls').toggleClass('is-checked');
+ },
+ switchMenu(event){
+ const target = $(event.target);
+ if(!target.hasClass('active')){
+ $('.side-menu li.active').removeClass('active');
+ target.parent().addClass('active');
+ const targetID = target.data('id');
+ this.generalSetting.set('registration-setting' === targetID);
+ this.emailSetting.set('email-setting' === targetID);
+ }
+ },
+
+ checkBoard(event){
+ let target = $(event.target);
+ if(!target.hasClass('js-toggle-board-choose')){
+ target = target.parent();
+ }
+ const checkboxId = target.attr('id');
+ $(`#${checkboxId} .materialCheckBox`).toggleClass('is-checked');
+ $(`#${checkboxId}`).toggleClass('is-checked');
+ },
+
+ inviteThroughEmail(){
+ const emails = $('#email-to-invite').val().trim().split('\n').join(',').split(',');
+ const boardsToInvite = [];
+ $('.js-toggle-board-choose .materialCheckBox.is-checked').each(function () {
+ boardsToInvite.push($(this).data('id'));
+ });
+ const validEmails = [];
+ emails.forEach((email) => {
+ if (email && SimpleSchema.RegEx.Email.test(email.trim())) {
+ validEmails.push(email.trim());
+ }
+ });
+ if (validEmails.length) {
+ this.setLoading(true);
+ Meteor.call('sendInvitation', validEmails, boardsToInvite, () => {
+ // if (!err) {
+ // TODO - show more info to user
+ // }
+ this.setLoading(false);
+ });
+ }
+ },
+
+ saveMailServerInfo(){
+ this.setLoading(true);
+ $('li').removeClass('has-error');
+
+ try{
+ const host = this.checkField('#mail-server-host');
+ const port = this.checkField('#mail-server-port');
+ const username = $('#mail-server-username').val().trim();
+ const password = $('#mail-server-password').val().trim();
+ const from = this.checkField('#mail-server-from');
+ const tls = $('#mail-server-tls.is-checked').length > 0;
+ Settings.update(Settings.findOne()._id, {$set:{'mailServer.host':host, 'mailServer.port': port, 'mailServer.username': username,
+ 'mailServer.password': password, 'mailServer.enableTLS': tls, 'mailServer.from': from}});
+ } catch (e) {
+ return;
+ } finally {
+ this.setLoading(false);
+ }
+
+ },
+
+ events(){
+ return [{
+ 'click a.js-toggle-registration': this.toggleRegistration,
+ 'click a.js-toggle-tls': this.toggleTLS,
+ 'click a.js-setting-menu': this.switchMenu,
+ 'click a.js-toggle-board-choose': this.checkBoard,
+ 'click button.js-email-invite': this.inviteThroughEmail,
+ 'click button.js-save': this.saveMailServerInfo,
+ }];
+ },
+}).register('setting');
diff --git a/client/components/settings/settingBody.styl b/client/components/settings/settingBody.styl
new file mode 100644
index 00000000..118d364c
--- /dev/null
+++ b/client/components/settings/settingBody.styl
@@ -0,0 +1,112 @@
+.flex
+ display: -webkit-box
+ display: -moz-box
+ display: -webkit-flex
+ display: -moz-flex
+ display: -ms-flexbox
+ display: flex
+
+.setting-content
+ padding 30px
+ color: #727479
+ background: #dedede
+ width 100%
+ height 100%
+ position: absolute;
+
+ .content-title
+ font-size 20px
+
+ .content-body
+ display flex
+ padding-top 15px
+ height 100%
+
+ .side-menu
+ background-color: #f7f7f7;
+ border: 1px solid #f0f0f0;
+ border-radius: 4px;
+ width: 250px;
+ box-shadow: inset -1px -1px 3px rgba(0,0,0,.05);
+
+ ul
+
+ li
+ margin: 0.1rem 0.2rem;
+
+ &.active
+ background #fff
+ box-shadow 0 1px 2px rgba(0,0,0,0.15);
+
+ &:hover
+ background #fff
+ box-shadow 0 1px 2px rgba(0,0,0,0.15);
+ a
+ @extends .flex
+ padding: 1rem 0 1rem 1rem
+ width: 100% - 5rem
+
+
+ span
+ font-size: 13px
+
+ .main-body
+ padding: 0.1em 1em
+
+ ul
+ li
+ padding: 0.5rem 0.5rem;
+
+ a
+ .is-checked
+ border-bottom: 2px solid #2980b9;
+ border-right: 2px solid #2980b9;
+
+ span
+ padding: 0 0.5rem
+
+ .invite-people
+ padding-left 20px;
+ li
+ min-width: 500px;
+
+ ul.no-margin-bottom
+ margin-bottom: 0;
+
+ .bg-white
+ a
+ background #f7f7f7
+ &.is-checked
+ background #fff
+
+
+.option
+ @extends .flex
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+ background: #fff;
+ text-decoration: none;
+ -webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.2);
+ box-shadow: 0 1px 2px rgba(0,0,0,0.2);
+ margin-top: 5px;
+ padding: 5px;
+
+.title
+ font-weight 700;
+ margin-bottom 0.5rem;
+.description
+ margin-bottom 0.5rem;
+.bg-white
+ background #f9fbfc;
+
+.form-control.has-error
+ border-color: #a94442;
+ box-shadow: inset 0 1px 1px rgba(0,0,0,.075);
+
+li.has-error
+ color #a94442
+ .form-group
+ .form-control
+ border-color: #a94442;
+ box-shadow: inset 0 1px 1px rgba(0,0,0,.075);
+
diff --git a/client/components/settings/settingHeader.jade b/client/components/settings/settingHeader.jade
new file mode 100644
index 00000000..fb884056
--- /dev/null
+++ b/client/components/settings/settingHeader.jade
@@ -0,0 +1,21 @@
+template(name="settingHeaderBar")
+ h1.header-setting-menu
+ span {{_ 'admin-panel'}}
+
+ .setting-header-btns.left
+ unless isMiniScreen
+ unless isSandstorm
+ if currentUser
+ a.setting-header-btn.settings.active
+ i.fa(class="fa-cog")
+ span {{_ 'settings'}}
+//TODO
+// a.setting-header-btn.people
+// i.fa(class="fa-users")
+// span {{_ 'people'}}
+
+ else
+ a.setting-header-btn.js-log-in(
+ title="{{_ 'log-in'}}")
+ i.fa.fa-sign-in
+ span {{_ 'log-in'}}
diff --git a/client/components/settings/settingHeader.styl b/client/components/settings/settingHeader.styl
new file mode 100644
index 00000000..995ed26d
--- /dev/null
+++ b/client/components/settings/settingHeader.styl
@@ -0,0 +1,25 @@
+#header #header-main-bar .setting-header-btn
+ &.active,
+ &:hover:not(.is-disabled)
+ background: rgba(0, 0, 0, .15)
+ color: darken(white, 5%)
+ margin-left: 20px;
+ padding-right: 10px;
+ height: 28px;
+ font-size: 13px;
+ float: left;
+ overflow: hidden;
+ line-height: @height;
+ margin: 0 2px;
+
+ i.fa
+ float: left
+ display: block
+ line-height: 28px
+ color: darken(white, 5%)
+ margin: 0 10px
+
+ + span
+ display: inline-block
+ margin-top: 1px
+ margin-right: 10px \ No newline at end of file
diff --git a/client/components/sidebar/sidebar.jade b/client/components/sidebar/sidebar.jade
index f3fdd1bc..6045b371 100644
--- a/client/components/sidebar/sidebar.jade
+++ b/client/components/sidebar/sidebar.jade
@@ -1,16 +1,22 @@
template(name="sidebar")
.board-sidebar.sidebar(class="{{#if isOpen}}is-open{{/if}}")
a.sidebar-tongue.js-toggle-sidebar(
- class="{{#if isTongueHidden}}is-hidden{{/if}}")
+ class="{{#if isTongueHidden}}is-hidden{{/if}}",
+ title="{{showTongueTitle}}")
i.fa.fa-angle-left
- .sidebar-content.js-board-sidebar-content.js-perfect-scrollbar
- a.hide-btn.js-hide-sidebar
- i.fa.fa-angle-right
- unless isDefaultView
- h2
- a.fa.fa-chevron-left.js-back-home
- = getViewTitle
- +Template.dynamic(template=getViewTemplate)
+ .sidebar-shadow
+ .sidebar-content.sidebar-shortcuts
+ a.board-header-btn.js-shortcuts
+ i.fa.fa-keyboard-o
+ span {{_ 'keyboard-shortcuts' }}
+ .sidebar-content.js-board-sidebar-content.js-perfect-scrollbar
+ a.hide-btn.js-hide-sidebar
+ i.fa.fa-angle-right
+ unless isDefaultView
+ h2
+ a.fa.fa-chevron-left.js-back-home
+ = getViewTitle
+ +Template.dynamic(template=getViewTemplate)
template(name='homeSidebar')
+membersWidget
@@ -54,7 +60,7 @@ template(name="labelsWidget")
.board-widget-content
each currentBoard.labels
a.card-label(class="card-label-{{color}}"
- class="{{#if currentUser.isBoardMember}}js-label{{/if}}")
+ class="{{#if currentUser.isNotCommentOnly}}js-label{{/if}}")
span.card-label-name= name
if currentUser.isBoardAdmin
a.card-label.add-label.js-add-label
@@ -132,9 +138,15 @@ template(name="changePermissionsPopup")
li
a(class="{{#if isLastAdmin}}disabled{{else}}js-set-normal{{/if}}")
| {{_ 'normal'}}
- unless isAdmin
+ if isNormal
i.fa.fa-check
span.sub-name {{_ 'normal-desc'}}
+ li
+ a(class="{{#if isLastAdmin}}disabled{{else}}js-set-comment-only{{/if}}")
+ | {{_ 'comment-only'}}
+ if isCommentOnly
+ i.fa.fa-check
+ span.sub-name {{_ 'comment-only-desc'}}
if isLastAdmin
hr
p.quiet.bottom {{_ 'last-admin-desc'}}
diff --git a/client/components/sidebar/sidebar.js b/client/components/sidebar/sidebar.js
index f32a27c5..1290fd13 100644
--- a/client/components/sidebar/sidebar.js
+++ b/client/components/sidebar/sidebar.js
@@ -89,11 +89,21 @@ BlazeComponent.extendComponent({
return TAPi18n.__(viewTitles[this.getView()]);
},
+ showTongueTitle() {
+ if (this.isOpen())
+ return `${TAPi18n.__('sidebar-close')}`;
+ else
+ return `${TAPi18n.__('sidebar-open')}`;
+ },
+
events() {
return [{
'click .js-hide-sidebar': this.hide,
'click .js-toggle-sidebar': this.toggle,
'click .js-back-home': this.setView,
+ 'click .js-shortcuts'() {
+ FlowRouter.go('shortcuts');
+ },
}];
},
}).register('sidebar');
@@ -111,7 +121,17 @@ Template.memberPopup.helpers({
},
memberType() {
const type = Users.findOne(this.userId).isBoardAdmin() ? 'admin' : 'normal';
- return TAPi18n.__(type).toLowerCase();
+ if(type === 'normal'){
+ const currentBoard = Boards.findOne(Session.get('currentBoard'));
+ const commentOnly = currentBoard.hasCommentOnly(this.userId);
+ if(commentOnly){
+ return TAPi18n.__('comment-only').toLowerCase();
+ } else {
+ return TAPi18n.__(type).toLowerCase();
+ }
+ } else {
+ return TAPi18n.__(type).toLowerCase();
+ }
},
isInvited() {
return Users.findOne(this.userId).isInvitedTo(Session.get('currentBoard'));
@@ -134,8 +154,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');
@@ -298,11 +318,12 @@ BlazeComponent.extendComponent({
}).register('addMemberPopup');
Template.changePermissionsPopup.events({
- 'click .js-set-admin, click .js-set-normal'(event) {
+ 'click .js-set-admin, click .js-set-normal, click .js-set-comment-only'(event) {
const currentBoard = Boards.findOne(Session.get('currentBoard'));
const memberId = this.userId;
const isAdmin = $(event.currentTarget).hasClass('js-set-admin');
- currentBoard.setMemberPermission(memberId, isAdmin);
+ const isCommentOnly = $(event.currentTarget).hasClass('js-set-comment-only');
+ currentBoard.setMemberPermission(memberId, isAdmin, isCommentOnly);
Popup.back(1);
},
});
@@ -313,6 +334,16 @@ Template.changePermissionsPopup.helpers({
return currentBoard.hasAdmin(this.userId);
},
+ isNormal() {
+ const currentBoard = Boards.findOne(Session.get('currentBoard'));
+ return !currentBoard.hasAdmin(this.userId) && !currentBoard.hasCommentOnly(this.userId);
+ },
+
+ isCommentOnly() {
+ const currentBoard = Boards.findOne(Session.get('currentBoard'));
+ return !currentBoard.hasAdmin(this.userId) && currentBoard.hasCommentOnly(this.userId);
+ },
+
isLastAdmin() {
const currentBoard = Boards.findOne(Session.get('currentBoard'));
return currentBoard.hasAdmin(this.userId) && (currentBoard.activeAdmins() === 1);
diff --git a/client/components/sidebar/sidebar.styl b/client/components/sidebar/sidebar.styl
index 24abe990..8f2f493e 100644
--- a/client/components/sidebar/sidebar.styl
+++ b/client/components/sidebar/sidebar.styl
@@ -6,11 +6,19 @@
bottom: 0
right: 0
- .sidebar-content
- padding: 12px
+ .sidebar-shadow
+ position: absolute
+ top: 0
+ bottom: 0
+ right: 0
+ left: 0
background: darken(white, 3%)
box-shadow: -10px 0px 5px -10px darken(white, 30%)
z-index: 10
+
+ .sidebar-content
+ padding: 12px
+ margin-bottom: 1.6em
position: absolute
top: 0
bottom: 0
@@ -73,6 +81,16 @@
i.fa
margin-right: 10px
+ .sidebar-shortcuts
+ margin: 0
+ padding: 0
+ top: auto
+ text-align: center
+ font-size: 0.8em
+ line-height: 1.6em
+ vertical-align: middle
+ color: darken(white, 40%)
+
.board-sidebar
width: 248px
right: -@width
diff --git a/client/components/users/userHeader.jade b/client/components/users/userHeader.jade
index ad41e8aa..51b0888b 100644
--- a/client/components/users/userHeader.jade
+++ b/client/components/users/userHeader.jade
@@ -17,6 +17,8 @@ template(name="memberMenuPopup")
li: a.js-change-password {{_ 'changePasswordPopup-title'}}
li: a.js-change-language {{_ 'changeLanguagePopup-title'}}
li: a.js-edit-notification {{_ 'editNotificationPopup-title'}}
+ if currentUser.isAdmin
+ li: a.js-go-setting(href='/setting') {{_ 'admin-panel'}}
hr
ul.pop-over-list
li: a.js-logout {{_ 'log-out'}}
diff --git a/client/components/users/userHeader.js b/client/components/users/userHeader.js
index 98053ed1..73a11fc0 100644
--- a/client/components/users/userHeader.js
+++ b/client/components/users/userHeader.js
@@ -15,6 +15,9 @@ Template.memberMenuPopup.events({
AccountsTemplates.logout();
},
+ 'click .js-go-setting'() {
+ Popup.close();
+ },
});
Template.editProfilePopup.events({
diff --git a/client/config/blazeHelpers.js b/client/config/blazeHelpers.js
index ef075907..73ee24b6 100644
--- a/client/config/blazeHelpers.js
+++ b/client/config/blazeHelpers.js
@@ -18,6 +18,4 @@ Blaze.registerHelper('currentCard', () => {
Blaze.registerHelper('getUser', (userId) => Users.findOne(userId));
-Blaze.registerHelper('concat', function (...args) {
- return Array.prototype.slice.call(args, 0, -1).join('');
-});
+Blaze.registerHelper('concat', (...args) => args.slice(0, -1).join(''));
diff --git a/client/lib/escapeActions.js b/client/lib/escapeActions.js
index dc6b05b7..666e33e0 100644
--- a/client/lib/escapeActions.js
+++ b/client/lib/escapeActions.js
@@ -134,3 +134,7 @@ $(document).on('click', (evt) => {
EscapeActions.clickExecute(evt.target, 'multiselection');
}
});
+
+$(document).on('click', 'a[href=#]', (evt) => {
+ evt.preventDefault();
+});
diff --git a/client/lib/i18n.js b/client/lib/i18n.js
index 34a789e1..4c02211a 100644
--- a/client/lib/i18n.js
+++ b/client/lib/i18n.js
@@ -6,10 +6,16 @@ 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 (currentUser) {
+ language = currentUser.profile && currentUser.profile.language;
+ }
+
+ if (!language) {
+ if(navigator.languages) {
+ language = navigator.languages[0];
+ } else {
+ language = navigator.language || navigator.userLanguage;
+ }
}
if (language) {
diff --git a/client/lib/utils.js b/client/lib/utils.js
index 4f772a60..9a9ff654 100644
--- a/client/lib/utils.js
+++ b/client/lib/utils.js
@@ -27,7 +27,7 @@ Utils = {
// in fact, what we really care is screen size
// large mobile device like iPad or android Pad has a big screen, it should also behave like a desktop
// in a small window (even on desktop), Wekan run in compact mode.
- // we can easily debug with a small window of desktop broswer. :-)
+ // we can easily debug with a small window of desktop browser. :-)
isMiniScreen() {
this.windowResizeDep.depend();
return $(window).width() <= 800;
diff --git a/config/accounts.js b/config/accounts.js
index 9ab26b33..e7faa4cd 100644
--- a/config/accounts.js
+++ b/config/accounts.js
@@ -1,12 +1,20 @@
const passwordField = AccountsTemplates.removeField('password');
const emailField = AccountsTemplates.removeField('email');
+
AccountsTemplates.addFields([{
_id: 'username',
type: 'text',
displayName: 'username',
required: true,
minLength: 2,
-}, emailField, passwordField]);
+}, emailField, passwordField, {
+ _id: 'invitationcode',
+ type: 'text',
+ displayName: 'Invitation Code',
+ required: false,
+ minLength: 6,
+ template: 'invitationCode',
+}]);
AccountsTemplates.configure({
defaultLayout: 'userFormsLayout',
@@ -48,9 +56,6 @@ AccountsTemplates.configureRoute('changePwd', {
});
if (Meteor.isServer) {
- if (process.env.MAIL_FROM) {
- Accounts.emailTemplates.from = process.env.MAIL_FROM;
- }
['resetPassword-subject', 'resetPassword-text', 'verifyEmail-subject', 'verifyEmail-text', 'enrollAccount-subject', 'enrollAccount-text'].forEach((str) => {
const [templateName, field] = str.split('-');
diff --git a/config/router.js b/config/router.js
index 7194621b..72592bd6 100644
--- a/config/router.js
+++ b/config/router.js
@@ -99,6 +99,26 @@ FlowRouter.route('/import', {
},
});
+FlowRouter.route('/setting', {
+ name: 'setting',
+ triggersEnter: [
+ AccountsTemplates.ensureSignedIn,
+ () => {
+ Session.set('currentBoard', null);
+ Session.set('currentCard', null);
+
+ Filter.reset();
+ EscapeActions.executeAll();
+ },
+ ],
+ action() {
+ BlazeLayout.render('defaultLayout', {
+ headerBar: 'settingHeaderBar',
+ content: 'setting',
+ });
+ },
+});
+
FlowRouter.notFound = {
action() {
BlazeLayout.render('defaultLayout', { content: 'notFound' });
diff --git a/docker-compose.yml b/docker-compose.yml
index 35c5bfd1..1463340f 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -3,7 +3,7 @@ version: '2'
services:
wekandb:
- image: mongo:3.2.11
+ image: mongo:3.2.13
container_name: wekan-db
restart: always
command: mongod --smallfiles --oplogSize 128
@@ -16,7 +16,7 @@ services:
- wekan-db-dump:/dump
wekan:
- image: mquandalle/wekan:latest
+ image: wekanteam/wekan:latest
container_name: wekan-app
restart: always
networks:
@@ -30,6 +30,8 @@ services:
- NPM_VERSION=${NPM_VERSION}
- ARCHITECTURE=${ARCHITECTURE}
- SRC_PATH=${SRC_PATH}
+ - METEOR_EDGE=${METEOR_EDGE}
+ - USE_EDGE=${USE_EDGE}
ports:
- 80:80
environment:
diff --git a/fix-download-unicode/cfs_access-point.txt b/fix-download-unicode/cfs_access-point.txt
new file mode 100644
index 00000000..8e3359d0
--- /dev/null
+++ b/fix-download-unicode/cfs_access-point.txt
@@ -0,0 +1,914 @@
+(function () {
+
+/* Imports */
+var Meteor = Package.meteor.Meteor;
+var global = Package.meteor.global;
+var meteorEnv = Package.meteor.meteorEnv;
+var FS = Package['cfs:base-package'].FS;
+var check = Package.check.check;
+var Match = Package.check.Match;
+var EJSON = Package.ejson.EJSON;
+var HTTP = Package['cfs:http-methods'].HTTP;
+
+/* Package-scope variables */
+var rootUrlPathPrefix, baseUrl, getHeaders, getHeadersByCollection, _existingMountPoints, mountUrls;
+
+(function(){
+
+///////////////////////////////////////////////////////////////////////
+// //
+// packages/cfs_access-point/packages/cfs_access-point.js //
+// //
+///////////////////////////////////////////////////////////////////////
+ //
+(function () {
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// packages/cfs:access-point/access-point-common.js //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ //
+rootUrlPathPrefix = __meteor_runtime_config__.ROOT_URL_PATH_PREFIX || ""; // 1
+// Adjust the rootUrlPathPrefix if necessary // 2
+if (rootUrlPathPrefix.length > 0) { // 3
+ if (rootUrlPathPrefix.slice(0, 1) !== '/') { // 4
+ rootUrlPathPrefix = '/' + rootUrlPathPrefix; // 5
+ } // 6
+ if (rootUrlPathPrefix.slice(-1) === '/') { // 7
+ rootUrlPathPrefix = rootUrlPathPrefix.slice(0, -1); // 8
+ } // 9
+} // 10
+ // 11
+// prepend ROOT_URL when isCordova // 12
+if (Meteor.isCordova) { // 13
+ rootUrlPathPrefix = Meteor.absoluteUrl(rootUrlPathPrefix.replace(/^\/+/, '')).replace(/\/+$/, ''); // 14
+} // 15
+ // 16
+baseUrl = '/cfs'; // 17
+FS.HTTP = FS.HTTP || {}; // 18
+ // 19
+// Note the upload URL so that client uploader packages know what it is // 20
+FS.HTTP.uploadUrl = rootUrlPathPrefix + baseUrl + '/files'; // 21
+ // 22
+/** // 23
+ * @method FS.HTTP.setBaseUrl // 24
+ * @public // 25
+ * @param {String} newBaseUrl - Change the base URL for the HTTP GET and DELETE endpoints. // 26
+ * @returns {undefined} // 27
+ */ // 28
+FS.HTTP.setBaseUrl = function setBaseUrl(newBaseUrl) { // 29
+ // 30
+ // Adjust the baseUrl if necessary // 31
+ if (newBaseUrl.slice(0, 1) !== '/') { // 32
+ newBaseUrl = '/' + newBaseUrl; // 33
+ } // 34
+ if (newBaseUrl.slice(-1) === '/') { // 35
+ newBaseUrl = newBaseUrl.slice(0, -1); // 36
+ } // 37
+ // 38
+ // Update the base URL // 39
+ baseUrl = newBaseUrl; // 40
+ // 41
+ // Change the upload URL so that client uploader packages know what it is // 42
+ FS.HTTP.uploadUrl = rootUrlPathPrefix + baseUrl + '/files'; // 43
+ // 44
+ // Remount URLs with the new baseUrl, unmounting the old, on the server only. // 45
+ // If existingMountPoints is empty, then we haven't run the server startup // 46
+ // code yet, so this new URL will be used at that point for the initial mount. // 47
+ if (Meteor.isServer && !FS.Utility.isEmpty(_existingMountPoints)) { // 48
+ mountUrls(); // 49
+ } // 50
+}; // 51
+ // 52
+/* // 53
+ * FS.File extensions // 54
+ */ // 55
+ // 56
+/** // 57
+ * @method FS.File.prototype.url Construct the file url // 58
+ * @public // 59
+ * @param {Object} [options] // 60
+ * @param {String} [options.store] Name of the store to get from. If not defined, the first store defined in `options.stores` for the collection on the client is used.
+ * @param {Boolean} [options.auth=null] Add authentication token to the URL query string? By default, a token for the current logged in user is added on the client. Set this to `false` to omit the token. Set this to a string to provide your own token. Set this to a number to specify an expiration time for the token in seconds.
+ * @param {Boolean} [options.download=false] Should headers be set to force a download? Typically this means that clicking the link with this URL will download the file to the user's Downloads folder instead of displaying the file in the browser.
+ * @param {Boolean} [options.brokenIsFine=false] Return the URL even if we know it's currently a broken link because the file hasn't been saved in the requested store yet.
+ * @param {Boolean} [options.metadata=false] Return the URL for the file metadata access point rather than the file itself.
+ * @param {String} [options.uploading=null] A URL to return while the file is being uploaded. // 66
+ * @param {String} [options.storing=null] A URL to return while the file is being stored. // 67
+ * @param {String} [options.filename=null] Override the filename that should appear at the end of the URL. By default it is the name of the file in the requested store.
+ * // 69
+ * Returns the HTTP URL for getting the file or its metadata. // 70
+ */ // 71
+FS.File.prototype.url = function(options) { // 72
+ var self = this; // 73
+ options = options || {}; // 74
+ options = FS.Utility.extend({ // 75
+ store: null, // 76
+ auth: null, // 77
+ download: false, // 78
+ metadata: false, // 79
+ brokenIsFine: false, // 80
+ uploading: null, // return this URL while uploading // 81
+ storing: null, // return this URL while storing // 82
+ filename: null // override the filename that is shown to the user // 83
+ }, options.hash || options); // check for "hash" prop if called as helper // 84
+ // 85
+ // Primarily useful for displaying a temporary image while uploading an image // 86
+ if (options.uploading && !self.isUploaded()) { // 87
+ return options.uploading; // 88
+ } // 89
+ // 90
+ if (self.isMounted()) { // 91
+ // See if we've stored in the requested store yet // 92
+ var storeName = options.store || self.collection.primaryStore.name; // 93
+ if (!self.hasStored(storeName)) { // 94
+ if (options.storing) { // 95
+ return options.storing; // 96
+ } else if (!options.brokenIsFine) { // 97
+ // We want to return null if we know the URL will be a broken // 98
+ // link because then we can avoid rendering broken links, broken // 99
+ // images, etc. // 100
+ return null; // 101
+ } // 102
+ } // 103
+ // 104
+ // Add filename to end of URL if we can determine one // 105
+ var filename = options.filename || self.name({store: storeName}); // 106
+ if (typeof filename === "string" && filename.length) { // 107
+ filename = '/' + filename; // 108
+ } else { // 109
+ filename = ''; // 110
+ } // 111
+ // 112
+ // TODO: Could we somehow figure out if the collection requires login? // 113
+ var authToken = ''; // 114
+ if (Meteor.isClient && typeof Accounts !== "undefined" && typeof Accounts._storedLoginToken === "function") { // 115
+ if (options.auth !== false) { // 116
+ // Add reactive deps on the user // 117
+ Meteor.userId(); // 118
+ // 119
+ var authObject = { // 120
+ authToken: Accounts._storedLoginToken() || '' // 121
+ }; // 122
+ // 123
+ // If it's a number, we use that as the expiration time (in seconds) // 124
+ if (options.auth === +options.auth) { // 125
+ authObject.expiration = FS.HTTP.now() + options.auth * 1000; // 126
+ } // 127
+ // 128
+ // Set the authToken // 129
+ var authString = JSON.stringify(authObject); // 130
+ authToken = FS.Utility.btoa(authString); // 131
+ } // 132
+ } else if (typeof options.auth === "string") { // 133
+ // If the user supplies auth token the user will be responsible for // 134
+ // updating // 135
+ authToken = options.auth; // 136
+ } // 137
+ // 138
+ // Construct query string // 139
+ var params = {}; // 140
+ if (authToken !== '') { // 141
+ params.token = authToken; // 142
+ } // 143
+ if (options.download) { // 144
+ params.download = true; // 145
+ } // 146
+ if (options.store) { // 147
+ // We use options.store here instead of storeName because we want to omit the queryString // 148
+ // whenever possible, allowing users to have "clean" URLs if they want. The server will // 149
+ // assume the first store defined on the server, which means that we are assuming that // 150
+ // the first on the client is also the first on the server. If that's not the case, the // 151
+ // store option should be supplied. // 152
+ params.store = options.store; // 153
+ } // 154
+ var queryString = FS.Utility.encodeParams(params); // 155
+ if (queryString.length) { // 156
+ queryString = '?' + queryString; // 157
+ } // 158
+ // 159
+ // Determine which URL to use // 160
+ var area; // 161
+ if (options.metadata) { // 162
+ area = '/record'; // 163
+ } else { // 164
+ area = '/files'; // 165
+ } // 166
+ // 167
+ // Construct and return the http method url // 168
+ return rootUrlPathPrefix + baseUrl + area + '/' + self.collection.name + '/' + self._id + filename + queryString; // 169
+ } // 170
+ // 171
+}; // 172
+ // 173
+ // 174
+ // 175
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+}).call(this);
+
+
+
+
+
+
+(function () {
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// packages/cfs:access-point/access-point-handlers.js //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ //
+getHeaders = []; // 1
+getHeadersByCollection = {}; // 2
+ // 3
+FS.HTTP.Handlers = {}; // 4
+ // 5
+/** // 6
+ * @method FS.HTTP.Handlers.Del // 7
+ * @public // 8
+ * @returns {any} response // 9
+ * // 10
+ * HTTP DEL request handler // 11
+ */ // 12
+FS.HTTP.Handlers.Del = function httpDelHandler(ref) { // 13
+ var self = this; // 14
+ var opts = FS.Utility.extend({}, self.query || {}, self.params || {}); // 15
+ // 16
+ // If DELETE request, validate with 'remove' allow/deny, delete the file, and return // 17
+ FS.Utility.validateAction(ref.collection.files._validators['remove'], ref.file, self.userId); // 18
+ // 19
+ /* // 20
+ * From the DELETE spec: // 21
+ * A successful response SHOULD be 200 (OK) if the response includes an // 22
+ * entity describing the status, 202 (Accepted) if the action has not // 23
+ * yet been enacted, or 204 (No Content) if the action has been enacted // 24
+ * but the response does not include an entity. // 25
+ */ // 26
+ self.setStatusCode(200); // 27
+ // 28
+ return { // 29
+ deleted: !!ref.file.remove() // 30
+ }; // 31
+}; // 32
+ // 33
+/** // 34
+ * @method FS.HTTP.Handlers.GetList // 35
+ * @public // 36
+ * @returns {Object} response // 37
+ * // 38
+ * HTTP GET file list request handler // 39
+ */ // 40
+FS.HTTP.Handlers.GetList = function httpGetListHandler() { // 41
+ // Not Yet Implemented // 42
+ // Need to check publications and return file list based on // 43
+ // what user is allowed to see // 44
+}; // 45
+ // 46
+/* // 47
+ requestRange will parse the range set in request header - if not possible it // 48
+ will throw fitting errors and autofill range for both partial and full ranges // 49
+ // 50
+ throws error or returns the object: // 51
+ { // 52
+ start // 53
+ end // 54
+ length // 55
+ unit // 56
+ partial // 57
+ } // 58
+*/ // 59
+var requestRange = function(req, fileSize) { // 60
+ if (req) { // 61
+ if (req.headers) { // 62
+ var rangeString = req.headers.range; // 63
+ // 64
+ // Make sure range is a string // 65
+ if (rangeString === ''+rangeString) { // 66
+ // 67
+ // range will be in the format "bytes=0-32767" // 68
+ var parts = rangeString.split('='); // 69
+ var unit = parts[0]; // 70
+ // 71
+ // Make sure parts consists of two strings and range is of type "byte" // 72
+ if (parts.length == 2 && unit == 'bytes') { // 73
+ // Parse the range // 74
+ var range = parts[1].split('-'); // 75
+ var start = Number(range[0]); // 76
+ var end = Number(range[1]); // 77
+ // 78
+ // Fix invalid ranges? // 79
+ if (range[0] != start) start = 0; // 80
+ if (range[1] != end || !end) end = fileSize - 1; // 81
+ // 82
+ // Make sure range consists of a start and end point of numbers and start is less than end // 83
+ if (start < end) { // 84
+ // 85
+ var partSize = 0 - start + end + 1; // 86
+ // 87
+ // Return the parsed range // 88
+ return { // 89
+ start: start, // 90
+ end: end, // 91
+ length: partSize, // 92
+ size: fileSize, // 93
+ unit: unit, // 94
+ partial: (partSize < fileSize) // 95
+ }; // 96
+ // 97
+ } else { // 98
+ throw new Meteor.Error(416, "Requested Range Not Satisfiable"); // 99
+ } // 100
+ // 101
+ } else { // 102
+ // The first part should be bytes // 103
+ throw new Meteor.Error(416, "Requested Range Unit Not Satisfiable"); // 104
+ } // 105
+ // 106
+ } else { // 107
+ // No range found // 108
+ } // 109
+ // 110
+ } else { // 111
+ // throw new Error('No request headers set for _parseRange function'); // 112
+ } // 113
+ } else { // 114
+ throw new Error('No request object passed to _parseRange function'); // 115
+ } // 116
+ // 117
+ return { // 118
+ start: 0, // 119
+ end: fileSize - 1, // 120
+ length: fileSize, // 121
+ size: fileSize, // 122
+ unit: 'bytes', // 123
+ partial: false // 124
+ }; // 125
+}; // 126
+ // 127
+/** // 128
+ * @method FS.HTTP.Handlers.Get // 129
+ * @public // 130
+ * @returns {any} response // 131
+ * // 132
+ * HTTP GET request handler // 133
+ */ // 134
+FS.HTTP.Handlers.Get = function httpGetHandler(ref) { // 135
+ var self = this; // 136
+ // Once we have the file, we can test allow/deny validators // 137
+ // XXX: pass on the "share" query eg. ?share=342hkjh23ggj for shared url access? // 138
+ FS.Utility.validateAction(ref.collection._validators['download'], ref.file, self.userId /*, self.query.shareId*/); // 139
+ // 140
+ var storeName = ref.storeName; // 141
+ // 142
+ // If no storeName was specified, use the first defined storeName // 143
+ if (typeof storeName !== "string") { // 144
+ // No store handed, we default to primary store // 145
+ storeName = ref.collection.primaryStore.name; // 146
+ } // 147
+ // 148
+ // Get the storage reference // 149
+ var storage = ref.collection.storesLookup[storeName]; // 150
+ // 151
+ if (!storage) { // 152
+ throw new Meteor.Error(404, "Not Found", 'There is no store "' + storeName + '"'); // 153
+ } // 154
+ // 155
+ // Get the file // 156
+ var copyInfo = ref.file.copies[storeName]; // 157
+ // 158
+ if (!copyInfo) { // 159
+ throw new Meteor.Error(404, "Not Found", 'This file was not stored in the ' + storeName + ' store'); // 160
+ } // 161
+ // 162
+ // Set the content type for file // 163
+ if (typeof copyInfo.type === "string") { // 164
+ self.setContentType(copyInfo.type); // 165
+ } else { // 166
+ self.setContentType('application/octet-stream'); // 167
+ } // 168
+ // 169
+ // Add 'Content-Disposition' header if requested a download/attachment URL // 170
+ if (typeof ref.download !== "undefined") { // 171
+ var filename = ref.filename || copyInfo.name; // 172
+ self.addHeader('Content-Disposition', 'attachment; filename="' + filename + '"'); // 173
+ } else { // 174
+ self.addHeader('Content-Disposition', 'inline'); // 175
+ } // 176
+ // 177
+ // Get the contents range from request // 178
+ var range = requestRange(self.request, copyInfo.size); // 179
+ // 180
+ // Some browsers cope better if the content-range header is // 181
+ // still included even for the full file being returned. // 182
+ self.addHeader('Content-Range', range.unit + ' ' + range.start + '-' + range.end + '/' + range.size); // 183
+ // 184
+ // If a chunk/range was requested instead of the whole file, serve that' // 185
+ if (range.partial) { // 186
+ self.setStatusCode(206, 'Partial Content'); // 187
+ } else { // 188
+ self.setStatusCode(200, 'OK'); // 189
+ } // 190
+ // 191
+ // Add any other global custom headers and collection-specific custom headers // 192
+ FS.Utility.each(getHeaders.concat(getHeadersByCollection[ref.collection.name] || []), function(header) { // 193
+ self.addHeader(header[0], header[1]); // 194
+ }); // 195
+ // 196
+ // Inform clients about length (or chunk length in case of ranges) // 197
+ self.addHeader('Content-Length', range.length); // 198
+ // 199
+ // Last modified header (updatedAt from file info) // 200
+ self.addHeader('Last-Modified', copyInfo.updatedAt.toUTCString()); // 201
+ // 202
+ // Inform clients that we accept ranges for resumable chunked downloads // 203
+ self.addHeader('Accept-Ranges', range.unit); // 204
+ // 205
+ if (FS.debug) console.log('Read file "' + (ref.filename || copyInfo.name) + '" ' + range.unit + ' ' + range.start + '-' + range.end + '/' + range.size);
+ // 207
+ var readStream = storage.adapter.createReadStream(ref.file, {start: range.start, end: range.end}); // 208
+ // 209
+ readStream.on('error', function(err) { // 210
+ // Send proper error message on get error // 211
+ if (err.message && err.statusCode) { // 212
+ self.Error(new Meteor.Error(err.statusCode, err.message)); // 213
+ } else { // 214
+ self.Error(new Meteor.Error(503, 'Service unavailable')); // 215
+ } // 216
+ }); // 217
+ // 218
+ readStream.pipe(self.createWriteStream()); // 219
+}; // 220
+
+const originalHandler = FS.HTTP.Handlers.Get;
+FS.HTTP.Handlers.Get = function (ref) {
+//console.log(ref.filename);
+ try {
+ var userAgent = (this.requestHeaders['user-agent']||'').toLowerCase();
+
+ if(userAgent.indexOf('msie') >= 0 || userAgent.indexOf('trident') >= 0 || userAgent.indexOf('chrome') >= 0) {
+ ref.filename = encodeURIComponent(ref.filename);
+ } else if(userAgent.indexOf('firefox') >= 0) {
+ ref.filename = new Buffer(ref.filename).toString('binary');
+ } else {
+ /* safari*/
+ ref.filename = new Buffer(ref.filename).toString('binary');
+ }
+ } catch (ex){
+ ref.filename = 'tempfix';
+ }
+ return originalHandler.call(this, ref);
+};
+ // 221
+/** // 222
+ * @method FS.HTTP.Handlers.PutInsert // 223
+ * @public // 224
+ * @returns {Object} response object with _id property // 225
+ * // 226
+ * HTTP PUT file insert request handler // 227
+ */ // 228
+FS.HTTP.Handlers.PutInsert = function httpPutInsertHandler(ref) { // 229
+ var self = this; // 230
+ var opts = FS.Utility.extend({}, self.query || {}, self.params || {}); // 231
+ // 232
+ FS.debug && console.log("HTTP PUT (insert) handler"); // 233
+ // 234
+ // Create the nice FS.File // 235
+ var fileObj = new FS.File(); // 236
+ // 237
+ // Set its name // 238
+ fileObj.name(opts.filename || null); // 239
+ // 240
+ // Attach the readstream as the file's data // 241
+ fileObj.attachData(self.createReadStream(), {type: self.requestHeaders['content-type'] || 'application/octet-stream'});
+ // 243
+ // Validate with insert allow/deny // 244
+ FS.Utility.validateAction(ref.collection.files._validators['insert'], fileObj, self.userId); // 245
+ // 246
+ // Insert file into collection, triggering readStream storage // 247
+ ref.collection.insert(fileObj); // 248
+ // 249
+ // Send response // 250
+ self.setStatusCode(200); // 251
+ // 252
+ // Return the new file id // 253
+ return {_id: fileObj._id}; // 254
+}; // 255
+ // 256
+/** // 257
+ * @method FS.HTTP.Handlers.PutUpdate // 258
+ * @public // 259
+ * @returns {Object} response object with _id and chunk properties // 260
+ * // 261
+ * HTTP PUT file update chunk request handler // 262
+ */ // 263
+FS.HTTP.Handlers.PutUpdate = function httpPutUpdateHandler(ref) { // 264
+ var self = this; // 265
+ var opts = FS.Utility.extend({}, self.query || {}, self.params || {}); // 266
+ // 267
+ var chunk = parseInt(opts.chunk, 10); // 268
+ if (isNaN(chunk)) chunk = 0; // 269
+ // 270
+ FS.debug && console.log("HTTP PUT (update) handler received chunk: ", chunk); // 271
+ // 272
+ // Validate with insert allow/deny; also mounts and retrieves the file // 273
+ FS.Utility.validateAction(ref.collection.files._validators['insert'], ref.file, self.userId); // 274
+ // 275
+ self.createReadStream().pipe( FS.TempStore.createWriteStream(ref.file, chunk) ); // 276
+ // 277
+ // Send response // 278
+ self.setStatusCode(200); // 279
+ // 280
+ return { _id: ref.file._id, chunk: chunk }; // 281
+}; // 282
+ // 283
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+}).call(this);
+
+
+
+
+
+
+(function () {
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// packages/cfs:access-point/access-point-server.js //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ //
+var path = Npm.require("path"); // 1
+ // 2
+HTTP.publishFormats({ // 3
+ fileRecordFormat: function (input) { // 4
+ // Set the method scope content type to json // 5
+ this.setContentType('application/json'); // 6
+ if (FS.Utility.isArray(input)) { // 7
+ return EJSON.stringify(FS.Utility.map(input, function (obj) { // 8
+ return FS.Utility.cloneFileRecord(obj); // 9
+ })); // 10
+ } else { // 11
+ return EJSON.stringify(FS.Utility.cloneFileRecord(input)); // 12
+ } // 13
+ } // 14
+}); // 15
+ // 16
+/** // 17
+ * @method FS.HTTP.setHeadersForGet // 18
+ * @public // 19
+ * @param {Array} headers - List of headers, where each is a two-item array in which item 1 is the header name and item 2 is the header value.
+ * @param {Array|String} [collections] - Which collections the headers should be added for. Omit this argument to add the header for all collections.
+ * @returns {undefined} // 22
+ */ // 23
+FS.HTTP.setHeadersForGet = function setHeadersForGet(headers, collections) { // 24
+ if (typeof collections === "string") { // 25
+ collections = [collections]; // 26
+ } // 27
+ if (collections) { // 28
+ FS.Utility.each(collections, function(collectionName) { // 29
+ getHeadersByCollection[collectionName] = headers || []; // 30
+ }); // 31
+ } else { // 32
+ getHeaders = headers || []; // 33
+ } // 34
+}; // 35
+ // 36
+/** // 37
+ * @method FS.HTTP.publish // 38
+ * @public // 39
+ * @param {FS.Collection} collection // 40
+ * @param {Function} func - Publish function that returns a cursor. // 41
+ * @returns {undefined} // 42
+ * // 43
+ * Publishes all documents returned by the cursor at a GET URL // 44
+ * with the format baseUrl/record/collectionName. The publish // 45
+ * function `this` is similar to normal `Meteor.publish`. // 46
+ */ // 47
+FS.HTTP.publish = function fsHttpPublish(collection, func) { // 48
+ var name = baseUrl + '/record/' + collection.name; // 49
+ // Mount collection listing URL using http-publish package // 50
+ HTTP.publish({ // 51
+ name: name, // 52
+ defaultFormat: 'fileRecordFormat', // 53
+ collection: collection, // 54
+ collectionGet: true, // 55
+ collectionPost: false, // 56
+ documentGet: true, // 57
+ documentPut: false, // 58
+ documentDelete: false // 59
+ }, func); // 60
+ // 61
+ FS.debug && console.log("Registered HTTP method GET URLs:\n\n" + name + '\n' + name + '/:id\n'); // 62
+}; // 63
+ // 64
+/** // 65
+ * @method FS.HTTP.unpublish // 66
+ * @public // 67
+ * @param {FS.Collection} collection // 68
+ * @returns {undefined} // 69
+ * // 70
+ * Unpublishes a restpoint created by a call to `FS.HTTP.publish` // 71
+ */ // 72
+FS.HTTP.unpublish = function fsHttpUnpublish(collection) { // 73
+ // Mount collection listing URL using http-publish package // 74
+ HTTP.unpublish(baseUrl + '/record/' + collection.name); // 75
+}; // 76
+ // 77
+_existingMountPoints = {}; // 78
+ // 79
+/** // 80
+ * @method defaultSelectorFunction // 81
+ * @private // 82
+ * @returns { collection, file } // 83
+ * // 84
+ * This is the default selector function // 85
+ */ // 86
+var defaultSelectorFunction = function() { // 87
+ var self = this; // 88
+ // Selector function // 89
+ // // 90
+ // This function will have to return the collection and the // 91
+ // file. If file not found undefined is returned - if null is returned the // 92
+ // search was not possible // 93
+ var opts = FS.Utility.extend({}, self.query || {}, self.params || {}); // 94
+ // 95
+ // Get the collection name from the url // 96
+ var collectionName = opts.collectionName; // 97
+ // 98
+ // Get the id from the url // 99
+ var id = opts.id; // 100
+ // 101
+ // Get the collection // 102
+ var collection = FS._collections[collectionName]; // 103
+ // 104
+ // Get the file if possible else return null // 105
+ var file = (id && collection)? collection.findOne({ _id: id }): null; // 106
+ // 107
+ // Return the collection and the file // 108
+ return { // 109
+ collection: collection, // 110
+ file: file, // 111
+ storeName: opts.store, // 112
+ download: opts.download, // 113
+ filename: opts.filename // 114
+ }; // 115
+}; // 116
+ // 117
+/* // 118
+ * @method FS.HTTP.mount // 119
+ * @public // 120
+ * @param {array of string} mountPoints mount points to map rest functinality on // 121
+ * @param {function} selector_f [selector] function returns `{ collection, file }` for mount points to work with // 122
+ * // 123
+*/ // 124
+FS.HTTP.mount = function(mountPoints, selector_f) { // 125
+ // We take mount points as an array and we get a selector function // 126
+ var selectorFunction = selector_f || defaultSelectorFunction; // 127
+ // 128
+ var accessPoint = { // 129
+ 'stream': true, // 130
+ 'auth': expirationAuth, // 131
+ 'post': function(data) { // 132
+ // Use the selector for finding the collection and file reference // 133
+ var ref = selectorFunction.call(this); // 134
+ // 135
+ // We dont support post - this would be normal insert eg. of filerecord? // 136
+ throw new Meteor.Error(501, "Not implemented", "Post is not supported"); // 137
+ }, // 138
+ 'put': function(data) { // 139
+ // Use the selector for finding the collection and file reference // 140
+ var ref = selectorFunction.call(this); // 141
+ // 142
+ // Make sure we have a collection reference // 143
+ if (!ref.collection) // 144
+ throw new Meteor.Error(404, "Not Found", "No collection found"); // 145
+ // 146
+ // Make sure we have a file reference // 147
+ if (ref.file === null) { // 148
+ // No id supplied so we will create a new FS.File instance and // 149
+ // insert the supplied data. // 150
+ return FS.HTTP.Handlers.PutInsert.apply(this, [ref]); // 151
+ } else { // 152
+ if (ref.file) { // 153
+ return FS.HTTP.Handlers.PutUpdate.apply(this, [ref]); // 154
+ } else { // 155
+ throw new Meteor.Error(404, "Not Found", 'No file found'); // 156
+ } // 157
+ } // 158
+ }, // 159
+ 'get': function(data) { // 160
+ // Use the selector for finding the collection and file reference // 161
+ var ref = selectorFunction.call(this); // 162
+ // 163
+ // Make sure we have a collection reference // 164
+ if (!ref.collection) // 165
+ throw new Meteor.Error(404, "Not Found", "No collection found"); // 166
+ // 167
+ // Make sure we have a file reference // 168
+ if (ref.file === null) { // 169
+ // No id supplied so we will return the published list of files ala // 170
+ // http.publish in json format // 171
+ return FS.HTTP.Handlers.GetList.apply(this, [ref]); // 172
+ } else { // 173
+ if (ref.file) { // 174
+ return FS.HTTP.Handlers.Get.apply(this, [ref]); // 175
+ } else { // 176
+ throw new Meteor.Error(404, "Not Found", 'No file found'); // 177
+ } // 178
+ } // 179
+ }, // 180
+ 'delete': function(data) { // 181
+ // Use the selector for finding the collection and file reference // 182
+ var ref = selectorFunction.call(this); // 183
+ // 184
+ // Make sure we have a collection reference // 185
+ if (!ref.collection) // 186
+ throw new Meteor.Error(404, "Not Found", "No collection found"); // 187
+ // 188
+ // Make sure we have a file reference // 189
+ if (ref.file) { // 190
+ return FS.HTTP.Handlers.Del.apply(this, [ref]); // 191
+ } else { // 192
+ throw new Meteor.Error(404, "Not Found", 'No file found'); // 193
+ } // 194
+ } // 195
+ }; // 196
+ // 197
+ var accessPoints = {}; // 198
+ // 199
+ // Add debug message // 200
+ FS.debug && console.log('Registered HTTP method URLs:'); // 201
+ // 202
+ FS.Utility.each(mountPoints, function(mountPoint) { // 203
+ // Couple mountpoint and accesspoint // 204
+ accessPoints[mountPoint] = accessPoint; // 205
+ // Remember our mountpoints // 206
+ _existingMountPoints[mountPoint] = mountPoint; // 207
+ // Add debug message // 208
+ FS.debug && console.log(mountPoint); // 209
+ }); // 210
+ // 211
+ // XXX: HTTP:methods should unmount existing mounts in case of overwriting? // 212
+ HTTP.methods(accessPoints); // 213
+ // 214
+}; // 215
+ // 216
+/** // 217
+ * @method FS.HTTP.unmount // 218
+ * @public // 219
+ * @param {string | array of string} [mountPoints] Optional, if not specified all mountpoints are unmounted // 220
+ * // 221
+ */ // 222
+FS.HTTP.unmount = function(mountPoints) { // 223
+ // The mountPoints is optional, can be string or array if undefined then // 224
+ // _existingMountPoints will be used // 225
+ var unmountList; // 226
+ // Container for the mount points to unmount // 227
+ var unmountPoints = {}; // 228
+ // 229
+ if (typeof mountPoints === 'undefined') { // 230
+ // Use existing mount points - unmount all // 231
+ unmountList = _existingMountPoints; // 232
+ } else if (mountPoints === ''+mountPoints) { // 233
+ // Got a string // 234
+ unmountList = [mountPoints]; // 235
+ } else if (mountPoints.length) { // 236
+ // Got an array // 237
+ unmountList = mountPoints; // 238
+ } // 239
+ // 240
+ // If we have a list to unmount // 241
+ if (unmountList) { // 242
+ // Iterate over each item // 243
+ FS.Utility.each(unmountList, function(mountPoint) { // 244
+ // Check _existingMountPoints to make sure the mount point exists in our // 245
+ // context / was created by the FS.HTTP.mount // 246
+ if (_existingMountPoints[mountPoint]) { // 247
+ // Mark as unmount // 248
+ unmountPoints[mountPoint] = false; // 249
+ // Release // 250
+ delete _existingMountPoints[mountPoint]; // 251
+ } // 252
+ }); // 253
+ FS.debug && console.log('FS.HTTP.unmount:'); // 254
+ FS.debug && console.log(unmountPoints); // 255
+ // Complete unmount // 256
+ HTTP.methods(unmountPoints); // 257
+ } // 258
+}; // 259
+ // 260
+// ### FS.Collection maps on HTTP pr. default on the following restpoints: // 261
+// * // 262
+// baseUrl + '/files/:collectionName/:id/:filename', // 263
+// baseUrl + '/files/:collectionName/:id', // 264
+// baseUrl + '/files/:collectionName' // 265
+// // 266
+// Change/ replace the existing mount point by: // 267
+// ```js // 268
+// // unmount all existing // 269
+// FS.HTTP.unmount(); // 270
+// // Create new mount point // 271
+// FS.HTTP.mount([ // 272
+// '/cfs/files/:collectionName/:id/:filename', // 273
+// '/cfs/files/:collectionName/:id', // 274
+// '/cfs/files/:collectionName' // 275
+// ]); // 276
+// ``` // 277
+// // 278
+mountUrls = function mountUrls() { // 279
+ // We unmount first in case we are calling this a second time // 280
+ FS.HTTP.unmount(); // 281
+ // 282
+ FS.HTTP.mount([ // 283
+ baseUrl + '/files/:collectionName/:id/:filename', // 284
+ baseUrl + '/files/:collectionName/:id', // 285
+ baseUrl + '/files/:collectionName' // 286
+ ]); // 287
+}; // 288
+ // 289
+// Returns the userId from URL token // 290
+var expirationAuth = function expirationAuth() { // 291
+ var self = this; // 292
+ // 293
+ // Read the token from '/hello?token=base64' // 294
+ var encodedToken = self.query.token; // 295
+ // 296
+ FS.debug && console.log("token: "+encodedToken); // 297
+ // 298
+ if (!encodedToken || !Meteor.users) return false; // 299
+ // 300
+ // Check the userToken before adding it to the db query // 301
+ // Set the this.userId // 302
+ var tokenString = FS.Utility.atob(encodedToken); // 303
+ // 304
+ var tokenObject; // 305
+ try { // 306
+ tokenObject = JSON.parse(tokenString); // 307
+ } catch(err) { // 308
+ throw new Meteor.Error(400, 'Bad Request'); // 309
+ } // 310
+ // 311
+ // XXX: Do some check here of the object // 312
+ var userToken = tokenObject.authToken; // 313
+ if (userToken !== ''+userToken) { // 314
+ throw new Meteor.Error(400, 'Bad Request'); // 315
+ } // 316
+ // 317
+ // If we have an expiration token we should check that it's still valid // 318
+ if (tokenObject.expiration != null) { // 319
+ // check if its too old // 320
+ var now = Date.now(); // 321
+ if (tokenObject.expiration < now) { // 322
+ FS.debug && console.log('Expired token: ' + tokenObject.expiration + ' is less than ' + now); // 323
+ throw new Meteor.Error(500, 'Expired token'); // 324
+ } // 325
+ } // 326
+ // 327
+ // We are not on a secure line - so we have to look up the user... // 328
+ var user = Meteor.users.findOne({ // 329
+ $or: [ // 330
+ {'services.resume.loginTokens.hashedToken': Accounts._hashLoginToken(userToken)}, // 331
+ {'services.resume.loginTokens.token': userToken} // 332
+ ] // 333
+ }); // 334
+ // 335
+ // Set the userId in the scope // 336
+ return user && user._id; // 337
+}; // 338
+ // 339
+HTTP.methods( // 340
+ {'/cfs/servertime': { // 341
+ get: function(data) { // 342
+ return Date.now().toString(); // 343
+ } // 344
+ } // 345
+}); // 346
+ // 347
+// Unify client / server api // 348
+FS.HTTP.now = function() { // 349
+ return Date.now(); // 350
+}; // 351
+ // 352
+// Start up the basic mount points // 353
+Meteor.startup(function () { // 354
+ mountUrls(); // 355
+}); // 356
+ // 357
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+}).call(this);
+
+///////////////////////////////////////////////////////////////////////
+
+}).call(this);
+
+
+/* Exports */
+if (typeof Package === 'undefined') Package = {};
+Package['cfs:access-point'] = {};
+
+})();
diff --git a/i18n/ar.i18n.json b/i18n/ar.i18n.json
index c287ea0a..1a73c172 100644
--- a/i18n/ar.i18n.json
+++ b/i18n/ar.i18n.json
@@ -38,14 +38,14 @@
"activity-unjoined": "غادر %s",
"activity-checklist-added": "added checklist to %s",
"add": "أضف",
- "add-attachment": "إرفاق ملف",
- "add-board": "إضافة لوحة",
- "add-card": "إضافة بطاقة",
- "add-checklist": "Add a checklist",
+ "add-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add Checklist",
"add-checklist-item": "Add an item to checklist",
"add-cover": "إضافة غلاف",
- "add-label": "إضافة علامة",
- "add-list": "إضافة قائمة",
+ "add-label": "Add Label",
+ "add-list": "Add List",
"add-members": "تعيين أعضاء",
"added": "أُضيف",
"addMemberPopup-title": "الأعضاء",
@@ -60,7 +60,7 @@
"archive-all": "أرشف الكل",
"archive-board": "أرشف اللوحة",
"archive-card": "أرشف البطاقة",
- "archive-list": "أرشف هذه القائمة",
+ "archive-list": "Archive List",
"archive-selection": "أرشف المُحدّد",
"archiveBoardPopup-title": "Archive Board?",
"archived-items": "عناصر في الأرشيف",
@@ -71,8 +71,8 @@
"attachment-delete-pop": "حذف المرق هو حذف نهائي . لا يمكن التراجع إذا حذف.",
"attachmentDeletePopup-title": "تريد حذف المرفق ?",
"attachments": "المرفقات",
- "auto-watch": "Automatically watch boards when create it",
- "avatar-too-big": "حجم ملف الصورة الخاصة بك كبير . لا يمكن أن تتجاوز 70 كيلو أكتي",
+ "auto-watch": "Automatically watch boards when they are created",
+ "avatar-too-big": "The avatar is too large (70KB max)",
"back": "رجوع",
"board-change-color": "تغيير اللومr",
"board-nb-stars": "%s نجوم",
@@ -136,7 +136,9 @@
"color-sky": "sky",
"color-yellow": "yellow",
"comment": "تعليق",
- "comment-placeholder": "صياغة تعليق",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "Can comment on cards only.",
"computer": "حاسوب",
"create": "إنشاء",
"createBoardPopup-title": "إنشاء لوحة",
@@ -181,7 +183,7 @@
"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-notAllowSelf": "You can not invite yourself",
"error-user-notCreated": "This user is not created",
"error-username-taken": "This username is already taken",
"export-board": "Export board",
@@ -196,6 +198,7 @@
"fullname": "الإسم الكامل",
"header-logo-title": "الرجوع إلى صفحة اللوحات",
"hide-system-messages": "Hide system messages",
+ "headerBarCreateBoardPopup-title": "إنشاء لوحة",
"home": "الرئيسية",
"import": "Import",
"import-board": "import from Trello",
@@ -213,7 +216,7 @@
"joined": "انضمّ",
"just-invited": "You are just invited to this board",
"keyboard-shortcuts": "اختصار لوحة المفاتيح",
- "label-create": "إنشاء علامة جديدة",
+ "label-create": "إنشاء علامة",
"label-default": "%s علامة (افتراضية)",
"label-delete-pop": "لا يوجد تراجع. سيؤدي هذا إلى إزالة هذه العلامة من جميع بطاقات والقضاء على تأريخها",
"labels": "علامات",
@@ -227,9 +230,13 @@
"list-select-cards": "تحديد بطاقات هذه القائمة",
"listActionPopup-title": "قائمة الإجراءات",
"listImportCardPopup-title": "Import a Trello card",
+ "listMorePopup-title": "المزيد",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
"lists": "القائمات",
"log-out": "تسجيل الخروج",
- "log-in": "Log In",
+ "log-in": "تسجيل الدخول",
"loginPopup-title": "تسجيل الدخول",
"memberMenuPopup-title": "أفضليات الأعضاء",
"members": "أعضاء",
@@ -271,7 +278,8 @@
"quick-access-description": "أضف لوحة إلى المفضلة لإنشاء اختصار في هذا الشريط.",
"remove-cover": "حذف الغلاف",
"remove-from-board": "حذف من اللوحة",
- "remove-label": "حذف هذه العلامة",
+ "remove-label": "Remove Label",
+ "listDeletePopup-title": "Delete List ?",
"remove-member": "حذف العضو",
"remove-member-from-card": "حذف من البطاقة",
"remove-member-pop": "حذف __name__ (__username__) من __boardTitle__ ? سيتم حذف هذا العضو من جميع بطاقة اللوحة مع إرسال إشعار له بذاك.",
@@ -281,7 +289,7 @@
"restore": "استعادة",
"save": "حفظ",
"search": "بحث",
- "select-color": "اختيار لون",
+ "select-color": "Select Color",
"shortcut-assign-self": "Assign yourself to current card",
"shortcut-autocomplete-emoji": "الإكمال التلقائي للرموز التعبيرية",
"shortcut-autocomplete-members": "الإكمال التلقائي لأسماء الأعضاء",
@@ -292,6 +300,8 @@
"shortcut-toggle-filterbar": "Toggle Filter Sidebar",
"shortcut-toggle-sidebar": "إظهار-إخفاء الشريط الجانبي للوحة",
"show-cards-minimum-count": "Show cards count if list contains more than",
+ "sidebar-open": "Open Sidebar",
+ "sidebar-close": "Close Sidebar",
"signupPopup-title": "إنشاء حساب",
"star-board-title": "اضغط لإضافة هذه اللوحة إلى المفضلة . سوف يتم إظهارها على رأس بقية اللوحات.",
"starred-boards": "اللوحات المفضلة",
@@ -319,5 +329,27 @@
"welcome-board": "Welcome Board",
"welcome-list1": "Basics",
"welcome-list2": "Advanced",
- "what-to-do": "ماذا تريد أن تنجز?"
+ "what-to-do": "ماذا تريد أن تنجز?",
+ "admin-panel": "Admin Panel",
+ "settings": "Settings",
+ "people": "People",
+ "registration": "Registration",
+ "disable-self-registration": "Disable Self-Registration",
+ "invite": "Invite",
+ "invite-people": "Invite People",
+ "to-boards": "To board(s)",
+ "email-addresses": "Email Addresses",
+ "smtp-host-description": "The address of the SMTP server that handles your emails.",
+ "smtp-port-description": "The port your SMTP server uses for outgoing emails.",
+ "smtp-tls-description": "Enable TLS support for SMTP server",
+ "smtp-host": "SMTP Host",
+ "smtp-port": "SMTP Port",
+ "smtp-username": "اسم المستخدم",
+ "smtp-password": "كلمة المرور",
+ "smtp-tls": "TLS support",
+ "send-from": "From",
+ "invitation-code": "Invitation Code",
+ "email-invite-register-subject": "__inviter__ sent you an invitation",
+ "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to Wekan for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.",
+ "error-invitation-code-not-exist": "Invitation code doesn't exist"
} \ No newline at end of file
diff --git a/i18n/br.i18n.json b/i18n/br.i18n.json
index 8b143f82..0d6e205e 100644
--- a/i18n/br.i18n.json
+++ b/i18n/br.i18n.json
@@ -38,14 +38,14 @@
"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-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add 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-label": "Add Label",
+ "add-list": "Add List",
"add-members": "Ouzhpenn izili",
"added": "Ouzhpennet",
"addMemberPopup-title": "Izili",
@@ -60,7 +60,7 @@
"archive-all": "Archive All",
"archive-board": "Archive Board",
"archive-card": "Archive Card",
- "archive-list": "Archive this list",
+ "archive-list": "Archive List",
"archive-selection": "Archive selection",
"archiveBoardPopup-title": "Archive Board?",
"archived-items": "Archived Items",
@@ -71,8 +71,8 @@
"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)",
+ "auto-watch": "Automatically watch boards when they are created",
+ "avatar-too-big": "The avatar is too large (70KB max)",
"back": "Back",
"board-change-color": "Kemmañ al liv",
"board-nb-stars": "%s stered",
@@ -136,7 +136,9 @@
"color-sky": "pers",
"color-yellow": "melen",
"comment": "Comment",
- "comment-placeholder": "Write a comment",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "Can comment on cards only.",
"computer": "Computer",
"create": "Krouiñ",
"createBoardPopup-title": "Create Board",
@@ -181,7 +183,7 @@
"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-notAllowSelf": "You can not invite yourself",
"error-user-notCreated": "This user is not created",
"error-username-taken": "This username is already taken",
"export-board": "Export board",
@@ -196,6 +198,7 @@
"fullname": "Full Name",
"header-logo-title": "Go back to your boards page.",
"hide-system-messages": "Hide system messages",
+ "headerBarCreateBoardPopup-title": "Create Board",
"home": "Home",
"import": "Import",
"import-board": "import from Trello",
@@ -213,7 +216,7 @@
"joined": "joined",
"just-invited": "You are just invited to this board",
"keyboard-shortcuts": "Keyboard shortcuts",
- "label-create": "Create a new label",
+ "label-create": "Create 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",
@@ -227,6 +230,10 @@
"list-select-cards": "Select all cards in this list",
"listActionPopup-title": "List Actions",
"listImportCardPopup-title": "Import a Trello card",
+ "listMorePopup-title": "Muioc’h",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
"lists": "Lists",
"log-out": "Log Out",
"log-in": "Log In",
@@ -271,7 +278,8 @@
"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-label": "Remove Label",
+ "listDeletePopup-title": "Delete 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.",
@@ -281,7 +289,7 @@
"restore": "Restore",
"save": "Save",
"search": "Search",
- "select-color": "Select a color",
+ "select-color": "Select Color",
"shortcut-assign-self": "Assign yourself to current card",
"shortcut-autocomplete-emoji": "Autocomplete emoji",
"shortcut-autocomplete-members": "Autocomplete members",
@@ -292,6 +300,8 @@
"shortcut-toggle-filterbar": "Toggle Filter Sidebar",
"shortcut-toggle-sidebar": "Toggle Board Sidebar",
"show-cards-minimum-count": "Show cards count if list contains more than",
+ "sidebar-open": "Open Sidebar",
+ "sidebar-close": "Close 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",
@@ -319,5 +329,27 @@
"welcome-board": "Welcome Board",
"welcome-list1": "Basics",
"welcome-list2": "Advanced",
- "what-to-do": "What do you want to do?"
+ "what-to-do": "What do you want to do?",
+ "admin-panel": "Admin Panel",
+ "settings": "Settings",
+ "people": "People",
+ "registration": "Registration",
+ "disable-self-registration": "Disable Self-Registration",
+ "invite": "Invite",
+ "invite-people": "Invite People",
+ "to-boards": "To board(s)",
+ "email-addresses": "Email Addresses",
+ "smtp-host-description": "The address of the SMTP server that handles your emails.",
+ "smtp-port-description": "The port your SMTP server uses for outgoing emails.",
+ "smtp-tls-description": "Enable TLS support for SMTP server",
+ "smtp-host": "SMTP Host",
+ "smtp-port": "SMTP Port",
+ "smtp-username": "Username",
+ "smtp-password": "Ger-tremen",
+ "smtp-tls": "TLS support",
+ "send-from": "From",
+ "invitation-code": "Invitation Code",
+ "email-invite-register-subject": "__inviter__ sent you an invitation",
+ "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to Wekan for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.",
+ "error-invitation-code-not-exist": "Invitation code doesn't exist"
} \ No newline at end of file
diff --git a/i18n/ca.i18n.json b/i18n/ca.i18n.json
index 4b5f8d31..9574ac76 100644
--- a/i18n/ca.i18n.json
+++ b/i18n/ca.i18n.json
@@ -8,7 +8,7 @@
"act-createList": "afegit/da __list__ a __board__",
"act-addBoardMember": "afegit/da __member__ a __board__",
"act-archivedBoard": "__board__ arxivat",
- "act-archivedCard": "\n __card__ arxivat/da",
+ "act-archivedCard": "__card__ arxivat/da",
"act-archivedList": "__list__ arxivat/da",
"act-importBoard": "__board__ importat",
"act-importCard": "__card__ importat",
@@ -38,14 +38,14 @@
"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-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add Checklist",
"add-checklist-item": "Afegeix un ítem",
"add-cover": "Afegeix coberta",
- "add-label": "Afegeix etiqueta",
- "add-list": "Afegeix llista",
+ "add-label": "Add Label",
+ "add-list": "Add List",
"add-members": "Afegeix membres",
"added": "Afegit",
"addMemberPopup-title": "Membres",
@@ -60,7 +60,7 @@
"archive-all": "Desa Tot",
"archive-board": "Arxiva tauler",
"archive-card": "Arxiva fitxa",
- "archive-list": "Arxiva aquesta llista",
+ "archive-list": "Archive List",
"archive-selection": "Arxiva selecció",
"archiveBoardPopup-title": "Arxivar el tauler?",
"archived-items": "Elements arxivats",
@@ -71,8 +71,8 @@
"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)",
+ "auto-watch": "Automatically watch boards when they are created",
+ "avatar-too-big": "The avatar is too large (70KB max)",
"back": "Enrere",
"board-change-color": "Canvia el color",
"board-nb-stars": "%s estrelles",
@@ -136,7 +136,9 @@
"color-sky": "cel",
"color-yellow": "groc",
"comment": "Comentari",
- "comment-placeholder": "Escriu un comentari",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "Can comment on cards only.",
"computer": "Ordinador",
"create": "Crea",
"createBoardPopup-title": "Crea tauler",
@@ -181,7 +183,7 @@
"error-json-schema": "La dades JSON no contenen la informació en el format correcte",
"error-list-doesNotExist": "La llista no existeix",
"error-user-doesNotExist": "L'usuari no existeix",
- "error-user-notAllowSelf": "Aquesta acció no està permesa",
+ "error-user-notAllowSelf": "You can not invite yourself",
"error-user-notCreated": "L'usuari no s'ha creat",
"error-username-taken": "Aquest usuari ja existeix",
"export-board": "Exporta tauler",
@@ -196,6 +198,7 @@
"fullname": "Nom complet",
"header-logo-title": "Torna a la teva pàgina de taulers",
"hide-system-messages": "Oculta missatges del sistema",
+ "headerBarCreateBoardPopup-title": "Crea tauler",
"home": "Inici",
"import": "importa",
"import-board": "Importa des de Trello",
@@ -213,7 +216,7 @@
"joined": "s'ha unit",
"just-invited": "Has estat convidat a aquest tauler",
"keyboard-shortcuts": "Dreceres de teclat",
- "label-create": "Crea una etiqueta nova",
+ "label-create": "Crea etiqueta",
"label-default": "%s etiqueta (per defecte)",
"label-delete-pop": "No es pot desfer. Això eliminarà aquesta etiqueta de totes les fitxes i destruirà la seva història.",
"labels": "Etiquetes",
@@ -227,6 +230,10 @@
"list-select-cards": "Selecciona totes les fitxes d'aquesta llista",
"listActionPopup-title": "Accions de la llista",
"listImportCardPopup-title": "importa una fitxa de Trello",
+ "listMorePopup-title": "Més",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
"lists": "Llistes",
"log-out": "Finalitza la sessió",
"log-in": "Ingresa",
@@ -271,7 +278,8 @@
"quick-access-description": "Inicia un tauler per afegir un accés directe en aquest barra",
"remove-cover": "Elimina coberta",
"remove-from-board": "Elimina del tauler",
- "remove-label": "Eliminia etiqueta",
+ "remove-label": "Remove Label",
+ "listDeletePopup-title": "Delete List ?",
"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ó.",
@@ -281,7 +289,7 @@
"restore": "Restaura",
"save": "Desa",
"search": "Cerca",
- "select-color": "Selecciona un color",
+ "select-color": "Select Color",
"shortcut-assign-self": "Assigna't la ftixa actual",
"shortcut-autocomplete-emoji": "Autocompleta emoji",
"shortcut-autocomplete-members": "Autocompleta membres",
@@ -291,7 +299,9 @@
"shortcut-show-shortcuts": "Mostra aquesta lista d'accessos directes",
"shortcut-toggle-filterbar": "Canvia la barra lateral del tauler",
"shortcut-toggle-sidebar": "Canvia Sidebar del Tauler",
- "show-cards-minimum-count": "Mostra contador de fitxes si la llista en conté més de ",
+ "show-cards-minimum-count": "Mostra contador de fitxes si la llista en conté més de",
+ "sidebar-open": "Mostra barra lateral",
+ "sidebar-close": "Amaga barra lateral",
"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",
@@ -319,5 +329,27 @@
"welcome-board": "Tauler de benvinguda",
"welcome-list1": "Bàsics",
"welcome-list2": "Avançades",
- "what-to-do": "Què vols fer?"
+ "what-to-do": "Què vols fer?",
+ "admin-panel": "Tauler d'administració",
+ "settings": "Configuració",
+ "people": "Persones",
+ "registration": "Registre",
+ "disable-self-registration": "Deshabilita Auto-Registre",
+ "invite": "Convida",
+ "invite-people": "Convida a persones",
+ "to-boards": "Al tauler(s)",
+ "email-addresses": "Adreça de correu",
+ "smtp-host-description": "L'adreça del vostre servidor SMTP.",
+ "smtp-port-description": "El port del vostre servidor SMTP.",
+ "smtp-tls-description": "Enable TLS support for SMTP server",
+ "smtp-host": "Servidor SMTP",
+ "smtp-port": "Port SMTP",
+ "smtp-username": "Nom d'Usuari",
+ "smtp-password": "Contrasenya",
+ "smtp-tls": "TLS support",
+ "send-from": "De",
+ "invitation-code": "Codi d'invitació",
+ "email-invite-register-subject": "__inviter__ t'ha convidat",
+ "email-invite-register-text": " __user__,\n\n __inviter__ us ha convidat a col·laborar a Wekan.\n\n Clicau l'enllaç següent per acceptar l'invitació:\n __url__\n\n El vostre codi d'invitació és: __icode__\n\n Gràcies",
+ "error-invitation-code-not-exist": "El codi d'invitació no existeix"
} \ No newline at end of file
diff --git a/i18n/cs.i18n.json b/i18n/cs.i18n.json
index ef1ddf26..5eafa36b 100644
--- a/i18n/cs.i18n.json
+++ b/i18n/cs.i18n.json
@@ -38,14 +38,14 @@
"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-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add 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-label": "Add Label",
+ "add-list": "Add List",
"add-members": "Přidat členy",
"added": "Přidán",
"addMemberPopup-title": "Členové",
@@ -60,7 +60,7 @@
"archive-all": "Archivovat vše",
"archive-board": "Archivovat tablo",
"archive-card": "Archivovat kartu",
- "archive-list": "Archivovat tento seznam",
+ "archive-list": "Archive List",
"archive-selection": "Archivovat výběr",
"archiveBoardPopup-title": "Archivovat tablo?",
"archived-items": "Archivované položky",
@@ -71,8 +71,8 @@
"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)",
+ "auto-watch": "Automatically watch boards when they are created",
+ "avatar-too-big": "The avatar is too large (70KB max)",
"back": "Zpět",
"board-change-color": "Změnit barvu",
"board-nb-stars": "%s hvězdiček",
@@ -136,7 +136,9 @@
"color-sky": "nebeská",
"color-yellow": "žlutá",
"comment": "Komentář",
- "comment-placeholder": "Zapsat komentář",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "Can comment on cards only.",
"computer": "Počítač",
"create": "Vytvořit",
"createBoardPopup-title": "Vytvořit tablo",
@@ -172,7 +174,7 @@
"email-resetPassword-subject": "Změň své heslo na __siteName__",
"email-resetPassword-text": "Ahoj __user__,\n\nPro změnu hesla klikni na odkaz níže.\n\n__url__\n\nDěkujeme.",
"email-sent": "Email byl odeslán",
- "email-verifyEmail-subject": "Ověř svou emailovou adresu na ",
+ "email-verifyEmail-subject": "Ověř svou emailovou adresu na",
"email-verifyEmail-text": "Ahoj __user__,\n\nPro ověření emailové adresy klikni na odkaz níže.\n\n__url__\n\nDěkujeme.",
"error-board-doesNotExist": "Toto tablo neexistuje",
"error-board-notAdmin": "K provedení změny musíš být administrátor tohoto tabla",
@@ -181,7 +183,7 @@
"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-notAllowSelf": "You can not invite yourself",
"error-user-notCreated": "Tento uživatel není vytvořen",
"error-username-taken": "This username is already taken",
"export-board": "Exportovat tablo",
@@ -196,6 +198,7 @@
"fullname": "Celé jméno",
"header-logo-title": "Jit zpět na stránku s tably.",
"hide-system-messages": "Hide system messages",
+ "headerBarCreateBoardPopup-title": "Vytvořit tablo",
"home": "Domů",
"import": "Import",
"import-board": "Importovat ze služby Trello",
@@ -213,7 +216,7 @@
"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-create": "Vytvořit š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",
@@ -227,9 +230,13 @@
"list-select-cards": "Vybrat všechny karty v tomto seznamu",
"listActionPopup-title": "Vypsat akce",
"listImportCardPopup-title": "Importovat Trello kartu",
+ "listMorePopup-title": "Více",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
"lists": "Seznamy",
"log-out": "Odhlásit",
- "log-in": "Log In",
+ "log-in": "Přihlásit",
"loginPopup-title": "Přihlásit",
"memberMenuPopup-title": "Nastavení uživatele",
"members": "Členové",
@@ -271,7 +278,8 @@
"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-label": "Remove Label",
+ "listDeletePopup-title": "Delete 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.",
@@ -281,7 +289,7 @@
"restore": "Obnovit",
"save": "Uložit",
"search": "Hledat",
- "select-color": "Vybrat barvu",
+ "select-color": "Select Color",
"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",
@@ -292,6 +300,8 @@
"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",
+ "sidebar-open": "Open Sidebar",
+ "sidebar-close": "Close Sidebar",
"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",
@@ -319,5 +329,27 @@
"welcome-board": "Welcome Board",
"welcome-list1": "Basics",
"welcome-list2": "Advanced",
- "what-to-do": "Co chcete dělat?"
+ "what-to-do": "Co chcete dělat?",
+ "admin-panel": "Admin Panel",
+ "settings": "Settings",
+ "people": "People",
+ "registration": "Registration",
+ "disable-self-registration": "Disable Self-Registration",
+ "invite": "Invite",
+ "invite-people": "Invite People",
+ "to-boards": "To board(s)",
+ "email-addresses": "Email Addresses",
+ "smtp-host-description": "The address of the SMTP server that handles your emails.",
+ "smtp-port-description": "The port your SMTP server uses for outgoing emails.",
+ "smtp-tls-description": "Enable TLS support for SMTP server",
+ "smtp-host": "SMTP Host",
+ "smtp-port": "SMTP Port",
+ "smtp-username": "Uživatelské jméno",
+ "smtp-password": "Heslo",
+ "smtp-tls": "TLS support",
+ "send-from": "From",
+ "invitation-code": "Invitation Code",
+ "email-invite-register-subject": "__inviter__ odeslal pozvánku",
+ "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to Wekan for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.",
+ "error-invitation-code-not-exist": "Invitation code doesn't exist"
} \ No newline at end of file
diff --git a/i18n/de.i18n.json b/i18n/de.i18n.json
index 787b5a0f..15b590e6 100644
--- a/i18n/de.i18n.json
+++ b/i18n/de.i18n.json
@@ -36,16 +36,16 @@
"activity-removed": "hat %s von %s entfernt",
"activity-sent": "hat %s an %s gesendet",
"activity-unjoined": "hat %s verlassen",
- "activity-checklist-added": "added checklist to %s",
+ "activity-checklist-added": "hat Checkliste zu %s hinzugefügt",
"add": "Hinzufügen",
- "add-attachment": "Anhang hinzufügen",
- "add-board": "Neues Board erstellen",
- "add-card": "Karte hinzufügen",
- "add-checklist": "Add a checklist",
- "add-checklist-item": "Add an item to checklist",
+ "add-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add Checklist",
+ "add-checklist-item": "Punkt zu einer Checkliste hinzufügen",
"add-cover": "Cover hinzufügen",
- "add-label": "Label hinzufügen",
- "add-list": "Liste hinzufügen",
+ "add-label": "Add Label",
+ "add-list": "Add List",
"add-members": "Mitglieder hinzufügen",
"added": "Hinzugefügt",
"addMemberPopup-title": "Mitglieder",
@@ -60,7 +60,7 @@
"archive-all": "Alles archivieren",
"archive-board": "Board archivieren",
"archive-card": "Karte archivieren",
- "archive-list": "Diese Liste archivieren",
+ "archive-list": "Archive List",
"archive-selection": "Auswahl archivieren",
"archiveBoardPopup-title": "Board archivieren?",
"archived-items": "Archivierte Einträge",
@@ -71,8 +71,8 @@
"attachment-delete-pop": "Das Löschen eines Anhangs kann nicht wieder rückgängig gemacht werden.",
"attachmentDeletePopup-title": "Anhang löschen?",
"attachments": "Anhänge",
- "auto-watch": "Neue Boards automatisch beobachten",
- "avatar-too-big": "Das Profilbild ist zu groß (max. 70Kb)",
+ "auto-watch": "Neue Boards nach Erstellung 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",
@@ -118,7 +118,7 @@
"changePasswordPopup-title": "Passwort ändern",
"changePermissionsPopup-title": "Berechtigungen ändern",
"changeSettingsPopup-title": "Einstellungen ändern",
- "checklists": "Checklists",
+ "checklists": "Checklisten",
"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",
@@ -136,7 +136,9 @@
"color-sky": "himmelblau",
"color-yellow": "gelb",
"comment": "Kommentar",
- "comment-placeholder": "Kommentar schreiben",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "Kann Karten nur Kommentieren",
"computer": "Computer",
"create": "Erstellen",
"createBoardPopup-title": "Board erstellen",
@@ -163,26 +165,26 @@
"editProfilePopup-title": "Profil ändern",
"email": "E-Mail",
"email-enrollAccount-subject": "Ihr Benutzerkonto auf __siteName__ wurde erstellt",
- "email-enrollAccount-text": "Hallo __user__,\n\num den Dienst nutzen zu können, klicken Sie bitte auf folgenden Link:\n\n__url__\n\nDanke.\n",
+ "email-enrollAccount-text": "Hallo __user__,\n\num den Dienst nutzen zu können, klicken Sie bitte auf folgenden Link:\n\n__url__\n\nDanke.",
"email-fail": "Senden der E-Mail fehlgeschlagen",
"email-invalid": "Ungültige E-Mail-Adresse",
"email-invite": "via E-Mail einladen",
"email-invite-subject": "__inviter__ hat Ihnen eine Einladung geschickt",
- "email-invite-text": "Hallo __user__,\n\n__inviter__ hat Sie zu dem Board \"__board__\" eingeladen.\n\nBitte klicken Sie auf folgenden Link:\n\n__url__\n\nDanke.\n",
+ "email-invite-text": "Hallo __user__,\n\n__inviter__ hat Sie zu dem Board \"__board__\" eingeladen.\n\nBitte klicken Sie auf folgenden Link:\n\n__url__\n\nDanke.",
"email-resetPassword-subject": "Setzten Sie ihr Passwort auf __siteName__ zurück",
- "email-resetPassword-text": "Hallo __user__,\n\num ihr Passwort zurückzusetzen, klicken Sie bitte auf folgenden Link:\n\n__url__\n\nDanke.\n",
+ "email-resetPassword-text": "Hallo __user__,\n\num ihr Passwort zurückzusetzen, klicken Sie bitte auf folgenden Link:\n\n__url__\n\nDanke.",
"email-sent": "E-Mail gesendet",
"email-verifyEmail-subject": "Bestätigen Sie ihre E-Mail-Adresse auf __siteName__",
- "email-verifyEmail-text": "Hallo __user__,\n\num ihre E-Mail-Adresse zu bestätigen, klicken Sie bitte auf folgenden Link:\n\n__url__\n\nDanke.\n",
+ "email-verifyEmail-text": "Hallo __user__,\n\num ihre E-Mail-Adresse zu bestätigen, klicken Sie bitte auf folgenden Link:\n\n__url__\n\nDanke.",
"error-board-doesNotExist": "Dieses Board existiert nicht",
- "error-board-notAdmin": "Um das zu tun, müssen Sie der Administrator dieses Boards sein",
- "error-board-notAMember": "Um das zu tun, müssen Sie ein Mitglied dieses Boards sein",
+ "error-board-notAdmin": "Um das zu tun, müssen Sie Administrator dieses Boards sein",
+ "error-board-notAMember": "Um das zu tun, müssen Sie 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-user-notAllowSelf": "You can not invite yourself",
+ "error-user-notCreated": "Dieser Nutzer ist nicht angelegt",
"error-username-taken": "Dieser Benutzername ist bereits vergeben",
"export-board": "Board exportieren",
"filter": "Filter",
@@ -196,6 +198,7 @@
"fullname": "Vollständiger Name",
"header-logo-title": "Zurück zur Board Seite.",
"hide-system-messages": "Systemmeldungen ausblenden",
+ "headerBarCreateBoardPopup-title": "Board erstellen",
"home": "Home",
"import": "Importieren",
"import-board": "von Trello importieren",
@@ -208,25 +211,29 @@
"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",
+ "initials": "Initialen",
"invalid-date": "Ungültiges Datum",
"joined": "beigetreten",
"just-invited": "Sie wurden soeben zu diesem Board eingeladen",
"keyboard-shortcuts": "Tastaturkürzel",
- "label-create": "Neues Label erstellen",
+ "label-create": "Label erstellen",
"label-default": "%s Label (Standard)",
"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": "Sie können keine Rollen ändern, weil es mindestens ein Administrator geben muss.",
+ "last-admin-desc": "Sie können keine Rollen ändern, weil es mindestens einen 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": "Dieses entfernt alle Karten von dieser Liste des Boards. Um archivierte Karten anzuzeigen und wiederherzustellen, klicken Sie auf \"Menü\" > \"Archivierte Einträge\".",
+ "list-archive-cards-pop": "Alle Karten von dieser Liste werden vom Board entfernt. 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": "Eine Trello-Karte importieren",
+ "listMorePopup-title": "Mehr",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
"lists": "Listen",
"log-out": "Ausloggen",
"log-in": "Einloggen",
@@ -268,20 +275,21 @@
"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": "Markieren Sie 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 dieser Leiste eine Verknüpfung hinzuzufügen.",
"remove-cover": "Cover entfernen",
"remove-from-board": "Von Board entfernen",
- "remove-label": "Label entfernen",
+ "remove-label": "Remove Label",
+ "listDeletePopup-title": "Delete List ?",
"remove-member": "Nutzer entfernen",
"remove-member-from-card": "Von Karte entfernen",
- "remove-member-pop": "__name__ (__username__) von __boardTitle__ entfernen? Das Mitglied wird von allen Karten auf diesem Board entfernt. Er erhält eine Benachrichtigung.",
+ "remove-member-pop": "__name__ (__username__) von __boardTitle__ entfernen? Das Mitglied wird von allen Karten auf diesem Board entfernt. Es erhält eine Benachrichtigung.",
"removeMemberPopup-title": "Mitglied entfernen?",
"rename": "Umbenennen",
"rename-board": "Board umbenennen",
"restore": "Wiederherstellen",
"save": "Speichern",
"search": "Suchen",
- "select-color": "Farbe auswählen",
+ "select-color": "Select Color",
"shortcut-assign-self": "Fügen Sie sich zur aktuellen Karte hinzu",
"shortcut-autocomplete-emoji": "Emojis vervollständigen",
"shortcut-autocomplete-members": "Mitglieder vervollständigen",
@@ -292,8 +300,10 @@
"shortcut-toggle-filterbar": "Filter-Seitenleiste ein-/ausblenden",
"shortcut-toggle-sidebar": "Seitenleiste ein-/ausblenden",
"show-cards-minimum-count": "Zeigt die Kartenanzahl an, wenn die Liste mehr enthält als",
+ "sidebar-open": "Seitenleiste öffnen",
+ "sidebar-close": "Seitenleiste schließen",
"signupPopup-title": "Benutzerkonto erstellen",
- "star-board-title": "Klicken um das Board mit einem Stern zu kennzeichnen. Es erscheint dann oben in ihrer Boardliste.",
+ "star-board-title": "Klicken um das Board mit einem Stern zu markieren. Es erscheint dann oben in ihrer Boardliste.",
"starred-boards": "Markierte Boards",
"starred-boards-description": "Markierte Boards erscheinen oben in ihrer Boardliste.",
"subscribe": "Abonnieren",
@@ -303,7 +313,7 @@
"time": "Zeit",
"title": "Titel",
"tracking": "Folgen",
- "tracking-info": "Sie werden über alle Änderungen an Karten, die Sie als Ersteller oder Mitglied beteiligt sind, benachrichtigt.",
+ "tracking-info": "Sie werden über alle Änderungen an Karten benachrichtigt, an denen Sie als Ersteller oder Mitglied beteiligt sind.",
"unassign-member": "Mitglied entfernen",
"unsaved-description": "Sie haben eine nicht gespeicherte Änderung.",
"unwatch": "Beobachtung entfernen",
@@ -314,10 +324,32 @@
"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",
+ "watching": "Beobachten",
+ "watching-info": "Sie werden über alle Änderungen in diesem Board benachrichtigt",
"welcome-board": "Willkommen-Board",
"welcome-list1": "Grundlagen",
"welcome-list2": "Fortgeschritten",
- "what-to-do": "Was willst du tun?"
+ "what-to-do": "Was wollen Sie tun?",
+ "admin-panel": "Administration",
+ "settings": "Einstellungen",
+ "people": "Nutzer",
+ "registration": "Registrierung",
+ "disable-self-registration": "Selbstregistrierung deaktivieren",
+ "invite": "Einladen",
+ "invite-people": "Nutzer einladen",
+ "to-boards": "In Board(s)",
+ "email-addresses": "E-Mail Adressen",
+ "smtp-host-description": "Die Adresse Ihres SMTP-Servers für ausgehende E-Mails.",
+ "smtp-port-description": "Der Port Ihres SMTP-Servers für ausgehende E-Mails.",
+ "smtp-tls-description": "Aktiviere TLS Unterstützung für SMTP Server",
+ "smtp-host": "SMTP-Server",
+ "smtp-port": "SMTP-Port",
+ "smtp-username": "Benutzername",
+ "smtp-password": "Passwort",
+ "smtp-tls": "TLS Unterstützung",
+ "send-from": "Absender",
+ "invitation-code": "Einladungscode",
+ "email-invite-register-subject": "__inviter__ hat Ihnen eine Einladung geschickt",
+ "email-invite-register-text": "Hallo __user__,\n\n__inviter__ hat Sie für Ihre Zusammenarbeit zu Wekan eingeladen.\n\nBitte klicken Sie auf folgenden Link:\n__url__\n\nIhr Einladungscode lautet: __icode__\n\nDanke.",
+ "error-invitation-code-not-exist": "Ungültiger Einladungscode"
} \ No newline at end of file
diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json
index 829b30e6..d95427a9 100644
--- a/i18n/en.i18n.json
+++ b/i18n/en.i18n.json
@@ -38,14 +38,14 @@
"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-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add Checklist",
"add-checklist-item": "Add an item to checklist",
"add-cover": "Add Cover",
- "add-label": "Add the label",
- "add-list": "Add a list",
+ "add-label": "Add Label",
+ "add-list": "Add List",
"add-members": "Add Members",
"added": "Added",
"addMemberPopup-title": "Members",
@@ -60,7 +60,7 @@
"archive-all": "Archive All",
"archive-board": "Archive Board",
"archive-card": "Archive Card",
- "archive-list": "Archive this list",
+ "archive-list": "Archive List",
"archive-selection": "Archive selection",
"archiveBoardPopup-title": "Archive Board?",
"archived-items": "Archived Items",
@@ -71,8 +71,8 @@
"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)",
+ "auto-watch": "Automatically watch boards when they are created",
+ "avatar-too-big": "The avatar is too large (70KB max)",
"back": "Back",
"board-change-color": "Change color",
"board-nb-stars": "%s stars",
@@ -136,7 +136,9 @@
"color-sky": "sky",
"color-yellow": "yellow",
"comment": "Comment",
- "comment-placeholder": "Write a comment",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "Can comment on cards only.",
"computer": "Computer",
"create": "Create",
"createBoardPopup-title": "Create Board",
@@ -163,17 +165,17 @@
"editProfilePopup-title": "Edit Profile",
"email": "Email",
"email-enrollAccount-subject": "An account created for you on __siteName__",
- "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.\n",
+ "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.",
"email-fail": "Sending email failed",
"email-invalid": "Invalid email",
"email-invite": "Invite via Email",
"email-invite-subject": "__inviter__ sent you an invitation",
- "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.\n",
+ "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.",
"email-resetPassword-subject": "Reset your password on __siteName__",
- "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.\n",
+ "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.",
"email-sent": "Email sent",
"email-verifyEmail-subject": "Verify your email address on __siteName__",
- "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.\n",
+ "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.",
"error-board-doesNotExist": "This board does not exist",
"error-board-notAdmin": "You need to be admin of this board to do that",
"error-board-notAMember": "You need to be a member of this board to do that",
@@ -181,7 +183,7 @@
"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-notAllowSelf": "You can not invite yourself",
"error-user-notCreated": "This user is not created",
"error-username-taken": "This username is already taken",
"export-board": "Export board",
@@ -196,6 +198,7 @@
"fullname": "Full Name",
"header-logo-title": "Go back to your boards page.",
"hide-system-messages": "Hide system messages",
+ "headerBarCreateBoardPopup-title": "Create Board",
"home": "Home",
"import": "Import",
"import-board": "import from Trello",
@@ -213,7 +216,7 @@
"joined": "joined",
"just-invited": "You are just invited to this board",
"keyboard-shortcuts": "Keyboard shortcuts",
- "label-create": "Create a new label",
+ "label-create": "Create 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",
@@ -275,8 +278,8 @@
"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",
- "listDeletePopup-title": "Delete the list ?",
+ "remove-label": "Remove Label",
+ "listDeletePopup-title": "Delete 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.",
@@ -286,7 +289,7 @@
"restore": "Restore",
"save": "Save",
"search": "Search",
- "select-color": "Select a color",
+ "select-color": "Select Color",
"shortcut-assign-self": "Assign yourself to current card",
"shortcut-autocomplete-emoji": "Autocomplete emoji",
"shortcut-autocomplete-members": "Autocomplete members",
@@ -297,6 +300,8 @@
"shortcut-toggle-filterbar": "Toggle Filter Sidebar",
"shortcut-toggle-sidebar": "Toggle Board Sidebar",
"show-cards-minimum-count": "Show cards count if list contains more than",
+ "sidebar-open": "Open Sidebar",
+ "sidebar-close": "Close 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",
@@ -324,5 +329,27 @@
"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
+ "what-to-do": "What do you want to do?",
+ "admin-panel": "Admin Panel",
+ "settings": "Settings",
+ "people": "People",
+ "registration": "Registration",
+ "disable-self-registration": "Disable Self-Registration",
+ "invite": "Invite",
+ "invite-people": "Invite People",
+ "to-boards": "To board(s)",
+ "email-addresses": "Email Addresses",
+ "smtp-host-description": "The address of the SMTP server that handles your emails.",
+ "smtp-port-description": "The port your SMTP server uses for outgoing emails.",
+ "smtp-tls-description": "Enable TLS support for SMTP server",
+ "smtp-host": "SMTP Host",
+ "smtp-port": "SMTP Port",
+ "smtp-username": "Username",
+ "smtp-password": "Password",
+ "smtp-tls": "TLS support",
+ "send-from": "From",
+ "invitation-code": "Invitation Code",
+ "email-invite-register-subject": "__inviter__ sent you an invitation",
+ "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to Wekan for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.",
+ "error-invitation-code-not-exist": "Invitation code doesn't exist"
+}
diff --git a/i18n/eo.i18n.json b/i18n/eo.i18n.json
new file mode 100644
index 00000000..6208e41b
--- /dev/null
+++ b/i18n/eo.i18n.json
@@ -0,0 +1,355 @@
+{
+ "accept": "Akcepti",
+ "act-activity-notify": "[Wekan] Activity Notification",
+ "act-addAttachment": "attached __attachment__ to __card__",
+ "act-addComment": "commented on __card__: __comment__",
+ "act-createBoard": "kreiis __board__",
+ "act-createCard": "aldonis __card__ al __list__",
+ "act-createList": "aldonis __card__ al __board__",
+ "act-addBoardMember": "aldonis __member__ al __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": "aldonis __member__ al __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": "Akcioj",
+ "activities": "Aktivaĵoj",
+ "activity": "Aktivaĵo",
+ "activity-added": "aldonis %s al %s",
+ "activity-archived": "archived %s",
+ "activity-attached": "attached %s to %s",
+ "activity-created": "kreiis %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": "sendis %s al %s",
+ "activity-unjoined": "unjoined %s",
+ "activity-checklist-added": "added checklist to %s",
+ "add": "Aldoni",
+ "add-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add Checklist",
+ "add-checklist-item": "Add an item to checklist",
+ "add-cover": "Add Cover",
+ "add-label": "Add Label",
+ "add-list": "Add List",
+ "add-members": "Aldoni membrojn",
+ "added": "Aldonita",
+ "addMemberPopup-title": "Membroj",
+ "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": "Apliki",
+ "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.",
+ "archive": "Arkivi",
+ "archive-all": "Arkivi ĉion",
+ "archive-board": "Archive Board",
+ "archive-card": "Arkivi karton",
+ "archive-list": "Archive List",
+ "archive-selection": "Arkivi elekton",
+ "archiveBoardPopup-title": "Archive Board?",
+ "archived-items": "Archived Items",
+ "archives": "Arkivoj",
+ "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 they are created",
+ "avatar-too-big": "The avatar is too large (70KB max)",
+ "back": "Reen",
+ "board-change-color": "Ŝanĝi koloron",
+ "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": "Karto arkivita.",
+ "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": "Redakti etikedojn",
+ "card-edit-members": "Redakti membroj",
+ "card-labels-title": "Change the labels for the card.",
+ "card-members-title": "Add or remove members of the board from the card.",
+ "card-start": "Komenco",
+ "card-start-on": "Komencas je ",
+ "cardAttachmentsPopup-title": "Attach From",
+ "cardDeletePopup-title": "Delete Card?",
+ "cardDetailsActionsPopup-title": "Card Actions",
+ "cardLabelsPopup-title": "Etikedoj",
+ "cardMembersPopup-title": "Membroj",
+ "cardMorePopup-title": "Pli",
+ "cards": "Karto",
+ "change": "Ŝanĝi",
+ "change-avatar": "Change Avatar",
+ "change-password": "Ŝangi pasvorton",
+ "change-permissions": "Change permissions",
+ "change-settings": "Ŝanĝi agordojn",
+ "changeAvatarPopup-title": "Change Avatar",
+ "changeLanguagePopup-title": "Ŝanĝi lingvon",
+ "changePasswordPopup-title": "Ŝangi pasvorton",
+ "changePermissionsPopup-title": "Change Permissions",
+ "changeSettingsPopup-title": "Ŝanĝi agordojn",
+ "checklists": "Checklists",
+ "click-to-star": "Click to star this board.",
+ "click-to-unstar": "Click to unstar this board.",
+ "clipboard": "Clipboard or drag & drop",
+ "close": "Fermi",
+ "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": "nigra",
+ "color-blue": "blua",
+ "color-green": "verda",
+ "color-lime": "lime",
+ "color-orange": "oranĝa",
+ "color-pink": "pink",
+ "color-purple": "purple",
+ "color-red": "ruĝa",
+ "color-sky": "sky",
+ "color-yellow": "flava",
+ "comment": "Komento",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "Can comment on cards only.",
+ "computer": "Komputilo",
+ "create": "Krei",
+ "createBoardPopup-title": "Krei ",
+ "createLabelPopup-title": "Create Label",
+ "current": "current",
+ "date": "Dato",
+ "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": "Farite",
+ "download": "Elŝuti",
+ "edit": "Redakti",
+ "edit-avatar": "Change Avatar",
+ "edit-profile": "Redakti profilo",
+ "editCardStartDatePopup-title": "Redakti komencdato",
+ "editCardDueDatePopup-title": "Change due date",
+ "editLabelPopup-title": "Ŝanĝi etikedo",
+ "editNotificationPopup-title": "Edit Notification",
+ "editProfilePopup-title": "Redakti profilo",
+ "email": "Retpoŝtadreso",
+ "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": "Malsukcese sendis retpoŝton",
+ "email-invalid": "Nevalida retpoŝtadreso",
+ "email-invite": "Inviti per retpoŝto",
+ "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": "Sendis retpoŝton",
+ "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": "Via teksto estas nevalida JSON",
+ "error-json-schema": "Via JSON ne enhavas la ĝustajn informojn en ĝusta formato",
+ "error-list-doesNotExist": "Tio listo ne ekzistas",
+ "error-user-doesNotExist": "Tio uzanto ne ekzistas",
+ "error-user-notAllowSelf": "You can not invite yourself",
+ "error-user-notCreated": "Uzanto ne kreita",
+ "error-username-taken": "Uzantnomo jam prenita",
+ "export-board": "Export board",
+ "filter": "Filter",
+ "filter-cards": "Filter Cards",
+ "filter-clear": "Clear filter",
+ "filter-no-label": "Nenia etikedo",
+ "filter-no-member": "Nenia membro",
+ "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",
+ "headerBarCreateBoardPopup-title": "Krei ",
+ "home": "Hejmo",
+ "import": "Importi",
+ "import-board": "Importi de 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": "Informoj",
+ "initials": "Initials",
+ "invalid-date": "Invalid date",
+ "joined": "joined",
+ "just-invited": "You are just invited to this board",
+ "keyboard-shortcuts": "Keyboard shortcuts",
+ "label-create": "Create 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": "Etikedoj",
+ "language": "Lingvo",
+ "last-admin-desc": "You can’t change roles because there must be at least one admin.",
+ "leave-board": "Leave Board",
+ "link-card": "Ligi al ĉitiu karto",
+ "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": "Movu ĉiujn kartojn en tiu listo.",
+ "list-select-cards": "Elektu ĉiujn kartojn en tiu listo.",
+ "listActionPopup-title": "List Actions",
+ "listImportCardPopup-title": "Import a Trello card",
+ "listMorePopup-title": "Pli",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
+ "lists": "Listoj",
+ "log-out": "Elsaluti",
+ "log-in": "Ensaluti",
+ "loginPopup-title": "Ensaluti",
+ "memberMenuPopup-title": "Membraj agordoj",
+ "members": "Membroj",
+ "menu": "Menuo",
+ "move-selection": "Movi elekton",
+ "moveCardPopup-title": "Movi karton",
+ "moveCardToBottom-title": "Movi suben",
+ "moveCardToTop-title": "Movi supren",
+ "moveSelectionPopup-title": "Movi elekton",
+ "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": "Nomo",
+ "no-archived-cards": "No archived cards.",
+ "no-archived-lists": "No archived lists.",
+ "no-results": "Neniaj rezultoj",
+ "normal": "Normala",
+ "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": "aŭ",
+ "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": "Netrovita paĝo.",
+ "password": "Pasvorto",
+ "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": "Privata",
+ "private-desc": "This board is private. Only people added to the board can view and edit it.",
+ "profile": "Profilo",
+ "public": "Publika",
+ "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 Label",
+ "listDeletePopup-title": "Delete List ?",
+ "remove-member": "Forigi membron",
+ "remove-member-from-card": "Forigi de karto",
+ "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": "Renomi",
+ "rename-board": "Rename Board",
+ "restore": "Forigi",
+ "save": "Savi",
+ "search": "Serĉi",
+ "select-color": "Select 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",
+ "sidebar-open": "Open Sidebar",
+ "sidebar-close": "Close Sidebar",
+ "signupPopup-title": "Create an Account",
+ "star-board-title": "Click to star this board. It will show up at top of your boards list.",
+ "starred-boards": "Starred Boards",
+ "starred-boards-description": "Starred boards show up at the top of your boards list.",
+ "subscribe": "Subscribe",
+ "team": "Teamo",
+ "this-board": "this board",
+ "this-card": "this card",
+ "time": "Tempo",
+ "title": "Titolo",
+ "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": "Alŝuti",
+ "upload-avatar": "Upload an avatar",
+ "uploaded-avatar": "Uploaded an avatar",
+ "username": "Uzantnomo",
+ "view-it": "View it",
+ "warn-list-archived": "warning: this card is in an archived list",
+ "watch": "Rigardi",
+ "watching": "Rigardante",
+ "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": "Kion vi volas fari?",
+ "admin-panel": "Admin Panel",
+ "settings": "Settings",
+ "people": "People",
+ "registration": "Registration",
+ "disable-self-registration": "Disable Self-Registration",
+ "invite": "Invite",
+ "invite-people": "Invite People",
+ "to-boards": "To board(s)",
+ "email-addresses": "Email Addresses",
+ "smtp-host-description": "The address of the SMTP server that handles your emails.",
+ "smtp-port-description": "The port your SMTP server uses for outgoing emails.",
+ "smtp-tls-description": "Enable TLS support for SMTP server",
+ "smtp-host": "SMTP Host",
+ "smtp-port": "SMTP Port",
+ "smtp-username": "Uzantnomo",
+ "smtp-password": "Pasvorto",
+ "smtp-tls": "TLS support",
+ "send-from": "From",
+ "invitation-code": "Invitation Code",
+ "email-invite-register-subject": "__inviter__ sent you an invitation",
+ "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to Wekan for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.",
+ "error-invitation-code-not-exist": "Invitation code doesn't exist"
+} \ No newline at end of file
diff --git a/i18n/es-ES.i18n.json b/i18n/es-ES.i18n.json
index f5da8370..4f777d0d 100644
--- a/i18n/es-ES.i18n.json
+++ b/i18n/es-ES.i18n.json
@@ -36,13 +36,16 @@
"activity-removed": "ha eliminado %s de %s",
"activity-sent": "ha enviado %s a %s",
"activity-unjoined": "ha abandonado %s",
+ "activity-checklist-added": "added checklist to %s",
"add": "Añadir",
- "add-attachment": "Añadir archivo adjunto",
- "add-board": "Añadir nuevo tablero",
- "add-card": "Añadir tarjeta",
+ "add-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add Checklist",
+ "add-checklist-item": "Add an item to checklist",
"add-cover": "Añadir cubierta",
- "add-label": "Añadir etiqueta",
- "add-list": "Añadir lista",
+ "add-label": "Add Label",
+ "add-list": "Add List",
"add-members": "Añadir Miembros",
"added": "Añadido",
"addMemberPopup-title": "Miembros",
@@ -57,7 +60,7 @@
"archive-all": "Guardar Todo",
"archive-board": "Archivar tablero",
"archive-card": "Archivar tarjeta",
- "archive-list": "Archivar esta lista",
+ "archive-list": "Archive List",
"archive-selection": "Archivar selección",
"archiveBoardPopup-title": "¿Archivar tablero?",
"archived-items": "Objetos archivados",
@@ -68,8 +71,8 @@
"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)",
+ "auto-watch": "Automatically watch boards when they are created",
+ "avatar-too-big": "The avatar is too large (70KB max)",
"back": "Atrás",
"board-change-color": "Cambiar color",
"board-nb-stars": "%s estrellas",
@@ -115,6 +118,7 @@
"changePasswordPopup-title": "Cambiar la contraseña",
"changePermissionsPopup-title": "Cambiar permisos",
"changeSettingsPopup-title": "Change Settings",
+ "checklists": "Checklists",
"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",
@@ -132,7 +136,9 @@
"color-sky": "cielo",
"color-yellow": "amarillo",
"comment": "Comentario",
- "comment-placeholder": "Escribir un comentario",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "Can comment on cards only.",
"computer": "Ordenador",
"create": "Crear",
"createBoardPopup-title": "Crear tablero",
@@ -177,7 +183,7 @@
"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-notAllowSelf": "You can not invite yourself",
"error-user-notCreated": "Este usuario no se ha creado",
"error-username-taken": "This username is already taken",
"export-board": "Exportar tablero",
@@ -192,6 +198,7 @@
"fullname": "Nombre Completo",
"header-logo-title": "Volver a tu página de tableros",
"hide-system-messages": "Hide system messages",
+ "headerBarCreateBoardPopup-title": "Crear tablero",
"home": "Inicio",
"import": "Importar",
"import-board": "Importar desde Trello",
@@ -209,7 +216,7 @@
"joined": "se ha unido",
"just-invited": "Has sido invitado a este tablero",
"keyboard-shortcuts": "Atajos de teclado",
- "label-create": "Crear una etiqueta nueva",
+ "label-create": "Crear etiqueta",
"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",
@@ -223,6 +230,10 @@
"list-select-cards": "Seleccionar todas las tarjetas en esta lista",
"listActionPopup-title": "Acciones de la lista",
"listImportCardPopup-title": "Importar tarjeta de Trello",
+ "listMorePopup-title": "Más",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
"lists": "Listas",
"log-out": "Finalizar la sesión",
"log-in": "Log In",
@@ -267,7 +278,8 @@
"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-label": "Remove Label",
+ "listDeletePopup-title": "Delete 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.",
@@ -277,7 +289,7 @@
"restore": "Restaurar",
"save": "Guardar",
"search": "Buscar",
- "select-color": "Selecciona un color",
+ "select-color": "Select Color",
"shortcut-assign-self": "Asignarme la tarjeta actual",
"shortcut-autocomplete-emoji": "Autocomplete emoji",
"shortcut-autocomplete-members": "Autocompletar miembros",
@@ -288,6 +300,8 @@
"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",
+ "sidebar-open": "Open Sidebar",
+ "sidebar-close": "Close Sidebar",
"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",
@@ -315,5 +329,27 @@
"welcome-board": "Welcome Board",
"welcome-list1": "Basics",
"welcome-list2": "Advanced",
- "what-to-do": "¿Qué quieres hacer?"
+ "what-to-do": "¿Qué quieres hacer?",
+ "admin-panel": "Admin Panel",
+ "settings": "Settings",
+ "people": "People",
+ "registration": "Registration",
+ "disable-self-registration": "Disable Self-Registration",
+ "invite": "Invite",
+ "invite-people": "Invite People",
+ "to-boards": "To board(s)",
+ "email-addresses": "Email Addresses",
+ "smtp-host-description": "The address of the SMTP server that handles your emails.",
+ "smtp-port-description": "The port your SMTP server uses for outgoing emails.",
+ "smtp-tls-description": "Enable TLS support for SMTP server",
+ "smtp-host": "SMTP Host",
+ "smtp-port": "SMTP Port",
+ "smtp-username": "Nombre de usuario",
+ "smtp-password": "Contraseña",
+ "smtp-tls": "TLS support",
+ "send-from": "From",
+ "invitation-code": "Invitation Code",
+ "email-invite-register-subject": "__inviter__ te ha enviado una invitación",
+ "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to Wekan for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.",
+ "error-invitation-code-not-exist": "Invitation code doesn't exist"
} \ No newline at end of file
diff --git a/i18n/es.i18n.json b/i18n/es.i18n.json
index ab067c7a..41e3f610 100644
--- a/i18n/es.i18n.json
+++ b/i18n/es.i18n.json
@@ -38,14 +38,14 @@
"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-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add Checklist",
"add-checklist-item": "Add an item to checklist",
"add-cover": "Añadir cubierta",
- "add-label": "Add the label",
- "add-list": "Add a list",
+ "add-label": "Add Label",
+ "add-list": "Add List",
"add-members": "Añadir Miembros",
"added": "Añadido",
"addMemberPopup-title": "Miembros",
@@ -60,7 +60,7 @@
"archive-all": "Guardar Todo",
"archive-board": "Archive Board",
"archive-card": "Archive Card",
- "archive-list": "Archivar esta lista",
+ "archive-list": "Archive List",
"archive-selection": "Archive selection",
"archiveBoardPopup-title": "Archive Board?",
"archived-items": "Items archivados",
@@ -71,8 +71,8 @@
"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)",
+ "auto-watch": "Automatically watch boards when they are created",
+ "avatar-too-big": "The avatar is too large (70KB max)",
"back": "Atrás",
"board-change-color": "Cambiar color",
"board-nb-stars": "%s stars",
@@ -119,8 +119,8 @@
"changePermissionsPopup-title": "Cambiar permisos",
"changeSettingsPopup-title": "Cambiar Preferencias",
"checklists": "Checklists",
- "click-to-star": "Haz clic para destacar este tablero. ",
- "click-to-unstar": "Haz clic para dejar de destacar este tablero. ",
+ "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",
@@ -136,7 +136,9 @@
"color-sky": "sky",
"color-yellow": "yellow",
"comment": "Comentario",
- "comment-placeholder": "Escribe un comentario",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "Can comment on cards only.",
"computer": "Ordenador",
"create": "Crear",
"createBoardPopup-title": "Crear tablero",
@@ -181,9 +183,9 @@
"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-notAllowSelf": "You can not invite yourself",
"error-user-notCreated": "This user is not created",
- "error-username-taken": "Este nombre de usuario ya está en uso ",
+ "error-username-taken": "Este nombre de usuario ya está en uso",
"export-board": "Export board",
"filter": "Filter",
"filter-cards": "Fichas de filtro",
@@ -196,6 +198,7 @@
"fullname": "Nombre Completo",
"header-logo-title": "Volver a tu página de tableros",
"hide-system-messages": "Ocultar los mensajes del sistema",
+ "headerBarCreateBoardPopup-title": "Crear tablero",
"home": "Inicio",
"import": "Importar",
"import-board": "importar desde Trello",
@@ -213,7 +216,7 @@
"joined": "se ha unido",
"just-invited": "You are just invited to this board",
"keyboard-shortcuts": "Atajos de teclado",
- "label-create": "Crear una etiqueta nueva ",
+ "label-create": "Crear etiqueta",
"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",
@@ -227,6 +230,10 @@
"list-select-cards": "Select all cards in this list",
"listActionPopup-title": "Acciones de la lista",
"listImportCardPopup-title": "Importar una tarjeta de Trello",
+ "listMorePopup-title": "Más",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
"lists": "Listas",
"log-out": "Finalizar la sesion",
"log-in": "Iniciar sesion",
@@ -271,8 +278,8 @@
"quick-access-description": "Star a board to add a shortcut in this bar.",
"remove-cover": "Eliminar cubierta",
"remove-from-board": "Borrar del Tablero",
- "remove-label": "Borrar la etiqueta",
- "listDeletePopup-title": "Delete the list ?",
+ "remove-label": "Remove Label",
+ "listDeletePopup-title": "Delete 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.",
@@ -282,7 +289,7 @@
"restore": "Restaurar",
"save": "Guardar",
"search": "Buscar",
- "select-color": "Selecciona un color",
+ "select-color": "Select Color",
"shortcut-assign-self": "Asignarte a ti mismo a la tarjeta actual",
"shortcut-autocomplete-emoji": "Autocompletar emoji",
"shortcut-autocomplete-members": "Autocompletar miembros",
@@ -293,6 +300,8 @@
"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",
+ "sidebar-open": "Open Sidebar",
+ "sidebar-close": "Close Sidebar",
"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",
@@ -320,5 +329,27 @@
"welcome-board": "Tablero de Bienvenida",
"welcome-list1": "Basicos",
"welcome-list2": "Avanzados",
- "what-to-do": "What do you want to do?"
+ "what-to-do": "What do you want to do?",
+ "admin-panel": "Admin Panel",
+ "settings": "Ajustes",
+ "people": "People",
+ "registration": "Registration",
+ "disable-self-registration": "Disable Self-Registration",
+ "invite": "Invite",
+ "invite-people": "Invite People",
+ "to-boards": "To board(s)",
+ "email-addresses": "Email Addresses",
+ "smtp-host-description": "The address of the SMTP server that handles your emails.",
+ "smtp-port-description": "The port your SMTP server uses for outgoing emails.",
+ "smtp-tls-description": "Enable TLS support for SMTP server",
+ "smtp-host": "SMTP Host",
+ "smtp-port": "SMTP Port",
+ "smtp-username": "Nombre de Usuario",
+ "smtp-password": "Clave",
+ "smtp-tls": "TLS support",
+ "send-from": "From",
+ "invitation-code": "Invitation Code",
+ "email-invite-register-subject": "__inviter__ sent you an invitation",
+ "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to Wekan for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.",
+ "error-invitation-code-not-exist": "Invitation code doesn't exist"
} \ No newline at end of file
diff --git a/i18n/eu.i18n.json b/i18n/eu.i18n.json
new file mode 100644
index 00000000..3c126a5c
--- /dev/null
+++ b/i18n/eu.i18n.json
@@ -0,0 +1,355 @@
+{
+ "accept": "Onartu",
+ "act-activity-notify": "[Wekan] Jarduera-jakinarazpena",
+ "act-addAttachment": "__attachment__ __card__ txartelera erantsita",
+ "act-addComment": "__card__ txartelean iruzkina: __comment__",
+ "act-createBoard": "__board__ sortuta",
+ "act-createCard": "__card__ __list__ zerrrendara gehituta",
+ "act-createList": "__list__ __board__ arbelera gehituta",
+ "act-addBoardMember": "__member__ __board__ arbelera gehituta",
+ "act-archivedBoard": "__board__ artxibatuta",
+ "act-archivedCard": "__card__ artxibatuta",
+ "act-archivedList": "__list__ artxibatuta",
+ "act-importBoard": "__board__ inportatuta",
+ "act-importCard": "__card__ inportatuta",
+ "act-importList": "__list__ inportatuta",
+ "act-joinMember": "__member__ __card__ txartelera gehituta",
+ "act-moveCard": "__card__ __oldList__ zerrendartik __list__ zerrendara eraman da",
+ "act-removeBoardMember": "__member__ __board__ arbeletik kendu da",
+ "act-restoredCard": "__card__ __board__ arbelean berrezarri da",
+ "act-unjoinMember": "__member__ __card__ txarteletik kendu da",
+ "act-withBoardTitle": "[Wekan] __board__",
+ "act-withCardTitle": "[__board__] __card__",
+ "actions": "Ekintzak",
+ "activities": "Jarduerak",
+ "activity": "Jarduera",
+ "activity-added": "%s %s(e)ra gehituta",
+ "activity-archived": "%s artxibatu du",
+ "activity-attached": "%s %s(e)ra erantsita",
+ "activity-created": "%s sortuta",
+ "activity-excluded": "%s %s(e)tik kanpo utzita",
+ "activity-imported": "%s inportatuta %s(e)ra %s(e)tik",
+ "activity-imported-board": "%s inportatuta %s(e)tik",
+ "activity-joined": "%s(e)ra elkartuta",
+ "activity-moved": "%s %s(e)tik %s(e)ra eramanda",
+ "activity-on": "%s",
+ "activity-removed": "%s %s(e)tik kenduta",
+ "activity-sent": "%s %s(e)ri bidalita",
+ "activity-unjoined": "%s utzita",
+ "activity-checklist-added": "egiaztaketa zerrenda %s(e)ra gehituta",
+ "add": "Gehitu",
+ "add-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add Checklist",
+ "add-checklist-item": "Gehitu elementu bat egiaztaketa zerrendara",
+ "add-cover": "Gehitu azala",
+ "add-label": "Add Label",
+ "add-list": "Add List",
+ "add-members": "Gehitu kideak",
+ "added": "Gehituta",
+ "addMemberPopup-title": "Kideak",
+ "admin": "Kudeatzailea",
+ "admin-desc": "Txartelak ikusi eta editatu ditzake, kideak kendu, eta arbelaren ezarpenak aldatu.",
+ "all-boards": "Arbel guztiak",
+ "and-n-other-card": "Eta beste txartel __count__",
+ "and-n-other-card_plural": "Eta beste __count__ txartel",
+ "apply": "Aplikatu",
+ "app-is-offline": "Aplikazio hau lineaz kanpo dago, orria freskatzeak datuen galera ekarriko du.",
+ "archive": "Artxibatu",
+ "archive-all": "Artxibatu guztiak",
+ "archive-board": "Artxibatu arbela",
+ "archive-card": "Artxibatu txartela",
+ "archive-list": "Archive List",
+ "archive-selection": "Artxibatu hautaketa",
+ "archiveBoardPopup-title": "Artxibatu arbela?",
+ "archived-items": "Artxibatutako elementuak",
+ "archives": "Artxiboak",
+ "assign-member": "Esleitu kidea",
+ "attached": "erantsita",
+ "attachment": "Eranskina",
+ "attachment-delete-pop": "Eranskina ezabatzea behin betikoa da. Ez dago desegiterik.",
+ "attachmentDeletePopup-title": "Ezabatu eranskina?",
+ "attachments": "Eranskinak",
+ "auto-watch": "Automatically watch boards when they are created",
+ "avatar-too-big": "The avatar is too large (70KB max)",
+ "back": "Atzera",
+ "board-change-color": "Aldatu kolorea",
+ "board-nb-stars": "%s izar",
+ "board-not-found": "Ez da arbela aurkitu",
+ "board-private-info": "Arbel hau <strong>pribatua</strong> izango da.",
+ "board-public-info": "Arbel hau <strong>publikoa</strong> izango da.",
+ "boardChangeColorPopup-title": "Aldatu arbelaren atzealdea",
+ "boardChangeTitlePopup-title": "Aldatu izena arbelari",
+ "boardChangeVisibilityPopup-title": "Aldatu ikusgaitasuna",
+ "boardChangeWatchPopup-title": "Aldatu ikuskatzea",
+ "boardMenuPopup-title": "Arbelaren menua",
+ "boards": "Arbelak",
+ "bucket-example": "Esaterako \"Pertz zerrenda\"",
+ "cancel": "Utzi",
+ "card-archived": "Txartel hau artxibatuta dago.",
+ "card-comments-title": "Txartel honek iruzkin %s dauka.",
+ "card-delete-notice": "Ezabaketa behin betiko da. Txartel honi lotutako ekintza guztiak galduko dituzu.",
+ "card-delete-pop": "Ekintza guztiak ekintza jariotik kenduko dira eta ezin izango duzu txartela berrireki. Ez dago desegiterik.",
+ "card-delete-suggest-archive": "Txartel bat artxibatu dezakezu arbeletik kendu nahi baduzu bere jarduera gordez.",
+ "card-due": "Epemuga",
+ "card-due-on": "Epemuga",
+ "card-edit-attachments": "Editatu eranskinak",
+ "card-edit-labels": "Editatu etiketak",
+ "card-edit-members": "Editatu kideak",
+ "card-labels-title": "Aldatu txartelaren etiketak",
+ "card-members-title": "Gehitu edo kendu arbeleko kideak txarteletik.",
+ "card-start": "Hasiera",
+ "card-start-on": "Hasiera",
+ "cardAttachmentsPopup-title": "Erantsi hemendik",
+ "cardDeletePopup-title": "Ezabatu txartela?",
+ "cardDetailsActionsPopup-title": "Txartel-ekintzak",
+ "cardLabelsPopup-title": "Etiketak",
+ "cardMembersPopup-title": "Kideak",
+ "cardMorePopup-title": "Gehiago",
+ "cards": "Txartelak",
+ "change": "Aldatu",
+ "change-avatar": "Aldatu avatarra",
+ "change-password": "Aldatu pasahitza",
+ "change-permissions": "Aldatu baimenak",
+ "change-settings": "Aldatu ezarpenak",
+ "changeAvatarPopup-title": "Aldatu avatarra",
+ "changeLanguagePopup-title": "Aldatu hizkuntza",
+ "changePasswordPopup-title": "Aldatu pasahitza",
+ "changePermissionsPopup-title": "Aldatu baimenak",
+ "changeSettingsPopup-title": "Aldatu ezarpenak",
+ "checklists": "Egiaztaketa zerrenda",
+ "click-to-star": "Egin klik arbel honi izarra jartzeko",
+ "click-to-unstar": "Egin klik arbel honi izarra kentzeko",
+ "clipboard": "Kopiatu eta itsatsi edo arrastatu eta jaregin",
+ "close": "Itxi",
+ "close-board": "Itxi arbela",
+ "close-board-pop": "Arbela berrezarri ahal izango duzu hasiera orriko goiburuko \"Artxiboak\" botoia sakatuz",
+ "color-black": "beltza",
+ "color-blue": "urdina",
+ "color-green": "berdea",
+ "color-lime": "lima",
+ "color-orange": "laranja",
+ "color-pink": "larrosa",
+ "color-purple": "purpura",
+ "color-red": "gorria",
+ "color-sky": "zerua",
+ "color-yellow": "horia",
+ "comment": "Iruzkina",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "Iruzkinak txarteletan soilik egin ditzake",
+ "computer": "Ordenagailua",
+ "create": "Sortu",
+ "createBoardPopup-title": "Sortu arbela",
+ "createLabelPopup-title": "Sortu etiketa",
+ "current": "unekoa",
+ "date": "Data",
+ "decline": "Ukatu",
+ "default-avatar": "Lehenetsitako avatarra",
+ "delete": "Ezabatu",
+ "deleteLabelPopup-title": "Ezabatu etiketa?",
+ "description": "Deskripzioa",
+ "disambiguateMultiLabelPopup-title": "Argitu etiketaren ekintza",
+ "disambiguateMultiMemberPopup-title": "Argitu kidearen ekintza",
+ "discard": "Baztertu",
+ "done": "Egina",
+ "download": "Deskargatu",
+ "edit": "Editatu",
+ "edit-avatar": "Aldatu avatarra",
+ "edit-profile": "Editatu profila",
+ "editCardStartDatePopup-title": "Aldatu hasiera data",
+ "editCardDueDatePopup-title": "Aldatu epemuga data",
+ "editLabelPopup-title": "Aldatu etiketa",
+ "editNotificationPopup-title": "Editatu jakinarazpena",
+ "editProfilePopup-title": "Editatu profila",
+ "email": "e-posta",
+ "email-enrollAccount-subject": "Kontu bat sortu zaizu __siteName__ gunean",
+ "email-enrollAccount-text": "Kaixo __user__,\n\nZerbitzua erabiltzen hasteko, egin klik beheko loturan.\n\n__url__\n\nEskerrik asko.",
+ "email-fail": "E-posta bidalketak huts egin du",
+ "email-invalid": "Baliogabeko e-posta",
+ "email-invite": "Gonbidatu e-posta bidez",
+ "email-invite-subject": "__inviter__ erabiltzaileak gonbidapen bat bidali dizu",
+ "email-invite-text": "Kaixo __user__,\n\n__inviter__ erabiltzaileak \"__board__\" arbelera elkartzera gonbidatzen zaitu elkar-lanean aritzeko.\n\nJarraitu mesedez lotura hau:\n\n__url__\n\nEskerrik asko.",
+ "email-resetPassword-subject": "Leheneratu zure __siteName__ guneko pasahitza",
+ "email-resetPassword-text": "Kaixo __user__,\n\nZure pasahitza berrezartzeko, egin klik beheko loturan.\n\n__url__\n\nEskerrik asko.",
+ "email-sent": "E-posta bidali da",
+ "email-verifyEmail-subject": "Egiaztatu __siteName__ guneko zure e-posta helbidea.",
+ "email-verifyEmail-text": "Kaixo __user__,\n\nZure e-posta kontua egiaztatzeko, egin klik beheko loturan.\n\n__url__\n\nEskerrik asko.",
+ "error-board-doesNotExist": "Arbel hau ez da existitzen",
+ "error-board-notAdmin": "Arbel honetako kudeatzailea izan behar zara hori egin ahal izateko",
+ "error-board-notAMember": "Arbel honetako kidea izan behar zara hori egin ahal izateko",
+ "error-json-malformed": "Zure testua ez da baliozko JSON",
+ "error-json-schema": "Zure JSON datuek ez dute formatu zuzenaren informazio egokia",
+ "error-list-doesNotExist": "Zerrenda hau ez da existitzen",
+ "error-user-doesNotExist": "Erabiltzaile hau ez da existitzen",
+ "error-user-notAllowSelf": "You can not invite yourself",
+ "error-user-notCreated": "Erabiltzaile hau sortu gabe dago",
+ "error-username-taken": "Erabiltzaile-izen hori hartuta dago",
+ "export-board": "Esportatu arbela",
+ "filter": "Iragazi",
+ "filter-cards": "Iragazi txartelak",
+ "filter-clear": "Garbitu iragazkia",
+ "filter-no-label": "Etiketarik ez",
+ "filter-no-member": "Kiderik ez",
+ "filter-on": "Iragazkia gaituta dago",
+ "filter-on-desc": "Arbel honetako txartela iragazten ari zara. Egin klik hemen iragazkia editatzeko.",
+ "filter-to-selection": "Iragazketa aukerara",
+ "fullname": "Izen abizenak",
+ "header-logo-title": "Itzuli zure arbelen orrira.",
+ "hide-system-messages": "Ezkutatu sistemako mezuak",
+ "headerBarCreateBoardPopup-title": "Sortu arbela",
+ "home": "Hasiera",
+ "import": "Inportatu",
+ "import-board": "Inportatu Trellotik",
+ "import-board-title": "Inportatu arbela Trellotik",
+ "import-board-trello-instruction": "Zure Trello arbelean, aukeratu 'Menu\", 'More', 'Print and Export', 'Export JSON', eta kopiatu jasotako testua hemen.",
+ "import-json-placeholder": "Isatsi baliozko JSON datuak hemen",
+ "import-map-members": "Kideen mapa",
+ "import-members-map": "Inportatu duzun arbela kide batzuk ditu, mesedez lotu inportatu nahi dituzun kideak Wekan erabiltzaileekin",
+ "import-show-user-mapping": "Berrikusi kideen mapa",
+ "import-user-select": "Hautatu kide hau bezala erabili nahi duzun Wekan erabiltzailea",
+ "importMapMembersAddPopup-title": "Aukeratu Wekan kidea",
+ "info": "Informazioak",
+ "initials": "Inizialak",
+ "invalid-date": "Baliogabeko data",
+ "joined": "elkartu da",
+ "just-invited": "Arbel honetara gonbidatu berri zaituzte",
+ "keyboard-shortcuts": "Teklatu laster-bideak",
+ "label-create": "Sortu etiketa",
+ "label-default": "%s etiketa (lehenetsia)",
+ "label-delete-pop": "Ez dago desegiterik. Honek etiketa hau kenduko du txartel guztietatik eta bere historiala suntsitu.",
+ "labels": "Etiketak",
+ "language": "Hizkuntza",
+ "last-admin-desc": "Ezin duzu rola aldatu gutxienez kudeatzaile bat behar delako.",
+ "leave-board": "Utzi arbela",
+ "link-card": "Lotura txartel honetara",
+ "list-archive-cards": "Artxibatu zerrendako txartel guztiak",
+ "list-archive-cards-pop": "Honek zerrenda honetako txartel guztiak arbeletik ezabatuko ditu. Artxibatutako txartelak ikusteko eta arbelera berreskuratzeko, zoaz \"Menua > Artxibatutako elementuak\" atalera.",
+ "list-move-cards": "Lekuz aldatu zerrendako txartel guztiak",
+ "list-select-cards": "Aukeratu zerrenda honetako txartel guztiak",
+ "listActionPopup-title": "Zerrendaren ekintzak",
+ "listImportCardPopup-title": "Inportatu Trello txartel bat",
+ "listMorePopup-title": "Gehiago",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
+ "lists": "Zerrendak",
+ "log-out": "Itxi saioa",
+ "log-in": "Hasi saioa",
+ "loginPopup-title": "Hasi saioa",
+ "memberMenuPopup-title": "Kidearen ezarpenak",
+ "members": "Kideak",
+ "menu": "Menua",
+ "move-selection": "Lekuz aldatu hautaketa",
+ "moveCardPopup-title": "Lekuz aldatu txartela",
+ "moveCardToBottom-title": "Eraman behera",
+ "moveCardToTop-title": "Eraman gora",
+ "moveSelectionPopup-title": "Lekuz aldatu hautaketa",
+ "multi-selection": "Hautaketa anitza",
+ "multi-selection-on": "Hautaketa anitza gaituta dago",
+ "muted": "Mututua",
+ "muted-info": "Ez zaizkizu jakinaraziko arbel honi egindako aldaketak",
+ "my-boards": "Nire arbelak",
+ "name": "Izena",
+ "no-archived-cards": "Artxibatutako txartelik ez.",
+ "no-archived-lists": "Artxibatutako zerrendarik ez.",
+ "no-results": "Emaitzarik ez",
+ "normal": "Arrunta",
+ "normal-desc": "Txartelak ikusi eta editatu ditzake. Ezin ditu ezarpenak aldatu.",
+ "not-accepted-yet": "Gonbidapena ez da oraindik onartu",
+ "notify-participate": "Jaso sortzaile edo kide zaren txartelen jakinarazpenak",
+ "notify-watch": "Jaso ikuskatzen dituzun arbel, zerrenda edo txartelen jakinarazpenak",
+ "optional": "aukerazkoa",
+ "or": "edo",
+ "page-maybe-private": "Orri hau pribatua izan daiteke. Agian <a href='%s'>saioa hasi</a> eta gero ikusi ahal izango duzu.",
+ "page-not-found": "Ez da orria aurkitu.",
+ "password": "Pasahitza",
+ "paste-or-dragdrop": "itsasteko, edo irudi fitxategia arrastatu eta jaregiteko (irudia besterik ez)",
+ "participating": "Parte-hartzen",
+ "preview": "Aurreikusi",
+ "previewAttachedImagePopup-title": "Aurreikusi",
+ "previewClipboardImagePopup-title": "Aurreikusi",
+ "private": "Pribatua",
+ "private-desc": "Arbel hau pribatua da. Arbelera gehitutako jendeak besterik ezin du ikusi eta editatu.",
+ "profile": "Profila",
+ "public": "Publikoa",
+ "public-desc": "Arbel hau publikoa da lotura duen edonorentzat ikusgai dago eta Google bezalako bilatzaileetan agertuko da. Arbelera gehitutako kideek besterik ezin dute editatu.",
+ "quick-access-description": "Jarri izarra arbel bati barra honetan lasterbide bat sortzeko",
+ "remove-cover": "Kendu azala",
+ "remove-from-board": "Kendu arbeletik",
+ "remove-label": "Remove Label",
+ "listDeletePopup-title": "Delete List ?",
+ "remove-member": "Kendu kidea",
+ "remove-member-from-card": "Kendu txarteletik",
+ "remove-member-pop": "Kendu __name__ (__username__) __boardTitle__ arbeletik? Kidea arbel honetako txartel guztietatik kenduko da. Jakinarazpenak bidaliko dira.",
+ "removeMemberPopup-title": "Kendu kidea?",
+ "rename": "Aldatu izena",
+ "rename-board": "Aldatu izena arbelari",
+ "restore": "Berrezarri",
+ "save": "Gorde",
+ "search": "Bilatu",
+ "select-color": "Select Color",
+ "shortcut-assign-self": "Esleitu zure burua txartel honetara",
+ "shortcut-autocomplete-emoji": "Automatikoki osatu emojia",
+ "shortcut-autocomplete-members": "Automatikoki osatu kideak",
+ "shortcut-clear-filters": "Garbitu iragazki guztiak",
+ "shortcut-close-dialog": "Itxi elkarrizketa-koadroa",
+ "shortcut-filter-my-cards": "Iragazi nire txartelak",
+ "shortcut-show-shortcuts": "Erakutsi lasterbideen zerrenda hau",
+ "shortcut-toggle-filterbar": "Txandakatu iragazkiaren albo-barra",
+ "shortcut-toggle-sidebar": "Txandakatu arbelaren albo-barra",
+ "show-cards-minimum-count": "Erakutsi txartel kopurua hau baino handiagoa denean:",
+ "sidebar-open": "Ireki albo-barra",
+ "sidebar-close": "Itxi albo-barra",
+ "signupPopup-title": "Sortu kontu bat",
+ "star-board-title": "Egin klik arbel honi izarra jartzeko, zure arbelen zerrendaren goialdean agertuko da",
+ "starred-boards": "Izardun arbelak",
+ "starred-boards-description": "Izardun arbelak zure arbelen zerrendaren goialdean agertuko dira",
+ "subscribe": "Harpidetu",
+ "team": "Taldea",
+ "this-board": "arbel hau",
+ "this-card": "txartel hau",
+ "time": "Ordua",
+ "title": "Izenburua",
+ "tracking": "Jarraitzen",
+ "tracking-info": "Sortzaile edo kide gisa parte-hartzen duzun txartelei egindako aldaketak jakinaraziko zaizkizu.",
+ "unassign-member": "Kendu kidea",
+ "unsaved-description": "Gorde gabeko deskripzio bat duzu",
+ "unwatch": "Utzi ikuskatzeari",
+ "upload": "Igo",
+ "upload-avatar": "Igo avatar bat",
+ "uploaded-avatar": "Avatar bat igo da",
+ "username": "Erabiltzaile-izena",
+ "view-it": "Ikusi",
+ "warn-list-archived": "abisua: txartel hau artxibatutako zerrenda batean dago",
+ "watch": "Ikuskatu",
+ "watching": "Ikuskatzen",
+ "watching-info": "Arbel honi egindako aldaketak jakinaraziko zaizkizu",
+ "welcome-board": "Ongi etorri arbela",
+ "welcome-list1": "Oinarrizkoa",
+ "welcome-list2": "Aurreratua",
+ "what-to-do": "Zer egin nahi duzu?",
+ "admin-panel": "Kudeaketa panela",
+ "settings": "Ezarpenak",
+ "people": "Jendea",
+ "registration": "Izen-ematea",
+ "disable-self-registration": "Desgaitu nork bere burua erregistratzea",
+ "invite": "Gonbidatu",
+ "invite-people": "Gonbidatu jendea",
+ "to-boards": "Arbele(ta)ra",
+ "email-addresses": "E-posta helbideak",
+ "smtp-host-description": "Zure e-posta mezuez arduratzen den SMTP zerbitzariaren helbidea",
+ "smtp-port-description": "Zure SMTP zerbitzariak bidalitako e-posta mezuentzat erabiltzen duen kaia.",
+ "smtp-tls-description": "Gaitu TLS euskarria SMTP zerbitzariarentzat",
+ "smtp-host": "SMTP ostalaria",
+ "smtp-port": "SMTP kaia",
+ "smtp-username": "Erabiltzaile-izena",
+ "smtp-password": "Pasahitza",
+ "smtp-tls": "TLS euskarria",
+ "send-from": "Nork",
+ "invitation-code": "Gonbidapen kodea",
+ "email-invite-register-subject": "__inviter__ erabiltzaileak gonbidapen bat bidali dizu",
+ "email-invite-register-text": "Kaixo __user__,\n\n__inviter__ erabiltzaileak Wekanera gonbidatu zaitu elkar-lanean aritzeko.\n\nJarraitu mesedez lotura hau:\n__url__\n\nZure gonbidapen kodea hau da: __icode__\n\nEskerrik asko.",
+ "error-invitation-code-not-exist": "Gonbidapen kodea ez da existitzen"
+} \ No newline at end of file
diff --git a/i18n/fa.i18n.json b/i18n/fa.i18n.json
index 667f87b4..786c5462 100644
--- a/i18n/fa.i18n.json
+++ b/i18n/fa.i18n.json
@@ -1,29 +1,29 @@
{
"accept": "تایید",
- "act-activity-notify": "[Wekan] Activity Notification",
- "act-addAttachment": "attached __attachment__ to __card__",
- "act-addComment": "commented on __card__: __comment__",
- "act-createBoard": "created __board__",
- "act-createCard": "added __card__ to __list__",
- "act-createList": "added __list__ to __board__",
- "act-addBoardMember": "added __member__ to __board__",
- "act-archivedBoard": "archived __board__",
- "act-archivedCard": "archived __card__",
- "act-archivedList": "archived __list__",
- "act-importBoard": "imported __board__",
- "act-importCard": "imported __card__",
- "act-importList": "imported __list__",
- "act-joinMember": "added __member__ to __card__",
- "act-moveCard": "moved __card__ from __oldList__ to __list__",
- "act-removeBoardMember": "removed __member__ from __board__",
- "act-restoredCard": "restored __card__ to __board__",
- "act-unjoinMember": "removed __member__ from __card__",
+ "act-activity-notify": "[wekan]اطلاع فعالیت",
+ "act-addAttachment": "پیوست __attachment__ به __card__",
+ "act-addComment": "یادداشت بر __card__: __comment__",
+ "act-createBoard": " __board__ ایجادشد",
+ "act-createCard": " __card__ به __list__ اضافه شد",
+ "act-createList": "__list__ به __board__ اضافه شد",
+ "act-addBoardMember": "__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": "انتقال __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-added": "%s به %s اضافه شد",
"activity-archived": "%s بایگانی شد",
"activity-attached": "%s به %s پیوست شد",
"activity-created": "%s ایجاد شد",
@@ -35,17 +35,17 @@
"activity-on": "%s",
"activity-removed": "%s از %s حذف شد",
"activity-sent": "ارسال %s به %s",
- "activity-unjoined": "جداسازی %s",
- "activity-checklist-added": "added checklist to %s",
+ "activity-unjoined": "قطع اتصال %s",
+ "activity-checklist-added": "سیاهه به %s اضافه شد",
"add": "افزودن",
- "add-attachment": "افزودن ضمیمه",
- "add-board": "افزودن برد جدید",
- "add-card": "افزودن کارت",
- "add-checklist": "Add a checklist",
- "add-checklist-item": "Add an item to checklist",
- "add-cover": "افزودن کاور",
- "add-label": "افزودن برچسب",
- "add-list": "افزودن لیست",
+ "add-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add Checklist",
+ "add-checklist-item": "افزودن مورد به سیاهه",
+ "add-cover": "جلد کردن",
+ "add-label": "Add Label",
+ "add-list": "Add List",
"add-members": "افزودن اعضا",
"added": "اضافه گردید",
"addMemberPopup-title": "اعضا",
@@ -54,25 +54,25 @@
"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": "تمامی آرشیوها",
+ "apply": "اجرا",
+ "app-is-offline": "برنامه به شبکه متصل نیست، تازه کردن(f5) صفحه اطلاعات نوشته شده را پاک می کند",
+ "archive": "بایگانی",
+ "archive-all": "تمامی بایگانی ها",
"archive-board": "بایگانی برد",
"archive-card": "بایگانی کارت",
- "archive-list": "بایگانی این لیست",
+ "archive-list": "Archive List",
"archive-selection": "بایگانی موارد انتخاب شده ها",
"archiveBoardPopup-title": "آیا می خواهید بایگانی شود؟",
"archived-items": "آیتم های بایگانی شده",
- "archives": "آرشیوها",
+ "archives": "بایگانی ها",
"assign-member": "تعیین عضو",
- "attached": "وابسته",
+ "attached": "ضمیمه",
"attachment": "ضمائم",
"attachment-delete-pop": "حذف پیوست دایمی خواهد بود، بدون بازگشت",
"attachmentDeletePopup-title": "آیا می خواهید ضمیمه را حذف کنید؟",
"attachments": "ضمائم",
- "auto-watch": "Automatically watch boards when create it",
- "avatar-too-big": "حجم تصویر انتخاب شده بیشتر از حد مجاز است .(حد مجاز 70Kb)",
+ "auto-watch": "اضافه شدن خودکار دیده بانی تخته زمانی که ایجاد می شوند",
+ "avatar-too-big": "تصویر کاربر بسیار بزرگ است ـ حداکثر۷۰ کیلوبایت ـ",
"back": "بازگشت",
"board-change-color": "تغییر رنگ",
"board-nb-stars": "%s ستاره",
@@ -82,25 +82,25 @@
"boardChangeColorPopup-title": "تغییر پس زمینه برد",
"boardChangeTitlePopup-title": "تغییر نام برد",
"boardChangeVisibilityPopup-title": "تغغیر وضعیت نمایش",
- "boardChangeWatchPopup-title": "Change Watch",
- "boardMenuPopup-title": "منوی برد",
- "boards": "بردها",
- "bucket-example": "مانند \"لیست سبدها\" برای مثال",
+ "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": "Due",
- "card-due-on": "Due on",
+ "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": "Start",
- "card-start-on": "Starts on",
+ "card-start": "شروع",
+ "card-start-on": "آغاز بر",
"cardAttachmentsPopup-title": "ضمیمه از",
"cardDeletePopup-title": "آیا می خواهید کارت را حذف کنید؟",
"cardDetailsActionsPopup-title": "اعمال کارت",
@@ -109,25 +109,25 @@
"cardMorePopup-title": "بیشتر",
"cards": "کارت ها",
"change": "تغییر",
- "change-avatar": "تغییر آواتار",
+ "change-avatar": "تغییر تصویر",
"change-password": "تغییر کلمه عبور",
"change-permissions": "تغییر دسترسی ها",
- "change-settings": "Change Settings",
- "changeAvatarPopup-title": "تغییر آواتار",
+ "change-settings": "تغییر تنظیمات",
+ "changeAvatarPopup-title": "تغییر تصویر",
"changeLanguagePopup-title": "تغییر زبان",
"changePasswordPopup-title": "تغییر کلمه عبور",
"changePermissionsPopup-title": "تغییر دسترسی ها",
- "changeSettingsPopup-title": "Change Settings",
- "checklists": "Checklists",
- "click-to-star": "جهت افزودن ستاره کلیک کنید .",
- "click-to-unstar": "جهت کاهش ستاره کلیک کنید.",
- "clipboard": "ذخیره در حافظه ویا بکش-رهاکن",
+ "changeSettingsPopup-title": "تغییر تنظیمات",
+ "checklists": "سیاهه ها",
+ "click-to-star": "با کلیک کردن ستاره بدهید",
+ "click-to-unstar": "با کلیک کردن ستاره را کم کنید",
+ "clipboard": "ذخیره در حافظه ویا بردار-رهاکن",
"close": "بستن",
"close-board": "بستن برد",
- "close-board-pop": "شما می توانید با کلیک بر دکمه \"بایگانی\" از قسمت بالای خانه، تخته را بازگذاری نمایید.",
+ "close-board-pop": "شما می توانید با کلیک بر دکمه \"بایگانی\" از قسمت بالای خانه، تخته را بازآوری نمایید.",
"color-black": "مشکی",
"color-blue": "آبی",
- "color-green": "سبز\n",
+ "color-green": "سبز",
"color-lime": "لیمویی",
"color-orange": "نارنجی",
"color-pink": "صورتی",
@@ -136,188 +136,220 @@
"color-sky": "آبی آسمانی",
"color-yellow": "زرد",
"comment": "نظر",
- "comment-placeholder": "ثبت یک نظر",
- "computer": "کامپیوتر",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "صرفا یادداشت",
+ "comment-only-desc": "صرفا یادداشت برروی کارت ها",
+ "computer": "رایانه",
"create": "ایجاد",
- "createBoardPopup-title": "ایجاد برد",
+ "createBoardPopup-title": "ایجاد تخته",
"createLabelPopup-title": "ایجاد برچسب",
"current": "جاری",
- "date": "Date",
+ "date": "تاریخ",
"decline": "رد",
- "default-avatar": "آواتار پیش فرض",
+ "default-avatar": "تصویر پیش فرض",
"delete": "حذف",
"deleteLabelPopup-title": "آیا می خواهید برچسب را حذف کنید؟",
"description": "توضیحات",
"disambiguateMultiLabelPopup-title": "عمل ابهام زدایی از برچسب",
"disambiguateMultiMemberPopup-title": "عمل ابهام زدایی از کاربر",
- "discard": "انصراف",
- "done": "پایان",
+ "discard": "لغو",
+ "done": "انجام شده",
"download": "دریافت",
"edit": "ویرایش",
- "edit-avatar": "تغییر آواتار",
+ "edit-avatar": "تغییر تصویر",
"edit-profile": "ویرایش پروفایل",
- "editCardStartDatePopup-title": "Change start date",
- "editCardDueDatePopup-title": "Change due date",
- "editLabelPopup-title": "تغغیر برچسب",
- "editNotificationPopup-title": "Edit Notification",
+ "editCardStartDatePopup-title": "تغییر تاریخ آغاز",
+ "editCardDueDatePopup-title": "تغییر تاریخ بدلیل",
+ "editLabelPopup-title": "تغیر برچسب",
+ "editNotificationPopup-title": "اصلاح اعلان",
"editProfilePopup-title": "ویرایش پروفایل",
- "email": "ایمیل",
+ "email": "پست الکترونیک",
"email-enrollAccount-subject": "یک حساب کاربری برای شما در __siteName__ ایجاد شد",
- "email-enrollAccount-text": "سلام __user__ \nبرای شروع به استفاده از این سرویس برروی کلیک روی لینک زیر کلیک نمایید،با تشکر \n__url__.",
+ "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-resetPassword-text": "سلام __user__\nجهت تنظیم مجدد کلمه عبور آدرس زیر را دنبال نمایید، باتشکر:\n__url__",
"email-sent": "نامه الکترونیکی فرستاده شد",
"email-verifyEmail-subject": "تایید آدرس الکترونیکی شما در __siteName__",
- "email-verifyEmail-text": "سلام __user__\nبه منظور تایید آدرس الکترونیکی حساب خود، لینک زیر را دنبال نمایید، باتشکر:\n__url__.",
+ "email-verifyEmail-text": "سلام __user__\nبه منظور تایید آدرس الکترونیکی حساب خود، آدرس زیر را دنبال نمایید، باتشکر:\n__url__.",
"error-board-doesNotExist": "تخته مورد نظر وجود ندارد",
"error-board-notAdmin": "شما جهت انجام آن باید مدیر تخته باشید",
- "error-board-notAMember": "شما انجام آن ،باید عضو این تخته باشید.",
+ "error-board-notAMember": "شما انجام آن ،اید عضو این تخته باشید.",
"error-json-malformed": "متن درغالب صحیح Json نمی باشد.",
"error-json-schema": "داده های Json شما، شامل اطلاعات صحیح در غالب درستی نمی باشد.",
"error-list-doesNotExist": "این لیست موجود نیست",
"error-user-doesNotExist": "این کاربر وجود ندارد",
- "error-user-notAllowSelf": "این اقدامبروی خود، مجاز نمی باشد",
+ "error-user-notAllowSelf": "عدم امکان دعوت خود",
"error-user-notCreated": "این کاربر ایجاد نشده است",
- "error-username-taken": "This username is already taken",
+ "error-username-taken": "این نام کاربری استفاده شده است",
"export-board": "انتقال به بیرون تخته",
- "filter": "فیلتر",
- "filter-cards": "صافی کارتها",
- "filter-clear": "حذف فیلتر",
- "filter-no-label": "No label",
- "filter-no-member": "No member",
- "filter-on": "صافی روشن است",
- "filter-on-desc": "شما صافی برای کارتهای تخته را روشن کرده اید. جهت ویرایش کلیک نمایید.",
- "filter-to-selection": "صافی برای موارد انتخابی",
+ "filter": "صافی ـFilterـ",
+ "filter-cards": "صافی ـFilterـ کارتها",
+ "filter-clear": "حذف صافی ـFilterـ",
+ "filter-no-label": "بدون برچسب",
+ "filter-no-member": "بدون عضو",
+ "filter-on": "صافی ـFilterـ فعال است",
+ "filter-on-desc": "شما صافی ـFilterـ برای کارتهای تخته را روشن کرده اید. جهت ویرایش کلیک نمایید.",
+ "filter-to-selection": "صافی ـFilterـ برای موارد انتخابی",
"fullname": "نام و نام خانوادگی",
"header-logo-title": "بازگشت به صفحه تخته.",
- "hide-system-messages": "Hide system messages",
+ "hide-system-messages": "عدم نمایش پیامهای سیستمی",
+ "headerBarCreateBoardPopup-title": "ایجاد تخته",
"home": "خانه",
"import": "وارد کردن",
- "import-board": "وارد کردن از ترلو",
- "import-board-title": "Import board from Trello",
+ "import-board": "وارد کردن از Trello",
+ "import-board-title": "وارد کردن تخته ها از 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-map-members": "نگاشت اعضا",
+ "import-members-map": "تعدادی عضو در تخته وارد شده می باشد. لطفا کاربرانی که باید وارد نرم افزار بشوند را مشخص کنید.",
"import-show-user-mapping": "بررسی نقشه کاربران",
"import-user-select": "کاربری از نرم افزار را که می خواهید بعنوان این عضو جایگزین شود را انتخاب کنید.",
- "importMapMembersAddPopup-title": "Select Wekan member",
+ "importMapMembersAddPopup-title": "انتخاب کاربر Wekan",
"info": "اطلاعات",
"initials": "تخصیصات اولیه",
- "invalid-date": "Invalid date",
+ "invalid-date": "تاریخ نامعتبر",
"joined": "متصل",
"just-invited": "هم اکنون، شما به این تخته دعوت شده اید.",
"keyboard-shortcuts": "میانبر کلیدها",
- "label-create": "ایجاد برچسب جدید",
+ "label-create": "ایجاد برچسب",
"label-default": "%s برچسب(پیش فرض)",
- "label-delete-pop": "بدون برگشت. این حذفبرچسب را از هر کارت پاک خواهد کردو تاریخچه آن را نیز ازبین می برد.",
+ "label-delete-pop": "بدون برگشت. این حذف برچسب را از هر کارت پاک خواهد کردو تاریخچه آن را نیز ازبین می برد.",
"labels": "برچسب ها",
"language": "زبان",
- "last-admin-desc": "شما نمی توانید نقش را تغییر دهید چراکه باید حداقل یک مدیری وجود داشته باشد.",
- "leave-board": "خروج از برد",
+ "last-admin-desc": "شما نمی توانید نقش ـroleـ را تغییر دهید چراکه باید حداقل یک مدیری وجود داشته باشد.",
+ "leave-board": "خروج از تخته",
"link-card": "ارجاع به این کارت",
"list-archive-cards": "بایگانی تمامی کارتهای این لیست",
- "list-archive-cards-pop": "این همه کارت ها در این لیست از تخته راحذف خواهد کرد. جهت مشاهده کارت های بایگانی و بازگرداندن آنها ، \"Menu\",\"Archived Item\" را کلیک کنید.",
- "list-move-cards": "انتقال تمام کارت ها در این لیست",
- "list-select-cards": "انتخاب تمام کارت ها در این لیست",
+ "list-archive-cards-pop": "این اقدام، همه کارت های این لیست از تخته راحذف خواهد کرد. جهت مشاهده کارت های بایگانی و بازگرداندن آنها ، \"Menu\",\"Archived Item\" را کلیک کنید.",
+ "list-move-cards": "انتقال تمام کارت های این لیست",
+ "list-select-cards": "انتخاب تمام کارت های این لیست",
"listActionPopup-title": "لیست اقدامات",
"listImportCardPopup-title": "وارد کردن کارت Trello",
+ "listMorePopup-title": "بیشتر",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
"lists": "لیست ها",
"log-out": "خروج",
- "log-in": "Log In",
+ "log-in": "ورود",
"loginPopup-title": "ورود",
"memberMenuPopup-title": "تنظیمات اعضا",
"members": "اعضا",
"menu": "منو",
- "move-selection": "حرکت مورد انتخاب شده",
+ "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": "بردهای من",
+ "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": "نتیجه ای ندارد",
+ "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",
+ "not-accepted-yet": "دعوت نامه هنوز پذیرفته نشده است",
+ "notify-participate": "اطلاع رسانی از هرگونه تغییر در کارتهایی که ایجاد کرده اید ویا عضو آن هستید",
+ "notify-watch": "اطلاع رسانی از هرگونه تغییر در تخته، لیست یا کارتهایی که از آنها دیده بانی میکنید",
"optional": "انتخابی",
"or": "یا",
"page-maybe-private": "این صفحه ممکن است خصوصی باشد.شما با<a href='%s'>ورود</a> می توانید آنرا ملاحظه نمایید.",
"page-not-found": "صفحه پیدا نشد.",
"password": "کلمه عبور",
- "paste-or-dragdrop": "جهت چسباندن، یا کشیدن-رهاسازی فایل تصویر به آن (تصویر)",
- "participating": "Participating",
- "preview": "نمایش",
- "previewAttachedImagePopup-title": "نمایش",
- "previewClipboardImagePopup-title": "نمایش",
+ "paste-or-dragdrop": "جهت چسباندن، یا برداشتن-رهاسازی فایل تصویر به آن (تصویر)",
+ "participating": "شرکت کنندگان",
+ "preview": "پیش‌نمایش",
+ "previewAttachedImagePopup-title": "پیش‌نمایش",
+ "previewClipboardImagePopup-title": "پیش‌نمایش",
"private": "خصوصی",
"private-desc": "این تخته خصوصی است. فقط تنها افراد اضافه شده به آن می توانند مشاهده و ویرایش کنند.",
- "profile": "پروفایل",
+ "profile": "حساب کاربری",
"public": "عمومی",
- "public-desc": "این تخته عمومی است. برای هر کسی با لینک ویا جستجو درموتورها مانند گوگل قابل مشاهده است . فقط افرادی که به آن اضافه شده اند امکان ویرایش دارند.",
+ "public-desc": "این تخته عمومی است. برای هر کسی با آدرس ویا جستجو درموتورها مانند گوگل قابل مشاهده است . فقط افرادی که به آن اضافه شده اند امکان ویرایش دارند.",
"quick-access-description": "جهت افزودن یک تخته به اینجا،آنرا ستاره دار نمایید.",
"remove-cover": "حذف کاور",
- "remove-from-board": "حذف از برد",
- "remove-label": "حذف برچسب",
+ "remove-from-board": "حذف از تخته",
+ "remove-label": "Remove Label",
+ "listDeletePopup-title": "Delete List ?",
"remove-member": "حذف عضو",
"remove-member-from-card": "حذف از کارت",
- "remove-member-pop": "آیا می خواهید __Name__ (__username__) را از __boardTitle__ حذف کنید? کاربر از تمام کارت ها در این تخته حذف خواهد شد و به آنها اطلاع رسانی خواهد شد.",
+ "remove-member-pop": "آیا __name__ (__username__) را از __boardTitle__ حذف می کنید? کاربر از تمام کارت ها در این تخته حذف خواهد شد و آنها ازین اقدام مطلع خواهند شد.",
"removeMemberPopup-title": "آیا می خواهید کاربر را حذف کنید؟",
- "rename": "تغغیر نام",
- "rename-board": "تغییر نام برد",
+ "rename": "تغیر نام",
+ "rename-board": "تغییر نام تخته",
"restore": "بازیابی",
"save": "ذخیره",
"search": "جستجو",
- "select-color": "انتخاب رنگ",
+ "select-color": "Select Color",
"shortcut-assign-self": "اختصاص خود به کارت فعلی",
- "shortcut-autocomplete-emoji": "Autocomplete emoji",
+ "shortcut-autocomplete-emoji": "تکمیل خودکار شکلکها",
"shortcut-autocomplete-members": "تکمیل خودکار کاربرها",
- "shortcut-clear-filters": "حذف تمامی فیلترها",
- "shortcut-close-dialog": "بستن دیالوگ",
+ "shortcut-clear-filters": "حذف تمامی صافی ـfilterـ",
+ "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": "جهت ستاره دار کردن تخته کلیک نمایی.این در بالای لیست تخته های شما نمایش داده خواهد شد.",
+ "shortcut-toggle-filterbar": "ضامن نوار جداکننده صافی ـfilterـ",
+ "shortcut-toggle-sidebar": "ضامن نوار جداکننده تخته",
+ "show-cards-minimum-count": "نمایش تعداد کارتها اگر لیست شامل بیشتراز",
+ "sidebar-open": "بازکردن جداکننده",
+ "sidebar-close": "بستن جداکننده",
+ "signupPopup-title": "ایجاد یک کاربر",
+ "star-board-title": "برای ستاره دادن، کلیک کنید.این در بالای لیست تخته های شما نمایش داده خواهد شد.",
"starred-boards": "تخته های ستاره دار",
"starred-boards-description": "تخته های ستاره دار در بالای لیست تخته ها نمایش داده می شود.",
"subscribe": "عضوشدن",
"team": "تیم",
- "this-board": "این برد",
+ "this-board": "این تخته",
"this-card": "این کارت",
- "time": "Time",
+ "time": "زمان",
"title": "عنوان",
- "tracking": "Tracking",
- "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
- "unassign-member": "عدم انتصاب کاربر ",
+ "tracking": "پیگردی",
+ "tracking-info": "شما از هرگونه تغییر در کارتهایی که بعنوان ایجاد کننده ویا عضو آن هستید، آگاه خواهید شد",
+ "unassign-member": "عدم انتصاب کاربر",
"unsaved-description": "شما توضیحات ذخیره نشده دارید.",
- "unwatch": "Unwatch",
+ "unwatch": "عدم دیده بانی",
"upload": "ارسال",
- "upload-avatar": "ارسال یک آواتار",
- "uploaded-avatar": "آواتار ارسال شد",
+ "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": "چه کاری می خواهید انجام دهید؟"
+ "watch": "دیده بانی",
+ "watching": "درحال دیده بانی",
+ "watching-info": "شما از هر تغییری دراین تخته آگاه خواهید شد",
+ "welcome-board": "به این تخته خوش آمدید",
+ "welcome-list1": "پایه ای ها",
+ "welcome-list2": "پیشرفته",
+ "what-to-do": "چه کاری می خواهید انجام دهید؟",
+ "admin-panel": "پیشخوان مدیریتی",
+ "settings": "تنظمات",
+ "people": "افراد",
+ "registration": "ثبت نام",
+ "disable-self-registration": "غیرفعالسازی خودثبت نامی",
+ "invite": "دعوت",
+ "invite-people": "دعوت از افراد",
+ "to-boards": "به تخته(ها)",
+ "email-addresses": "ادرس پست های الکترونیکی",
+ "smtp-host-description": "آدرس سرور SMTP ای که پست الکترونیکی شما برروی آن است",
+ "smtp-port-description": "شماره درگاه ـPortـ ای که سرور SMTP شما جهت ارسال از آن استفاده می کند",
+ "smtp-tls-description": "پشتیبانی از TLS برای سرور SMTP",
+ "smtp-host": "آدرس سرور SMTP",
+ "smtp-port": "شماره درگاه ـPortـ سرور SMTP",
+ "smtp-username": "نام کاربری",
+ "smtp-password": "کلمه عبور",
+ "smtp-tls": "پشتیبانی از SMTP",
+ "send-from": "از",
+ "invitation-code": "کد دعوت نامه",
+ "email-invite-register-subject": "__inviter__ برای شما دعوت نامه ارسال کرده است",
+ "email-invite-register-text": "__User__ عزیز \nکاربر __inviter__ شما را به عضویت در Wekan برای همکاری دعوت کرده است.\nلطفا لینک زیر را دنبال کنید،\n __url__\nکد دعوت شما __icode__ می باشد.\n باتشکر",
+ "error-invitation-code-not-exist": "چنین کد دعوتی یافت نشد"
} \ No newline at end of file
diff --git a/i18n/fi.i18n.json b/i18n/fi.i18n.json
index 63e79088..f315b964 100644
--- a/i18n/fi.i18n.json
+++ b/i18n/fi.i18n.json
@@ -35,11 +35,11 @@
"activity-on": "kohteessa %s",
"activity-removed": "poistettu %s kohteesta %s",
"activity-sent": "lähetetty %s kohteeseen %s",
- "activity-unjoined": "peruttu %s liityminen",
+ "activity-unjoined": "peruttu %s liittyminen",
"activity-checklist-added": "lisätty tarkistuslista kohteeseen %s",
"add": "Lisää",
- "add-attachment": "Lisää liitetiedosto",
- "add-board": "Lisää uusi taulu",
+ "add-attachment": "Lisää liite",
+ "add-board": "Lisää taulu",
"add-card": "Lisää kortti",
"add-checklist": "Lisää tarkistuslista",
"add-checklist-item": "Lisää kohde tarkistuslistaan",
@@ -60,7 +60,7 @@
"archive-all": "Arkistoi kaikki",
"archive-board": "Arkistoi taulu",
"archive-card": "Arkistoi kortti",
- "archive-list": "Arkistoi tämä lista",
+ "archive-list": "Arkistoi lista",
"archive-selection": "Arkistoi valinta",
"archiveBoardPopup-title": "Arkistoi taulu?",
"archived-items": "Arkistoidut kohteet",
@@ -72,7 +72,7 @@
"attachmentDeletePopup-title": "Poista liitetiedosto?",
"attachments": "Liitetiedostot",
"auto-watch": "Automaattisesti seuraa tauluja kun ne on luotu",
- "avatar-too-big": "Profiilikuva on liian suuri (70Kb maksimi)",
+ "avatar-too-big": "Profiilikuva on liian suuri (70KB maksimi)",
"back": "Takaisin",
"board-change-color": "Muokkaa väriä",
"board-nb-stars": "%s tähteä",
@@ -137,6 +137,8 @@
"color-yellow": "keltainen",
"comment": "Kommentti",
"comment-placeholder": "Kirjoita kommentti",
+ "comment-only": "Vain kommentointi",
+ "comment-only-desc": "Voi vain kommentoida kortteja",
"computer": "Tietokone",
"create": "Luo",
"createBoardPopup-title": "Luo taulu",
@@ -172,7 +174,7 @@
"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-verifyEmail-subject": "Verify your email address on __siteName__",
+ "email-verifyEmail-subject": "Varmista sähköpostiosoitteesi osoitteessa __url__",
"email-verifyEmail-text": "Hei __user__,\n\nvahvistaaksesi sähköpostiosoitteesi, klikkaa allaolevaa linkkiä.\n\n__url__\n\nKiitos.",
"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ä",
@@ -181,10 +183,10 @@
"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-notAllowSelf": "Et voi kutsua itseäsi",
"error-user-notCreated": "Tätä käyttäjää ei ole luotu",
"error-username-taken": "Tämä käyttäjätunnus on jo käytössä",
- "export-board": "Export board",
+ "export-board": "Vie taulu",
"filter": "Suodata",
"filter-cards": "Suodata kortit",
"filter-clear": "Poista suodatin",
@@ -196,6 +198,7 @@
"fullname": "Koko nimi",
"header-logo-title": "Palaa taulut sivullesi.",
"hide-system-messages": "Piilota järjestelmäviestit",
+ "headerBarCreateBoardPopup-title": "Luo taulu",
"home": "Koti",
"import": "Tuo",
"import-board": "tuo Trellosta",
@@ -213,7 +216,7 @@
"joined": "liittyi",
"just-invited": "Sinut on juuri kutsuttu tälle taululle",
"keyboard-shortcuts": "Pikanäppäimet",
- "label-create": "Luo uusi tunniste",
+ "label-create": "Luo 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",
@@ -227,6 +230,10 @@
"list-select-cards": "Valitse kaikki kortit tässä listassa",
"listActionPopup-title": "Listaa toimet",
"listImportCardPopup-title": "Tuo Trello kortti",
+ "listMorePopup-title": "Lisää",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
"lists": "Listat",
"log-out": "Kirjaudu ulos",
"log-in": "Kirjaudu sisään",
@@ -234,11 +241,11 @@
"memberMenuPopup-title": "Jäsen asetukset",
"members": "Jäsenet",
"menu": "Valikko",
- "move-selection": "Move selection",
+ "move-selection": "Siirrä valinta",
"moveCardPopup-title": "Siirrä kortti",
"moveCardToBottom-title": "Siirrä alimmaiseksi",
"moveCardToTop-title": "Siirrä ylimmäiseksi",
- "moveSelectionPopup-title": "Move selection",
+ "moveSelectionPopup-title": "Siirrä valinta",
"multi-selection": "Monivalinta",
"multi-selection-on": "Monivalinta on päällä",
"muted": "Vaimennettu",
@@ -272,6 +279,7 @@
"remove-cover": "Poista kansi",
"remove-from-board": "Poista taululta",
"remove-label": "Poista tunniste",
+ "listDeletePopup-title": "Delete List ?",
"remove-member": "Poista jäsen",
"remove-member-from-card": "Poista kortilta",
"remove-member-pop": "Poista __name__ (__username__) taululta __boardTitle__? Jäsen poistetaan kaikilta taulun korteilta. Heille lähetetään ilmoitus.",
@@ -292,6 +300,8 @@
"shortcut-toggle-filterbar": "Muokkaa suodatus sivupalkin näkyvyyttä",
"shortcut-toggle-sidebar": "Muokkaa taulu sivupalkin näkyvyyttä",
"show-cards-minimum-count": "Näytä korttien lukumäärä jos lista sisältää enemmän kuin",
+ "sidebar-open": "Avaa sivupalkki",
+ "sidebar-close": "Sulje sivupalkki",
"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",
@@ -319,5 +329,27 @@
"welcome-board": "Tervetuloa taulu",
"welcome-list1": "Perusasiat",
"welcome-list2": "Edistynyt",
- "what-to-do": "Mitä haluat tehdä?"
+ "what-to-do": "Mitä haluat tehdä?",
+ "admin-panel": "Hallintapaneeli",
+ "settings": "Asetukset",
+ "people": "Ihmiset",
+ "registration": "Rekisteröinti",
+ "disable-self-registration": "Poista käytöstä itse-rekisteröityminen",
+ "invite": "Kutsu",
+ "invite-people": "Kutsu ihmisiä",
+ "to-boards": "Taulu(i)lle",
+ "email-addresses": "Sähköpostiosoite",
+ "smtp-host-description": "SMTP palvelimen osoite jolla sähköpostit lähetetään.",
+ "smtp-port-description": "Portti jota STMP palvelimesi käyttää lähteville sähköposteille.",
+ "smtp-tls-description": "Ota käyttöön TLS tuki SMTP palvelimelle",
+ "smtp-host": "SMTP isäntä",
+ "smtp-port": "SMTP portti",
+ "smtp-username": "Käyttäjänimi",
+ "smtp-password": "Salasana",
+ "smtp-tls": "TLS tuki",
+ "send-from": "Lähettäjä",
+ "invitation-code": "Kutsukoodi",
+ "email-invite-register-subject": "__inviter__ lähetti sinulle kutsun",
+ "email-invite-register-text": "Hei __user__,\n\n__inviter__ kutsuu sinut mukaan Wekan ohjelman käyttöön.\n\nOle hyvä ja seuraa allaolevaa linkkiä:\n__url__\n\nJa kutsukoodisi on: __icode__\n\nKiitos.",
+ "error-invitation-code-not-exist": "Kutsukoodi ei ole olemassa"
} \ No newline at end of file
diff --git a/i18n/fr.i18n.json b/i18n/fr.i18n.json
index 22243159..4467a344 100644
--- a/i18n/fr.i18n.json
+++ b/i18n/fr.i18n.json
@@ -1,23 +1,23 @@
{
"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-activity-notify": "[Wekan] Notification d'activité",
+ "act-addAttachment": "a joint __attachment__ à __card__",
+ "act-addComment": "a commenté __card__ : __comment__",
+ "act-createBoard": "a créé __board__",
+ "act-createCard": "a ajouté __card__ à __list__",
+ "act-createList": "a ajouté __list__ à __board__",
+ "act-addBoardMember": "a ajouté __member__ à __board__",
+ "act-archivedBoard": "a archivé __board__",
+ "act-archivedCard": "a archivé __card__",
+ "act-archivedList": "a archivé __list__",
+ "act-importBoard": "a importé __board__",
+ "act-importCard": "a importé __card__",
+ "act-importList": "a importé __list__",
+ "act-joinMember": "a ajouté __member__ à __card__",
+ "act-moveCard": "a déplacé __card__ de __oldList__ à __list__",
+ "act-removeBoardMember": "a retiré __member__ de __board__",
+ "act-restoredCard": "a restauré __card__ dans __board__",
+ "act-unjoinMember": "a retiré __member__ de __card__",
"act-withBoardTitle": "[Wekan] __board__",
"act-withCardTitle": "[__board__] __card__",
"actions": "Actions",
@@ -31,58 +31,58 @@
"activity-imported": "a importé %s vers %s depuis %s",
"activity-imported-board": "a importé %s depuis %s",
"activity-joined": "a rejoint %s",
- "activity-moved": "a déplacé %s depuis %s vers %s",
+ "activity-moved": "a déplacé %s de %s vers %s",
"activity-on": "sur %s",
- "activity-removed": "a supprimé %s vers %s",
+ "activity-removed": "a supprimé %s de %s",
"activity-sent": "a envoyé %s vers %s",
"activity-unjoined": "a quitté %s",
- "activity-checklist-added": "added checklist to %s",
+ "activity-checklist-added": "a ajouté une checklist à %s",
"add": "Ajouter",
- "add-attachment": "Joindre un fichier",
- "add-board": "Ajouter un nouveau tableau",
+ "add-attachment": "Ajouter une pièce jointe",
+ "add-board": "Ajouter un tableau",
"add-card": "Ajouter une carte",
- "add-checklist": "Add a checklist",
- "add-checklist-item": "Add an item to checklist",
+ "add-checklist": "Ajouter une checklist",
+ "add-checklist-item": "Ajouter un élément à la checklist",
"add-cover": "Ajouter la couverture",
"add-label": "Ajouter une étiquette",
"add-list": "Ajouter une liste",
"add-members": "Assigner des membres",
- "added": "Ajouté",
+ "added": "Ajouté le",
"addMemberPopup-title": "Membres",
"admin": "Admin",
"admin-desc": "Peut voir et éditer les cartes, supprimer des membres et changer les paramètres du tableau.",
"all-boards": "Tous les tableaux",
"and-n-other-card": "Et __count__ autre carte",
"and-n-other-card_plural": "Et __count__ autres cartes",
- "apply": "Apply",
- "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.",
+ "apply": "Appliquer",
+ "app-is-offline": "L'application est actuellement déconnectée, recharger la page provoquera des pertes de données.",
"archive": "Archiver",
"archive-all": "Tout archiver",
"archive-board": "Archiver le tableau",
"archive-card": "Archiver la carte",
- "archive-list": "Archiver cette liste",
+ "archive-list": "Archiver une liste",
"archive-selection": "Archiver la selection",
"archiveBoardPopup-title": "Archiver le tableau ?",
"archived-items": "Éléments archivés",
"archives": "Archives",
- "assign-member": "Assigner un membre",
+ "assign-member": "Affecter un membre",
"attached": "joint",
"attachment": "Pièce jointe",
"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)",
+ "auto-watch": "Surveiller automatiquement les tableaux quand ils sont créés",
+ "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",
"board-nb-stars": "%s étoiles",
"board-not-found": "Tableau non trouvé",
"board-private-info": "Ce tableau sera <strong>privé</strong>",
"board-public-info": "Ce tableau sera <strong>public</strong>.",
- "boardChangeColorPopup-title": "Change la fond du tableau",
+ "boardChangeColorPopup-title": "Change la couleur de fond du tableau",
"boardChangeTitlePopup-title": "Renommer le tableau",
"boardChangeVisibilityPopup-title": "Changer la visibilité",
- "boardChangeWatchPopup-title": "Change Watch",
+ "boardChangeWatchPopup-title": "Modifier le suivi",
"boardMenuPopup-title": "Menu du tableau",
"boards": "Tableaux",
"bucket-example": "Comme « todo list » par exemple",
@@ -92,15 +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-due": "À échéance",
+ "card-due-on": "Échéance le",
+ "card-edit-attachments": "Modifier les pièces jointes",
+ "card-edit-labels": "Modifier les étiquettes",
"card-edit-members": "Modifier les membres",
"card-labels-title": "Modifier les étiquettes de la carte.",
"card-members-title": "Ajouter ou supprimer des membres à la carte.",
- "card-start": "Start",
- "card-start-on": "Starts on",
+ "card-start": "Début",
+ "card-start-on": "Commence le",
"cardAttachmentsPopup-title": "Joindre depuis",
"cardDeletePopup-title": "Supprimer la carte ?",
"cardDetailsActionsPopup-title": "Actions sur la carte",
@@ -108,16 +108,16 @@
"cardMembersPopup-title": "Membres",
"cardMorePopup-title": "Plus",
"cards": "Cartes",
- "change": "Changer",
- "change-avatar": "Changer l'avatar",
- "change-password": "Changer le mot de passe",
- "change-permissions": "Changer les permissions",
- "change-settings": "Change Settings",
- "changeAvatarPopup-title": "Changer l'avatar",
- "changeLanguagePopup-title": "Changer la langue",
- "changePasswordPopup-title": "Changer le mot de passe",
- "changePermissionsPopup-title": "Changer les permissions",
- "changeSettingsPopup-title": "Change Settings",
+ "change": "Modifier",
+ "change-avatar": "Modifier l'avatar",
+ "change-password": "Modifier le mot de passe",
+ "change-permissions": "Modifier les permissions",
+ "change-settings": "Modifier les paramètres",
+ "changeAvatarPopup-title": "Modifier l'avatar",
+ "changeLanguagePopup-title": "Modifier la langue",
+ "changePasswordPopup-title": "Modifier le mot de passe",
+ "changePermissionsPopup-title": "Modifier 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.",
@@ -136,12 +136,14 @@
"color-sky": "ciel",
"color-yellow": "jaune",
"comment": "Commentaire",
- "comment-placeholder": "Rédiger un commentaire",
+ "comment-placeholder": "Écrire un commentaire",
+ "comment-only": "Commentaire uniquement",
+ "comment-only-desc": "Ne peut que commenter des cartes.",
"computer": "Ordinateur",
"create": "Créer",
"createBoardPopup-title": "Créer un tableau",
- "createLabelPopup-title": "Créer un étiquette",
- "current": "courant",
+ "createLabelPopup-title": "Créer une étiquette",
+ "current": "actuel",
"date": "Date",
"decline": "Refuser",
"default-avatar": "Avatar par défaut",
@@ -153,125 +155,131 @@
"discard": "Mettre à la corbeille",
"done": "Fait",
"download": "Télécharger",
- "edit": "Éditer",
- "edit-avatar": "Changer l'avatar",
- "edit-profile": "Éditer le profil",
- "editCardStartDatePopup-title": "Change start date",
- "editCardDueDatePopup-title": "Change due date",
- "editLabelPopup-title": "Changer l'étiquette",
- "editNotificationPopup-title": "Edit Notification",
- "editProfilePopup-title": "Éditer le profil",
+ "edit": "Modifier",
+ "edit-avatar": "Modifier l'avatar",
+ "edit-profile": "Modifier le profil",
+ "editCardStartDatePopup-title": "Modifier la date de début",
+ "editCardDueDatePopup-title": "Modifier la date d'échéance",
+ "editLabelPopup-title": "Modifier l'étiquette",
+ "editNotificationPopup-title": "Modifier la notification",
+ "editProfilePopup-title": "Modifier le profil",
"email": "Email",
"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-fail": "Échec de l'envoi du courriel.",
+ "email-invalid": "Adresse email incorrecte.",
"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-subject": "Réinitialiser votre 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": "Cet utilisateur n’a pas encore été créé. ",
- "error-username-taken": "This username is already taken",
+ "error-board-doesNotExist": "Ce tableau n'existe pas",
+ "error-board-notAdmin": "Vous devez être administrateur de ce tableau pour faire cela",
+ "error-board-notAMember": "Vous devez être membre de 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": "Vous ne pouvez pas vous inviter vous-même",
+ "error-user-notCreated": "Cet utilisateur n'a pas encore été créé",
+ "error-username-taken": "Ce nom d'utilisateur est déjà utilisé",
"export-board": "Exporter le tableau",
"filter": "Filtrer",
"filter-cards": "Filtrer les cartes",
- "filter-clear": "Retirer les filtres",
- "filter-no-label": "No label",
- "filter-no-member": "No member",
+ "filter-clear": "Supprimer les filtres",
+ "filter-no-label": "Aucune étiquette",
+ "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-on-desc": "Vous êtes en train de filtrer les cartes sur ce tableau. Cliquez ici pour modifier les filtres.",
"filter-to-selection": "Filtre vers la sélection",
"fullname": "Nom complet",
"header-logo-title": "Retourner à la page des tableaux",
- "hide-system-messages": "Hide system messages",
+ "hide-system-messages": "Masquer les messages système",
+ "headerBarCreateBoardPopup-title": "Créer un tableau",
"home": "Accueil",
"import": "Importer",
"import-board": "Importer depuis Trello",
- "import-board-title": "Import board from Trello",
- "import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text",
- "import-json-placeholder": "Collez ici les données JSON valides. ",
- "import-map-members": "Map members",
- "import-members-map": "Le tableau que vous venez d’importer contient des participants. Veuillez associer les participants que vous souhaitez importer à des utilisateurs de Wekan. ",
- "import-show-user-mapping": "Review members mapping",
- "import-user-select": "Pick the Wekan user you want to use as this member",
- "importMapMembersAddPopup-title": "Select Wekan member",
+ "import-board-title": "Importer le tableau depuis Trello",
+ "import-board-trello-instruction": "Dans votre tableau Trello, allez sur 'Menu', puis sur 'Plus', 'Imprimer et exporter', 'Exporter en JSON' et copiez le texte du résultat",
+ "import-json-placeholder": "Collez ici les données JSON valides",
+ "import-map-members": "Faire correspondre aux membres",
+ "import-members-map": "Le tableau que vous venez d'importer contient des membres. Veuillez associer les membres que vous souhaitez importer à des utilisateurs de Wekan.",
+ "import-show-user-mapping": "Contrôler l'association des membres",
+ "import-user-select": "Sélectionnez l'utilisateur Wekan que vous voulez associer à ce membre",
+ "importMapMembersAddPopup-title": "Sélectionner le membre Wekan",
"info": "Infos",
"initials": "Initiales",
- "invalid-date": "Invalid date",
- "joined": "a joint",
- "just-invited": "You are just invited to this board",
+ "invalid-date": "Date invalide",
+ "joined": "a rejoint",
+ "just-invited": "Vous venez d'être invité à ce tableau",
"keyboard-shortcuts": "Raccourcis clavier",
- "label-create": "Créer une nouvelle étiquette",
- "label-default": "%s label (default)",
+ "label-create": "Créer une étiquette",
+ "label-default": "étiquette %s (défaut)",
"label-delete-pop": "Cette action est irréversible. Elle supprimera cette étiquette de toutes les cartes ainsi que l'historique associé.",
"labels": "Étiquettes",
- "language": "Langage",
- "last-admin-desc": "Vous ne pouvez pas changer les rôles car il doit y avoir au moins un admin.",
+ "language": "Langue",
+ "last-admin-desc": "Vous ne pouvez pas changer les rôles car il doit y avoir au moins un administrateur.",
"leave-board": "Quitter le tableau",
- "link-card": "Lier cette carte",
- "list-archive-cards": "Archiver les cartes de cette liste",
- "list-archive-cards-pop": "Cela archivera toutes les cartes de cette liste. Pour voir les cartes archivées et les ramener vers le tableau, cliquez sur le « Menu » puis sur « Éléments archivés ».",
- "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",
+ "link-card": "Lier à cette carte",
+ "list-archive-cards": "Archiver toutes les cartes de cette liste",
+ "list-archive-cards-pop": "Cela archivera toutes les cartes de cette liste. Pour voir les cartes archivées et les ramener vers le tableau, cliquez sur « Menu » puis sur « Éléments archivés ».",
+ "list-move-cards": "Déplacer toutes les cartes de cette liste",
+ "list-select-cards": "Sélectionner toutes les cartes de cette liste",
+ "listActionPopup-title": "Actions sur la liste",
"listImportCardPopup-title": "Importer une carte Trello",
+ "listMorePopup-title": "Plus",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
"lists": "Listes",
"log-out": "Déconnexion",
- "log-in": "Log In",
+ "log-in": "Connexion",
"loginPopup-title": "Connexion",
"memberMenuPopup-title": "Préférence de membre",
"members": "Membres",
"menu": "Menu",
"move-selection": "Déplacer la sélection",
"moveCardPopup-title": "Déplacer la carte",
- "moveCardToBottom-title": "Move to Bottom",
- "moveCardToTop-title": "Move to Top",
+ "moveCardToBottom-title": "Déplacer tout en bas",
+ "moveCardToTop-title": "Déplacer tout en haut",
"moveSelectionPopup-title": "Déplacer la sélection",
"multi-selection": "Sélection multiple",
"multi-selection-on": "Multi-Selection active",
- "muted": "Muted",
- "muted-info": "You will never be notified of any changes in this board",
+ "muted": "Silencieux",
+ "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.",
"no-archived-lists": "Pas de liste archivée.",
"no-results": "Pas de résultats",
"normal": "Normal",
- "normal-desc": "Peut voir et éditer les cartes. Ne peut pas changer les paramètres.",
- "not-accepted-yet": "L’invitation n’a pas encore été acceptée",
- "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",
+ "normal-desc": "Peut voir et modifier les cartes. Ne peut pas changer les paramètres.",
+ "not-accepted-yet": "L'invitation n'a pas encore été acceptée",
+ "notify-participate": "Recevoir les mises à jour de toutes les cartes auxquelles vous participez en tant que créateur ou que membre ",
+ "notify-watch": "Recevoir les mises à jour de tous les tableaux, listes ou cartes que vous suivez",
"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": "pour coller, ou glissez-déposez une image ici (seulement une image)",
- "participating": "Participating",
+ "participating": "Participant",
"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.",
+ "private-desc": "Ce tableau est privé. Seuls les membres peuvent y accéder et le modifier.",
"profile": "Profil",
"public": "Public",
- "public-desc": "Ce tableau est public. Il est visible par toutes les personnes possédant le lien et visible dans les moteurs de recherche tels que Google. Seuls les membres peuvent l'éditer.",
- "quick-access-description": "Ajouter un tableau aux favoris pour créer un raccourci dans cette barre.",
- "remove-cover": "Enlever la couverture",
+ "public-desc": "Ce tableau est public. Il est accessible par toutes les personnes disposant du lien et apparaîtra dans les résultats des moteurs de recherche tels que Google. Seuls les membres peuvent le modifier.",
+ "quick-access-description": "Ajouter un tableau à vos favoris pour créer un raccourci dans cette barre.",
+ "remove-cover": "Enlever la page de présentation",
"remove-from-board": "Retirer du tableau",
- "remove-label": "Retirer cette étiquette",
+ "remove-label": "Retirer une étiquette",
+ "listDeletePopup-title": "Delete List ?",
"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.",
@@ -279,45 +287,69 @@
"rename": "Renommer",
"rename-board": "Renommer le tableau",
"restore": "Restaurer",
- "save": "Sauvegarder",
+ "save": "Enregistrer",
"search": "Chercher",
- "select-color": "Choisissez une couleur",
- "shortcut-assign-self": "Assign yourself to current card",
- "shortcut-autocomplete-emoji": "Autocomplete emoji",
+ "select-color": "Sélectionner une couleur",
+ "shortcut-assign-self": "Affecter cette carte à vous-même",
+ "shortcut-autocomplete-emoji": "Auto-complétion des emoji",
"shortcut-autocomplete-members": "Auto-complétion des membres",
"shortcut-clear-filters": "Retirer tous les filtres",
- "shortcut-close-dialog": "Fermer le dialogue",
+ "shortcut-close-dialog": "Fermer la boîte de dialogue",
"shortcut-filter-my-cards": "Filtrer mes cartes",
"shortcut-show-shortcuts": "Afficher cette liste de raccourcis",
"shortcut-toggle-filterbar": "Afficher/Cacher la barre latérale des filtres",
"shortcut-toggle-sidebar": "Afficher/Cacher la barre latérale du tableau",
- "show-cards-minimum-count": "Show cards count if list contains more than",
- "signupPopup-title": "Créer un compe",
- "star-board-title": "Cliquer pour ajouter ce tableau aux favoris. Il sera affiché en haut de votre liste de tableaux.",
+ "show-cards-minimum-count": "Afficher le nombre de cartes si la liste en contient plus de ",
+ "sidebar-open": "Ouvrir le panneau",
+ "sidebar-close": "Fermer le panneau",
+ "signupPopup-title": "Créer un compte",
+ "star-board-title": "Cliquer pour ajouter ce tableau aux favoris. Il sera affiché en tête de votre liste de tableaux.",
"starred-boards": "Tableaux favoris",
- "starred-boards-description": "Les tableaux favoris s'affichent en haut de votre liste de tableaux.",
+ "starred-boards-description": "Les tableaux favoris s'affichent en tête de votre liste de tableaux.",
"subscribe": "Suivre",
"team": "Équipe",
"this-board": "ce tableau",
"this-card": "cette carte",
- "time": "Time",
+ "time": "Temps",
"title": "Titre",
- "tracking": "Tracking",
- "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
+ "tracking": "Suivi",
+ "tracking-info": "Vous serez notifié de toute modification concernant les cartes pour lesquelles vous êtes impliqué en tant que créateur ou membre.",
"unassign-member": "Retirer le membre",
"unsaved-description": "Vous avez une description non sauvegardée",
- "unwatch": "Unwatch",
+ "unwatch": "Arrêter de suivre",
"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 ?"
+ "watch": "Suivre",
+ "watching": "Suivi",
+ "watching-info": "Vous serez notifié de toute modification dans ce tableau",
+ "welcome-board": "Tableau de bienvenue",
+ "welcome-list1": "Basiques",
+ "welcome-list2": "Avancés",
+ "what-to-do": "Que voulez-vous faire ?",
+ "admin-panel": "Panneau d'administration",
+ "settings": "Paramètres",
+ "people": "Personne",
+ "registration": "Inscription",
+ "disable-self-registration": "Désactiver l'inscription",
+ "invite": "Inviter",
+ "invite-people": "Inviter une personne",
+ "to-boards": "Au(x) tableau(x)",
+ "email-addresses": "Adresses email",
+ "smtp-host-description": "L'adresse du serveur SMTP qui gère vos mails.",
+ "smtp-port-description": "Le port des mails sortants du serveur SMTP.",
+ "smtp-tls-description": "Activer la gestion de TLS sur le serveur SMTP",
+ "smtp-host": "Hôte SMTP",
+ "smtp-port": "Port SMTP",
+ "smtp-username": "Nom d'utilisateur",
+ "smtp-password": "Mot de passe",
+ "smtp-tls": "Prise en charge de TLS",
+ "send-from": "De",
+ "invitation-code": "Code d'invitation",
+ "email-invite-register-subject": "__inviter__ vous a envoyé une invitation",
+ "email-invite-register-text": "Cher __user__,\n\n__inviter__ vous invite à le rejoindre sur Wekan pour collaborer.\n\nVeuillez suivre le lien ci-dessous :\n__url__\n\nVotre code d'invitation est : __icode__\n\nMerci.",
+ "error-invitation-code-not-exist": "Ce code d'invitation n'existe pas."
} \ No newline at end of file
diff --git a/i18n/he.i18n.json b/i18n/he.i18n.json
index 85b5f5b3..d31a79f9 100644
--- a/i18n/he.i18n.json
+++ b/i18n/he.i18n.json
@@ -1,130 +1,130 @@
{
"accept": "אישור",
- "act-activity-notify": "[Wekan] Activity Notification",
- "act-addAttachment": "attached __attachment__ to __card__",
- "act-addComment": "commented on __card__: __comment__",
+ "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": "הרשימה __card__ אורכבה",
+ "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-joinMember": "המשתמש __member__ נוסף לכרטיס __card__",
"act-moveCard": "הכרטיס __card__ הועבר מהרשימה __oldList__ לרשימה __list__",
"act-removeBoardMember": "המשתמש __member__ הוסר מהלוח __board__",
"act-restoredCard": "הכרטיס __card__ שוחזר ללוח __board__",
- "act-unjoinMember": "removed __member__ from __card__",
+ "act-unjoinMember": "המשתמש __member__ הוסר מהכרטיס __card__",
"act-withBoardTitle": "[Wekan] __board__",
"act-withCardTitle": "[__board__] __card__",
"actions": "פעולות",
"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-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": "הוסף חבר",
+ "activity-checklist-added": "נוספה רשימת משימות ל%s",
+ "add": "הוספה",
+ "add-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add Checklist",
+ "add-checklist-item": "הוספת פריט לרשימת משימות",
+ "add-cover": "הוספת כיסוי",
+ "add-label": "Add Label",
+ "add-list": "Add List",
+ "add-members": "הוספת חברים",
"added": "התווסף",
- "addMemberPopup-title": "חבר",
- "admin": "אדמין",
- "admin-desc": "יכול לצפות ולערוך כרטיסים, להסיר חברים ולשנות הגדרות ללוח.",
+ "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": "פריטים מאוחסנים בארכיון",
+ "and-n-other-card": "וכרטיס אחר",
+ "and-n-other-card_plural": "ו־__count__ כרטיסים אחרים",
+ "apply": "החלה",
+ "app-is-offline": "המערכת מושבתת כרגע, רענון הדף יגרום לאבדן מידע.",
+ "archive": "להעביר לארכיון",
+ "archive-all": "להעביר הכול לארכיון",
+ "archive-board": "להעביר לוח לארכיון",
+ "archive-card": "להעביר כרטיס בארכיון",
+ "archive-list": "Archive List",
+ "archive-selection": "להעביר בחירה לארכיון",
+ "archiveBoardPopup-title": "להעביר לוח זה לארכיון?",
+ "archived-items": "פריטים בארכיון",
"archives": "ארכיונים",
- "assign-member": "הקצה חבר",
+ "assign-member": "הקצאת חבר",
"attached": "מצורף",
"attachment": "קובץ מצורף",
- "attachment-delete-pop": "מחיקת קובץ מצורף הינה סופית. אין דרך חזרה.",
+ "attachment-delete-pop": "מחיקת קובץ מצורף הנה סופית. אין דרך חזרה.",
"attachmentDeletePopup-title": "למחוק קובץ מצורף?",
"attachments": "קבצים מצורפים",
- "auto-watch": "Automatically watch boards when create it",
- "avatar-too-big": "האווטאר גדול מידי (מקס 70Kb)",
- "back": "חזור",
- "board-change-color": "שנה צבע",
+ "auto-watch": "הוספת לוחות למעקב כשהם נוצרים",
+ "avatar-too-big": "תמונת המשתמש גדולה מדי (70 ק״ב לכל היותר)",
+ "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",
+ "boardChangeColorPopup-title": "שינוי רקע ללוח",
+ "boardChangeTitlePopup-title": "שינוי שם הלוח",
+ "boardChangeVisibilityPopup-title": "שינוי מצב הצגה",
+ "boardChangeWatchPopup-title": "שינוי הגדרת המעקב",
"boardMenuPopup-title": "תפריט לוח",
"boards": "לוחות",
- "bucket-example": "כמו “Bucket List” לדוגמא",
- "cancel": "בטל",
- "card-archived": "כרטיס זה מאוחסן בארכיון",
+ "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": "צרף מ",
+ "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": "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",
- "close": "סגור",
- "close-board": "סגור לוח",
- "close-board-pop": "תוכלו לשחזר את הלוח בלחיצה על כפתור \"ארכיונים\" מהכותרת העליונה.",
+ "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": "ירוק",
@@ -135,131 +135,138 @@
"color-red": "אדום",
"color-sky": "תכלת",
"color-yellow": "צהוב",
- "comment": "הערה",
- "comment-placeholder": "כתוב הערה",
+ "comment": "להגיב",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "ניתן להעיר על כרטיסים בלבד.",
"computer": "מחשב",
- "create": "צור",
- "createBoardPopup-title": "צור לוח",
- "createLabelPopup-title": "צור תווית",
+ "create": "יצירה",
+ "createBoardPopup-title": "יצירת לוח",
+ "createLabelPopup-title": "יצירת תווית",
"current": "נוכחי",
- "date": "Date",
- "decline": "סרב",
- "default-avatar": "אווטאר דיפולטי",
- "delete": "מחק",
+ "date": "תאריך",
+ "decline": "סירוב",
+ "default-avatar": "תמונת משתמש כבררת מחדל",
+ "delete": "מחיקה",
"deleteLabelPopup-title": "למחוק תווית?",
"description": "תיאור",
"disambiguateMultiLabelPopup-title": "הבהרת פעולת תווית",
"disambiguateMultiMemberPopup-title": "הבהרת פעולת חבר",
- "discard": "בטל",
+ "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להתחלת השימוש בשירות, לחץ על הקישור המופיע מטה.\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 שלך לא כוללים הנחיות בפורמט תקין",
+ "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-notAllowSelf": "אינך יכול להזמין את עצמך",
"error-user-notCreated": "משתמש זה לא נוצר",
- "error-username-taken": "This username is already taken",
- "export-board": "ייצא לוח",
+ "error-username-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": "סנן את הבחירה",
+ "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": "Hide system messages",
+ "header-logo-title": "חזרה לדף הלוחות שלך.",
+ "hide-system-messages": "הסתרת הודעות מערכת",
+ "headerBarCreateBoardPopup-title": "יצירת לוח",
"home": "בית",
- "import": "ייבא",
- "import-board": "ייבא מטרלו",
- "import-board-title": "Import board from Trello",
- "import-board-trello-instruction": "בלוח הטרלו שלך, עבור ל 'Menu', ואז ל 'More', 'Print and Export', 'Export JSON' והעתק את הטקסט שנוצר",
- "import-json-placeholder": "הדבק נתוני JSON תקינים כאן",
- "import-map-members": "Map members",
- "import-members-map": "הלוחות המיובאים שלך מכילים חברים. בבקשה מפה את החברים שתרצה לייבא כמשתמשים",
- "import-show-user-mapping": "צפה במיפוי חברים",
- "import-user-select": "בחר במשתמש עבור חבר זה",
- "importMapMembersAddPopup-title": "Select Wekan member",
- "info": "אינפורמציה",
+ "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": "הלוחות המיובאים שלך מכילים חברים. נא למפות את החברים שברצונך לייבא למשתמשי Wekan",
+ "import-show-user-mapping": "סקירת מיפוי חברים",
+ "import-user-select": "נא לבחור את המשתמש ב־Wekan בו ברצונך להשתמש עבור חבר זה",
+ "importMapMembersAddPopup-title": "בחירת משתמש Wekan",
+ "info": "מידע",
"initials": "ראשי תיבות",
- "invalid-date": "Invalid date",
+ "invalid-date": "תאריך שגוי",
"joined": "הצטרף",
"just-invited": "הוזמנת ללוח זה",
"keyboard-shortcuts": "קיצורי מקלדת",
- "label-create": "צור תווית חדשה",
- "label-default": "%s תווית (ברירת מחדל)",
+ "label-create": "יצירת תווית",
+ "label-default": "תווית בצבע %s (בררת מחדל)",
"label-delete-pop": "אין דרך חזרה. התווית תוסר מכל הכרטיסים וההיסטוריה תימחק.",
"labels": "תוויות",
"language": "שפה",
- "last-admin-desc": "לא ניתן לשנות תפקידים מכיוון שחייב להיות אדמין אחד לפחות.",
- "leave-board": "עזוב לוח",
+ "last-admin-desc": "אין אפשרות לשנות תפקידים כיוון שחייב להיות מנהל אחד לפחות.",
+ "leave-board": "עזיבת הלוח",
"link-card": "קישור לכרטיס זה",
- "list-archive-cards": "אחסן בארכיון את כל הכרטיסים שברשימה זו",
- "list-archive-cards-pop": "כל הכרטיסים מרשימה זו יוסרו מהלוח. לצפייה בכרטיסים המאוחסנים בארכיון ולהחזירם ללוח, לחצו \"תפריט\" > \"כרטיסים מאוחסנים בארכיון\".",
- "list-move-cards": "הזז את כל הכרטיסים ברשימה זו",
- "list-select-cards": "בחר את כל הכרטיסים ברשימה זו",
+ "list-archive-cards": "העברת כל הכרטיסים שברשימה זו לארכיון",
+ "list-archive-cards-pop": "פעולה זו תסיר את כל הכרטיסים שברשימה הזו מהלוח. כדי לצפות בכרטיסים שבארכיון ולהחזיר אותם בחזרה ללוח, יש ללחוץ על „תפריט“ > „פריטים בארכיון“.",
+ "list-move-cards": "העברת כל הכרטיסים שברשימה זו",
+ "list-select-cards": "בחירת כל הכרטיסים שברשימה זו",
"listActionPopup-title": "פעולות רשימה",
- "listImportCardPopup-title": "ייבא כרטיס מטרלו",
+ "listImportCardPopup-title": "ייבוא כרטיס מטרלו",
+ "listMorePopup-title": "עוד",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
"lists": "רשימות",
- "log-out": "התנתק",
- "log-in": "Log In",
- "loginPopup-title": "התחבר",
- "memberMenuPopup-title": "הגדרות חבר",
+ "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": "הזז בחירה",
+ "move-selection": "העברת הבחירה",
+ "moveCardPopup-title": "העברת כרטיס",
+ "moveCardToBottom-title": "העברת כרטיס לתחתית הרשימה",
+ "moveCardToTop-title": "העברת כרטיס לראש הרשימה ",
+ "moveSelectionPopup-title": "העברת בחירה",
"multi-selection": "בחירה מרובה",
"multi-selection-on": "בחירה מרובה פועלת",
- "muted": "Muted",
- "muted-info": "You will never be notified of any changes in this board",
+ "muted": "מושתק",
+ "muted-info": "מעתה לא תתקבלנה אצלך התרעות על שינויים בלוח זה",
"my-boards": "הלוחות שלי",
"name": "שם",
- "no-archived-cards": "אין כרטיסים מאוחסנים בארכיון.",
- "no-archived-lists": "אין רשימות מאוחסנות בארכיון.",
+ "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": "אופציונלי",
+ "normal": "רגיל",
+ "normal-desc": "הרשאה לצפות ולערוך כרטיסים. לא ניתן לשנות הגדרות.",
+ "not-accepted-yet": "ההזמנה לא אושרה עדיין",
+ "notify-participate": "קבלת עדכונים על כרטיסים בהם יש לך מעורבות הן בתהליך היצירה והן כחבר",
+ "notify-watch": "קבלת עדכונים על כל לוח, רשימה או כרטיס שסימנת למעקב",
+ "optional": "רשות",
"or": "או",
- "page-maybe-private": "יתכן שדף זה פרטי. תוכלו לצפות על ידי <a href='%s'>התחברות למערכת</a>",
+ "page-maybe-private": "יתכן שדף זה פרטי. ניתן לצפות בו על ידי <a href='%s'>כניסה למערכת</a>",
"page-not-found": "דף לא נמצא.",
- "password": "סיסמא",
- "paste-or-dragdrop": "בכדי להדביק או drag & drop קובץ תמונה (תמונה בלבד)",
- "participating": "Participating",
+ "password": "ססמה",
+ "paste-or-dragdrop": "כדי להדביק או לגרור ולשחרר קובץ תמונה אליו (תמונות בלבד)",
+ "participating": "משתתפים",
"preview": "תצוגה מקדימה",
"previewAttachedImagePopup-title": "תצוגה מקדימה",
"previewClipboardImagePopup-title": "תצוגה מקדימה",
@@ -267,57 +274,82 @@
"private-desc": "לוח זה פרטי. רק אנשים שנוספו ללוח יכולים לצפות ולערוך אותו.",
"profile": "פרופיל",
"public": "ציבורי",
- "public-desc": "לוח זה ציבורי. כל מי שמחזיק בקישור יכול לצפות בלוח זה והלוח יופיע בתוצאות מנועי חיפוש כגון גוגל. רק אנשים שנוספו ללוח יכולים לערוך אותו.",
- "quick-access-description": "בלחיצה על הכוכב יתווסף קיצור דרך ללוח בשורה זו.",
- "remove-cover": "הסר כיסוי",
- "remove-from-board": "הסר מהלוח",
- "remove-label": "הסר תווית",
- "remove-member": "הסר חבר",
- "remove-member-from-card": "הסר מהכרטיס",
- "remove-member-pop": "הסר __name__ (__username__) מ __boardTitle__? החבר יוסר מכל הכרטיסים בלוח זה. הוא יקבל על כך הודעה.",
+ "public-desc": "לוח זה ציבורי. כל מי שמחזיק בקישור יכול לצפות בלוח והוא יופיע בתוצאות מנועי חיפוש כגון גוגל. רק אנשים שנוספו ללוח יכולים לערוך אותו.",
+ "quick-access-description": "לחיצה על הכוכב תוסיף קיצור דרך ללוח בשורה זו.",
+ "remove-cover": "הסרת כיסוי",
+ "remove-from-board": "הסרה מהלוח",
+ "remove-label": "Remove Label",
+ "listDeletePopup-title": "Delete 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",
+ "rename": "שינוי שם",
+ "rename-board": "שינוי שם ללוח",
+ "restore": "שחזור",
+ "save": "שמירה",
+ "search": "חיפוש",
+ "select-color": "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": "Show cards count if list contains more than",
- "signupPopup-title": "צור חשבון",
- "star-board-title": "בלחיצה על הכווכב של הלוח יתווסף הלוח לראש רשימת הלוחות שלך.",
+ "shortcut-clear-filters": "ביטול כל המסננים",
+ "shortcut-close-dialog": "סגירת החלון",
+ "shortcut-filter-my-cards": "סינון הכרטיסים שלי",
+ "shortcut-show-shortcuts": "העלאת רשימת קיצורים זו",
+ "shortcut-toggle-filterbar": "הצגה או הסתרה של סרגל צד הסינון",
+ "shortcut-toggle-sidebar": "הצגה או הסתרה של סרגל צד הלוח",
+ "show-cards-minimum-count": "הצגת ספירת כרטיסים אם רשימה מכילה למעלה מ־",
+ "sidebar-open": "פתיחת סרגל צד",
+ "sidebar-close": "סגירת סרגל צד",
+ "signupPopup-title": "יצירת חשבון",
+ "star-board-title": "ניתן ללחוץ כדי לסמן בכוכב. הלוח יופיע בראש רשימת הלוחות שלך.",
"starred-boards": "לוחות שסומנו בכוכב",
"starred-boards-description": "לוחות מסומנים בכוכב מופיעים בראש רשימת הלוחות שלך.",
- "subscribe": "הירשם",
+ "subscribe": "הרשמה",
"team": "צוות",
"this-board": "לוח זה",
"this-card": "כרטיס זה",
- "time": "Time",
+ "time": "זמן",
"title": "כותרת",
- "tracking": "Tracking",
- "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
- "unassign-member": "בטל הקצאת חבר",
+ "tracking": "מעקב",
+ "tracking-info": "על כל שינוי בכרטיסים בהם הייתה לך מעורבות ברמת היצירה או כחברות תגיע אליך הודעה.",
+ "unassign-member": "ביטול הקצאת חבר",
"unsaved-description": "יש לך תיאור לא שמור.",
- "unwatch": "Unwatch",
- "upload": "העלה/טען",
- "upload-avatar": "העלה/ טען אווטאר",
- "uploaded-avatar": "אווטאר הועלה/נטען",
+ "unwatch": "ביטול מעקב",
+ "upload": "העלאה",
+ "upload-avatar": "העלאת תמונת משתמש",
+ "uploaded-avatar": "הועלתה תמונה משתמש",
"username": "שם משתמש",
- "view-it": "צפה",
+ "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": "מה תרצה לעשות?"
+ "watch": "לעקוב",
+ "watching": "במעקב",
+ "watching-info": "מעתה יגיעו אליך דיווחים על כל שינוי בלוח זה",
+ "welcome-board": "לוח קבלת פנים",
+ "welcome-list1": "יסודות",
+ "welcome-list2": "מתקדם",
+ "what-to-do": "מה ברצונך לעשות?",
+ "admin-panel": "חלונית ניהול המערכת",
+ "settings": "הגדרות",
+ "people": "אנשים",
+ "registration": "הרשמה",
+ "disable-self-registration": "השבתת הרשמה עצמית",
+ "invite": "הזמנה",
+ "invite-people": "הזמנת אנשים",
+ "to-boards": "ללוח/ות",
+ "email-addresses": "כתובות דוא״ל",
+ "smtp-host-description": "כתובת שרת ה־SMTP שמטפל בהודעות הדוא״ל שלך.",
+ "smtp-port-description": "מספר הפתחה בה שרת ה־SMTP שלך משתמש לדוא״ל יוצא.",
+ "smtp-tls-description": "הפעל תמיכה ב־TLS עבור שרת ה־SMTP",
+ "smtp-host": "כתובת ה־SMTP",
+ "smtp-port": "פתחת ה־SMTP",
+ "smtp-username": "שם משתמש",
+ "smtp-password": "ססמה",
+ "smtp-tls": "תמיכה ב־TLS",
+ "send-from": "מאת",
+ "invitation-code": "קוד הזמנה",
+ "email-invite-register-subject": "נשלחה אליך הזמנה מאת __inviter__",
+ "email-invite-register-text": "__user__ יקר,\n\nקיבלת הזמנה מאת __inviter__ לשתף פעולה ב־Wekan.\n\nנא ללחוץ על הקישור:\n__url__\n\nקוד ההזמנה שלך הוא: __icode__\n\nתודה.",
+ "error-invitation-code-not-exist": "קוד ההזמנה אינו קיים"
} \ No newline at end of file
diff --git a/i18n/it.i18n.json b/i18n/it.i18n.json
index 8d8a1c34..f7ded0d6 100755..100644
--- a/i18n/it.i18n.json
+++ b/i18n/it.i18n.json
@@ -10,7 +10,7 @@
"act-archivedBoard": "ha archiviato __board__",
"act-archivedCard": "ha archiviato __card__",
"act-archivedList": "ha archiviato __list__",
- "act-importBoard": " ha importato __board__",
+ "act-importBoard": "ha importato __board__",
"act-importCard": "ha importato __card__",
"act-importList": "ha importato __list__",
"act-joinMember": "ha aggiunto __member__ a __card__",
@@ -36,16 +36,16 @@
"activity-removed": "rimosso %s da %s",
"activity-sent": "inviato %s a %s",
"activity-unjoined": "ha abbandonato %s",
- "activity-checklist-added": "added checklist to %s",
+ "activity-checklist-added": "aggiunta checklist a %s",
"add": "Aggiungere",
- "add-attachment": "Aggiungi allegato",
- "add-board": "Aggiungi una nuova bachecha",
- "add-card": "Aggiungi una scheda",
- "add-checklist": "Add a checklist",
- "add-checklist-item": "Add an item to checklist",
+ "add-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add Checklist",
+ "add-checklist-item": "Aggiungi un elemento alla checklist",
"add-cover": "Aggiungi copertina",
- "add-label": "Aggiungi l'etichetta",
- "add-list": "Aggiungi una lista",
+ "add-label": "Add Label",
+ "add-list": "Add List",
"add-members": "Aggiungi membri",
"added": "Aggiunto",
"addMemberPopup-title": "Membri",
@@ -60,7 +60,7 @@
"archive-all": "Archivia tutto",
"archive-board": "Archivia bacheca",
"archive-card": "Archivia scheda",
- "archive-list": "Archivia questa lista",
+ "archive-list": "Archive List",
"archive-selection": "Archivia selezione",
"archiveBoardPopup-title": "Archivia Bacheca?",
"archived-items": "Elementi archiviati",
@@ -71,8 +71,8 @@
"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)",
+ "auto-watch": "Segui automaticamente le bacheche quando vengono create.",
+ "avatar-too-big": "L'avatar è troppo grande (70KB max)",
"back": "Indietro",
"board-change-color": "Cambia colore",
"board-nb-stars": "%s stelle",
@@ -118,7 +118,7 @@
"changePasswordPopup-title": "Cambia password",
"changePermissionsPopup-title": "Cambia permessi",
"changeSettingsPopup-title": "Cambia impostazioni",
- "checklists": "Checklists",
+ "checklists": "Checklist",
"click-to-star": "Clicca per stellare questa bacheca",
"click-to-unstar": "Clicca per togliere la stella da questa bacheca",
"clipboard": "Clipboard o drag & drop",
@@ -136,7 +136,9 @@
"color-sky": "azzurro",
"color-yellow": "giallo",
"comment": "Commento",
- "comment-placeholder": "Scrivi un commento",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Solo commenti",
+ "comment-only-desc": "Puoi commentare solo le schede.",
"computer": "Computer",
"create": "Crea",
"createBoardPopup-title": "Crea bacheca",
@@ -163,17 +165,17 @@
"editProfilePopup-title": "Modifica profilo",
"email": "Email",
"email-enrollAccount-subject": "Creato un account per te su __siteName__",
- "email-enrollAccount-text": "Ciao __user__,\n\nPer iniziare ad usare il servizio, clicca sul link seguente:\n\n__url__\n\nGrazie.\n",
+ "email-enrollAccount-text": "Ciao __user__,\n\nPer iniziare ad usare il servizio, clicca sul link seguente:\n\n__url__\n\nGrazie.",
"email-fail": "Invio email fallito",
"email-invalid": "Email non valida",
"email-invite": "Invita via email",
"email-invite-subject": "__inviter__ ti ha inviato un invito",
- "email-invite-text": "Caro __user__,\n\n__inviter__ ti ha invitato ad unirti alla bacheca \"__board__\" per le collaborazioni.\n\nPer favore clicca sul link seguente:\n\n__url__\n\nGrazie.\n",
+ "email-invite-text": "Caro __user__,\n\n__inviter__ ti ha invitato ad unirti alla bacheca \"__board__\" per le collaborazioni.\n\nPer favore clicca sul link seguente:\n\n__url__\n\nGrazie.",
"email-resetPassword-subject": "Ripristina la tua password su on __siteName__",
- "email-resetPassword-text": "Ciao __user__,\n\nPer ripristinare la tua password, clicca sul link seguente:\n\n__url__\n\nGrazie.\n",
+ "email-resetPassword-text": "Ciao __user__,\n\nPer ripristinare la tua password, clicca sul link seguente:\n\n__url__\n\nGrazie.",
"email-sent": "Email inviata",
"email-verifyEmail-subject": "Verifica il tuo indirizzo email su on __siteName__",
- "email-verifyEmail-text": "Ciao __user__,\n\nPer verificare il tuo account email, clicca sul link seguente:\n\n__url__\n\nGrazie.\n",
+ "email-verifyEmail-text": "Ciao __user__,\n\nPer verificare il tuo account email, clicca sul link seguente:\n\n__url__\n\nGrazie.",
"error-board-doesNotExist": "Questa bacheca non esiste",
"error-board-notAdmin": "Devi essere admin di questa bacheca per poterlo fare",
"error-board-notAMember": "Devi essere un membro di questa bacheca per poterlo fare",
@@ -181,7 +183,7 @@
"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-notAllowSelf": "Non puoi invitare te stesso",
"error-user-notCreated": "L'utente non è stato creato",
"error-username-taken": "Questo username è già utilizzato",
"export-board": "Esporta bacheca",
@@ -196,6 +198,7 @@
"fullname": "Nome completo",
"header-logo-title": "Torna alla tua bacheca.",
"hide-system-messages": "Nascondi i messaggi di sistema",
+ "headerBarCreateBoardPopup-title": "Crea bacheca",
"home": "Home",
"import": "Importa",
"import-board": "importa da Trello",
@@ -213,7 +216,7 @@
"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-create": "Crea 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",
@@ -227,6 +230,10 @@
"list-select-cards": "Selezione tutte le schede in questa lista",
"listActionPopup-title": "Azioni disponibili",
"listImportCardPopup-title": "Importa una scheda di Trello",
+ "listMorePopup-title": "Altro",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
"lists": "Liste",
"log-out": "Log Out",
"log-in": "Log In",
@@ -271,7 +278,8 @@
"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-label": "Remove Label",
+ "listDeletePopup-title": "Delete List ?",
"remove-member": "Rimuovi utente",
"remove-member-from-card": "Rimuovi dalla scheda",
"remove-member-pop": "Rimuovere __name__ (__username__) da __boardTitle__? L'utente sarà rimosso da tutte le schede in questa bacheca. Riceveranno una notifica.",
@@ -281,7 +289,7 @@
"restore": "Ripristina",
"save": "Salva",
"search": "Cerca",
- "select-color": "Seleziona un colore",
+ "select-color": "Select Color",
"shortcut-assign-self": "Aggiungi te stesso alla scheda corrente",
"shortcut-autocomplete-emoji": "Autocompletamento emoji",
"shortcut-autocomplete-members": "Autocompletamento membri",
@@ -292,6 +300,8 @@
"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",
+ "sidebar-open": "Apri Sidebar",
+ "sidebar-close": "Chiudi Sidebar",
"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",
@@ -319,5 +329,27 @@
"welcome-board": "Bacheca di benvenuto",
"welcome-list1": "Basi",
"welcome-list2": "Avanzate",
- "what-to-do": "Cosa vuoi fare?"
+ "what-to-do": "Cosa vuoi fare?",
+ "admin-panel": "Pannello dell'Amministratore",
+ "settings": "Impostazioni",
+ "people": "Persone",
+ "registration": "Registrazione",
+ "disable-self-registration": "Disabilita Auto-registrazione",
+ "invite": "Invita",
+ "invite-people": "Invita persone",
+ "to-boards": "torna alle bacheche(a)",
+ "email-addresses": "Indirizzi email",
+ "smtp-host-description": "L'indirizzo del server SMTP che gestisce le tue email.",
+ "smtp-port-description": "La porta che il tuo server SMTP utilizza per le email in uscita.",
+ "smtp-tls-description": "Abilita supporto TLS per server SMTP",
+ "smtp-host": "SMTP Host",
+ "smtp-port": "Porta SMTP",
+ "smtp-username": "Username",
+ "smtp-password": "Password",
+ "smtp-tls": "Supporto TLS",
+ "send-from": "Da",
+ "invitation-code": "Codice d'invito",
+ "email-invite-register-subject": "__inviter__ ti ha inviato un invito",
+ "email-invite-register-text": "Gentile __user__,\n\n__inviter__ ti ha invitato su Wekan per collaborare.\n\nPer favore segui il link qui sotto:\n__url__\n\nIl tuo codice d'invito è: __icode__\n\nGrazie.",
+ "error-invitation-code-not-exist": "Il codice d'invito non esiste"
} \ No newline at end of file
diff --git a/i18n/ja.i18n.json b/i18n/ja.i18n.json
index 1826f064..4c939d10 100644
--- a/i18n/ja.i18n.json
+++ b/i18n/ja.i18n.json
@@ -1,13 +1,13 @@
{
- "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-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__",
@@ -21,7 +21,7 @@
"act-withBoardTitle": "[Wekan] __board__",
"act-withCardTitle": "[__board__] __card__",
"actions": "操作",
- "activities": "Activities",
+ "activities": "アクティビティ",
"activity": "アクティビティ",
"activity-added": "%s を %s に追加しました",
"activity-archived": "%s をアーカイブしました",
@@ -35,55 +35,55 @@
"activity-on": "%s",
"activity-removed": "%s を %s から削除しました",
"activity-sent": "%s を %s に送りました",
- "activity-unjoined": "unjoined %s",
- "activity-checklist-added": "added checklist to %s",
+ "activity-unjoined": "%s への参加を止めました",
+ "activity-checklist-added": "%s にチェックリストを追加しました",
"add": "追加",
- "add-attachment": "Add an attachment",
- "add-board": "ボード追加",
- "add-card": "Add a card",
- "add-checklist": "Add a checklist",
- "add-checklist-item": "Add an item to checklist",
+ "add-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add Checklist",
+ "add-checklist-item": "チェックリストに項目を追加",
"add-cover": "カバーの追加",
- "add-label": "Add the label",
- "add-list": "Add a list",
- "add-members": "Add Members",
+ "add-label": "Add Label",
+ "add-list": "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-list": "このリストをアーカイブ",
- "archive-selection": "Archive selection",
- "archiveBoardPopup-title": "Archive Board?",
+ "archive-board": "ボードをアーカイブ",
+ "archive-card": "カードをアーカイブ",
+ "archive-list": "Archive List",
+ "archive-selection": "選択したものをアーカイブ",
+ "archiveBoardPopup-title": "ボードをアーカイブしますか?",
"archived-items": "アーカイブされたアイテム",
- "archives": "Archives",
- "assign-member": "Assign member",
+ "archives": "アーカイブ",
+ "assign-member": "メンバーの割当",
"attached": "添付されました",
"attachment": "添付ファイル",
"attachment-delete-pop": "添付ファイルの削除をすると取り消しできません。",
"attachmentDeletePopup-title": "添付ファイルを削除しますか?",
"attachments": "添付ファイル",
- "auto-watch": "作成したボードは自動的に監視する",
- "avatar-too-big": "The avatar is too large (70Kb max)",
+ "auto-watch": "Automatically watch boards when they are created",
+ "avatar-too-big": "The avatar is too large (70KB max)",
"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": "公開範囲の変更",
- "boardChangeWatchPopup-title": "Change Watch",
- "boardMenuPopup-title": "Board Menu",
+ "boardChangeWatchPopup-title": "ウォッチの変更",
+ "boardMenuPopup-title": "ボードメニュー",
"boards": "ボード",
"bucket-example": "Like “Bucket List” for example",
"cancel": "キャンセル",
@@ -93,80 +93,82 @@
"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": "期限",
- "card-due-on": "Due on",
- "card-edit-attachments": "Edit attachments",
- "card-edit-labels": "Edit labels",
- "card-edit-members": "Edit members",
+ "card-due-on": "期限日",
+ "card-edit-attachments": "添付ファイルの編集",
+ "card-edit-labels": "ラベルの編集",
+ "card-edit-members": "メンバーの編集",
"card-labels-title": "カードのラベルを変更する",
"card-members-title": "カードからボードメンバーを追加・削除する",
"card-start": "開始",
- "card-start-on": "Starts on",
+ "card-start-on": "開始日",
"cardAttachmentsPopup-title": "Attach From",
"cardDeletePopup-title": "カードを削除しますか?",
- "cardDetailsActionsPopup-title": "Card Actions",
+ "cardDetailsActionsPopup-title": "カード操作",
"cardLabelsPopup-title": "ラベル",
"cardMembersPopup-title": "メンバー",
"cardMorePopup-title": "さらに見る",
- "cards": "Cards",
- "change": "Change",
+ "cards": "カード",
+ "change": "変更",
"change-avatar": "アバターの変更",
"change-password": "パスワードの変更",
- "change-permissions": "Change permissions",
+ "change-permissions": "権限の変更",
"change-settings": "設定の変更",
"changeAvatarPopup-title": "アバターの変更",
"changeLanguagePopup-title": "言語の変更",
"changePasswordPopup-title": "パスワードの変更",
"changePermissionsPopup-title": "パーミッションの変更",
"changeSettingsPopup-title": "設定の変更",
- "checklists": "Checklists",
+ "checklists": "チェックリスト",
"click-to-star": "ボードにスターをつける",
"click-to-unstar": "ボードからスターを外す",
- "clipboard": "Clipboard or drag & drop",
+ "clipboard": "クリップボードもしくはドラッグ&ドロップ",
"close": "閉じる",
- "close-board": "Close Board",
+ "close-board": "ボードを閉じる",
"close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.",
- "color-black": "black",
- "color-blue": "blue",
- "color-green": "green",
- "color-lime": "lime",
- "color-orange": "orange",
- "color-pink": "pink",
- "color-purple": "purple",
- "color-red": "red",
- "color-sky": "sky",
- "color-yellow": "yellow",
+ "color-black": "黒",
+ "color-blue": "青",
+ "color-green": "緑",
+ "color-lime": "ライム",
+ "color-orange": "オレンジ",
+ "color-pink": "ピンク",
+ "color-purple": "紫",
+ "color-red": "赤",
+ "color-sky": "空",
+ "color-yellow": "黄",
"comment": "コメント",
- "comment-placeholder": "Write a comment",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "Can comment on cards only.",
"computer": "コンピューター",
"create": "作成",
"createBoardPopup-title": "ボードの作成",
"createLabelPopup-title": "ラベルの作成",
- "current": "current",
- "date": "Date",
- "decline": "Decline",
- "default-avatar": "Default avatar",
+ "current": "現在",
+ "date": "日付",
+ "decline": "拒否",
+ "default-avatar": "デフォルトのアバター",
"delete": "削除",
"deleteLabelPopup-title": "ラベルを削除しますか?",
"description": "詳細",
"disambiguateMultiLabelPopup-title": "Disambiguate Label Action",
"disambiguateMultiMemberPopup-title": "Disambiguate Member Action",
- "discard": "Discard",
- "done": "Done",
+ "discard": "捨てる",
+ "done": "完了",
"download": "ダウンロード",
"edit": "編集",
"edit-avatar": "アバターの変更",
- "edit-profile": "Edit Profile",
- "editCardStartDatePopup-title": "Change start date",
- "editCardDueDatePopup-title": "Change due date",
+ "edit-profile": "プロフィールの編集",
+ "editCardStartDatePopup-title": "開始日の変更",
+ "editCardDueDatePopup-title": "期限の変更",
"editLabelPopup-title": "ラベルの変更",
- "editNotificationPopup-title": "Edit Notification",
- "editProfilePopup-title": "Edit Profile",
+ "editNotificationPopup-title": "通知の変更",
+ "editProfilePopup-title": "プロフィールの編集",
"email": "メールアドレス",
"email-enrollAccount-subject": "An account created for you on __siteName__",
"email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.",
- "email-fail": "Sending email failed",
- "email-invalid": "Invalid email",
- "email-invite": "Invite via Email",
+ "email-fail": "メールの送信に失敗しました",
+ "email-invalid": "無効なメールアドレス",
+ "email-invite": "メールで招待",
"email-invite-subject": "__inviter__ sent you an invitation",
"email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.",
"email-resetPassword-subject": "Reset your password on __siteName__",
@@ -174,95 +176,100 @@
"email-sent": "Email sent",
"email-verifyEmail-subject": "Verify your email address on __siteName__",
"email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.",
- "error-board-doesNotExist": "This board does not exist",
+ "error-board-doesNotExist": "ボードがありません",
"error-board-notAdmin": "You need to be admin of this board to do that",
"error-board-notAMember": "You need to be a member of this board to do that",
"error-json-malformed": "Your text is not valid JSON",
"error-json-schema": "Your JSON data does not include the proper information in the correct format",
"error-list-doesNotExist": "This list does not exist",
- "error-user-doesNotExist": "This user does not exist",
- "error-user-notAllowSelf": "This action on self is not allowed",
- "error-user-notCreated": "This user is not created",
+ "error-user-doesNotExist": "ユーザーが存在しません",
+ "error-user-notAllowSelf": "You can not invite yourself",
+ "error-user-notCreated": "ユーザーが作成されていません",
"error-username-taken": "このユーザ名は既に使用されています",
- "export-board": "Export board",
- "filter": "Filter",
+ "export-board": "ボードのエクスポート",
+ "filter": "フィルター",
"filter-cards": "カードをフィルターする",
- "filter-clear": "Clear filter",
- "filter-no-label": "No label",
- "filter-no-member": "No member",
- "filter-on": "Filter is on",
+ "filter-clear": "フィルターの解除",
+ "filter-no-label": "ラベルなし",
+ "filter-no-member": "メンバーなし",
+ "filter-on": "フィルター有効",
"filter-on-desc": "このボードのカードをフィルターしています。フィルターを編集するにはこちらをクリックしてください。",
"filter-to-selection": "Filter to selection",
"fullname": "フルネーム",
"header-logo-title": "自分のボードページに戻る。",
- "hide-system-messages": "Hide system messages",
+ "hide-system-messages": "システムメッセージを隠す",
+ "headerBarCreateBoardPopup-title": "ボードの作成",
"home": "ホーム",
- "import": "Import",
- "import-board": "import from Trello",
- "import-board-title": "Import board from Trello",
+ "import": "インポート",
+ "import-board": "Trelloからインポート",
+ "import-board-title": "Trelloからボードをインポート",
"import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text",
"import-json-placeholder": "Paste your valid JSON data here",
- "import-map-members": "Map members",
+ "import-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",
+ "importMapMembersAddPopup-title": "Wekanメンバーを選択",
"info": "情報",
"initials": "Initials",
- "invalid-date": "Invalid date",
+ "invalid-date": "無効な日付",
"joined": "参加しました",
"just-invited": "You are just invited to this board",
- "keyboard-shortcuts": "Keyboard shortcuts",
- "label-create": "ラベル作成",
+ "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のカードをインポート",
+ "listMorePopup-title": "さらに見る",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
+ "lists": "リスト",
"log-out": "ログアウト",
- "log-in": "Log In",
+ "log-in": "ログイン",
"loginPopup-title": "ログイン",
- "memberMenuPopup-title": "Member Settings",
+ "memberMenuPopup-title": "メンバー設定",
"members": "メンバー",
"menu": "メニュー",
"move-selection": "Move selection",
- "moveCardPopup-title": "Move Card",
- "moveCardToBottom-title": "Move to Bottom",
- "moveCardToTop-title": "Move to Top",
- "moveSelectionPopup-title": "Move selection",
- "multi-selection": "Multi-Selection",
- "multi-selection-on": "Multi-Selection is on",
- "muted": "Muted",
- "muted-info": "You will never be notified of any changes in this board",
+ "moveCardPopup-title": "カードの移動",
+ "moveCardToBottom-title": "最下部に移動",
+ "moveCardToTop-title": "先頭に移動",
+ "moveSelectionPopup-title": "選択箇所に移動",
+ "multi-selection": "複数選択",
+ "multi-selection-on": "複数選択有効",
+ "muted": "ミュート",
+ "muted-info": "このボードの変更は通知されません",
"my-boards": "自分のボード",
"name": "名前",
- "no-archived-cards": "No archived cards.",
- "no-archived-lists": "No archived lists.",
+ "no-archived-cards": "アーカイブされたボードはありません",
+ "no-archived-lists": "アーカイブされたリストはありません",
"no-results": "該当するものはありません",
"normal": "通常",
"normal-desc": "カードの閲覧と編集が可能。設定変更不可。",
- "not-accepted-yet": "Invitation not accepted yet",
- "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",
+ "not-accepted-yet": "招待はアクセプトされていません",
+ "notify-participate": "作成した、またはメンバーとなったカードの更新情報を受け取る",
+ "notify-watch": "ウォッチしているすべてのボード、リスト、カードの更新情報を受け取る",
"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",
+ "participating": "参加",
+ "preview": "プレビュー",
+ "previewAttachedImagePopup-title": "プレビュー",
+ "previewClipboardImagePopup-title": "プレビュー",
"private": "プライベート",
"private-desc": "このボードはプライベートです。ボードメンバーのみが閲覧・編集可能です。",
"profile": "プロフィール",
@@ -270,10 +277,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 Label",
+ "listDeletePopup-title": "Delete List ?",
"remove-member": "メンバーを外す",
- "remove-member-from-card": "カードから取り除く",
+ "remove-member-from-card": "カードから外す",
"remove-member-pop": "__boardTitle__ から __name__ (__username__) を外しますか?メンバーはこのボードのすべてのカードから外れ、通知を受けます。",
"removeMemberPopup-title": "メンバーを外しますか?",
"rename": "名前変更",
@@ -281,17 +289,19 @@
"restore": "Restore",
"save": "保存",
"search": "検索",
- "select-color": "色を選択",
- "shortcut-assign-self": "Assign yourself to current card",
+ "select-color": "Select Color",
+ "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",
- "show-cards-minimum-count": "Show cards count if list contains more than",
+ "shortcut-toggle-filterbar": "フィルターサイドバーの切り替え",
+ "shortcut-toggle-sidebar": "ボードサイドバーの切り替え",
+ "show-cards-minimum-count": "以下より多い場合、リストにカード数を表示",
+ "sidebar-open": "サイドバーを開く",
+ "sidebar-close": "サイドバーを閉じる",
"signupPopup-title": "アカウント作成",
"star-board-title": "ボードにスターをつけると自分のボード一覧のトップに表示されます。",
"starred-boards": "スターのついたボード",
@@ -300,24 +310,46 @@
"team": "チーム",
"this-board": "このボード",
"this-card": "このカード",
- "time": "Time",
+ "time": "時間",
"title": "タイトル",
- "tracking": "Tracking",
+ "tracking": "トラッキング",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"unassign-member": "Unassign member",
"unsaved-description": "You have an unsaved description.",
- "unwatch": "Unwatch",
- "upload": "Upload",
- "upload-avatar": "Upload an avatar",
- "uploaded-avatar": "Uploaded an avatar",
+ "unwatch": "アンウォッチ",
+ "upload": "アップロード",
+ "upload-avatar": "アバターのアップロード",
+ "uploaded-avatar": "アップロードされたアバター",
"username": "ユーザー名",
"view-it": "View it",
"warn-list-archived": "warning: this card is in an archived list",
- "watch": "Watch",
- "watching": "Watching",
- "watching-info": "You will be notified of any change in this board",
- "welcome-board": "Welcome Board",
- "welcome-list1": "Basics",
- "welcome-list2": "Advanced",
- "what-to-do": "What do you want to do?"
+ "watch": "ウォッチ",
+ "watching": "ウォッチしています",
+ "watching-info": "このボードの変更が通知されます",
+ "welcome-board": "ウェルカムボード",
+ "welcome-list1": "基本",
+ "welcome-list2": "高度",
+ "what-to-do": "何をしたいですか?",
+ "admin-panel": "管理パネル",
+ "settings": "設定",
+ "people": "People",
+ "registration": "登録",
+ "disable-self-registration": "自己登録を無効化",
+ "invite": "招待",
+ "invite-people": "Invite People",
+ "to-boards": "To board(s)",
+ "email-addresses": "Emailアドレス",
+ "smtp-host-description": "Emailを処理するSMTPサーバーのアドレス",
+ "smtp-port-description": "SMTPサーバーがEmail送信に使用するポート",
+ "smtp-tls-description": "SMTPサーバのTLSサポートを有効化",
+ "smtp-host": "SMTPホスト",
+ "smtp-port": "SMTPポート",
+ "smtp-username": "ユーザー名",
+ "smtp-password": "パスワード",
+ "smtp-tls": "TLSサポート",
+ "send-from": "送信元",
+ "invitation-code": "招待コード",
+ "email-invite-register-subject": "__inviter__ sent you an invitation",
+ "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to Wekan for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.",
+ "error-invitation-code-not-exist": "招待コードが存在しません"
} \ No newline at end of file
diff --git a/i18n/ko.i18n.json b/i18n/ko.i18n.json
index 9b5226c4..31286f1f 100644
--- a/i18n/ko.i18n.json
+++ b/i18n/ko.i18n.json
@@ -1,27 +1,27 @@
{
- "accept": "Accept",
- "act-activity-notify": "[Wekan] Activity Notification",
- "act-addAttachment": "attached __attachment__ to __card__",
- "act-addComment": "commented on __card__: __comment__",
- "act-createBoard": "created __board__",
- "act-createCard": "added __card__ to __list__",
- "act-createList": "added __list__ to __board__",
- "act-addBoardMember": "added __member__ to __board__",
- "act-archivedBoard": "archived __board__",
- "act-archivedCard": "archived __card__",
- "act-archivedList": "archived __list__",
- "act-importBoard": "imported __board__",
- "act-importCard": "imported __card__",
- "act-importList": "imported __list__",
- "act-joinMember": "added __member__ to __card__",
- "act-moveCard": "moved __card__ from __oldList__ to __list__",
- "act-removeBoardMember": "removed __member__ from __board__",
- "act-restoredCard": "restored __card__ to __board__",
- "act-unjoinMember": "removed __member__ from __card__",
+ "accept": "확인",
+ "act-activity-notify": "[Wekan] 활동 알림",
+ "act-addAttachment": "__attachment__를 __card__에 첨부",
+ "act-addComment": "__card__에 내용 추가 : __comment__",
+ "act-createBoard": "__board__ 생성",
+ "act-createCard": "__list__에 __card__ 추가",
+ "act-createList": "__board__에 __list__ 추가",
+ "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": "Activities",
+ "activities": "활동 내역",
"activity": "활동 상태",
"activity-added": "%s를 %s에 추가함",
"activity-archived": "%s 저장됨",
@@ -35,289 +35,321 @@
"activity-on": "%s에",
"activity-removed": "%s를 %s에서 삭제함",
"activity-sent": "%s를 %s로 보냄",
- "activity-unjoined": "unjoined %s",
- "activity-checklist-added": "added checklist to %s",
+ "activity-unjoined": "%s에서 멤버 해제",
+ "activity-checklist-added": "%s에 체크리스트를 추가함",
"add": "추가",
- "add-attachment": "Add an attachment",
- "add-board": "새로운 보드를 추가",
- "add-card": "Add a card",
- "add-checklist": "Add a checklist",
- "add-checklist-item": "Add an item to checklist",
+ "add-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add Checklist",
+ "add-checklist-item": "체크리스트에 항목 추가",
"add-cover": "커버 추가",
- "add-label": "Add the label",
- "add-list": "Add a list",
- "add-members": "Add Members",
+ "add-label": "Add Label",
+ "add-list": "Add List",
+ "add-members": "멤버 추가",
"added": "추가됨",
"addMemberPopup-title": "멤버",
"admin": "관리자",
"admin-desc": "카드를 보거나 수정하고, 멤버를 삭제하고, 보드에 대한 설정을 수정할 수 있습니다.",
- "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.",
+ "all-boards": "전체 보드",
+ "and-n-other-card": "__count__ 개의 다른 카드",
+ "and-n-other-card_plural": "__count__ 개의 다른 카드들",
+ "apply": "적용",
+ "app-is-offline": "현재 페이지는 오프라인 상태입니다. 저장되지 않은 데이터는 손실됩니다. 새로고침 하세요.",
"archive": "보관",
"archive-all": "모두 보관",
- "archive-board": "Archive Board",
- "archive-card": "Archive Card",
- "archive-list": "이 목록 보관",
- "archive-selection": "Archive selection",
- "archiveBoardPopup-title": "Archive Board?",
+ "archive-board": "보드 저장소 보관",
+ "archive-card": "카드 저장소 보관",
+ "archive-list": "Archive List",
+ "archive-selection": "저장소 선택",
+ "archiveBoardPopup-title": "보드를 저장소에 보관하시겠습니까?",
"archived-items": "보관된 아이템",
- "archives": "Archives",
- "assign-member": "Assign member",
+ "archives": "저장소",
+ "assign-member": "멤버 지정",
"attached": "첨부됨",
"attachment": "첨부 파일",
"attachment-delete-pop": "영구 첨부파일을 삭제합니다. 되돌릴 수 없습니다.",
"attachmentDeletePopup-title": "첨부 파일을 삭제합니까?",
"attachments": "첨부 파일",
- "auto-watch": "Automatically watch boards when create it",
- "avatar-too-big": "The avatar is too large (70Kb max)",
+ "auto-watch": "Automatically watch boards when they are created",
+ "avatar-too-big": "The avatar is too large (70KB max)",
"back": "뒤로",
- "board-change-color": "Change color",
- "board-nb-stars": "%s stars",
+ "board-change-color": "보드 색 변경",
+ "board-nb-stars": "%s개의 별",
"board-not-found": "보드를 찾을 수 없습니다",
- "board-private-info": "This board will be <strong>private</strong>.",
+ "board-private-info": "이 보드는 <strong>비공개</strong>입니다.",
"board-public-info": "이 보드는 <strong>공개</strong>로 설정됩니다",
- "boardChangeColorPopup-title": "Change Board Background",
+ "boardChangeColorPopup-title": "보드 배경 변경",
"boardChangeTitlePopup-title": "보드 이름 바꾸기",
"boardChangeVisibilityPopup-title": "표시 여부 변경",
- "boardChangeWatchPopup-title": "Change Watch",
- "boardMenuPopup-title": "Board Menu",
+ "boardChangeWatchPopup-title": "감시상태 변경",
+ "boardMenuPopup-title": "보드 메뉴",
"boards": "보드",
- "bucket-example": "Like “Bucket List” for example",
+ "bucket-example": "예: “프로젝트 이름“ 입력",
"cancel": "취소",
"card-archived": "이 카드를 보관합니다.",
"card-comments-title": "이 카드에 %s 코멘트가 있습니다.",
"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-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": "Start",
- "card-start-on": "Starts on",
- "cardAttachmentsPopup-title": "Attach From",
+ "card-start": "시작일",
+ "card-start-on": "시작일",
+ "cardAttachmentsPopup-title": "첨부 파일",
"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-settings": "Change Settings",
+ "change-permissions": "권한 변경",
+ "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",
+ "changeSettingsPopup-title": "설정 변경",
+ "checklists": "체크리스트",
+ "click-to-star": "보드에 별 추가.",
+ "click-to-unstar": "보드에 별 삭제.",
+ "clipboard": "클립보드 또는 드래그 앤 드롭",
"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-placeholder": "Write a comment",
+ "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": "Write Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "카드에 댓글만 달수 있습니다.",
"computer": "내 컴퓨터",
"create": "생성",
"createBoardPopup-title": "보드 생성",
"createLabelPopup-title": "라벨 생성",
- "current": "current",
- "date": "Date",
- "decline": "Decline",
- "default-avatar": "Default avatar",
+ "current": "경향",
+ "date": "날짜",
+ "decline": "쇠퇴",
+ "default-avatar": "기본 아바타",
"delete": "삭제",
"deleteLabelPopup-title": "라벨을 삭제합니까?",
"description": "설명",
- "disambiguateMultiLabelPopup-title": "Disambiguate Label Action",
- "disambiguateMultiMemberPopup-title": "Disambiguate Member Action",
- "discard": "Discard",
- "done": "Done",
+ "disambiguateMultiLabelPopup-title": "라벨 액션의 모호성 제거",
+ "disambiguateMultiMemberPopup-title": "멤버 액션의 모호성 제거",
+ "discard": "포기",
+ "done": "완료",
"download": "다운로드",
"edit": "수정",
"edit-avatar": "아바타 변경",
- "edit-profile": "Edit Profile",
- "editCardStartDatePopup-title": "Change start date",
- "editCardDueDatePopup-title": "Change due date",
+ "edit-profile": "프로필 변경",
+ "editCardStartDatePopup-title": "시작일 변경",
+ "editCardDueDatePopup-title": "종료일 변경",
"editLabelPopup-title": "라벨 변경",
- "editNotificationPopup-title": "Edit Notification",
- "editProfilePopup-title": "Edit Profile",
+ "editNotificationPopup-title": "알림 수정",
+ "editProfilePopup-title": "프로필 변경",
"email": "이메일",
- "email-enrollAccount-subject": "An account created for you on __siteName__",
- "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.",
- "email-fail": "Sending email failed",
- "email-invalid": "Invalid email",
- "email-invite": "Invite via Email",
- "email-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",
+ "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": "You can not invite yourself",
+ "error-user-notCreated": "유저가 생성되지 않았습니다.",
+ "error-username-taken": "중복된 아이디 입니다.",
+ "export-board": "보드 내보내기",
+ "filter": "필터",
"filter-cards": "카드 필터",
- "filter-clear": "Clear filter",
- "filter-no-label": "No label",
- "filter-no-member": "No member",
- "filter-on": "Filter is on",
+ "filter-clear": "필터 초기화",
+ "filter-no-label": "라벨 없음",
+ "filter-no-member": "멤버 없음",
+ "filter-on": "필터 사용",
"filter-on-desc": "보드에서 카드를 필터링합니다. 여기를 클릭하여 필터를 수정합니다.",
- "filter-to-selection": "Filter to selection",
- "fullname": "전체 이름",
+ "filter-to-selection": "선택 항목으로 필터링",
+ "fullname": "실명",
"header-logo-title": "보드 페이지로 돌아가기.",
- "hide-system-messages": "Hide system messages",
+ "hide-system-messages": "시스템 메시지 숨기기",
+ "headerBarCreateBoardPopup-title": "보드 생성",
"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",
+ "import": "가져오기",
+ "import-board": "Trello에서 가져오기",
+ "import-board-title": "Trello에서 보드 가져오기",
+ "import-board-trello-instruction": "Trello 게시판에서 'Menu' -> 'More' -> 'Print and Export', 'Export 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": "Initials",
- "invalid-date": "Invalid date",
+ "initials": "이니셜",
+ "invalid-date": "잘못된 날짜",
"joined": "참가함",
- "just-invited": "You are just invited to this board",
- "keyboard-shortcuts": "Keyboard shortcuts",
- "label-create": "새로운 라벨 생성",
+ "just-invited": "보드에 방금 초대되었습니다.",
+ "keyboard-shortcuts": "키보드 단축키",
+ "label-create": "라벨 생성",
"label-default": "%s 라벨 (기본)",
"label-delete-pop": "되돌릴 수 없습니다. 모든 카드에서 라벨을 제거하고, 이력을 제거합니다.",
"labels": "라벨",
"language": "언어",
"last-admin-desc": "적어도 하나의 관리자가 필요하기에 이 역할을 변경할 수 없습니다.",
- "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 카드 가져 오기",
+ "listMorePopup-title": "더보기",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
+ "lists": "목록들",
"log-out": "로그아웃",
- "log-in": "Log In",
+ "log-in": "로그인",
"loginPopup-title": "로그인",
- "memberMenuPopup-title": "Member Settings",
+ "memberMenuPopup-title": "멤버 설정",
"members": "멤버",
"menu": "메뉴",
- "move-selection": "Move selection",
- "moveCardPopup-title": "Move Card",
- "moveCardToBottom-title": "Move to Bottom",
- "moveCardToTop-title": "Move to Top",
- "moveSelectionPopup-title": "Move selection",
- "multi-selection": "Multi-Selection",
- "multi-selection-on": "Multi-Selection is on",
- "muted": "Muted",
- "muted-info": "You will never be notified of any changes in this board",
+ "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 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",
- "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",
+ "not-accepted-yet": "초대장이 수락되지 않았습니다.",
+ "notify-participate": "보드 생성자 또는 멤버로 참여하는 모든 카드에 대한 변경사항 알림 받음",
+ "notify-watch": "감시중인 보드, 목록 또는 카드에 대한 변경사항 알림 받음",
+ "optional": "옵션",
+ "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",
+ "paste-or-dragdrop": "이미지 파일을 붙여 넣거나 드래그 앤 드롭 (이미지 전용)",
+ "participating": "참여",
+ "preview": "미리보기",
+ "previewAttachedImagePopup-title": "미리보기",
+ "previewClipboardImagePopup-title": "미리보기",
"private": "비공개",
"private-desc": "비공개된 보드입니다. 오직 보드에 추가된 사람들만 보고 수정할 수 있습니다",
"profile": "프로파일",
"public": "공개",
"public-desc": "공개된 보드입니다. 링크를 가진 모든 사람과 구글과 같은 검색 엔진에서 찾아서 볼수 있습니다. 보드에 추가된 사람들만 수정이 가능합니다.",
- "quick-access-description": "Star a board to add a shortcut in this bar.",
+ "quick-access-description": "여기에 바로 가기를 추가하려면 보드에 별 표시를 체크하세요.",
"remove-cover": "커버 제거",
- "remove-from-board": "Remove from Board",
- "remove-label": "Remove the label",
+ "remove-from-board": "보드에서 제거",
+ "remove-label": "Remove Label",
+ "listDeletePopup-title": "Delete List ?",
"remove-member": "멤버 제거",
"remove-member-from-card": "카드에서 제거",
- "remove-member-pop": "__boardTitle__에서 __name__(__username__) 을 제거합니까? 그 멤버는 이 보드의 모든 카드에서 제거됩니다. 그에대한 알람을 받게됩니다.",
+ "remove-member-pop": "__boardTitle__에서 __name__(__username__) 을 제거합니까? 이 보드의 모든 카드에서 제거됩니다. 해당 내용을 __name__(__username__) 은(는) 알림으로 받게됩니다.",
"removeMemberPopup-title": "멤버를 제거합니까?",
"rename": "새이름",
"rename-board": "보드 이름 바꾸기",
- "restore": "Restore",
+ "restore": "복구",
"save": "저장",
"search": "검색",
- "select-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",
+ "select-color": "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": "목록에 카드 수량 표시(입력된 수량 넘을 경우 표시)",
+ "sidebar-open": "사이드바 열기",
+ "sidebar-close": "사이드바 닫기",
"signupPopup-title": "계정 생성",
- "star-board-title": "보드에 별을 클릭합니다. 보드 목록에서 최상위로 둘 수 있습니다.",
+ "star-board-title": "보드에 별 표시를 클릭합니다. 보드 목록에서 최상위로 둘 수 있습니다.",
"starred-boards": "별표된 보드",
- "starred-boards-description": "별표된 보드들은 보드 목록의 최상단에서 보입니다.",
+ "starred-boards-description": "별 표시된 보드들은 보드 목록의 최상단에서 보입니다.",
"subscribe": "구독",
"team": "팀",
"this-board": "보드",
"this-card": "카드",
- "time": "Time",
+ "time": "시간",
"title": "제목",
- "tracking": "Tracking",
- "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
- "unassign-member": "Unassign member",
- "unsaved-description": "You have an unsaved description.",
- "unwatch": "Unwatch",
- "upload": "Upload",
- "upload-avatar": "Upload an avatar",
- "uploaded-avatar": "Uploaded an avatar",
- "username": "사용자 이름",
- "view-it": "View it",
- "warn-list-archived": "warning: this card is in an archived list",
- "watch": "Watch",
- "watching": "Watching",
- "watching-info": "You will be notified of any change in this board",
- "welcome-board": "Welcome Board",
- "welcome-list1": "Basics",
- "welcome-list2": "Advanced",
- "what-to-do": "무엇을 원하나요?"
+ "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": "무엇을 하고 싶으신가요?",
+ "admin-panel": "관리자 패널",
+ "settings": "설정",
+ "people": "사람",
+ "registration": "회원가입",
+ "disable-self-registration": "일반 유저의 회원 가입 막기",
+ "invite": "초대",
+ "invite-people": "사람 초대",
+ "to-boards": "보드로 부터",
+ "email-addresses": "이메일 주소",
+ "smtp-host-description": "이메일을 처리하는 SMTP 서버의 주소입니다.",
+ "smtp-port-description": "SMTP 서버가 보내는 전자 메일에 사용하는 포트입니다.",
+ "smtp-tls-description": "Enable TLS support for SMTP server",
+ "smtp-host": "SMTP 호스트",
+ "smtp-port": "SMTP 포트",
+ "smtp-username": "사용자 이름",
+ "smtp-password": "암호",
+ "smtp-tls": "TLS support",
+ "send-from": "보낸 사람",
+ "invitation-code": "초대 코드",
+ "email-invite-register-subject": "\"__inviter__ 님이 당신에게 초대장을 보냈습니다.",
+ "email-invite-register-text": "\"__user__ 님, \n\n__inviter__ 님이 Wekan 보드에 협업을 위하여 초대합니다.\n\n아래 링크를 클릭해주세요 : \n__url__\n\n그리고 초대 코드는 __icode__ 입니다.\n\n감사합니다.",
+ "error-invitation-code-not-exist": "초대 코드가 존재하지 않습니다."
} \ No newline at end of file
diff --git a/i18n/no.i18n.json b/i18n/no.i18n.json
new file mode 100644
index 00000000..97aa9412
--- /dev/null
+++ b/i18n/no.i18n.json
@@ -0,0 +1,355 @@
+{
+ "accept": "Godta",
+ "act-activity-notify": "[Wekan] Aktivitetsvarsel",
+ "act-addAttachment": "la ved __attachment__ til __card__",
+ "act-addComment": "kommenterte til __card__: __comment__",
+ "act-createBoard": "opprettet __board__",
+ "act-createCard": "la __card__ til __list__",
+ "act-createList": "la __list__ til __board__",
+ "act-addBoardMember": "la __member__ til __board__",
+ "act-archivedBoard": "arkiverte __board__",
+ "act-archivedCard": "arkiverte __card__",
+ "act-archivedList": "arkiverte __list__",
+ "act-importBoard": "importerte __board__",
+ "act-importCard": "importerte __card__",
+ "act-importList": "importerte __list__",
+ "act-joinMember": "la __member__ til __card__",
+ "act-moveCard": "flyttet __card__ fra __oldList__ til __list__",
+ "act-removeBoardMember": "fjernet __member__ fra __board__",
+ "act-restoredCard": "gjenopprettet __card__ til __board__",
+ "act-unjoinMember": "fjernet __member__ fra __card__",
+ "act-withBoardTitle": "[Wekan] __board__",
+ "act-withCardTitle": "[__board__] __card__",
+ "actions": "Actions",
+ "activities": "Aktiviteter",
+ "activity": "Aktivitet",
+ "activity-added": "la %s til %s",
+ "activity-archived": "arkiverte %s",
+ "activity-attached": "la %s til %s",
+ "activity-created": "opprettet %s",
+ "activity-excluded": "ekskluderte %s fra %s",
+ "activity-imported": "importerte %s til %s fra %s",
+ "activity-imported-board": "importerte %s fra %s",
+ "activity-joined": "ble med %s",
+ "activity-moved": "flyttet %s fra %s til %s",
+ "activity-on": "på %s",
+ "activity-removed": "fjernet %s fra %s",
+ "activity-sent": "sendte %s til %s",
+ "activity-unjoined": "forlot %s",
+ "activity-checklist-added": "la til sjekkliste til %s",
+ "add": "Legg til",
+ "add-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add Checklist",
+ "add-checklist-item": "Nytt punkt på sjekklisten",
+ "add-cover": "Nytt omslag",
+ "add-label": "Add Label",
+ "add-list": "Add List",
+ "add-members": "Legg til medlemmer",
+ "added": "Lagt til",
+ "addMemberPopup-title": "Medlemmer",
+ "admin": "Admin",
+ "admin-desc": "Kan se og redigere kort, fjerne medlemmer, og endre innstillingene for tavlen.",
+ "all-boards": "Alle tavler",
+ "and-n-other-card": "Og __count__ andre kort",
+ "and-n-other-card_plural": "Og __count__ andre kort",
+ "apply": "Lagre",
+ "app-is-offline": "Programmet er ikke på nett, å laste siden på nytt vil medføre tap av data.",
+ "archive": "Arkiv",
+ "archive-all": "Arkiver alle",
+ "archive-board": "Arkiver tavle",
+ "archive-card": "Arkiver kort",
+ "archive-list": "Archive List",
+ "archive-selection": "Arkiver merkede",
+ "archiveBoardPopup-title": "Arkivere tavle?",
+ "archived-items": "Arkiverte punkter",
+ "archives": "Arkiv",
+ "assign-member": "Tildel medlem",
+ "attached": "la ved",
+ "attachment": "Vedlegg",
+ "attachment-delete-pop": "Sletting av vedlegg er permanent og kan ikke angres",
+ "attachmentDeletePopup-title": "Slette vedlegg?",
+ "attachments": "Vedlegg",
+ "auto-watch": "Automatically watch boards when they are created",
+ "avatar-too-big": "The avatar is too large (70KB max)",
+ "back": "Tilbake",
+ "board-change-color": "Endre farge",
+ "board-nb-stars": "%s stjerner",
+ "board-not-found": "Kunne ikke finne tavlen",
+ "board-private-info": "Denne tavlen vil være <strong>privat</strong>.",
+ "board-public-info": "Denne tavlen vil være <strong>offentlig</strong>.",
+ "boardChangeColorPopup-title": "Ende tavlens bakgrunnsfarge",
+ "boardChangeTitlePopup-title": "Endre navn på tavlen",
+ "boardChangeVisibilityPopup-title": "Endre synlighet",
+ "boardChangeWatchPopup-title": "Endre overvåkning",
+ "boardMenuPopup-title": "Tavlemeny",
+ "boards": "Tavler",
+ "bucket-example": "Som \"Bucket List\" for eksempel",
+ "cancel": "Avbryt",
+ "card-archived": "Dette kortet er arkivert.",
+ "card-comments-title": "Dette kortet har %s kommentar.",
+ "card-delete-notice": "Sletting er permanent. Du vil miste alle hendelser knyttet til dette kortet.",
+ "card-delete-pop": "Alle handlinger vil fjernes fra feeden for aktiviteter og du vil ikke kunne åpne kortet på nytt. Det er ingen mulighet å angre.",
+ "card-delete-suggest-archive": "Du kan arkivere kortet for å fjerne det fra tavlen. All aktivitet vil beholdes.",
+ "card-due": "Frist",
+ "card-due-on": "Frist til",
+ "card-edit-attachments": "Rediger vedlegg",
+ "card-edit-labels": "Rediger etiketter",
+ "card-edit-members": "Endre medlemmer",
+ "card-labels-title": "Endre etiketter for kortet.",
+ "card-members-title": "Legg til eller fjern tavle-medlemmer fra dette kortet.",
+ "card-start": "Start",
+ "card-start-on": "Starter på",
+ "cardAttachmentsPopup-title": "Legg ved fra",
+ "cardDeletePopup-title": "Slett kort?",
+ "cardDetailsActionsPopup-title": "Kort-handlinger",
+ "cardLabelsPopup-title": "Etiketter",
+ "cardMembersPopup-title": "Medlemmer",
+ "cardMorePopup-title": "Mer",
+ "cards": "Kort",
+ "change": "Endre",
+ "change-avatar": "Endre avatar",
+ "change-password": "Endre passord",
+ "change-permissions": "Endre rettigheter",
+ "change-settings": "Endre innstillinger",
+ "changeAvatarPopup-title": "Endre Avatar",
+ "changeLanguagePopup-title": "Endre språk",
+ "changePasswordPopup-title": "Endre passord",
+ "changePermissionsPopup-title": "Endre tillatelser",
+ "changeSettingsPopup-title": "Endre innstillinger",
+ "checklists": "Sjekklister",
+ "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 Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "Can comment on cards only.",
+ "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": "Endre 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": "You can not invite yourself",
+ "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",
+ "headerBarCreateBoardPopup-title": "Create Board",
+ "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 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": "Etiketter",
+ "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",
+ "listMorePopup-title": "Mer",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
+ "lists": "Lists",
+ "log-out": "Log Out",
+ "log-in": "Log In",
+ "loginPopup-title": "Log In",
+ "memberMenuPopup-title": "Member Settings",
+ "members": "Medlemmer",
+ "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": "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 Label",
+ "listDeletePopup-title": "Delete 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": "Endre navn på tavlen",
+ "restore": "Restore",
+ "save": "Save",
+ "search": "Search",
+ "select-color": "Select 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",
+ "sidebar-open": "Open Sidebar",
+ "sidebar-close": "Close Sidebar",
+ "signupPopup-title": "Create an Account",
+ "star-board-title": "Click to star this board. It will show up at top of your boards list.",
+ "starred-boards": "Starred Boards",
+ "starred-boards-description": "Starred boards show up at the top of your boards list.",
+ "subscribe": "Subscribe",
+ "team": "Team",
+ "this-board": "this board",
+ "this-card": "this card",
+ "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?",
+ "admin-panel": "Admin Panel",
+ "settings": "Settings",
+ "people": "People",
+ "registration": "Registration",
+ "disable-self-registration": "Disable Self-Registration",
+ "invite": "Invite",
+ "invite-people": "Invite People",
+ "to-boards": "To board(s)",
+ "email-addresses": "Email Addresses",
+ "smtp-host-description": "The address of the SMTP server that handles your emails.",
+ "smtp-port-description": "The port your SMTP server uses for outgoing emails.",
+ "smtp-tls-description": "Enable TLS support for SMTP server",
+ "smtp-host": "SMTP Host",
+ "smtp-port": "SMTP Port",
+ "smtp-username": "Username",
+ "smtp-password": "Password",
+ "smtp-tls": "TLS support",
+ "send-from": "From",
+ "invitation-code": "Invitation Code",
+ "email-invite-register-subject": "__inviter__ sent you an invitation",
+ "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to Wekan for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.",
+ "error-invitation-code-not-exist": "Invitation code doesn't exist"
+} \ No newline at end of file
diff --git a/i18n/pl.i18n.json b/i18n/pl.i18n.json
index d5a3fd7d..b1b868a1 100644
--- a/i18n/pl.i18n.json
+++ b/i18n/pl.i18n.json
@@ -38,14 +38,14 @@
"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-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add Checklist",
"add-checklist-item": "Add an item to checklist",
"add-cover": "Dodaj okładkę",
- "add-label": "Dodaj etykietę",
- "add-list": "Dodaj listę",
+ "add-label": "Add Label",
+ "add-list": "Add List",
"add-members": "Dodaj członka",
"added": "Dodano",
"addMemberPopup-title": "Członkowie",
@@ -60,7 +60,7 @@
"archive-all": "Zarchiwizuj wszystkie",
"archive-board": "Zarchiwizuj tablicę",
"archive-card": "Zarchiwizuj kartę",
- "archive-list": "Zarchiwizuj tę listę",
+ "archive-list": "Archive List",
"archive-selection": "Zarchiwizuj zaznaczone",
"archiveBoardPopup-title": "Zarchiwizować tablicę?",
"archived-items": "Archived Items",
@@ -71,8 +71,8 @@
"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)",
+ "auto-watch": "Automatically watch boards when they are created",
+ "avatar-too-big": "The avatar is too large (70KB max)",
"back": "Wstecz",
"board-change-color": "Zmień kolor",
"board-nb-stars": "%s odznaczeń",
@@ -90,7 +90,7 @@
"card-archived": "Ta karta jest zarchiwizowana.",
"card-comments-title": "Ta karta ma %s komentarzy.",
"card-delete-notice": "Usunięcie jest trwałe. Stracisz wszystkie akcje powiązane z tą kartą.",
- "card-delete-pop": "Wszystkie akcje będą usunięte z widoku aktywności, nie można będzie ponownie otworzyć karty. Usunięcie jest nieodwracalne. ",
+ "card-delete-pop": "Wszystkie akcje będą usunięte z widoku aktywności, nie można będzie ponownie otworzyć karty. Usunięcie jest nieodwracalne.",
"card-delete-suggest-archive": "Możesz zarchiwizować kartę w celu usunięcia jej z tablicy oraz zachowania jej aktywności.",
"card-due": "Due",
"card-due-on": "Due on",
@@ -136,7 +136,9 @@
"color-sky": "błękitny",
"color-yellow": "żółty",
"comment": "Komentarz",
- "comment-placeholder": "Napisz komentarz",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "Can comment on cards only.",
"computer": "Komputer",
"create": "Utwórz",
"createBoardPopup-title": "Utwórz tablicę",
@@ -181,7 +183,7 @@
"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-notAllowSelf": "You can not invite yourself",
"error-user-notCreated": "Ten użytkownik nie został stworzony",
"error-username-taken": "This username is already taken",
"export-board": "Eksportuj tablicę",
@@ -196,6 +198,7 @@
"fullname": "Full Name",
"header-logo-title": "Wróć do swojej strony z tablicami.",
"hide-system-messages": "Hide system messages",
+ "headerBarCreateBoardPopup-title": "Utwórz tablicę",
"home": "Strona główna",
"import": "Importu",
"import-board": "zaimportuj z Trello",
@@ -213,7 +216,7 @@
"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-create": "Utwórz 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",
@@ -227,9 +230,13 @@
"list-select-cards": "Zaznacz wszystkie karty z tej listy",
"listActionPopup-title": "Lista akcji",
"listImportCardPopup-title": "Zaimportuj kartę z Trello",
+ "listMorePopup-title": "Więcej",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
"lists": "Listy",
"log-out": "Wyloguj",
- "log-in": "Log In",
+ "log-in": "Zaloguj",
"loginPopup-title": "Zaloguj",
"memberMenuPopup-title": "Member Settings",
"members": "Członkowie",
@@ -271,7 +278,8 @@
"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-label": "Remove Label",
+ "listDeletePopup-title": "Delete 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.",
@@ -281,7 +289,7 @@
"restore": "Przywróć",
"save": "Zapisz",
"search": "Wyszukaj",
- "select-color": "Wybierz kolor",
+ "select-color": "Select Color",
"shortcut-assign-self": "Przypisz siebie do obecnej karty",
"shortcut-autocomplete-emoji": "Autocomplete emoji",
"shortcut-autocomplete-members": "Autocomplete members",
@@ -292,6 +300,8 @@
"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",
+ "sidebar-open": "Open Sidebar",
+ "sidebar-close": "Close Sidebar",
"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",
@@ -319,5 +329,27 @@
"welcome-board": "Welcome Board",
"welcome-list1": "Basics",
"welcome-list2": "Advanced",
- "what-to-do": "Co chcesz zrobić?"
+ "what-to-do": "Co chcesz zrobić?",
+ "admin-panel": "Admin Panel",
+ "settings": "Settings",
+ "people": "People",
+ "registration": "Registration",
+ "disable-self-registration": "Disable Self-Registration",
+ "invite": "Invite",
+ "invite-people": "Invite People",
+ "to-boards": "To board(s)",
+ "email-addresses": "Email Addresses",
+ "smtp-host-description": "The address of the SMTP server that handles your emails.",
+ "smtp-port-description": "The port your SMTP server uses for outgoing emails.",
+ "smtp-tls-description": "Enable TLS support for SMTP server",
+ "smtp-host": "SMTP Host",
+ "smtp-port": "SMTP Port",
+ "smtp-username": "Nazwa użytkownika",
+ "smtp-password": "Hasło",
+ "smtp-tls": "TLS support",
+ "send-from": "From",
+ "invitation-code": "Invitation Code",
+ "email-invite-register-subject": "__inviter__ wysłał Ci zaproszenie",
+ "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to Wekan for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.",
+ "error-invitation-code-not-exist": "Invitation code doesn't exist"
} \ No newline at end of file
diff --git a/i18n/pt-BR.i18n.json b/i18n/pt-BR.i18n.json
index 6739f9b9..3b3af909 100644
--- a/i18n/pt-BR.i18n.json
+++ b/i18n/pt-BR.i18n.json
@@ -1,23 +1,23 @@
{
"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-activity-notify": "[Wekan] Notificação de Atividade",
+ "act-addAttachment": "anexo __attachment__ de __card__",
+ "act-addComment": "comentado em __card__: __comment__",
+ "act-createBoard": "__board__ criado",
+ "act-createCard": "__card__ adicionado à __list__",
+ "act-createList": "__list__ adicionada à __board__",
+ "act-addBoardMember": "__member__ adicionado à __board__",
+ "act-archivedBoard": "__board__ arquivado",
+ "act-archivedCard": "__card__ arquivado",
+ "act-archivedList": "__list__ arquivada",
+ "act-importBoard": "__board__ importado",
+ "act-importCard": "__card__ importado",
+ "act-importList": "__list__ importada",
+ "act-joinMember": "__member__ adicionado à __card__",
+ "act-moveCard": "__card__ movido de __oldList__ para __list__",
+ "act-removeBoardMember": "__member__ removido de __board__",
+ "act-restoredCard": "__card__ restaurado para __board__",
+ "act-unjoinMember": "__member__ removido de __card__",
"act-withBoardTitle": "[Wekan] __board__",
"act-withCardTitle": "[__board__] __card__",
"actions": "Ações",
@@ -36,16 +36,16 @@
"activity-removed": "removeu %s de %s",
"activity-sent": "enviou %s de %s",
"activity-unjoined": "saiu de %s",
- "activity-checklist-added": "added checklist to %s",
+ "activity-checklist-added": "Adicionado lista de verificação a %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-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add Checklist",
+ "add-checklist-item": "Adicionar um item à lista de verificação",
"add-cover": "Adicionar Capa",
- "add-label": "Adicionar a Etiqueta",
- "add-list": "Adicionar uma lista",
+ "add-label": "Add Label",
+ "add-list": "Add List",
"add-members": "Adicionar Membros",
"added": "Criado",
"addMemberPopup-title": "Membros",
@@ -54,13 +54,13 @@
"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.",
+ "apply": "Aplicar",
+ "app-is-offline": "A aplicação está atualmente desligada, atualizando a página causará perda de dados.",
"archive": "Arquivar",
"archive-all": "Arquivar Tudo",
"archive-board": "Arquivar Quadro",
"archive-card": "Arquivar Cartão",
- "archive-list": "Arquivar esta lista",
+ "archive-list": "Archive List",
"archive-selection": "Arquivar seleção",
"archiveBoardPopup-title": "Arquivar Quadro?",
"archived-items": "Itens Arquivados",
@@ -71,8 +71,8 @@
"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)",
+ "auto-watch": "Veja automaticamente os boards que são criados",
+ "avatar-too-big": "O avatar é muito grande (70KB max)",
"back": "Voltar",
"board-change-color": "Alterar cor",
"board-nb-stars": "%s estrelas",
@@ -82,7 +82,7 @@
"boardChangeColorPopup-title": "Alterar Tela de Fundo",
"boardChangeTitlePopup-title": "Renomear Quadro",
"boardChangeVisibilityPopup-title": "Alterar Visibilidade",
- "boardChangeWatchPopup-title": "Change Watch",
+ "boardChangeWatchPopup-title": "Alterar observação",
"boardMenuPopup-title": "Menu do Quadro",
"boards": "Quadros",
"bucket-example": "\"Bucket List\", por exemplo",
@@ -92,15 +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-due": "Data fim",
+ "card-due-on": "Finaliza em",
"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",
+ "card-start": "Data início",
+ "card-start-on": "Começa em",
"cardAttachmentsPopup-title": "Anexar a partir de",
"cardDeletePopup-title": "Excluir Cartão?",
"cardDetailsActionsPopup-title": "Ações do cartão",
@@ -112,12 +112,12 @@
"change-avatar": "Alterar Avatar",
"change-password": "Alterar Senha",
"change-permissions": "Alterar permissões",
- "change-settings": "Change Settings",
+ "change-settings": "Altera configurações",
"changeAvatarPopup-title": "Alterar Avatar",
"changeLanguagePopup-title": "Alterar Idioma",
"changePasswordPopup-title": "Alterar Senha",
"changePermissionsPopup-title": "Alterar Permissões",
- "changeSettingsPopup-title": "Change Settings",
+ "changeSettingsPopup-title": "Altera configurações",
"checklists": "Checklists",
"click-to-star": "Marcar quadro como favorito.",
"click-to-unstar": "Remover quadro dos favoritos.",
@@ -136,13 +136,15 @@
"color-sky": "céu",
"color-yellow": "amarelo",
"comment": "Comentário",
- "comment-placeholder": "Escrever um comentário",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Somente comentários",
+ "comment-only-desc": "Pode comentar apenas em cartões.",
"computer": "Computador",
"create": "Criar",
"createBoardPopup-title": "Criar Quadro",
"createLabelPopup-title": "Criar Etiqueta",
"current": "atual",
- "date": "Date",
+ "date": "Data",
"decline": "Rejeitar",
"default-avatar": "Avatar padrão",
"delete": "Excluir",
@@ -156,10 +158,10 @@
"edit": "Editar",
"edit-avatar": "Alterar Avatar",
"edit-profile": "Editar Perfil",
- "editCardStartDatePopup-title": "Change start date",
- "editCardDueDatePopup-title": "Change due date",
+ "editCardStartDatePopup-title": "Altera data de início",
+ "editCardDueDatePopup-title": "Altera data fim",
"editLabelPopup-title": "Alterar Etiqueta",
- "editNotificationPopup-title": "Edit Notification",
+ "editNotificationPopup-title": "Editar Notificações",
"editProfilePopup-title": "Editar Perfil",
"email": "E-mail",
"email-enrollAccount-subject": "Uma conta foi criada para você em __siteName__",
@@ -181,39 +183,40 @@
"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-notAllowSelf": "Você não pode convidar a si mesmo",
"error-user-notCreated": "Este usuário não foi criado",
- "error-username-taken": "This username is already taken",
+ "error-username-taken": "Esse username já existe",
"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-no-label": "Sem labels",
+ "filter-no-member": "Sem membros",
"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",
+ "hide-system-messages": "Esconde mensagens de sistema",
+ "headerBarCreateBoardPopup-title": "Criar Quadro",
"home": "Início",
"import": "Importar",
"import-board": "Importar do Trello",
- "import-board-title": "Import board from Trello",
+ "import-board-title": "Importar board do 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-map-members": "Mapear membros",
"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",
+ "importMapMembersAddPopup-title": "Seleciona um membro",
"info": "Informações",
"initials": "Iniciais",
- "invalid-date": "Invalid date",
+ "invalid-date": "Data inválida",
"joined": "juntou-se",
"just-invited": "Você já foi convidado para este quadro",
"keyboard-shortcuts": "Atalhos do teclado",
- "label-create": "Criar uma nova etiqueta",
+ "label-create": "Criar Etiqueta",
"label-default": "%s etiqueta (padrão)",
"label-delete-pop": "Não será possível recuperá-la. A etiqueta será removida de todos os cartões e seu histórico será destruído.",
"labels": "Etiquetas",
@@ -227,22 +230,26 @@
"list-select-cards": "Selecionar todos os cartões nesta lista",
"listActionPopup-title": "Listar Ações",
"listImportCardPopup-title": "Importe um cartão do Trello",
+ "listMorePopup-title": "Mais",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
"lists": "Listas",
"log-out": "Sair",
- "log-in": "Log In",
+ "log-in": "Entrar",
"loginPopup-title": "Entrar",
"memberMenuPopup-title": "Configuração de Membros",
"members": "Membros",
"menu": "Menu",
"move-selection": "Mover seleção",
"moveCardPopup-title": "Mover Cartão",
- "moveCardToBottom-title": "Move to Bottom",
- "moveCardToTop-title": "Move to Top",
+ "moveCardToBottom-title": "Mover para o final",
+ "moveCardToTop-title": "Mover para o topo",
"moveSelectionPopup-title": "Mover seleção",
"multi-selection": "Multi-Seleção",
"multi-selection-on": "Multi-seleção está ativo",
- "muted": "Muted",
- "muted-info": "You will never be notified of any changes in this board",
+ "muted": "Silenciar",
+ "muted-info": "Você nunca receberá qualquer notificação desse board",
"my-boards": "Meus Quadros",
"name": "Nome",
"no-archived-cards": "Nenhum cartão arquivado",
@@ -251,15 +258,15 @@
"normal": "Normal",
"normal-desc": "Pode ver e editar cartões. Não pode alterar configurações.",
"not-accepted-yet": "Convite ainda não aceito",
- "notify-participate": "Receive updates to any cards you participate as creater or member",
- "notify-watch": "Receive updates to any boards, lists, or cards you’re watching",
+ "notify-participate": "Receber atualizações de qualquer card que você criar ou participar como membro",
+ "notify-watch": "Receber atualizações de qualquer board, lista ou cards que você estiver observando",
"optional": "opcional",
"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": "para colar, ou arraste e solte o arquivo da imagem para ca (somente imagens)",
- "participating": "Participating",
+ "participating": "Participando",
"preview": "Previsualizar",
"previewAttachedImagePopup-title": "Previsualizar",
"previewClipboardImagePopup-title": "Previsualizar",
@@ -271,7 +278,8 @@
"quick-access-description": "Clique na estrela para adicionar um atalho nesta barra.",
"remove-cover": "Remover Capa",
"remove-from-board": "Remover do Quadro",
- "remove-label": "Remover Etiqueta",
+ "remove-label": "Remove Label",
+ "listDeletePopup-title": "Delete 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.",
@@ -281,9 +289,9 @@
"restore": "Restaurar",
"save": "Salvar",
"search": "Buscar",
- "select-color": "Selecione uma cor",
+ "select-color": "Select Color",
"shortcut-assign-self": "Atribuir a si o cartão atual",
- "shortcut-autocomplete-emoji": "Autocomplete emoji",
+ "shortcut-autocomplete-emoji": "Autocompletar emoji",
"shortcut-autocomplete-members": "Preenchimento automático de membros",
"shortcut-clear-filters": "Limpar todos filtros",
"shortcut-close-dialog": "Fechar dialogo",
@@ -291,7 +299,9 @@
"shortcut-show-shortcuts": "Mostrar lista de atalhos",
"shortcut-toggle-filterbar": "Alternar barra de filtro",
"shortcut-toggle-sidebar": "Fechar barra lateral.",
- "show-cards-minimum-count": "Show cards count if list contains more than",
+ "show-cards-minimum-count": "Mostrar contador de cards se a lista tiver mais de",
+ "sidebar-open": "Abrir barra lateral",
+ "sidebar-close": "Fechar barra lateral",
"signupPopup-title": "Criar uma Conta",
"star-board-title": "Clique para marcar este quadro como favorito. Ele aparecerá no topo na lista dos seus quadros.",
"starred-boards": "Quadros Favoritos",
@@ -300,24 +310,46 @@
"team": "Equipe",
"this-board": "este quadro",
"this-card": "este cartão",
- "time": "Time",
+ "time": "Tempo",
"title": "Título",
"tracking": "Tracking",
- "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
+ "tracking-info": "Você será notificado se houver qualquer alteração em cards em que você é o criador ou membro",
"unassign-member": "Membro não associado",
"unsaved-description": "Você possui uma descrição não salva",
- "unwatch": "Unwatch",
+ "unwatch": "Deixar de observar",
"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?"
+ "watch": "Observar",
+ "watching": "Observando",
+ "watching-info": "Você será notificado em qualquer alteração desse board",
+ "welcome-board": "Board de Boas Vindas",
+ "welcome-list1": "Básico",
+ "welcome-list2": "Avançado",
+ "what-to-do": "O que você gostaria de fazer?",
+ "admin-panel": "Painel Administrativo",
+ "settings": "Configurações",
+ "people": "Pessoas",
+ "registration": "Registro",
+ "disable-self-registration": "Desabilitar Cadastrar-se",
+ "invite": "Convite",
+ "invite-people": "Convide Pessoas",
+ "to-boards": "Para o/os quadro(s)",
+ "email-addresses": "Endereço de Email",
+ "smtp-host-description": "O endereço do servidor SMTP que envia seus emails.",
+ "smtp-port-description": "A porta que o servidor SMTP usa para enviar os emails.",
+ "smtp-tls-description": "Habilitar suporte TLS para servidor SMTP",
+ "smtp-host": "Servidor SMTP",
+ "smtp-port": "Porta SMTP",
+ "smtp-username": "Nome de usuário",
+ "smtp-password": "Senha",
+ "smtp-tls": "Suporte TLS",
+ "send-from": "De",
+ "invitation-code": "Código do Convite",
+ "email-invite-register-subject": "__inviter__ lhe enviou um convite",
+ "email-invite-register-text": "Caro __user__,\n\n__inviter__ convidou você para colaborar no Wekan.\n\nPor favor, vá no link abaixo:\n__url__\n\nE seu código de convite é: __icode__\n\nObrigado.",
+ "error-invitation-code-not-exist": "O código do convite não existe"
} \ No newline at end of file
diff --git a/i18n/ro.i18n.json b/i18n/ro.i18n.json
index a4de961b..b788b642 100644
--- a/i18n/ro.i18n.json
+++ b/i18n/ro.i18n.json
@@ -38,14 +38,14 @@
"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-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add Checklist",
"add-checklist-item": "Add an item to checklist",
"add-cover": "Add Cover",
- "add-label": "Add the label",
- "add-list": "Add a list",
+ "add-label": "Add Label",
+ "add-list": "Add List",
"add-members": "Add Members",
"added": "Added",
"addMemberPopup-title": "Members",
@@ -60,7 +60,7 @@
"archive-all": "Archive All",
"archive-board": "Archive Board",
"archive-card": "Archive Card",
- "archive-list": "Archive this list",
+ "archive-list": "Archive List",
"archive-selection": "Archive selection",
"archiveBoardPopup-title": "Archive Board?",
"archived-items": "Archived Items",
@@ -71,8 +71,8 @@
"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)",
+ "auto-watch": "Automatically watch boards when they are created",
+ "avatar-too-big": "The avatar is too large (70KB max)",
"back": "Înapoi",
"board-change-color": "Change color",
"board-nb-stars": "%s stars",
@@ -136,7 +136,9 @@
"color-sky": "sky",
"color-yellow": "yellow",
"comment": "Comment",
- "comment-placeholder": "Write a comment",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "Can comment on cards only.",
"computer": "Computer",
"create": "Create",
"createBoardPopup-title": "Create Board",
@@ -181,7 +183,7 @@
"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-notAllowSelf": "You can not invite yourself",
"error-user-notCreated": "This user is not created",
"error-username-taken": "This username is already taken",
"export-board": "Export board",
@@ -196,6 +198,7 @@
"fullname": "Full Name",
"header-logo-title": "Go back to your boards page.",
"hide-system-messages": "Hide system messages",
+ "headerBarCreateBoardPopup-title": "Create Board",
"home": "Home",
"import": "Import",
"import-board": "import from Trello",
@@ -213,7 +216,7 @@
"joined": "joined",
"just-invited": "You are just invited to this board",
"keyboard-shortcuts": "Keyboard shortcuts",
- "label-create": "Create a new label",
+ "label-create": "Create 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",
@@ -227,6 +230,10 @@
"list-select-cards": "Select all cards in this list",
"listActionPopup-title": "List Actions",
"listImportCardPopup-title": "Import a Trello card",
+ "listMorePopup-title": "More",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
"lists": "Liste",
"log-out": "Log Out",
"log-in": "Log In",
@@ -271,7 +278,8 @@
"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-label": "Remove Label",
+ "listDeletePopup-title": "Delete 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.",
@@ -281,7 +289,7 @@
"restore": "Restore",
"save": "Salvează",
"search": "Caută",
- "select-color": "Select a color",
+ "select-color": "Select Color",
"shortcut-assign-self": "Assign yourself to current card",
"shortcut-autocomplete-emoji": "Autocomplete emoji",
"shortcut-autocomplete-members": "Autocomplete members",
@@ -292,6 +300,8 @@
"shortcut-toggle-filterbar": "Toggle Filter Sidebar",
"shortcut-toggle-sidebar": "Toggle Board Sidebar",
"show-cards-minimum-count": "Show cards count if list contains more than",
+ "sidebar-open": "Open Sidebar",
+ "sidebar-close": "Close 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",
@@ -319,5 +329,27 @@
"welcome-board": "Welcome Board",
"welcome-list1": "Basics",
"welcome-list2": "Advanced",
- "what-to-do": "Ce ai vrea sa faci?"
+ "what-to-do": "Ce ai vrea sa faci?",
+ "admin-panel": "Admin Panel",
+ "settings": "Settings",
+ "people": "People",
+ "registration": "Registration",
+ "disable-self-registration": "Disable Self-Registration",
+ "invite": "Invite",
+ "invite-people": "Invite People",
+ "to-boards": "To board(s)",
+ "email-addresses": "Email Addresses",
+ "smtp-host-description": "The address of the SMTP server that handles your emails.",
+ "smtp-port-description": "The port your SMTP server uses for outgoing emails.",
+ "smtp-tls-description": "Enable TLS support for SMTP server",
+ "smtp-host": "SMTP Host",
+ "smtp-port": "SMTP Port",
+ "smtp-username": "Username",
+ "smtp-password": "Parolă",
+ "smtp-tls": "TLS support",
+ "send-from": "From",
+ "invitation-code": "Invitation Code",
+ "email-invite-register-subject": "__inviter__ sent you an invitation",
+ "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to Wekan for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.",
+ "error-invitation-code-not-exist": "Invitation code doesn't exist"
} \ No newline at end of file
diff --git a/i18n/ru.i18n.json b/i18n/ru.i18n.json
index 48401b17..ffb9f6ff 100644
--- a/i18n/ru.i18n.json
+++ b/i18n/ru.i18n.json
@@ -1,23 +1,23 @@
{
"accept": "Принять",
- "act-activity-notify": "[Wekan] Activity Notification",
- "act-addAttachment": "attached __attachment__ to __card__",
- "act-addComment": "commented on __card__: __comment__",
- "act-createBoard": "created __board__",
- "act-createCard": "added __card__ to __list__",
- "act-createList": "added __list__ to __board__",
- "act-addBoardMember": "added __member__ to __board__",
- "act-archivedBoard": "archived __board__",
- "act-archivedCard": "archived __card__",
- "act-archivedList": "archived __list__",
- "act-importBoard": "imported __board__",
- "act-importCard": "imported __card__",
- "act-importList": "imported __list__",
- "act-joinMember": "added __member__ to __card__",
- "act-moveCard": "moved __card__ from __oldList__ to __list__",
- "act-removeBoardMember": "removed __member__ from __board__",
- "act-restoredCard": "restored __card__ to __board__",
- "act-unjoinMember": "removed __member__ from __card__",
+ "act-activity-notify": "[Wekan] Уведомления о активности",
+ "act-addAttachment": "вложенно __attachment__ в __card__",
+ "act-addComment": "прокомментировал __card__: __comment__",
+ "act-createBoard": "создана __board__",
+ "act-createCard": "добавлена __card__ в __list__",
+ "act-createList": "Добавлен __list__ для __board__",
+ "act-addBoardMember": "добавлен __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": "__card__ перемещена из __oldList__ в __list__",
+ "act-removeBoardMember": "__member__ удален из __board__",
+ "act-restoredCard": "__card__ востановлена в __board__",
+ "act-unjoinMember": "__member__ удален из __card__",
"act-withBoardTitle": "[Wekan] __board__",
"act-withCardTitle": "[__board__] __card__",
"actions": "Действия",
@@ -36,16 +36,16 @@
"activity-removed": "удалено %s из %s",
"activity-sent": "отправлено %s в %s",
"activity-unjoined": "вышел из %s",
- "activity-checklist-added": "added checklist to %s",
+ "activity-checklist-added": "добавлен список в %s",
"add": "Создать",
- "add-attachment": "Добавить вложение",
- "add-board": "Создать новую доску",
- "add-card": "Добавить карточку",
- "add-checklist": "Add a checklist",
- "add-checklist-item": "Add an item to checklist",
+ "add-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add Checklist",
+ "add-checklist-item": "Добавить елемент в список",
"add-cover": "Прикрепить",
- "add-label": "Добавить метку",
- "add-list": "Добавить список",
+ "add-label": "Add Label",
+ "add-list": "Add List",
"add-members": "Добавить пользователя",
"added": "Добавлено",
"addMemberPopup-title": "Участники",
@@ -54,13 +54,13 @@
"all-boards": "Все доски",
"and-n-other-card": "И __count__ другая карточка",
"and-n-other-card_plural": "И __count__ другие карточки",
- "apply": "Apply",
- "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.",
+ "apply": "Применить",
+ "app-is-offline": "Приложение офлайн, обновление страницы приведет к потере данных.",
"archive": "Архивировать",
"archive-all": "Архивировать все",
"archive-board": "Архивировать доску",
"archive-card": "Архивировать карточку",
- "archive-list": "Архивировать список",
+ "archive-list": "Archive List",
"archive-selection": "Архивировать выбранное",
"archiveBoardPopup-title": "Заархивировать доску?",
"archived-items": "Объекты в архиве",
@@ -71,8 +71,8 @@
"attachment-delete-pop": "Если удалить вложение, его нельзя будет восстановить.",
"attachmentDeletePopup-title": "Удалить вложение?",
"attachments": "Вложения",
- "auto-watch": "Automatically watch boards when create it",
- "avatar-too-big": "Аватар слишком большой (максимум 70кб)",
+ "auto-watch": "Автоматически следить за созданными досками",
+ "avatar-too-big": "Аватар слишком большой (максимум 70КБ)",
"back": "Назад",
"board-change-color": "Изменить цвет",
"board-nb-stars": "%s избранное",
@@ -82,7 +82,7 @@
"boardChangeColorPopup-title": "Изменить фон доски",
"boardChangeTitlePopup-title": "Переименовать доску",
"boardChangeVisibilityPopup-title": "Изменить настройки видимости",
- "boardChangeWatchPopup-title": "Change Watch",
+ "boardChangeWatchPopup-title": "Изменить Отслеживание",
"boardMenuPopup-title": "Меню доски",
"boards": "Доски",
"bucket-example": "Например “Список дел”",
@@ -92,15 +92,15 @@
"card-delete-notice": "Это действие невозможно будет отменить. Все изменения, которые вы вносили в карточку будут потеряны.",
"card-delete-pop": "Все действия будут удалены из ленты активности и вы не сможете заново открыть карточку. Действие необратимо",
"card-delete-suggest-archive": "Вы можете заархивировать карточку, чтобы удалить ее с доски и сохранить активность .",
- "card-due": "Due",
- "card-due-on": "Due on",
+ "card-due": "До",
+ "card-due-on": "Завершить до",
"card-edit-attachments": "Изменить вложения",
"card-edit-labels": "Изменить метку",
"card-edit-members": "Изменить пользователей",
"card-labels-title": "Редактировать метки.",
"card-members-title": "Добавить или удалить участника.",
- "card-start": "Start",
- "card-start-on": "Starts on",
+ "card-start": "Начать",
+ "card-start-on": "Начнется с",
"cardAttachmentsPopup-title": "Прикрепить из",
"cardDeletePopup-title": "Удалить карточку?",
"cardDetailsActionsPopup-title": "Действия в карточке",
@@ -112,13 +112,13 @@
"change-avatar": "Изменить аватар",
"change-password": "Изменить пароль",
"change-permissions": "Изменить права доступа",
- "change-settings": "Change Settings",
+ "change-settings": "Изменить Настройки",
"changeAvatarPopup-title": "Изменить аватар",
"changeLanguagePopup-title": "Сменить язык",
"changePasswordPopup-title": "Изменить пароль",
"changePermissionsPopup-title": "Изменить настройки доступа",
- "changeSettingsPopup-title": "Change Settings",
- "checklists": "Checklists",
+ "changeSettingsPopup-title": "Изменить Настройки",
+ "checklists": "Список",
"click-to-star": "Добавить в «Избранное»",
"click-to-unstar": "Удалить из «Избранного»",
"clipboard": "Буфер обмена или drag & drop",
@@ -136,13 +136,15 @@
"color-sky": "голубой",
"color-yellow": "желтый",
"comment": "Отправить",
- "comment-placeholder": "Написать комментарий",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Только комментирование",
+ "comment-only-desc": "Может комментировать только карточки.",
"computer": "Загрузить с компьютера",
"create": "Создать",
"createBoardPopup-title": "Создать доску",
"createLabelPopup-title": "Создать метку",
"current": "Текущий",
- "date": "Date",
+ "date": "Дата",
"decline": "Понизить",
"default-avatar": "Стандартный аватар",
"delete": "Удалить",
@@ -156,10 +158,10 @@
"edit": "Редактировать",
"edit-avatar": "Изменить аватар",
"edit-profile": "Изменить профиль",
- "editCardStartDatePopup-title": "Change start date",
- "editCardDueDatePopup-title": "Change due date",
+ "editCardStartDatePopup-title": "Сменить дату начала",
+ "editCardDueDatePopup-title": "Изменить дату До",
"editLabelPopup-title": "Редактирование метки",
- "editNotificationPopup-title": "Edit Notification",
+ "editNotificationPopup-title": "Редактировать уведомления",
"editProfilePopup-title": "Изменить профиль",
"email": "Эл.почта",
"email-enrollAccount-subject": "Аккаунт создан для вас здесь __url__",
@@ -181,35 +183,36 @@
"error-json-schema": "Содержимое вашего JSON не содержит информацию в корректном формате",
"error-list-doesNotExist": "Список не найден",
"error-user-doesNotExist": "Пользователь не найден",
- "error-user-notAllowSelf": "Нельзя выполнить это действие на себе",
+ "error-user-notAllowSelf": "Вы не можете пригласить себя",
"error-user-notCreated": "Пользователь не создан",
- "error-username-taken": "This username is already taken",
- "export-board": "Export board",
+ "error-username-taken": "Этот пользователь уже существует",
+ "export-board": "Экспортировать доску",
"filter": "Фильтр",
"filter-cards": "Фильтр карточек",
"filter-clear": "Очистить фильтр",
- "filter-no-label": "No label",
- "filter-no-member": "No member",
+ "filter-no-label": "Нет метки",
+ "filter-no-member": "Нет пользователей",
"filter-on": "Filter is on",
"filter-on-desc": "Показываются карточки, соответствующие настройкам фильтра. Нажмите для редактирования.",
"filter-to-selection": "Filter to selection",
"fullname": "Полное имя",
"header-logo-title": "Вернуться к доскам.",
- "hide-system-messages": "Hide system messages",
+ "hide-system-messages": "Скрыть системные сообщения",
+ "headerBarCreateBoardPopup-title": "Создать доску",
"home": "Главная",
"import": "Импорт",
"import-board": "Импорт с Trello",
- "import-board-title": "Import board from Trello",
+ "import-board-title": "Импортировать доску из Trello",
"import-board-trello-instruction": "На вашей Trello доске нажмите “Menu” - “More” - “Print and export - “Export JSON” и скопируйте полученный текст",
"import-json-placeholder": "Вставьте JSON сюда",
- "import-map-members": "Map members",
- "import-members-map": "Вы ипортировали доску с пользователями. Пожалуйста, составьте карту пользователей, которых вы хотите импортировать в Wekan пользователей ",
+ "import-map-members": "Карта пользователей",
+ "import-members-map": "Вы ипортировали доску с пользователями. Пожалуйста, составьте карту пользователей, которых вы хотите импортировать в Wekan пользователей",
"import-show-user-mapping": "Пересмотреть карту пользователей",
"import-user-select": "Выберите Wekan-пользователя, которого вы хотите использовать в качестве пользователя",
- "importMapMembersAddPopup-title": "Select Wekan member",
+ "importMapMembersAddPopup-title": "Выбрать Wekan пользователя",
"info": "Информация",
"initials": "Инициалы",
- "invalid-date": "Invalid date",
+ "invalid-date": "Неверная дата",
"joined": "вступил",
"just-invited": "Вы только пригласили на эту доску",
"keyboard-shortcuts": "Сочетания клавиш",
@@ -227,22 +230,26 @@
"list-select-cards": "Выбрать все карточки в этом списке",
"listActionPopup-title": "Список действий",
"listImportCardPopup-title": "Импортировать Trello карточку",
+ "listMorePopup-title": "Поделиться",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
"lists": "Списки",
"log-out": "Выйти",
- "log-in": "Log In",
+ "log-in": "Войти",
"loginPopup-title": "Войти",
"memberMenuPopup-title": "Настройки пользователя",
"members": "Участники",
"menu": "Меню",
- "move-selection": "Move selection",
+ "move-selection": "Переместить выделение",
"moveCardPopup-title": "Переместить карточку",
- "moveCardToBottom-title": "Move to Bottom",
- "moveCardToTop-title": "Move to Top",
- "moveSelectionPopup-title": "Move selection",
+ "moveCardToBottom-title": "Переместить вниз",
+ "moveCardToTop-title": "Переместить вверх",
+ "moveSelectionPopup-title": "Переместить выделение",
"multi-selection": "Выбрать несколько",
"multi-selection-on": "Выбрать несколько из",
- "muted": "Muted",
- "muted-info": "You will never be notified of any changes in this board",
+ "muted": "Заглушен",
+ "muted-info": "Вы НИКОГДА не будете уведомлены об любых изменениях в этой доске.",
"my-boards": "Мои доски",
"name": "Имя",
"no-archived-cards": "Нет карточек в архиве.",
@@ -251,15 +258,15 @@
"normal": "Обычный",
"normal-desc": "Может редактировать карточки. Не может управлять настройками.",
"not-accepted-yet": "Приглашение еще не принято",
- "notify-participate": "Receive updates to any cards you participate as creater or member",
- "notify-watch": "Receive updates to any boards, lists, or cards you’re watching",
+ "notify-participate": "Получать обновления по любым карточкам, которые вы создавали или участником которых являетесь.",
+ "notify-watch": "Получать обновления по любым доскам, спискам и карточкам, на которые вы подписаны как наблюдатель.",
"optional": "не обязательно",
"or": "или",
"page-maybe-private": "Возможно, эта страница скрыта от незарегистрированных пользователей. Попробуйте <a href='%s'>войти на сайт</a>.",
"page-not-found": "Страница не найдена.",
"password": "Пароль",
"paste-or-dragdrop": "вставьте, или перетащите файл с изображением сюда (только графический фай)",
- "participating": "Participating",
+ "participating": "Участнвую",
"preview": "Предпросмотр",
"previewAttachedImagePopup-title": "Предпросмотр",
"previewClipboardImagePopup-title": "Предпросмотр",
@@ -271,7 +278,8 @@
"quick-access-description": "Нажмите на звезду, что добавить ярлык доски на панель.",
"remove-cover": "Открепить",
"remove-from-board": "Удалить с доски",
- "remove-label": "Удалить метку",
+ "remove-label": "Remove Label",
+ "listDeletePopup-title": "Delete List ?",
"remove-member": "Удалить участника",
"remove-member-from-card": "Удалить из карточки",
"remove-member-pop": "Удалить участника __name__ (__username__) из доски __boardTitle__? Участник будет удален из всех карточек. Также он получит уведомление о совершаемом действии.",
@@ -281,7 +289,7 @@
"restore": "Восстановить",
"save": "Сохранить",
"search": "Поиск",
- "select-color": "Выбрать цвет",
+ "select-color": "Select Color",
"shortcut-assign-self": "Связать себя с текущей карточкой",
"shortcut-autocomplete-emoji": "Автозаполнение emoji",
"shortcut-autocomplete-members": "Автозаполнение пользователей",
@@ -291,33 +299,57 @@
"shortcut-show-shortcuts": "Поднять список ярлыков",
"shortcut-toggle-filterbar": "Переместить фильтр на бововую панель",
"shortcut-toggle-sidebar": "Переместить доску на боковую панель",
- "show-cards-minimum-count": "Show cards count if list contains more than",
+ "show-cards-minimum-count": "Показывать количество карточек если их больше",
+ "sidebar-open": "Открыть Панель",
+ "sidebar-close": "Скрыть Панель",
"signupPopup-title": "Создать учетную запись",
"star-board-title": "Добавить в «Избранное». Эта доска будет всегда на виду.",
"starred-boards": "Добавленные в «Избранное»",
- "starred-boards-description": "Starred boards show up at the top of your boards list.",
+ "starred-boards-description": "Избранные доски будут всегда вверху списка.",
"subscribe": "Подписаться",
"team": "Участники",
"this-board": "эту доску",
"this-card": "текущая карточка",
- "time": "Time",
+ "time": "Время",
"title": "Название",
- "tracking": "Tracking",
- "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
+ "tracking": "Отслеживание",
+ "tracking-info": "Вы будете уведомлены об любых изменениях в досках где вы создатель или пользователь.",
"unassign-member": "Отменить назначение пользователя",
"unsaved-description": "У вас есть несохраненное описание.",
- "unwatch": "Unwatch",
+ "unwatch": "Перестать следить",
"upload": "Загрзуить",
"upload-avatar": "Загрузить аватар",
"uploaded-avatar": "Загруженный аватар",
"username": "Имя пользователя",
"view-it": "Просмотреть",
"warn-list-archived": "Внимание: Данная карточка находится в списке архива",
- "watch": "Watch",
- "watching": "Watching",
- "watching-info": "You will be notified of any change in this board",
- "welcome-board": "Welcome Board",
- "welcome-list1": "Basics",
- "welcome-list2": "Advanced",
- "what-to-do": "Что вы хотите сделать?"
+ "watch": "Следить",
+ "watching": "Отслеживается",
+ "watching-info": "Вы будете уведомлены об любых изменениях в этой доске.",
+ "welcome-board": "Приветственная Доска",
+ "welcome-list1": "Основы",
+ "welcome-list2": "Расширенно",
+ "what-to-do": "Что вы хотите сделать?",
+ "admin-panel": "Административная Панель",
+ "settings": "Настройки",
+ "people": "Люди",
+ "registration": "Регистрация",
+ "disable-self-registration": "Отключить \"Само-Регистрацию\"",
+ "invite": "Пригласить",
+ "invite-people": "Пригласить людей",
+ "to-boards": "В Доску(и)",
+ "email-addresses": "Email адрес",
+ "smtp-host-description": "Адрес SMTP сервера, который отправляет ваши электронные письма.",
+ "smtp-port-description": "Порт который SMTP-сервер использует для исходящих сообщений.",
+ "smtp-tls-description": "Включить поддержку TLS для SMTP сервера",
+ "smtp-host": "SMTP Хост",
+ "smtp-port": "SMTP Порт",
+ "smtp-username": "Имя пользователя",
+ "smtp-password": "Пароль",
+ "smtp-tls": "поддержка TLS",
+ "send-from": "От",
+ "invitation-code": "Код приглашения",
+ "email-invite-register-subject": "__inviter__ прислал вам приглашение",
+ "email-invite-register-text": "Уважаемый __user__,\n\n__inviter__ приглашает вас в Wekan для сотрудничества.\n\nПожалуйста, проследуйте по ссылке:\n__url__\n\nВаш код приглашения: __icode__\n\nСпасибо.",
+ "error-invitation-code-not-exist": "Код приглашения не существует"
} \ No newline at end of file
diff --git a/i18n/sr.i18n.json b/i18n/sr.i18n.json
index 2dd7ca97..96f2b2e8 100644
--- a/i18n/sr.i18n.json
+++ b/i18n/sr.i18n.json
@@ -1,6 +1,6 @@
{
"accept": "Prihvati",
- "act-activity-notify": "[Wekan] Activity Notification",
+ "act-activity-notify": "[Wekan] Obaveštenje o aktivnostima",
"act-addAttachment": "attached __attachment__ to __card__",
"act-addComment": "commented on __card__: __comment__",
"act-createBoard": "created __board__",
@@ -36,16 +36,16 @@
"activity-removed": "uklonio %s iz %s",
"activity-sent": "poslao %s %s-u",
"activity-unjoined": "rastavio %s",
- "activity-checklist-added": "added checklist to %s",
+ "activity-checklist-added": "lista je dodata u %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-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add Checklist",
+ "add-checklist-item": "Dodaj novu stavku u listu",
"add-cover": "Dodaj zaglavlje",
- "add-label": "Dodaj natpis",
- "add-list": "Dodaj listu",
+ "add-label": "Add Label",
+ "add-list": "Add List",
"add-members": "Dodaj Članove",
"added": "Dodao",
"addMemberPopup-title": "Članovi",
@@ -54,13 +54,13 @@
"all-boards": "Sve table",
"and-n-other-card": "And __count__ other card",
"and-n-other-card_plural": "And __count__ other cards",
- "apply": "Apply",
- "app-is-offline": "The application is currently offline, refreshing the page will cause data loss.",
+ "apply": "Primeni",
+ "app-is-offline": "Aplikacija je trenutno van mreže, ponovno učitavanje stranice će dovesti do gubitka podataka.",
"archive": "Arhiviraj",
"archive-all": "Arhiviraj sve",
"archive-board": "Arhiviraj tablu",
"archive-card": "Arhiviraj karticu",
- "archive-list": "Arhiviraj ovu listu",
+ "archive-list": "Archive List",
"archive-selection": "Arhiviraj izabrano",
"archiveBoardPopup-title": "Da arhiviram tablu ?",
"archived-items": "Arhivirane stavke",
@@ -71,8 +71,8 @@
"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)",
+ "auto-watch": "Automatically watch boards when they are created",
+ "avatar-too-big": "The avatar is too large (70KB max)",
"back": "Nazad",
"board-change-color": "Promeni boju",
"board-nb-stars": "%s zvezdice",
@@ -92,15 +92,15 @@
"card-delete-notice": "Brisanje je trajno. Izgubićeš sve akcije povezane sa ovom karticom.",
"card-delete-pop": "Sve akcije će biti uklonjene sa liste aktivnosti i kartica neće moći biti ponovo otvorena. Nema vraćanja unazad.",
"card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.",
- "card-due": "Due",
- "card-due-on": "Due on",
+ "card-due": "Krajnji datum",
+ "card-due-on": "Završava se",
"card-edit-attachments": "Uredi priloge",
"card-edit-labels": "Uredi natpise",
"card-edit-members": "Uredi članove",
"card-labels-title": "Promeni natpis na kartici.",
"card-members-title": "Dodaj ili ukloni članove table sa kartice.",
- "card-start": "Start",
- "card-start-on": "Starts on",
+ "card-start": "Početak",
+ "card-start-on": "Počinje",
"cardAttachmentsPopup-title": "Attach From",
"cardDeletePopup-title": "Delete Card?",
"cardDetailsActionsPopup-title": "Card Actions",
@@ -112,13 +112,13 @@
"change-avatar": "Change Avatar",
"change-password": "Change Password",
"change-permissions": "Change permissions",
- "change-settings": "Change Settings",
+ "change-settings": "Izmeni podešavanja",
"changeAvatarPopup-title": "Change Avatar",
"changeLanguagePopup-title": "Change Language",
"changePasswordPopup-title": "Change Password",
"changePermissionsPopup-title": "Change Permissions",
- "changeSettingsPopup-title": "Change Settings",
- "checklists": "Checklists",
+ "changeSettingsPopup-title": "Izmeni podešavanja",
+ "checklists": "Liste",
"click-to-star": "Click to star this board.",
"click-to-unstar": "Click to unstar this board.",
"clipboard": "Clipboard or drag & drop",
@@ -136,13 +136,15 @@
"color-sky": "sky",
"color-yellow": "yellow",
"comment": "Comment",
- "comment-placeholder": "Write a comment",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "Can comment on cards only.",
"computer": "Computer",
"create": "Create",
"createBoardPopup-title": "Create Board",
"createLabelPopup-title": "Create Label",
"current": "current",
- "date": "Date",
+ "date": "Datum",
"decline": "Decline",
"default-avatar": "Default avatar",
"delete": "Delete",
@@ -156,10 +158,10 @@
"edit": "Edit",
"edit-avatar": "Change Avatar",
"edit-profile": "Edit Profile",
- "editCardStartDatePopup-title": "Change start date",
- "editCardDueDatePopup-title": "Change due date",
+ "editCardStartDatePopup-title": "Izmeni početni datum",
+ "editCardDueDatePopup-title": "Izmeni krajnji datum",
"editLabelPopup-title": "Change Label",
- "editNotificationPopup-title": "Edit Notification",
+ "editNotificationPopup-title": "Izmeni notifikaciju",
"editProfilePopup-title": "Edit Profile",
"email": "Email",
"email-enrollAccount-subject": "An account created for you on __siteName__",
@@ -181,39 +183,40 @@
"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-notAllowSelf": "You can not invite yourself",
"error-user-notCreated": "This user is not created",
- "error-username-taken": "This username is already taken",
+ "error-username-taken": "Korisničko ime je već zauzeto",
"export-board": "Export board",
"filter": "Filter",
"filter-cards": "Filter Cards",
"filter-clear": "Clear filter",
- "filter-no-label": "No label",
- "filter-no-member": "No member",
+ "filter-no-label": "Nema oznake",
+ "filter-no-member": "Nema člana",
"filter-on": "Filter is on",
"filter-on-desc": "You are filtering cards on this board. Click here to edit filter.",
"filter-to-selection": "Filter to selection",
"fullname": "Full Name",
"header-logo-title": "Go back to your boards page.",
- "hide-system-messages": "Hide system messages",
+ "hide-system-messages": "Sakrij sistemske poruke",
+ "headerBarCreateBoardPopup-title": "Create Board",
"home": "Home",
"import": "Import",
"import-board": "import from Trello",
- "import-board-title": "Import board from Trello",
+ "import-board-title": "Uvezi tablu iz Trella",
"import-board-trello-instruction": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text",
"import-json-placeholder": "Paste your valid JSON data here",
- "import-map-members": "Map members",
+ "import-map-members": "Mapiraj članove",
"import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users",
"import-show-user-mapping": "Review members mapping",
"import-user-select": "Pick the Wekan user you want to use as this member",
- "importMapMembersAddPopup-title": "Select Wekan member",
+ "importMapMembersAddPopup-title": "Izaberi člana Wekan-a",
"info": "Infos",
"initials": "Initials",
- "invalid-date": "Invalid date",
+ "invalid-date": "Neispravan datum",
"joined": "joined",
"just-invited": "You are just invited to this board",
"keyboard-shortcuts": "Keyboard shortcuts",
- "label-create": "Create a new label",
+ "label-create": "Create 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",
@@ -227,6 +230,10 @@
"list-select-cards": "Select all cards in this list",
"listActionPopup-title": "List Actions",
"listImportCardPopup-title": "Import a Trello card",
+ "listMorePopup-title": "More",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
"lists": "Lists",
"log-out": "Log Out",
"log-in": "Log In",
@@ -236,13 +243,13 @@
"menu": "Menu",
"move-selection": "Move selection",
"moveCardPopup-title": "Move Card",
- "moveCardToBottom-title": "Move to Bottom",
- "moveCardToTop-title": "Move to Top",
+ "moveCardToBottom-title": "Premesti na dno",
+ "moveCardToTop-title": "Premesti na vrh",
"moveSelectionPopup-title": "Move selection",
"multi-selection": "Multi-Selection",
"multi-selection-on": "Multi-Selection is on",
- "muted": "Muted",
- "muted-info": "You will never be notified of any changes in this board",
+ "muted": "Utišano",
+ "muted-info": "Nećete biti obavešteni o promenama u ovoj tabli",
"my-boards": "My Boards",
"name": "Name",
"no-archived-cards": "No archived cards.",
@@ -252,14 +259,14 @@
"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",
+ "notify-watch": "Budite obavešteni o novim događajima u tablama, listama ili karticama koje pratite.",
"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": "Participating",
+ "participating": "Učestvujem",
"preview": "Prikaz",
"previewAttachedImagePopup-title": "Prikaz",
"previewClipboardImagePopup-title": "Prikaz",
@@ -271,7 +278,8 @@
"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-label": "Remove Label",
+ "listDeletePopup-title": "Delete List ?",
"remove-member": "Ukloni člana",
"remove-member-from-card": "Ukloni iz kartice",
"remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.",
@@ -281,7 +289,7 @@
"restore": "Oporavi",
"save": "Snimi",
"search": "Pretraga",
- "select-color": "Izaberi boju",
+ "select-color": "Select Color",
"shortcut-assign-self": "Pridruži sebe trenutnoj kartici",
"shortcut-autocomplete-emoji": "Autocomplete emoji",
"shortcut-autocomplete-members": "Sam popuni članove",
@@ -292,6 +300,8 @@
"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",
+ "sidebar-open": "Open Sidebar",
+ "sidebar-close": "Close Sidebar",
"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",
@@ -300,24 +310,46 @@
"team": "Tim",
"this-board": "ova tabla",
"this-card": "ova kartica",
- "time": "Time",
+ "time": "Vreme",
"title": "Naslov",
- "tracking": "Tracking",
+ "tracking": "Praćenje",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"unassign-member": "Unassign member",
"unsaved-description": "Imaš nesnimljen opis.",
- "unwatch": "Unwatch",
+ "unwatch": "Ne posmatraj",
"upload": "Upload",
"upload-avatar": "Upload an avatar",
"uploaded-avatar": "Uploaded an avatar",
"username": "Korisničko ime",
"view-it": "Pregledaj je",
"warn-list-archived": "upozorenje: ova kartica je u arhiviranoj listi",
- "watch": "Watch",
- "watching": "Watching",
- "watching-info": "You will be notified of any change in this board",
- "welcome-board": "Welcome Board",
- "welcome-list1": "Basics",
- "welcome-list2": "Advanced",
- "what-to-do": "Šta želiš da uradiš ?"
+ "watch": "Posmatraj",
+ "watching": "Posmatranje",
+ "watching-info": "Bićete obavešteni o promenama u ovoj tabli",
+ "welcome-board": "Tabla dobrodošlice",
+ "welcome-list1": "Osnove",
+ "welcome-list2": "Napredno",
+ "what-to-do": "Šta želiš da uradiš ?",
+ "admin-panel": "Admin Panel",
+ "settings": "Settings",
+ "people": "People",
+ "registration": "Registration",
+ "disable-self-registration": "Disable Self-Registration",
+ "invite": "Invite",
+ "invite-people": "Invite People",
+ "to-boards": "To board(s)",
+ "email-addresses": "Email Addresses",
+ "smtp-host-description": "The address of the SMTP server that handles your emails.",
+ "smtp-port-description": "The port your SMTP server uses for outgoing emails.",
+ "smtp-tls-description": "Enable TLS support for SMTP server",
+ "smtp-host": "SMTP Host",
+ "smtp-port": "SMTP Port",
+ "smtp-username": "Korisničko ime",
+ "smtp-password": "Lozinka",
+ "smtp-tls": "TLS support",
+ "send-from": "From",
+ "invitation-code": "Invitation Code",
+ "email-invite-register-subject": "__inviter__ sent you an invitation",
+ "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to Wekan for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.",
+ "error-invitation-code-not-exist": "Invitation code doesn't exist"
} \ No newline at end of file
diff --git a/i18n/sv.i18n.json b/i18n/sv.i18n.json
new file mode 100644
index 00000000..9e4a24f8
--- /dev/null
+++ b/i18n/sv.i18n.json
@@ -0,0 +1,355 @@
+{
+ "accept": "Acceptera",
+ "act-activity-notify": "[Wekan] Aktivitetsavisering",
+ "act-addAttachment": "bifogade __attachment__ to __card__",
+ "act-addComment": "kommenterade __card__: __comment__",
+ "act-createBoard": "skapade __board__",
+ "act-createCard": "lade till __card__ to __list__",
+ "act-createList": "lade till __list__ to __board__",
+ "act-addBoardMember": "lade till __member__ to __board__",
+ "act-archivedBoard": "arkiverade __board__",
+ "act-archivedCard": "arkiverade __card__",
+ "act-archivedList": "arkiverade __list__",
+ "act-importBoard": "importerade __board__",
+ "act-importCard": "importerade __card__",
+ "act-importList": "importerade __list__",
+ "act-joinMember": "lade __member__ till __card__",
+ "act-moveCard": "flyttade __card__ från __oldList__ till __list__",
+ "act-removeBoardMember": "tog bort __member__ från __board__",
+ "act-restoredCard": "återställde __card__ to __board__",
+ "act-unjoinMember": "tog bort __member__ from __card__",
+ "act-withBoardTitle": "[Wekan] __board__",
+ "act-withCardTitle": "[__board__] __card__",
+ "actions": "Åtgärder",
+ "activities": "Aktiviteter",
+ "activity": "Aktivitet",
+ "activity-added": "Lade %s till %s",
+ "activity-archived": "arkiverade %s",
+ "activity-attached": "bifogade %s to %s",
+ "activity-created": "skapade %s",
+ "activity-excluded": "exkluderade %s från %s",
+ "activity-imported": "importerade %s till %s från %s",
+ "activity-imported-board": "importerade %s från %s",
+ "activity-joined": "anslöt sig till %s",
+ "activity-moved": "tog bort %s från %s till %s",
+ "activity-on": "på %s",
+ "activity-removed": "tog bort %s från %s",
+ "activity-sent": "skickade %s till %s",
+ "activity-unjoined": "gick ur %s",
+ "activity-checklist-added": "lade kontrollista till %s",
+ "add": "Lägg till",
+ "add-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add Checklist",
+ "add-checklist-item": "Lägg till ett objekt till kontrollista",
+ "add-cover": "Lägg till omslag",
+ "add-label": "Add Label",
+ "add-list": "Add List",
+ "add-members": "Lägg till medlemmar",
+ "added": "Lade till",
+ "addMemberPopup-title": "Medlemmar",
+ "admin": "Adminstratör",
+ "admin-desc": "Kan visa och redigera kort, ta bort medlemmar och ändra inställningarna för anslagstavlan.",
+ "all-boards": "Alla anslagstavlor",
+ "and-n-other-card": "Och __count__ annat kort",
+ "and-n-other-card_plural": "Och __count__ andra kort",
+ "apply": "Tillämpa",
+ "app-is-offline": "Applikationen är för närvarande offline, uppdatera sidan kommer att orsaka dataförlust .",
+ "archive": "Arkivera",
+ "archive-all": "Arkivera",
+ "archive-board": "Arkiverad anslagstavla",
+ "archive-card": "Arkivera kort",
+ "archive-list": "Archive List",
+ "archive-selection": "Arkivera val",
+ "archiveBoardPopup-title": "Arkivera anslagstavla?",
+ "archived-items": "Arkivera objekt",
+ "archives": "Arkiv",
+ "assign-member": "Tilldela medlem",
+ "attached": "bifogad",
+ "attachment": "Bilaga",
+ "attachment-delete-pop": "Ta bort en bilaga är permanent. Det går inte att ångra.",
+ "attachmentDeletePopup-title": "Ta bort bilaga?",
+ "attachments": "Bilagor",
+ "auto-watch": "Bevaka automatiskt anslagstavlor när de skapas",
+ "avatar-too-big": "Avatar är för stor (70KB max)",
+ "back": "Tillbaka",
+ "board-change-color": "Ändra färg",
+ "board-nb-stars": "%s stjärnor",
+ "board-not-found": "Anslagstavla hittades inte",
+ "board-private-info": "Denna anslagstavla kommer att vara <strong>privat</strong>.",
+ "board-public-info": "Denna anslagstavla kommer att vara <strong>officiell</strong>.",
+ "boardChangeColorPopup-title": "Ändra bakgrund på anslagstavla",
+ "boardChangeTitlePopup-title": "Byt namn på anslagstavla",
+ "boardChangeVisibilityPopup-title": "Ändra synlighet",
+ "boardChangeWatchPopup-title": "Ändra bevaka",
+ "boardMenuPopup-title": "Anslagstavla meny",
+ "boards": "Anslagstavlor",
+ "bucket-example": "Gilla \"att-göra-innan-jag-dör-lista\" till exempel",
+ "cancel": "Avbryt",
+ "card-archived": "Detta kort är arkiverat.",
+ "card-comments-title": "Detta kort har %s kommentar.",
+ "card-delete-notice": "Ta bort är permanent. Du kommer att förlora alla åtgärder i samband med detta kort.",
+ "card-delete-pop": "Alla åtgärder kommer att tas bort från aktivitetsflöde och du kommer inte att kunna öppna kortet igen. Det går inte att ångra.",
+ "card-delete-suggest-archive": "Du kan arkivera ett kort för att ta bort det från anslagstavlan och bevara aktiviteten.",
+ "card-due": "Förfaller",
+ "card-due-on": "Förfaller på",
+ "card-edit-attachments": "Redigera bilaga",
+ "card-edit-labels": "Redigera etiketter",
+ "card-edit-members": "Redigera medlemmar",
+ "card-labels-title": "Ändra etiketter för kortet.",
+ "card-members-title": "Lägg till eller ta bort medlemmar av anslagstavlan från kortet.",
+ "card-start": "Börja",
+ "card-start-on": "Börja med",
+ "cardAttachmentsPopup-title": "Bifoga från",
+ "cardDeletePopup-title": "Ta bort kort?",
+ "cardDetailsActionsPopup-title": "Kortåtgärder",
+ "cardLabelsPopup-title": "Etiketter",
+ "cardMembersPopup-title": "Medlemmar",
+ "cardMorePopup-title": "Mera",
+ "cards": "Kort",
+ "change": "Ändra",
+ "change-avatar": "Ändra avatar",
+ "change-password": "Ändra lösenord",
+ "change-permissions": "Ändra behörigheter",
+ "change-settings": "Ändra inställningar",
+ "changeAvatarPopup-title": "Ändra avatar",
+ "changeLanguagePopup-title": "Ändra språk",
+ "changePasswordPopup-title": "Ändra lösenord",
+ "changePermissionsPopup-title": "Ändra behörigheter",
+ "changeSettingsPopup-title": "Ändra inställningar",
+ "checklists": "Kontrollistor",
+ "click-to-star": "Klicka för att stjärnmärka denna anslagstavla.",
+ "click-to-unstar": "Klicka för att ta bort stjärnmärkningen från denna anslagstavla.",
+ "clipboard": "Urklipp eller dra och släpp",
+ "close": "Stäng",
+ "close-board": "Stäng anslagstavla",
+ "close-board-pop": "Du kommer att kunna återställa anslagstavlan genom att klicka på knappen ”Arkiv” från hem huvudet.",
+ "color-black": "svart",
+ "color-blue": "blå",
+ "color-green": "grön",
+ "color-lime": "lime",
+ "color-orange": "orange",
+ "color-pink": "rosa",
+ "color-purple": "lila",
+ "color-red": "röd",
+ "color-sky": "himmel",
+ "color-yellow": "gul",
+ "comment": "Kommentera",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Kommentera endast",
+ "comment-only-desc": "Kan endast kommentera kort.",
+ "computer": "Dator",
+ "create": "Skapa",
+ "createBoardPopup-title": "Skapa anslagstavla",
+ "createLabelPopup-title": "Skapa etikett",
+ "current": "aktuell",
+ "date": "Datum",
+ "decline": "Nedgång",
+ "default-avatar": "Standard avatar",
+ "delete": "Ta bort",
+ "deleteLabelPopup-title": "Ta bort etikett?",
+ "description": "Beskrivning",
+ "disambiguateMultiLabelPopup-title": "Otvetydig etikettåtgärd",
+ "disambiguateMultiMemberPopup-title": "Otvetydig medlemsåtgärd",
+ "discard": "Kassera",
+ "done": "Färdig",
+ "download": "Hämta",
+ "edit": "Redigera",
+ "edit-avatar": "Ändra avatar",
+ "edit-profile": "Redigera profil",
+ "editCardStartDatePopup-title": "Ändra startdatum",
+ "editCardDueDatePopup-title": "Ändra förfallodatum",
+ "editLabelPopup-title": "Ändra etikett",
+ "editNotificationPopup-title": "Redigera avisering",
+ "editProfilePopup-title": "Redigera profil",
+ "email": "E-post",
+ "email-enrollAccount-subject": "Ett konto skapas för dig på __siteName__",
+ "email-enrollAccount-text": "Hej __user__,\n\nFör att börja använda tjänsten, klicka på länken nedan.\n\n__url__\n\nTack.",
+ "email-fail": "Sändning av e-post misslyckades",
+ "email-invalid": "Ogiltig e-post",
+ "email-invite": "Bjud in via e-post",
+ "email-invite-subject": "__inviter__ skickade dig en inbjudan",
+ "email-invite-text": "Bästa __user__,\n\n__inviter__ inbjuder dig till anslagstavlan \"__board__\" för samarbete.\n\nFölj länken nedan:\n\n__url__\n\nTack.",
+ "email-resetPassword-subject": "Återställa lösenordet för __siteName__",
+ "email-resetPassword-text": "Hej __user__,\n\nFör att återställa ditt lösenord, klicka på länken nedan.\n\n__url__\n\nTack.",
+ "email-sent": "E-post skickad",
+ "email-verifyEmail-subject": "Verifiera din e-post adress på __siteName__",
+ "email-verifyEmail-text": "Hej __user__,\n\nFör att verifiera din konto e-post, klicka på länken nedan.\n\n__url__\n\nTack.",
+ "error-board-doesNotExist": "Denna anslagstavla finns inte",
+ "error-board-notAdmin": "Du måste vara administratör för denna anslagstavla för att göra det",
+ "error-board-notAMember": "Du måste vara medlem i denna anslagstavla för att göra det",
+ "error-json-malformed": "Din text är inte giltigt JSON",
+ "error-json-schema": "Din JSON data inkluderar inte korrekt information i rätt format",
+ "error-list-doesNotExist": "Denna lista finns inte",
+ "error-user-doesNotExist": "Denna användare finns inte",
+ "error-user-notAllowSelf": "Du kan inte bjuda in dig själv",
+ "error-user-notCreated": "Den här användaren har inte skapats",
+ "error-username-taken": "Detta användarnamn är redan taget",
+ "export-board": "Exportera anslagstavla",
+ "filter": "Filtrera",
+ "filter-cards": "Filtrera kort",
+ "filter-clear": "Rensa filter",
+ "filter-no-label": "Ingen etikett",
+ "filter-no-member": "Ingen medlem",
+ "filter-on": "Filter är på",
+ "filter-on-desc": "Du filtrerar kort på denna anslagstavla. Klicka här för att redigera filter.",
+ "filter-to-selection": "Filter till val",
+ "fullname": "Namn",
+ "header-logo-title": "Gå tillbaka till din anslagstavlor-sida.",
+ "hide-system-messages": "Göm systemmeddelanden",
+ "headerBarCreateBoardPopup-title": "Skapa anslagstavla",
+ "home": "Hem",
+ "import": "Importera",
+ "import-board": "Importera från Trello",
+ "import-board-title": "Importera anslagstavla från Trello",
+ "import-board-trello-instruction": "I din Trello-anslagstavla, gå till 'Meny', sedan 'Mera', 'Skriv ut och exportera', 'Exportera JSON' och kopiera den resulterande text.",
+ "import-json-placeholder": "Klistra in giltigt JSON data här",
+ "import-map-members": "Kartlägg medlemmar",
+ "import-members-map": "Din importerade anslagstavla har några medlemmar. Kartlägg medlemmarna som du vill importera till Wekan-användare",
+ "import-show-user-mapping": "Granska medlemskartläggning",
+ "import-user-select": "Välj Wekan-användare du vill använda som denna medlem",
+ "importMapMembersAddPopup-title": "Välj Wekan member",
+ "info": "Infos",
+ "initials": "Initialer ",
+ "invalid-date": "Ogiltigt datum",
+ "joined": "gick med",
+ "just-invited": "Du blev nyss inbjuden till denna anslagstavla",
+ "keyboard-shortcuts": "Tangentbordsgenvägar",
+ "label-create": "Skapa etikett",
+ "label-default": "%s etikett (standard)",
+ "label-delete-pop": "Det finns ingen ångra. Detta tar bort denna etikett från alla kort och förstöra dess historik.",
+ "labels": "Etiketter",
+ "language": "Språk",
+ "last-admin-desc": "Du kan inte ändra roller för det måste finnas minst en administratör.",
+ "leave-board": "Lämna anslagstavla",
+ "link-card": "Länka till detta kort",
+ "list-archive-cards": "Arkivera alla kort i denna lista",
+ "list-archive-cards-pop": "Detta tar bort alla kort i denna lista från anslagstavlan. Om du se arkiverade kort och få dem tillbaka till anslagstavlan, klicka på ”Meny” > ”Arkiverade objekt”.",
+ "list-move-cards": "Flytta alla kort i denna lista",
+ "list-select-cards": "Välj alla kort i denna lista",
+ "listActionPopup-title": "Liståtgärder",
+ "listImportCardPopup-title": "Importera ett Trello kort",
+ "listMorePopup-title": "Mera",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
+ "lists": "Listor",
+ "log-out": "Logga ut",
+ "log-in": "Logga in",
+ "loginPopup-title": "Logga in",
+ "memberMenuPopup-title": "Användarinställningar",
+ "members": "Medlemmar",
+ "menu": "Meny",
+ "move-selection": "Flytta vald",
+ "moveCardPopup-title": "Flytta kort",
+ "moveCardToBottom-title": "Flytta längst ner",
+ "moveCardToTop-title": "Flytta högst upp",
+ "moveSelectionPopup-title": "Flytta vald",
+ "multi-selection": "Flerval",
+ "multi-selection-on": "Flerval är på",
+ "muted": "Tystad",
+ "muted-info": "Du kommer aldrig att meddelas om eventuella ändringar i denna anslagstavla",
+ "my-boards": "Mina anslagstavlor",
+ "name": "Namn",
+ "no-archived-cards": "Inga arkiverade kort.",
+ "no-archived-lists": "Inga arkiverade listor.",
+ "no-results": "Inga reslutat",
+ "normal": "Normal",
+ "normal-desc": "Kan se och redigera kort. Kan inte ändra inställningar.",
+ "not-accepted-yet": "Inbjudan inte ännu accepterad",
+ "notify-participate": "Få uppdateringar till alla kort du deltar i som skapare eller medlem",
+ "notify-watch": "Få uppdateringar till alla anslagstavlor, listor, eller kort du bevakar",
+ "optional": "valfri",
+ "or": "eller",
+ "page-maybe-private": "Denna sida kan vara privat. Du kanske kan se den genom att <a href='%s'>logga in</a>.",
+ "page-not-found": "Sidan hittades inte.",
+ "password": "Lösenord",
+ "paste-or-dragdrop": "klistra in eller dra och släpp bildfil till den (endast bilder)",
+ "participating": "Deltagande",
+ "preview": "Förhandsvisning",
+ "previewAttachedImagePopup-title": "Förhandsvisning",
+ "previewClipboardImagePopup-title": "Förhandsvisning",
+ "private": "Privat",
+ "private-desc": "Denna anslagstavla är privat. Endast personer tillagda till anslagstavlan kan se och redigera den.",
+ "profile": "Profil",
+ "public": "Officiell",
+ "public-desc": "Denna anslagstavla är offentlig. Den är synligt för alla med länken och kommer att dyka upp i sökmotorer som Google. Endast personer tillagda till anslagstavlan kan redigera.",
+ "quick-access-description": "Stjärnmärk en anslagstavla för att lägga till en genväg i detta fält.",
+ "remove-cover": "Ta bort omslag",
+ "remove-from-board": "Ta bort från anslagstavla",
+ "remove-label": "Remove Label",
+ "listDeletePopup-title": "Delete List ?",
+ "remove-member": "Ta bort medlem",
+ "remove-member-from-card": "Ta bort från kort",
+ "remove-member-pop": "Ta bort __name__ (__username__) från __boardTitle__? Medlemmen kommer att bli borttagen från alla kort i denna anslagstavla. De kommer att få en avisering.",
+ "removeMemberPopup-title": "Ta bort medlem?",
+ "rename": "Byt namn",
+ "rename-board": "Byt namn på anslagstavla",
+ "restore": "Återställ",
+ "save": "Spara",
+ "search": "Sök",
+ "select-color": "Select Color",
+ "shortcut-assign-self": "Tilldela dig nuvarande kort",
+ "shortcut-autocomplete-emoji": "Komplettera automatiskt emoji",
+ "shortcut-autocomplete-members": "Komplettera automatiskt medlemmar",
+ "shortcut-clear-filters": "Rensa alla filter",
+ "shortcut-close-dialog": "Stäng dialog",
+ "shortcut-filter-my-cards": "Filtrera mina kort",
+ "shortcut-show-shortcuts": "Ta fram denna genvägslista",
+ "shortcut-toggle-filterbar": "Växla filtrets sidofält",
+ "shortcut-toggle-sidebar": "Växla anslagstavlans sidofält",
+ "show-cards-minimum-count": "Visa kortantal om listan innehåller mer än",
+ "sidebar-open": "Stäng sidofält",
+ "sidebar-close": "Stäng sidofält",
+ "signupPopup-title": "Skapa ett konto",
+ "star-board-title": "Klicka för att stjärnmärka denna anslagstavla. Den kommer att visas högst upp på din lista över anslagstavlor.",
+ "starred-boards": "Stjärnmärkta anslagstavlor",
+ "starred-boards-description": "Stjärnmärkta anslagstavlor visas högst upp på din lista över anslagstavlor.",
+ "subscribe": "Prenumenera",
+ "team": "Grupp",
+ "this-board": "denna anslagstavla",
+ "this-card": "detta kort",
+ "time": "Tid",
+ "title": "Titel",
+ "tracking": "Spårning",
+ "tracking-info": "Du kommer att meddelas om eventuella ändringar av dessa kort du deltar i som skapare eller medlem.",
+ "unassign-member": "Ta bort tilldelad medlem",
+ "unsaved-description": "Du har en osparad beskrivning.",
+ "unwatch": "Avbevaka",
+ "upload": "Ladda upp",
+ "upload-avatar": "Ladda upp en avatar",
+ "uploaded-avatar": "Laddade upp en avatar",
+ "username": "Änvandarnamn",
+ "view-it": "Visa det",
+ "warn-list-archived": "varning: detta kort är en arkiverad lista",
+ "watch": "Bevaka",
+ "watching": "Bevakar",
+ "watching-info": "Du kommer att meddelas om alla ändringar på denna anslagstavla",
+ "welcome-board": "Välkomstanslagstavla",
+ "welcome-list1": "Grunderna",
+ "welcome-list2": "Avancerad",
+ "what-to-do": "Vad vill du göra?",
+ "admin-panel": "Administratörspanel ",
+ "settings": "Inställningar",
+ "people": "Personer",
+ "registration": "Registrering",
+ "disable-self-registration": "Avaktiverar självregistrering",
+ "invite": "Bjud in",
+ "invite-people": "Bjud in personer",
+ "to-boards": "Till anslagstavl(a/or)",
+ "email-addresses": "E-post adresser",
+ "smtp-host-description": "Adressen till SMTP-servern som hanterar din e-post.",
+ "smtp-port-description": "Porten SMTP-servern använder för utgående e-post.",
+ "smtp-tls-description": "Aktivera TLS-stöd för SMTP-server",
+ "smtp-host": "SMTP-värd",
+ "smtp-port": "SMTP-port",
+ "smtp-username": "Användarnamn",
+ "smtp-password": "Lösenord",
+ "smtp-tls": "TLS-stöd",
+ "send-from": "Från",
+ "invitation-code": "Inbjudningskod",
+ "email-invite-register-subject": "__inviter__ skickade dig en inbjudan",
+ "email-invite-register-text": "Bästa __user__,\n\n__inviter__ inbjuder dig till Wekan för samarbeten.\n\nVänligen följ länken nedan:\n__url__\n\nOch din inbjudningskod är: __icode__\n\nTack.",
+ "error-invitation-code-not-exist": "Inbjudningskod finns inte"
+} \ No newline at end of file
diff --git a/i18n/ta.i18n.json b/i18n/ta.i18n.json
new file mode 100644
index 00000000..818e92a7
--- /dev/null
+++ b/i18n/ta.i18n.json
@@ -0,0 +1,355 @@
+{
+ "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 Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add Checklist",
+ "add-checklist-item": "Add an item to checklist",
+ "add-cover": "Add Cover",
+ "add-label": "Add Label",
+ "add-list": "Add 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 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 they are created",
+ "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": "orange",
+ "color-pink": "pink",
+ "color-purple": "purple",
+ "color-red": "red",
+ "color-sky": "sky",
+ "color-yellow": "yellow",
+ "comment": "Comment",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "Can comment on cards only.",
+ "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": "You can not invite yourself",
+ "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",
+ "headerBarCreateBoardPopup-title": "Create Board",
+ "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 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",
+ "listMorePopup-title": "More",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
+ "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": "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": "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 Label",
+ "listDeletePopup-title": "Delete 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 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",
+ "sidebar-open": "Open Sidebar",
+ "sidebar-close": "Close Sidebar",
+ "signupPopup-title": "Create an Account",
+ "star-board-title": "Click to star this board. It will show up at top of your boards list.",
+ "starred-boards": "Starred Boards",
+ "starred-boards-description": "Starred boards show up at the top of your boards list.",
+ "subscribe": "Subscribe",
+ "team": "Team",
+ "this-board": "this board",
+ "this-card": "this card",
+ "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?",
+ "admin-panel": "Admin Panel",
+ "settings": "Settings",
+ "people": "People",
+ "registration": "Registration",
+ "disable-self-registration": "Disable Self-Registration",
+ "invite": "Invite",
+ "invite-people": "Invite People",
+ "to-boards": "To board(s)",
+ "email-addresses": "Email Addresses",
+ "smtp-host-description": "The address of the SMTP server that handles your emails.",
+ "smtp-port-description": "The port your SMTP server uses for outgoing emails.",
+ "smtp-tls-description": "Enable TLS support for SMTP server",
+ "smtp-host": "SMTP Host",
+ "smtp-port": "SMTP Port",
+ "smtp-username": "Username",
+ "smtp-password": "Password",
+ "smtp-tls": "TLS support",
+ "send-from": "From",
+ "invitation-code": "Invitation Code",
+ "email-invite-register-subject": "__inviter__ sent you an invitation",
+ "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to Wekan for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.",
+ "error-invitation-code-not-exist": "Invitation code doesn't exist"
+} \ No newline at end of file
diff --git a/i18n/th.i18n.json b/i18n/th.i18n.json
new file mode 100644
index 00000000..8fbdf5ac
--- /dev/null
+++ b/i18n/th.i18n.json
@@ -0,0 +1,355 @@
+{
+ "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": "ย้าย __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 Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add Checklist",
+ "add-checklist-item": "เพิ่มรายการตรวจสอบ",
+ "add-cover": "เพิ่มหน้าปก",
+ "add-label": "Add Label",
+ "add-list": "Add List",
+ "add-members": "เพิ่มสมาชิก",
+ "added": "เพิ่ม",
+ "addMemberPopup-title": "สมาชิก",
+ "admin": "ผู้ดูแลระบบ",
+ "admin-desc": "สามารถดูและแก้ไขการ์ด ลบสมาชิก และเปลี่ยนการตั้งค่าบอร์ดได้",
+ "all-boards": "บอร์ดทั้งหมด",
+ "and-n-other-card": "และการ์ดอื่น __count__",
+ "and-n-other-card_plural": "และการ์ดอื่น ๆ __count__",
+ "apply": "นำมาใช้",
+ "app-is-offline": "ตอนนี้เว็บกำลังออฟไลน์, การรีเฟรชหน้าจะทำให้เกิดการสูญเสียข้อมูล",
+ "archive": "เอกสารที่เก็บไว้",
+ "archive-all": "เอกสารที่เก็บไว้ทั้งหมด",
+ "archive-board": "เอกสารบอร์ดที่เก็บไว้",
+ "archive-card": "เอกสารการ์ดที่เก็บไว้",
+ "archive-list": "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 they are created",
+ "avatar-too-big": "The avatar is too large (70KB max)",
+ "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": "การดำเนินการทั้งหมดจะถูกลบจาก feed กิจกรรมและคุณไม่สามารถเปิดได้อีกครั้งหรือยกเลิกการทำ",
+ "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 หรือลากและวาง",
+ "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": "Write Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "Can comment on cards only.",
+ "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": "You can not invite yourself",
+ "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": "ซ่อนข้อความของระบบ",
+ "headerBarCreateBoardPopup-title": "สร้างบอร์ด",
+ "home": "หน้าหลัก",
+ "import": "นำเข้า",
+ "import-board": "นำเข้าจาก Trello",
+ "import-board-title": "นำเข้าบอร์ดจาก Trello",
+ "import-board-trello-instruction": "ใน Trello ของคุณให้ไปที่ 'Menu' และไปที่ More -> Print and Export -> Export JSON และคัดลอกข้อความจากนั้น",
+ "import-json-placeholder": "วางข้อมูล JSON ที่ถูกต้องของคุณที่นี่",
+ "import-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 การทำแผนที่สมาชิก",
+ "import-user-select": "เลือกผู้ใช้ Wekan ที่คุณต้องการใช้เป็นเหมือนสมาชิกนี้",
+ "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": "นำเข้าการ์ด Trello",
+ "listMorePopup-title": "เพิ่มเติม",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
+ "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'>logging in</a>.",
+ "page-not-found": "ไม่พบหน้า",
+ "password": "รหัสผ่าน",
+ "paste-or-dragdrop": "วาง หรือลากและวาง ไฟล์ภาพ(ภาพเท่านั้น)",
+ "participating": "Participating",
+ "preview": "ภาพตัวอย่าง",
+ "previewAttachedImagePopup-title": "ตัวอย่าง",
+ "previewClipboardImagePopup-title": "ตัวอย่าง",
+ "private": "ส่วนตัว",
+ "private-desc": "บอร์ดนี้เป็นส่วนตัว. คนที่ถูกเพิ่มเข้าในบอร์ดเท่านั้นที่สามารถดูและแก้ไขได้",
+ "profile": "โปรไฟล์",
+ "public": "สาธารณะ",
+ "public-desc": "บอร์ดนี้เป็นสาธารณะ. ทุกคนสามารถเข้าถึงได้ผ่าน url นี้ แต่สามารถแก้ไขได้เฉพาะผู้ที่ถูกเพิ่มเข้าไปในการ์ดเท่านั้น",
+ "quick-access-description": "เพิ่มไว้ในนี้เพื่อเป็นทางลัด",
+ "remove-cover": "ลบหน้าปก",
+ "remove-from-board": "ลบจากบอร์ด",
+ "remove-label": "Remove Label",
+ "listDeletePopup-title": "Delete List ?",
+ "remove-member": "ลบสมาชิก",
+ "remove-member-from-card": "ลบจากการ์ด",
+ "remove-member-pop": "ลบ __name__ (__username__) จาก __boardTitle__ หรือไม่ สมาชิกจะถูกลบออกจากการ์ดทั้งหมดบนบอร์ดนี้ และพวกเขาจะได้รับการแจ้งเตือน",
+ "removeMemberPopup-title": "ลบสมาชิกหรือไม่",
+ "rename": "ตั้งชื่อใหม่",
+ "rename-board": "ตั้งชื่อบอร์ดใหม่",
+ "restore": "กู้คืน",
+ "save": "บันทึก",
+ "search": "ค้นหา",
+ "select-color": "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": "แสดงจำนวนของการ์ดถ้ารายการมีมากกว่า(เลื่อนกำหนดตัวเลข)",
+ "sidebar-open": "เปิดแถบเลื่อน",
+ "sidebar-close": "ปิดแถบเลื่อน",
+ "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": "ต้องการทำอะไร",
+ "admin-panel": "Admin Panel",
+ "settings": "Settings",
+ "people": "People",
+ "registration": "Registration",
+ "disable-self-registration": "Disable Self-Registration",
+ "invite": "Invite",
+ "invite-people": "Invite People",
+ "to-boards": "To board(s)",
+ "email-addresses": "Email Addresses",
+ "smtp-host-description": "The address of the SMTP server that handles your emails.",
+ "smtp-port-description": "The port your SMTP server uses for outgoing emails.",
+ "smtp-tls-description": "Enable TLS support for SMTP server",
+ "smtp-host": "SMTP Host",
+ "smtp-port": "SMTP Port",
+ "smtp-username": "ชื่อผู้ใช้งาน",
+ "smtp-password": "รหัสผ่าน",
+ "smtp-tls": "TLS support",
+ "send-from": "From",
+ "invitation-code": "Invitation Code",
+ "email-invite-register-subject": "__inviter__ ส่งคำเชิญให้คุณ",
+ "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to Wekan for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.",
+ "error-invitation-code-not-exist": "Invitation code doesn't exist"
+} \ No newline at end of file
diff --git a/i18n/tr.i18n.json b/i18n/tr.i18n.json
index 3dc0781c..516e6256 100644
--- a/i18n/tr.i18n.json
+++ b/i18n/tr.i18n.json
@@ -1,323 +1,355 @@
{
- "accept": "Accept",
- "act-activity-notify": "[Wekan] Activity Notification",
- "act-addAttachment": "attached __attachment__ to __card__",
- "act-addComment": "commented on __card__: __comment__",
- "act-createBoard": "created __board__",
- "act-createCard": "added __card__ to __list__",
- "act-createList": "added __list__ to __board__",
- "act-addBoardMember": "added __member__ to __board__",
- "act-archivedBoard": "archived __board__",
- "act-archivedCard": "archived __card__",
- "act-archivedList": "archived __list__",
- "act-importBoard": "imported __board__",
- "act-importCard": "imported __card__",
- "act-importList": "imported __list__",
- "act-joinMember": "added __member__ to __card__",
- "act-moveCard": "moved __card__ from __oldList__ to __list__",
- "act-removeBoardMember": "removed __member__ from __board__",
- "act-restoredCard": "restored __card__ to __board__",
- "act-unjoinMember": "removed __member__ from __card__",
+ "accept": "Kabul Et",
+ "act-activity-notify": "[Wekan] Aktivite Bildirimi",
+ "act-addAttachment": "__card__ kartına __attachment__ dosyasını ekledi",
+ "act-addComment": "__card__ kartına bir yorum bırakıt: __comment__",
+ "act-createBoard": "__board__ panosunu oluşturdu",
+ "act-createCard": "__card__ kartını ___list__ listesine ekledi.",
+ "act-createList": "__list__ listesini __board__ panosuna ekledi",
+ "act-addBoardMember": "__member__ kullanıcısını __board__ panosuna ekledi",
+ "act-archivedBoard": "__board__ panosunu arşivledi",
+ "act-archivedCard": "__card__ kartını arşivledi",
+ "act-archivedList": "__list__ listesini arşivledi",
+ "act-importBoard": "__board__ panosunu aktardı",
+ "act-importCard": "__card__ kartını aktardı",
+ "act-importList": "__list__ listesini aktardı",
+ "act-joinMember": "__member__ kullanıcısnı __card__ kartına ekledi",
+ "act-moveCard": "__card__ kartını __oldList__ listesinden __list__ listesine taşıdı",
+ "act-removeBoardMember": "__board__ panosundan __member__ kullanıcısını çıkarttı",
+ "act-restoredCard": "__card__ kartını __board__ panosuna geri döndürdü",
+ "act-unjoinMember": "__member__ kullanıcısnı __card__ kartından çıkarttı",
"act-withBoardTitle": "[Wekan] __board__",
"act-withCardTitle": "[__board__] __card__",
"actions": "İşlemler",
"activities": "Aktiviteler",
"activity": "Etkinlik",
- "activity-added": "added %s to %s",
+ "activity-added": "%s içine %s ekledi",
"activity-archived": "%s arşivledi",
- "activity-attached": "attached %s to %s",
+ "activity-attached": "%s içine %s ekledi",
"activity-created": "%s oluşturdu",
- "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",
+ "activity-excluded": "%s içinden %s çıkarttı",
+ "activity-imported": "%s i %s içine taşıdı, kaynağı %s",
+ "activity-imported-board": "%s i %s içinden aktardı",
+ "activity-joined": "şuna katıldı: %s",
+ "activity-moved": "%s i %s içinden %s içine taşıdı",
+ "activity-on": "%s",
+ "activity-removed": "%s i %s ten kaldırdı",
+ "activity-sent": "%s i %s e gönderdi",
+ "activity-unjoined": "%s içinden ayrıldı",
+ "activity-checklist-added": "%s içine liste ekledi",
"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",
- "add-members": "Add Members",
+ "add-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add Checklist",
+ "add-checklist-item": "Listeye yeni bir eleman ekle",
+ "add-cover": "Kapak resmi ekle",
+ "add-label": "Add Label",
+ "add-list": "Add List",
+ "add-members": "Üye ekle",
"added": "Eklendi",
"addMemberPopup-title": "Üyeler",
"admin": "Yönetici",
"admin-desc": "Kartları görüntüler ve düzenler, üyeleri çıkarır ve pano ayarlarını değiştirir.",
- "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",
+ "all-boards": "Tüm panolar",
+ "and-n-other-card": "Ve __count__ diğer kart",
+ "and-n-other-card_plural": "Ve __count__ diğer kart",
+ "apply": "Uygula",
+ "app-is-offline": "Uygulama şu an çevrim dışı, saya yenilemek kaydedilmemiş veri kaybına yol açacaktır.",
+ "archive": "Arşivle",
"archive-all": "Tümünü Arşivle",
- "archive-board": "Archive Board",
- "archive-card": "Archive Card",
- "archive-list": "Bu listeyi arşivle",
- "archive-selection": "Archive selection",
- "archiveBoardPopup-title": "Archive Board?",
+ "archive-board": "Panoyu Arşivle",
+ "archive-card": "Kartı arşivle",
+ "archive-list": "Archive List",
+ "archive-selection": "Seçimi arşivle",
+ "archiveBoardPopup-title": "Pano arşivlensin mi?",
"archived-items": "Arşivlenmiş Öğeler",
"archives": "Arşiv",
- "assign-member": "Assign member",
+ "assign-member": "Üye ata",
"attached": "dosya eklendi",
"attachment": "Ek Dosya",
"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)",
+ "auto-watch": "Automatically watch boards when they are created",
+ "avatar-too-big": "The avatar is too large (70KB max)",
"back": "Geri",
- "board-change-color": "Change color",
- "board-nb-stars": "%s stars",
+ "board-change-color": "Renk değiştir",
+ "board-nb-stars": "%s yıldız",
"board-not-found": "Pano bulunamadı",
- "board-private-info": "This board will be <strong>private</strong>.",
+ "board-private-info": "Bu pano <strong>gizli</strong> olacak.",
"board-public-info": "Bu pano <strong>genel</strong>e açılacaktır.",
- "boardChangeColorPopup-title": "Change Board Background",
+ "boardChangeColorPopup-title": "Pano arkaplan rengini değiştir",
"boardChangeTitlePopup-title": "Pano Adı Değiştirme",
"boardChangeVisibilityPopup-title": "Görünebilirliği Değiştir",
- "boardChangeWatchPopup-title": "Change Watch",
- "boardMenuPopup-title": "Board Menu",
+ "boardChangeWatchPopup-title": "İzleme Durumunu Değiştir",
+ "boardMenuPopup-title": "Pano menüsü",
"boards": "Panolar",
- "bucket-example": "Like “Bucket List” for example",
+ "bucket-example": "Örn: \"Marketten Alacaklarım\"",
"cancel": "İptal",
"card-archived": "Bu kart arşivlendi.",
- "card-comments-title": "This card has %s comment.",
+ "card-comments-title": "Bu kartta %s yorum var.",
"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",
+ "card-delete-pop": "Son hareketler alanındaki tüm veriler silinecek, ayrıca bu kartı yeniden açamayacaksın. Bu işlemin geri dönüşü yok.",
+ "card-delete-suggest-archive": "Kartı panodan kaldırıp, buna rağmen aktivitelerini saklamak istiyorsan kartı arşivleyebilirsin.",
+ "card-due": "şu zamanda:",
+ "card-due-on": "şu zamanda:",
+ "card-edit-attachments": "Ek dosyasını düzenle",
+ "card-edit-labels": "Etiketleri düzenle",
+ "card-edit-members": "Üyeleri düzenle",
+ "card-labels-title": "Bu kart için etiketleri düzenle",
+ "card-members-title": "Karta pano içindeki üyeleri ekler veya çıkartır.",
+ "card-start": "Başlama",
+ "card-start-on": "Başlama:",
+ "cardAttachmentsPopup-title": "Eklenme",
"cardDeletePopup-title": "Kart Silinsin mi?",
- "cardDetailsActionsPopup-title": "Card Actions",
+ "cardDetailsActionsPopup-title": "Kart işlemleri",
"cardLabelsPopup-title": "Etiketler",
"cardMembersPopup-title": "Üyeler",
- "cardMorePopup-title": "More",
- "cards": "Cards",
- "change": "Change",
+ "cardMorePopup-title": "Daha",
+ "cards": "Kartlar",
+ "change": "Değiştir",
"change-avatar": "Avatar Değiştir",
"change-password": "Parola Değiştir",
- "change-permissions": "Change permissions",
- "change-settings": "Change Settings",
+ "change-permissions": "İzinleri değiştir",
+ "change-settings": "Ayarları değiştir",
"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",
+ "changeSettingsPopup-title": "Ayarları değiştir",
+ "checklists": "Doğrulama Listeleri",
"click-to-star": "Bu panoyu yıldızlamak için tıkla.",
"click-to-unstar": "Bu panunun yıldızını kaldırmak için tıkla.",
- "clipboard": "Clipboard or drag & drop",
+ "clipboard": "Panodan (cliboard) veya sürükle ve bırak ile",
"close": "Kapat",
- "close-board": "Close Board",
+ "close-board": "Panoyu kapat",
"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": "siyah",
+ "color-blue": "mavi",
+ "color-green": "yeşil",
+ "color-lime": "çim",
+ "color-orange": "turuncu",
+ "color-pink": "pembe",
+ "color-purple": "mor",
+ "color-red": "kırmızı",
+ "color-sky": "açık mavi",
+ "color-yellow": "sarı",
"comment": "Yorum Gönder",
- "comment-placeholder": "Write a comment",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "Sadece kartlara yorum yazabilir.",
"computer": "Bilgisayar",
"create": "Oluştur",
"createBoardPopup-title": "Pano Oluşturma",
"createLabelPopup-title": "Etiket Oluşturma",
- "current": "current",
- "date": "Date",
- "decline": "Decline",
- "default-avatar": "Default avatar",
+ "current": "mevcut",
+ "date": "Tarih",
+ "decline": "Reddet",
+ "default-avatar": "Varsayılan avatar",
"delete": "Sil",
"deleteLabelPopup-title": "Etiket Silinsin mi?",
"description": "Açıklama",
- "disambiguateMultiLabelPopup-title": "Disambiguate Label Action",
- "disambiguateMultiMemberPopup-title": "Disambiguate Member Action",
- "discard": "Discard",
- "done": "Done",
+ "disambiguateMultiLabelPopup-title": "Etiket işlemini izah et",
+ "disambiguateMultiMemberPopup-title": "Üye işlemini izah et",
+ "discard": "ıskartaya çıkart",
+ "done": "Tamam",
"download": "İndir",
"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",
+ "editCardStartDatePopup-title": "Başlangıç tarihini değiştir",
+ "editCardDueDatePopup-title": "Bitiş tarihini değiştir",
+ "editLabelPopup-title": "Etiket Değiştir",
+ "editNotificationPopup-title": "Bildirimi değiştir",
"editProfilePopup-title": "Profili Düzenle",
"email": "E-posta",
- "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": "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",
+ "email-enrollAccount-subject": "__siteName__ üzerinde hesabın oluşturuldu",
+ "email-enrollAccount-text": "Merhaba __user__,\n\nBu servisi kullanmaya başlamak için aşağıdaki linke tıklamalısın\n\n__url__\n\nTeşekkürler.",
+ "email-fail": "E-posta gönderimi başarısız",
+ "email-invalid": "Geçersiz e-posta",
+ "email-invite": "E-posta ile davet et",
+ "email-invite-subject": "__inviter__ size bir davetiye gönderdi",
+ "email-invite-text": "Sevgili __user__,\n\n__inviter__ seni birlikte çalışmak için \"__board__\" panosuna davet ediyor.\n\nLütfen aşağıdaki linke tıkla:\n\n__url__\n\nTeşekkürler.",
+ "email-resetPassword-subject": "__siteName__ üzerinde parolanı sıfırla",
+ "email-resetPassword-text": "Merhaba __user__,\n\nParolanı sıfırlaman için aşağıdaki linke tıklaman yeterli.\n\n__url__\n\nTeşekkürler.",
+ "email-sent": "E-posta gönderildi",
+ "email-verifyEmail-subject": "__siteName__ üzerindeki e-posta adresini doğrulama",
+ "email-verifyEmail-text": "Merhaba __user__,\n\nHesap e-posta adresini doğrulamak için aşağıdaki linke tıklaman yeterli.\n\n__url__\n\nTeşekkürler.",
+ "error-board-doesNotExist": "Erişmeye çalıştığın pano bulunamadı",
+ "error-board-notAdmin": "Bu işlemi yapmak için pano yöneticisi olmalısın.",
+ "error-board-notAMember": "Bu işlemi yapmak için pano içindeki bir üye olmalısın.",
+ "error-json-malformed": "Girilen metin geçerli bir JSON formatında değil",
+ "error-json-schema": "Girdiğin JSON metni tüm bilgileri doğru biçimde barındırmıyor",
+ "error-list-doesNotExist": "Liste bulunamadı",
+ "error-user-doesNotExist": "Kullanıcı bulunamadı",
+ "error-user-notAllowSelf": "You can not invite yourself",
+ "error-user-notCreated": "Bu üye oluşturulmadı",
+ "error-username-taken": "Kullanıcı adı zaten alınmış",
+ "export-board": "Panoyu dışarı aktar",
+ "filter": "Filtre",
+ "filter-cards": "Kartları Filtrele",
+ "filter-clear": "Süzgeci temizle",
+ "filter-no-label": "Etiket yok",
+ "filter-no-member": "Üye yok",
+ "filter-on": "Filtre aktif",
+ "filter-on-desc": "Bu panodaki kartları filtreliyorsunuz. Fitreyi düzenlemek için tıklayın.",
+ "filter-to-selection": "Seçime göre filtreleme yap",
"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-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": "Yeni bir etiket oluştur",
+ "hide-system-messages": "Sistem mesajlarını gizle",
+ "headerBarCreateBoardPopup-title": "Pano Oluşturma",
+ "home": "Ana Sayfa",
+ "import": "İçeri aktar",
+ "import-board": "Trello'dan içeri aktar",
+ "import-board-title": "Trello'dan panoları içeri aktarır",
+ "import-board-trello-instruction": "Trello panonuzda, 'Menü'ye gidip, ardıdan, 'daha fazlası' na tıklayın, 'Yazdır ve Çıktı al' sayfasından 'JSON biçiminde çıktı al' diyip, çıkan metni buraya kopyalayın.",
+ "import-json-placeholder": "Geçerli JSON verisini buraya yapıştırın",
+ "import-map-members": "Üyeleri eşleştirme",
+ "import-members-map": "İçe aktardığın panoda bazı kullanıcılar var. Lütfen bu kullanıcıları Wekan panosundaki kullanıcılarla eşleştirin.",
+ "import-show-user-mapping": "Üye eşleştirmesini kontrol et",
+ "import-user-select": "Bu üyenin sistemdeki hangi kullanıcı olduğunu seçin",
+ "importMapMembersAddPopup-title": "Üye seç",
+ "info": "Bilgiler",
+ "initials": "İlk Harfleri",
+ "invalid-date": "Geçersiz tarih",
+ "joined": "katılma",
+ "just-invited": "Bu panoya şimdi davet edildin.",
+ "keyboard-shortcuts": "Klavye kısayolları",
+ "label-create": "Etiket Oluşturma",
"label-default": "%s etiket (varsayılan)",
"label-delete-pop": "Geri dönüşü yok. Tüm kartlardan bu etiket kaldırılacaktır ve geçmişini yok edecektir.",
"labels": "Etiketler",
"language": "Dil",
- "last-admin-desc": "Rolleri değiştiremezsiniz çünkü burada en az bir yönetici olmalıdır.",
- "leave-board": "Leave Board",
+ "last-admin-desc": "Rolleri değiştiremezsiniz, çünkü burada en az bir yönetici olmalıdır.",
+ "leave-board": "Panodan ayrıl",
"link-card": "Bu kartın bağlantısı",
- "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",
+ "list-archive-cards": "Bu liste içindeki tüm kartları arşivle",
+ "list-archive-cards-pop": "Bu işlem bu listedeki tüm kartları kaldıracak ve arşivleyecek. Arşivlenmiş kartları görmek ve panoya geri yüklemek için \"Menü\" altından \"Arşivlenmiş Öğeler\"e gidebilirsiniz.",
+ "list-move-cards": "Listedeki tüm kartları taşı",
+ "list-select-cards": "Listedeki tüm kartları seç",
"listActionPopup-title": "Liste İşlemleri",
- "listImportCardPopup-title": "Import a Trello card",
- "lists": "Lists",
+ "listImportCardPopup-title": "Bir Trello kartını içeri aktar",
+ "listMorePopup-title": "Daha",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
+ "lists": "Listeler",
"log-out": "Oturum Kapat",
- "log-in": "Log In",
+ "log-in": "Oturum Aç",
"loginPopup-title": "Oturum Aç",
- "memberMenuPopup-title": "Member Settings",
+ "memberMenuPopup-title": "Üye ayarları",
"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",
+ "move-selection": "Seçimi taşı",
+ "moveCardPopup-title": "Kartı taşı",
+ "moveCardToBottom-title": "Aşağı taşı",
+ "moveCardToTop-title": "Yukarı taşı",
+ "moveSelectionPopup-title": "Seçimi taşı",
+ "multi-selection": "Çoklu seçim",
+ "multi-selection-on": "Çoklu seçim açık",
+ "muted": "Sessiz",
+ "muted-info": "Bu panodaki değişiklikler hakkında bildirim almayacaksınız",
"my-boards": "Panolarım",
"name": "Adı",
- "no-archived-cards": "No archived cards.",
- "no-archived-lists": "No archived lists.",
+ "no-archived-cards": "Arşivlenmiş kart bulunamadı.",
+ "no-archived-lists": "Arşivlenmiş liste bulunamadı.",
"no-results": "Sonuç yok",
"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",
+ "not-accepted-yet": "Davetiye henüz kabul edilmemiş",
+ "notify-participate": "Oluşturduğunuz veya üye olduğunuz tüm kartlar hakkında bildirim alma",
+ "notify-watch": "Takip ettiğiniz tüm pano, liste ve kartlar hakkında bildirim alma",
"optional": "isteğe bağlı",
- "or": "or",
+ "or": "veya",
"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",
+ "paste-or-dragdrop": "Dosya eklemek için yapıştırabilir, veya (eğer resimse) sürükle bırak yapabilirsiniz",
+ "participating": "Katılımcılar",
+ "preview": "Önizleme",
+ "previewAttachedImagePopup-title": "Önizleme",
+ "previewClipboardImagePopup-title": "Önizleme",
"private": "Özel",
"private-desc": "Bu pano özel. Sadece panoya ekli kişiler görüntüleyebilir ve düzenleyebilir.",
"profile": "Kullanıcı Sayfası",
"public": "Genel",
"public-desc": "Bu pano genel. Bağlantı adresi ile herhangi bir kimseye görünür ve Google gibi arama motorlarında gösterilecektir. Panoyu, sadece eklenen kişiler düzenleyebilir.",
- "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",
+ "quick-access-description": "Bu bara kısayol olarak bir pano eklemek için panoyu yıldızlamalısınız",
+ "remove-cover": "Kapak resmini kaldır",
+ "remove-from-board": "Panodan kaldır",
+ "remove-label": "Remove Label",
+ "listDeletePopup-title": "Delete 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.",
- "removeMemberPopup-title": "Üyeyi Çıkarmak mı?",
- "rename": "Ad değiştir",
+ "removeMemberPopup-title": "Üye çıkarılsın mı?",
+ "rename": "Yeniden adlandır",
"rename-board": "Pano Adı Değiştirme",
- "restore": "Restore",
+ "restore": "Geri yükleme",
"save": "Kaydet",
- "search": "Search",
- "select-color": "Bir renk seç",
- "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",
+ "search": "Arama",
+ "select-color": "Select Color",
+ "shortcut-assign-self": "Kendini karta ekle",
+ "shortcut-autocomplete-emoji": "Otomatik tamamlayan emoji yüz ifadeleri",
+ "shortcut-autocomplete-members": "Otomatik tamamlayan üye isimleri",
+ "shortcut-clear-filters": "Tüm filtreleri temizle",
+ "shortcut-close-dialog": "Diyaloğu kapat",
+ "shortcut-filter-my-cards": "Kartlarımı filtrele",
+ "shortcut-show-shortcuts": "Kısayollar listesini getir",
+ "shortcut-toggle-filterbar": "Filtre kenar çubuğunu aç/kapa",
+ "shortcut-toggle-sidebar": "Pano kenar çubuğunu aç/kapa",
+ "show-cards-minimum-count": "Eğer listede şu kadar sayıdan fazla şey varsa kart sayısını göster: ",
+ "sidebar-open": "Kenar çubuğunu aç",
+ "sidebar-close": "Kenar çubuğunu kapat",
"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",
"starred-boards-description": "Yıldızlanmış panolar, pano listenin en üstünde gösterilir.",
- "subscribe": "Subscribe",
+ "subscribe": "Abone ol",
"team": "Takım",
"this-board": "bu panoyu",
"this-card": "bu kart",
- "time": "Time",
+ "time": "Zaman",
"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",
+ "tracking": "Takp",
+ "tracking-info": "Oluşturduğunuz veya üyesi olduğunuz tüm kartlardaki değişiklikler size bildirim olarak gelecek.",
+ "unassign-member": "Üyeyi çıkart",
+ "unsaved-description": "Kaydedilmemiş bir açıklama metnin bulunmakta",
+ "unwatch": "Takibi bırak",
+ "upload": "Yükle",
+ "upload-avatar": "Avatar yükle",
+ "uploaded-avatar": "Avatar yüklendi",
"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?"
+ "view-it": "Görüntüle",
+ "warn-list-archived": "dikkat: bu kart arşivlenmiş bir liste içinde",
+ "watch": "Takip Et",
+ "watching": "Takip Ediliyor",
+ "watching-info": "Bu pano hakkındaki tüm değişiklikler hakkında tarafınıza bildirim gelecektir",
+ "welcome-board": "Panoya Hoş Geldiniz",
+ "welcome-list1": "Temel",
+ "welcome-list2": "Gelişmiş",
+ "what-to-do": "Ne yapmak istiyorsunuz?",
+ "admin-panel": "Yönetici Paneli",
+ "settings": "Ayarlar",
+ "people": "Kullanıcılar",
+ "registration": "Kayıt",
+ "disable-self-registration": "Ziyaretçilere kaydı kapa",
+ "invite": "Davet",
+ "invite-people": "Kullanıcı davet et",
+ "to-boards": "Şu pano(lar)a",
+ "email-addresses": "E-posta adresleri",
+ "smtp-host-description": "E-posta gönderimi yapan SMTP sunucu adresi",
+ "smtp-port-description": "E-posta gönderimi yapan SMTP sunucu portu",
+ "smtp-tls-description": "SMTP mail sunucusu için TLS kriptolama desteği açılsın mı",
+ "smtp-host": "SMTP sunucu adresi",
+ "smtp-port": "SMTP portu",
+ "smtp-username": "Kullanıcı adı",
+ "smtp-password": "Parola",
+ "smtp-tls": "TLS kriptolama desteği",
+ "send-from": "Gönderen",
+ "invitation-code": "Davetiye kodu",
+ "email-invite-register-subject": "__inviter__ size bir davetiye gönderdi",
+ "email-invite-register-text": "Sevgili __user__,\n\n__inviter__ Sizi koordine çalışabilmek için Wekan'a davet etti.\n\nLütfen aşağıdaki linke tıklayın:\n__url__\n\nDavetiye kodunuz: __icode__\n\nTeşekkürler.",
+ "error-invitation-code-not-exist": "Davetiye kodu bulunamadı"
} \ No newline at end of file
diff --git a/i18n/zh-CN.i18n.json b/i18n/zh-CN.i18n.json
index 0e4db570..00205668 100644
--- a/i18n/zh-CN.i18n.json
+++ b/i18n/zh-CN.i18n.json
@@ -15,9 +15,9 @@
"act-importList": "导入列表 __list__",
"act-joinMember": "添加成员 __member__ 至卡片 __card__",
"act-moveCard": "从列表 __oldList__ 移动卡片 __card__ 至列表 __list__",
- "act-removeBoardMember": "从看板 __board__ 移除成员 __member__ ",
+ "act-removeBoardMember": "从看板 __board__ 移除成员 __member__",
"act-restoredCard": "恢复卡片 __card__ 至看板 __board__",
- "act-unjoinMember": "从卡片 __card__ 移除成员 __member__ ",
+ "act-unjoinMember": "从卡片 __card__ 移除成员 __member__",
"act-withBoardTitle": "[Wekan] 看板 __board__",
"act-withCardTitle": "[看板 __board__] 卡片 __card__",
"actions": "操作",
@@ -36,16 +36,16 @@
"activity-removed": "从 %s 中移除 %s",
"activity-sent": "发送 %s 至 %s",
"activity-unjoined": "已解除 %s 关联",
- "activity-checklist-added": "added checklist to %s",
+ "activity-checklist-added": "已经将清单添加到 %s",
"add": "添加",
- "add-attachment": "添加附件",
- "add-board": "添加新看板",
- "add-card": "添加卡片",
- "add-checklist": "Add a checklist",
- "add-checklist-item": "Add an item to checklist",
+ "add-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add Checklist",
+ "add-checklist-item": "扩充清单",
"add-cover": "添加封面",
- "add-label": "添加标签",
- "add-list": "添加清单",
+ "add-label": "Add Label",
+ "add-list": "Add List",
"add-members": "添加成员",
"added": "添加",
"addMemberPopup-title": "成员",
@@ -60,7 +60,7 @@
"archive-all": "全部归档",
"archive-board": "归档看板",
"archive-card": "归档卡片",
- "archive-list": "归档该清单",
+ "archive-list": "Archive List",
"archive-selection": "归档所选内容",
"archiveBoardPopup-title": "确定要归档看板吗?",
"archived-items": "已归档项目",
@@ -71,8 +71,8 @@
"attachment-delete-pop": "删除附件的操作不可逆。",
"attachmentDeletePopup-title": "删除附件?",
"attachments": "附件",
- "auto-watch": "创建看板时自动关注",
- "avatar-too-big": "头像太大 (最大 70 Kb)",
+ "auto-watch": "自动关注新建的看板",
+ "avatar-too-big": "头像过大 (上限 70 KB)",
"back": "返回",
"board-change-color": "更改颜色",
"board-nb-stars": "%s 星标",
@@ -85,12 +85,12 @@
"boardChangeWatchPopup-title": "更改关注状态",
"boardMenuPopup-title": "看板菜单",
"boards": "看板",
- "bucket-example": "例如 “目标清单”",
+ "bucket-example": "例如 “遗愿清单”",
"cancel": "取消",
"card-archived": "该卡片已被归档",
"card-comments-title": "该卡片有 %s 条评论",
"card-delete-notice": "彻底删除的操作不可恢复,你将会丢失该卡片相关的所有操作记录。",
- "card-delete-pop": "所有的动作将从活动动态中被移除且您将无法重新打开该卡片。此操作无法撤销。",
+ "card-delete-pop": "所有的活动将从活动摘要中被移除且您将无法重新打开该卡片。此操作无法撤销。",
"card-delete-suggest-archive": "你可以将卡片从看板中归档至回收箱,但保留相关活动。",
"card-due": "到期",
"card-due-on": "期限",
@@ -103,7 +103,7 @@
"card-start-on": "始于",
"cardAttachmentsPopup-title": "附件来源",
"cardDeletePopup-title": "彻底删除卡片?",
- "cardDetailsActionsPopup-title": "卡片动作",
+ "cardDetailsActionsPopup-title": "卡片操作",
"cardLabelsPopup-title": "标签",
"cardMembersPopup-title": "成员",
"cardMorePopup-title": "更多",
@@ -118,7 +118,7 @@
"changePasswordPopup-title": "更改密码",
"changePermissionsPopup-title": "更改权限",
"changeSettingsPopup-title": "更改设置",
- "checklists": "Checklists",
+ "checklists": "清单",
"click-to-star": "点此来标记该看板",
"click-to-unstar": "点此来去除该看板的标记",
"clipboard": "剪贴板或者拖放文件",
@@ -136,7 +136,9 @@
"color-sky": "天蓝",
"color-yellow": "黄色",
"comment": "评论",
- "comment-placeholder": "添加评论",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "只能在卡片上评论。",
"computer": "从本机上传",
"create": "创建",
"createBoardPopup-title": "创建看板",
@@ -148,8 +150,8 @@
"delete": "删除",
"deleteLabelPopup-title": "删除标签?",
"description": "描述",
- "disambiguateMultiLabelPopup-title": "消除标签动作歧义",
- "disambiguateMultiMemberPopup-title": "消除会员动作歧义",
+ "disambiguateMultiLabelPopup-title": "标签消歧 [?]",
+ "disambiguateMultiMemberPopup-title": "成员消歧 [?]",
"discard": "放弃",
"done": "完成",
"download": "下载",
@@ -181,7 +183,7 @@
"error-json-schema": "JSON 数据没有用正确的格式包含合适的信息",
"error-list-doesNotExist": "不存在此列表",
"error-user-doesNotExist": "该用户不存在",
- "error-user-notAllowSelf": "不允许对自己执行此操作",
+ "error-user-notAllowSelf": "You can not invite yourself",
"error-user-notCreated": "该用户未能成功创建",
"error-username-taken": "此用户名已存在",
"export-board": "导出看板",
@@ -196,13 +198,14 @@
"fullname": "全称",
"header-logo-title": "返回您的看板页",
"hide-system-messages": "隐藏系统消息",
+ "headerBarCreateBoardPopup-title": "创建看板",
"home": "首页",
"import": "导入",
"import-board": "从 Trello 导入",
"import-board-title": "从Trello导入看板",
"import-board-trello-instruction": "在你的Trello看板中,点击“菜单”,然后选择“更多”,“打印与导出”,“导出为 JSON” 并拷贝结果文本",
"import-json-placeholder": "粘贴您有效的 JSON 数据至此",
- "import-map-members": " 映射成员",
+ "import-map-members": "映射成员",
"import-members-map": "您导入的看板有一些成员。请将您想导入的成员映射到 Wekan 用户。",
"import-show-user-mapping": "核对成员映射",
"import-user-select": "选择您想将此成员映射到的 Wekan 用户",
@@ -213,7 +216,7 @@
"joined": "关联",
"just-invited": "您刚刚被邀请加入此看板",
"keyboard-shortcuts": "键盘快捷键",
- "label-create": "创建新标签",
+ "label-create": "创建标签",
"label-default": "%s 标签 (默认)",
"label-delete-pop": "此操作不可逆,这将会删除该标签并清除它的历史记录。",
"labels": "标签",
@@ -221,13 +224,17 @@
"last-admin-desc": "你不能更改角色,因为至少需要一名管理员。",
"leave-board": "离开看板",
"link-card": "关联至该卡片",
- "list-archive-cards": "归档清单中的所有卡片",
- "list-archive-cards-pop": "这将会从本看板中移除该清单中的所有卡片。如果需要浏览已归档的卡片并且将其恢复至看板,请点击\"菜单\">\"回收箱\"",
- "list-move-cards": "移动清单中的所有卡片",
- "list-select-cards": "选择清单中的所有卡片",
- "listActionPopup-title": "清单操作",
+ "list-archive-cards": "归档列表中的所有卡片",
+ "list-archive-cards-pop": "这将会从本看板中移除该列表中的所有卡片。如果需要浏览已归档的卡片并且将其恢复至看板,请点击 \"菜单\" > \"回收箱\"",
+ "list-move-cards": "移动列表中的所有卡片",
+ "list-select-cards": "选择列表中的所有卡片",
+ "listActionPopup-title": "列表操作",
"listImportCardPopup-title": "导入 Trello 卡片",
- "lists": "清单",
+ "listMorePopup-title": "更多",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
+ "lists": "列表",
"log-out": "登出",
"log-in": "登录",
"loginPopup-title": "登录",
@@ -246,7 +253,7 @@
"my-boards": "我的看板",
"name": "名称",
"no-archived-cards": "没有已归档的卡片",
- "no-archived-lists": "没有已归档的清单",
+ "no-archived-lists": "没有已归档的列表。",
"no-results": "无结果",
"normal": "普通",
"normal-desc": "可以创建以及编辑卡片,无法更改设置。",
@@ -271,7 +278,8 @@
"quick-access-description": "星标看板在导航条中添加快捷方式",
"remove-cover": "移除封面",
"remove-from-board": "从看板中删除",
- "remove-label": "移除标签",
+ "remove-label": "Remove Label",
+ "listDeletePopup-title": "Delete List ?",
"remove-member": "移除成员",
"remove-member-from-card": "从该卡片中移除",
"remove-member-pop": "确定从 __boardTitle__ 中移除 __name__ (__username__) 吗? 该成员将被从该看板的所有卡片中移除,同时他会收到一条提醒。",
@@ -281,7 +289,7 @@
"restore": "还原",
"save": "保存",
"search": "搜索",
- "select-color": "选择颜色",
+ "select-color": "Select Color",
"shortcut-assign-self": "分配当前卡片给自己",
"shortcut-autocomplete-emoji": "表情符号自动补全",
"shortcut-autocomplete-members": "自动补全成员",
@@ -292,7 +300,9 @@
"shortcut-toggle-filterbar": "切换过滤器边栏",
"shortcut-toggle-sidebar": "切换面板边栏",
"show-cards-minimum-count": "当列表中的卡片多于此阈值时将显示数量",
- "signupPopup-title": " 创建账户",
+ "sidebar-open": "打开侧栏",
+ "sidebar-close": "打开侧栏",
+ "signupPopup-title": "创建账户",
"star-board-title": "点此来标记该看板,它将会出现在您的看板列表顶部。",
"starred-boards": "已标记看板",
"starred-boards-description": "已标记看板将会出现在您的看板列表顶部。",
@@ -312,12 +322,34 @@
"uploaded-avatar": "头像已经上传",
"username": "用户名",
"view-it": "查看",
- "warn-list-archived": "警告: 该卡片位于已归档清单中",
+ "warn-list-archived": "警告: 该卡片位于已归档的列表中",
"watch": "关注",
- "watching": "已关注",
+ "watching": "关注",
"watching-info": "当此看板发生变更时会通知你",
"welcome-board": "“欢迎”看板",
"welcome-list1": "基本",
"welcome-list2": "高阶",
- "what-to-do": "要做什么?"
+ "what-to-do": "要做什么?",
+ "admin-panel": "管理面板",
+ "settings": "设置",
+ "people": "人员",
+ "registration": "注册",
+ "disable-self-registration": "禁止自助注册",
+ "invite": "邀请",
+ "invite-people": "邀请人员",
+ "to-boards": "邀请到看板 (可多选)",
+ "email-addresses": "电子邮箱地址",
+ "smtp-host-description": "用于发送邮件的SMTP服务器地址。",
+ "smtp-port-description": "SMTP服务器端口。",
+ "smtp-tls-description": "对SMTP服务器启用TLS支持",
+ "smtp-host": "SMTP服务器",
+ "smtp-port": "SMTP端口",
+ "smtp-username": "用户名",
+ "smtp-password": "密码",
+ "smtp-tls": "TLS支持",
+ "send-from": "发件人",
+ "invitation-code": "邀请码",
+ "email-invite-register-subject": "__inviter__ 向您发出邀请",
+ "email-invite-register-text": "亲爱的 __user__,\n\n__inviter__ 邀请您加入 Wekan 进行协作。\n\n请访问下面的链接︰\n__url__\n\n您的的邀请码是︰\n__icode__\n\n非常感谢。",
+ "error-invitation-code-not-exist": "邀请码不存在"
} \ No newline at end of file
diff --git a/i18n/zh-TW.i18n.json b/i18n/zh-TW.i18n.json
index 59805a4f..264e0a9d 100644
--- a/i18n/zh-TW.i18n.json
+++ b/i18n/zh-TW.i18n.json
@@ -36,16 +36,16 @@
"activity-removed": "移除 %s 從 %s 中",
"activity-sent": "寄送 %s 至 %s",
"activity-unjoined": "解除關聯 %s",
- "activity-checklist-added": "added checklist to %s",
+ "activity-checklist-added": "新增待辦清單至 %s",
"add": "新增",
- "add-attachment": "新增附件",
- "add-board": "新增看板",
- "add-card": "新增卡片",
- "add-checklist": "Add a checklist",
- "add-checklist-item": "Add an item to checklist",
+ "add-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-checklist": "Add Checklist",
+ "add-checklist-item": "新增項目",
"add-cover": "新增封面",
- "add-label": "新增標籤",
- "add-list": "新增清單",
+ "add-label": "Add Label",
+ "add-list": "Add List",
"add-members": "新增成員",
"added": "新增",
"addMemberPopup-title": "成員",
@@ -60,7 +60,7 @@
"archive-all": "全部刪除",
"archive-board": "刪除看板",
"archive-card": "刪除卡片",
- "archive-list": "刪除該清單",
+ "archive-list": "Archive List",
"archive-selection": "刪除所選內容",
"archiveBoardPopup-title": "確定要刪除看板嗎?",
"archived-items": "封存",
@@ -72,7 +72,7 @@
"attachmentDeletePopup-title": "刪除附件?",
"attachments": "附件",
"auto-watch": "新增看板時自動加入觀察",
- "avatar-too-big": "大頭貼太大 (最大 70 Kb)",
+ "avatar-too-big": "頭像檔案太大 (最大 70 KB)",
"back": "返回",
"board-change-color": "更改顏色",
"board-nb-stars": "%s 星號標記",
@@ -118,7 +118,7 @@
"changePasswordPopup-title": "更改密碼",
"changePermissionsPopup-title": "更改許可權",
"changeSettingsPopup-title": "更改設定",
- "checklists": "Checklists",
+ "checklists": "待辦清單",
"click-to-star": "點此來標記該看板",
"click-to-unstar": "點此來去除該看板的標記",
"clipboard": "剪貼簿貼上或者拖曳檔案",
@@ -136,7 +136,9 @@
"color-sky": "天藍",
"color-yellow": "黃色",
"comment": "評論",
- "comment-placeholder": "新增評論",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "只可以發表評論",
+ "comment-only-desc": "只可以對卡片發表評論",
"computer": "從本機上傳",
"create": "建立",
"createBoardPopup-title": "建立看板",
@@ -196,6 +198,7 @@
"fullname": "全稱",
"header-logo-title": "返回您的看板頁面",
"hide-system-messages": "隱藏系統訊息",
+ "headerBarCreateBoardPopup-title": "建立看板",
"home": "首頁",
"import": "匯入",
"import-board": "匯入 Trello 資料",
@@ -213,7 +216,7 @@
"joined": "關聯",
"just-invited": "您剛剛被邀請加入此看板",
"keyboard-shortcuts": "鍵盤快速鍵",
- "label-create": "建立新標籤",
+ "label-create": "建立標籤",
"label-default": "%s 標籤 (預設)",
"label-delete-pop": "此操作無法還原,這將會刪除該標籤並清除它的歷史記錄。",
"labels": "標籤",
@@ -227,6 +230,10 @@
"list-select-cards": "選擇清單中的所有卡片",
"listActionPopup-title": "清單操作",
"listImportCardPopup-title": "匯入 Trello 卡片",
+ "listMorePopup-title": "更多",
+ "link-list": "Link to this list",
+ "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
+ "list-delete-suggest-archive": "You can archive a list to remove it from the board and preserve the activity.",
"lists": "清單",
"log-out": "登出",
"log-in": "登入",
@@ -271,7 +278,8 @@
"quick-access-description": "被星號標記的看板在導航列中新增快速啟動方式",
"remove-cover": "移除封面",
"remove-from-board": "從看板中刪除",
- "remove-label": "移除標籤",
+ "remove-label": "Remove Label",
+ "listDeletePopup-title": "Delete List ?",
"remove-member": "移除成員",
"remove-member-from-card": "從該卡片中移除",
"remove-member-pop": "確定從 __boardTitle__ 中移除 __name__ (__username__) 嗎? 該成員將被從該看板的所有卡片中移除,同時他會收到一則提醒。",
@@ -281,7 +289,7 @@
"restore": "還原",
"save": "儲存",
"search": "搜尋",
- "select-color": "選擇顏色",
+ "select-color": "Select Color",
"shortcut-assign-self": "分配目前卡片給自己",
"shortcut-autocomplete-emoji": "自動完成表情符號",
"shortcut-autocomplete-members": "自動補齊成員",
@@ -292,6 +300,8 @@
"shortcut-toggle-filterbar": "切換過濾程式邊欄",
"shortcut-toggle-sidebar": "切換面板邊欄",
"show-cards-minimum-count": "顯示卡片數量,當內容超過數量",
+ "sidebar-open": "開啟側邊欄",
+ "sidebar-close": "關閉側邊欄",
"signupPopup-title": "建立帳戶",
"star-board-title": "點此標記該看板,它將會出現在您的看板列表上方。",
"starred-boards": "已標記看板",
@@ -319,5 +329,27 @@
"welcome-board": "歡迎進入看板",
"welcome-list1": "基本",
"welcome-list2": "進階",
- "what-to-do": "要做什麼?"
+ "what-to-do": "要做什麼?",
+ "admin-panel": "控制台",
+ "settings": "設定",
+ "people": "成員",
+ "registration": "註冊",
+ "disable-self-registration": "關閉自我註冊",
+ "invite": "邀請",
+ "invite-people": "邀請成員",
+ "to-boards": "至看板()",
+ "email-addresses": "電子郵件",
+ "smtp-host-description": "SMTP 外寄郵件伺服器",
+ "smtp-port-description": "SMTP 外寄郵件伺服器埠號",
+ "smtp-tls-description": "對 SMTP 啟動 TLS 支援",
+ "smtp-host": "SMTP 位置",
+ "smtp-port": "SMTP 埠號",
+ "smtp-username": "使用者名稱",
+ "smtp-password": "密碼",
+ "smtp-tls": "支援 TLS",
+ "send-from": "從",
+ "invitation-code": "邀請碼",
+ "email-invite-register-subject": "__inviter__ 向您發出邀請",
+ "email-invite-register-text": "親愛的 __user__,\n\n__inviter__ 邀請您加入 Wekan 一同協作\n\n請點擊下列連結:\n__url__\n\n您的邀請碼為:__icode__\n\n謝謝。",
+ "error-invitation-code-not-exist": "邀請碼不存在"
} \ No newline at end of file
diff --git a/meta/screenshots/board-view.jpg b/meta/screenshots/board-view.jpg
deleted file mode 100644
index 6b8ffafe..00000000
--- a/meta/screenshots/board-view.jpg
+++ /dev/null
Binary files differ
diff --git a/meta/screenshots/board_view_01.png b/meta/screenshots/board_view_01.png
new file mode 100755
index 00000000..6151a17b
--- /dev/null
+++ b/meta/screenshots/board_view_01.png
Binary files differ
diff --git a/meta/screenshots/board_view_02.png b/meta/screenshots/board_view_02.png
new file mode 100755
index 00000000..2e745a7b
--- /dev/null
+++ b/meta/screenshots/board_view_02.png
Binary files differ
diff --git a/models/activities.js b/models/activities.js
index 7d262ec6..9a41d4aa 100644
--- a/models/activities.js
+++ b/models/activities.js
@@ -52,6 +52,8 @@ if (Meteor.isServer) {
Activities._collection._ensureIndex({ createdAt: -1 });
Activities._collection._ensureIndex({ cardId: 1, createdAt: -1 });
Activities._collection._ensureIndex({ boardId: 1, createdAt: -1 });
+ Activities._collection._ensureIndex({ commentId: 1 }, { partialFilterExpression: { commentId: { $exists: true } } });
+ Activities._collection._ensureIndex({ attachmentId: 1 }, { partialFilterExpression: { attachmentId: { $exists: true } } });
});
Activities.after.insert((userId, doc) => {
diff --git a/models/boards.js b/models/boards.js
index 14943d61..8a7844e2 100644
--- a/models/boards.js
+++ b/models/boards.js
@@ -107,6 +107,7 @@ Boards.attachSchema(new SimpleSchema({
userId: this.userId,
isAdmin: true,
isActive: true,
+ isCommentOnly: false,
}];
}
},
@@ -120,6 +121,9 @@ Boards.attachSchema(new SimpleSchema({
'members.$.isActive': {
type: Boolean,
},
+ 'members.$.isCommentOnly': {
+ type: Boolean,
+ },
permission: {
type: String,
allowedValues: ['public', 'private'],
@@ -152,7 +156,7 @@ Boards.helpers({
* Is supplied user authorized to view this board?
*/
isVisibleBy(user) {
- if(this.isPublic()) {
+ if (this.isPublic()) {
// public boards are visible to everyone
return true;
} else {
@@ -168,7 +172,7 @@ Boards.helpers({
* @returns {boolean} the member that matches, or undefined/false
*/
isActiveMember(userId) {
- if(userId) {
+ if (userId) {
return this.members.find((member) => (member.userId === userId && member.isActive));
} else {
return false;
@@ -180,23 +184,23 @@ Boards.helpers({
},
lists() {
- return Lists.find({ boardId: this._id, archived: false }, { sort: { sort: 1 }});
+ return Lists.find({ boardId: this._id, archived: false }, { sort: { sort: 1 } });
},
activities() {
- return Activities.find({ boardId: this._id }, { sort: { createdAt: -1 }});
+ return Activities.find({ boardId: this._id }, { sort: { createdAt: -1 } });
},
activeMembers() {
- return _.where(this.members, {isActive: true});
+ return _.where(this.members, { isActive: true });
},
activeAdmins() {
- return _.where(this.members, {isActive: true, isAdmin: true});
+ return _.where(this.members, { isActive: true, isAdmin: true });
},
memberUsers() {
- return Users.find({ _id: {$in: _.pluck(this.members, 'userId')} });
+ return Users.find({ _id: { $in: _.pluck(this.members, 'userId') } });
},
getLabel(name, color) {
@@ -212,11 +216,15 @@ Boards.helpers({
},
hasMember(memberId) {
- return !!_.findWhere(this.members, {userId: memberId, isActive: true});
+ return !!_.findWhere(this.members, { userId: memberId, isActive: true });
},
hasAdmin(memberId) {
- return !!_.findWhere(this.members, {userId: memberId, isActive: true, isAdmin: true});
+ return !!_.findWhere(this.members, { userId: memberId, isActive: true, isAdmin: true });
+ },
+
+ hasCommentOnly(memberId) {
+ return !!_.findWhere(this.members, { userId: memberId, isActive: true, isAdmin: false, isCommentOnly: true });
},
absoluteUrl() {
@@ -231,34 +239,34 @@ Boards.helpers({
// XXX waiting on https://github.com/mquandalle/meteor-collection-mutations/issues/1 to remove...
pushLabel(name, color) {
const _id = Random.id(6);
- Boards.direct.update(this._id, { $push: {labels: { _id, name, color }}});
+ Boards.direct.update(this._id, { $push: { labels: { _id, name, color } } });
return _id;
},
});
Boards.mutations({
archive() {
- return { $set: { archived: true }};
+ return { $set: { archived: true } };
},
restore() {
- return { $set: { archived: false }};
+ return { $set: { archived: false } };
},
rename(title) {
- return { $set: { title }};
+ return { $set: { title } };
},
setDescription(description) {
- return { $set: {description} };
+ return { $set: { description } };
},
setColor(color) {
- return { $set: { color }};
+ return { $set: { color } };
},
setVisibility(visibility) {
- return { $set: { permission: visibility }};
+ return { $set: { permission: visibility } };
},
addLabel(name, color) {
@@ -268,7 +276,7 @@ Boards.mutations({
// user).
if (!this.getLabel(name, color)) {
const _id = Random.id(6);
- return { $push: {labels: { _id, name, color }}};
+ return { $push: { labels: { _id, name, color } } };
}
return {};
},
@@ -287,7 +295,7 @@ Boards.mutations({
},
removeLabel(labelId) {
- return { $pull: { labels: { _id: labelId }}};
+ return { $pull: { labels: { _id: labelId } } };
},
addMember(memberId) {
@@ -306,6 +314,7 @@ Boards.mutations({
userId: memberId,
isAdmin: false,
isActive: true,
+ isCommentOnly: false,
},
},
};
@@ -332,7 +341,7 @@ Boards.mutations({
};
},
- setMemberPermission(memberId, isAdmin) {
+ setMemberPermission(memberId, isAdmin, isCommentOnly) {
const memberIndex = this.memberIndex(memberId);
// do not allow change permission of self
@@ -343,6 +352,7 @@ Boards.mutations({
return {
$set: {
[`members.${memberIndex}.isAdmin`]: isAdmin,
+ [`members.${memberIndex}.isCommentOnly`]: isCommentOnly,
},
};
},
@@ -376,7 +386,7 @@ if (Meteor.isServer) {
return false;
// If there is more than one admin, it's ok to remove anyone
- const nbAdmins = _.where(doc.members, {isActive: true, isAdmin: true}).length;
+ const nbAdmins = _.where(doc.members, { isActive: true, isAdmin: true }).length;
if (nbAdmins > 1)
return false;
@@ -398,7 +408,7 @@ if (Meteor.isServer) {
if (board) {
const userId = Meteor.userId();
const index = board.memberIndex(userId);
- if (index>=0) {
+ if (index >= 0) {
board.removeMember(userId);
return true;
} else throw new Meteor.Error('error-board-notAMember');
@@ -414,6 +424,7 @@ if (Meteor.isServer) {
_id: 1,
'members.userId': 1,
}, { unique: true });
+ Boards._collection._ensureIndex({ 'members.userId': 1 });
});
// Genesis: the first activity of the newly created board
@@ -542,3 +553,86 @@ if (Meteor.isServer) {
}
});
}
+
+//BOARDS REST API
+if (Meteor.isServer) {
+ JsonRoutes.add('GET', '/api/users/:userId/boards', function (req, res, next) {
+ Authentication.checkLoggedIn(req.userId);
+ const paramUserId = req.params.userId;
+ // A normal user should be able to see their own boards,
+ // admins can access boards of any user
+ Authentication.checkAdminOrCondition(req.userId, req.userId === paramUserId);
+
+ const data = Boards.find({
+ archived: false,
+ 'members.userId': req.userId,
+ }, {
+ sort: ['title'],
+ }).map(function(board) {
+ return {
+ _id: board._id,
+ title: board.title,
+ };
+ });
+
+ JsonRoutes.sendResult(res, {code: 200, data});
+ });
+
+ JsonRoutes.add('GET', '/api/boards', function (req, res, next) {
+ Authentication.checkUserId(req.userId);
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: Boards.find({ permission: 'public' }).map(function (doc) {
+ return {
+ _id: doc._id,
+ title: doc.title,
+ };
+ }),
+ });
+ });
+
+ JsonRoutes.add('GET', '/api/boards/:id', function (req, res, next) {
+ const id = req.params.id;
+ Authentication.checkBoardAccess( req.userId, id);
+
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: Boards.findOne({ _id: id }),
+ });
+ });
+
+ JsonRoutes.add('POST', '/api/boards', function (req, res, next) {
+ Authentication.checkUserId( req.userId);
+ const id = Boards.insert({
+ title: req.body.title,
+ members: [
+ {
+ userId: req.body.owner,
+ isAdmin: true,
+ isActive: true,
+ isCommentOnly: false,
+ },
+ ],
+ permission: 'public',
+ color: 'belize',
+ });
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: id,
+ },
+ });
+ });
+
+ JsonRoutes.add('DELETE', '/api/boards/:id', function (req, res, next) {
+ Authentication.checkUserId( req.userId);
+ const id = req.params.id;
+ Boards.remove({ _id: id });
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data:{
+ _id: id,
+ },
+ });
+ });
+}
diff --git a/models/cardComments.js b/models/cardComments.js
index 070c148e..e51275a4 100644
--- a/models/cardComments.js
+++ b/models/cardComments.js
@@ -80,3 +80,65 @@ if (Meteor.isServer) {
}
});
}
+
+//CARD COMMENT REST API
+if (Meteor.isServer) {
+ JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/comments', function (req, res, next) {
+ Authentication.checkUserId( req.userId);
+ const paramBoardId = req.params.boardId;
+ const paramCardId = req.params.cardId;
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: CardComments.find({ boardId: paramBoardId, cardId: paramCardId}).map(function (doc) {
+ return {
+ _id: doc._id,
+ comment: doc.text,
+ authorId: doc.userId,
+ };
+ }),
+ });
+ });
+
+ JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/comments/:commentId', function (req, res, next) {
+ Authentication.checkUserId( req.userId);
+ const paramBoardId = req.params.boardId;
+ const paramCommentId = req.params.commentId;
+ const paramCardId = req.params.cardId;
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: CardComments.findOne({ _id: paramCommentId, cardId: paramCardId, boardId: paramBoardId }),
+ });
+ });
+
+ JsonRoutes.add('POST', '/api/boards/:boardId/cards/:cardId/comments', function (req, res, next) {
+ Authentication.checkUserId( req.userId);
+ const paramBoardId = req.params.boardId;
+ const paramCardId = req.params.cardId;
+ const id = CardComments.insert({
+ userId: req.body.authorId,
+ text: req.body.comment,
+ cardId: paramCardId,
+ boardId: paramBoardId,
+ });
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: id,
+ },
+ });
+ });
+
+ JsonRoutes.add('DELETE', '/api/boards/:boardId/cards/:cardId/comments/:commentId', function (req, res, next) {
+ Authentication.checkUserId( req.userId);
+ const paramBoardId = req.params.boardId;
+ const paramCommentId = req.params.commentId;
+ const paramCardId = req.params.cardId;
+ CardComments.remove({ _id: paramCommentId, cardId: paramCardId, boardId: paramBoardId });
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: paramCardId,
+ },
+ });
+ });
+}
diff --git a/models/cards.js b/models/cards.js
index f6bd0b06..c48b4845 100644
--- a/models/cards.js
+++ b/models/cards.js
@@ -123,15 +123,15 @@ Cards.helpers({
},
activities() {
- return Activities.find({ cardId: this._id }, { sort: { createdAt: -1 }});
+ return Activities.find({ cardId: this._id }, { sort: { createdAt: -1 } });
},
comments() {
- return CardComments.find({ cardId: this._id }, { sort: { createdAt: -1 }});
+ return CardComments.find({ cardId: this._id }, { sort: { createdAt: -1 } });
},
attachments() {
- return Attachments.find({ cardId: this._id }, { sort: { uploadedAt: -1 }});
+ return Attachments.find({ cardId: this._id }, { sort: { uploadedAt: -1 } });
},
cover() {
@@ -142,7 +142,7 @@ Cards.helpers({
},
checklists() {
- return Checklists.find({ cardId: this._id }, { sort: { createdAt: 1 }});
+ return Checklists.find({ cardId: this._id }, { sort: { createdAt: 1 } });
},
checklistItemCount() {
@@ -183,19 +183,19 @@ Cards.helpers({
Cards.mutations({
archive() {
- return { $set: { archived: true }};
+ return { $set: { archived: true } };
},
restore() {
- return { $set: { archived: false }};
+ return { $set: { archived: false } };
},
setTitle(title) {
- return { $set: { title }};
+ return { $set: { title } };
},
setDescription(description) {
- return { $set: { description }};
+ return { $set: { description } };
},
move(listId, sortIndex) {
@@ -207,11 +207,11 @@ Cards.mutations({
},
addLabel(labelId) {
- return { $addToSet: { labelIds: labelId }};
+ return { $addToSet: { labelIds: labelId } };
},
removeLabel(labelId) {
- return { $pull: { labelIds: labelId }};
+ return { $pull: { labelIds: labelId } };
},
toggleLabel(labelId) {
@@ -223,11 +223,11 @@ Cards.mutations({
},
assignMember(memberId) {
- return { $addToSet: { members: memberId }};
+ return { $addToSet: { members: memberId } };
},
unassignMember(memberId) {
- return { $pull: { members: memberId }};
+ return { $pull: { members: memberId } };
},
toggleMember(memberId) {
@@ -239,27 +239,27 @@ Cards.mutations({
},
setCover(coverId) {
- return { $set: { coverId }};
+ return { $set: { coverId } };
},
unsetCover() {
- return { $unset: { coverId: '' }};
+ return { $unset: { coverId: '' } };
},
setStart(startAt) {
- return { $set: { startAt }};
+ return { $set: { startAt } };
},
unsetStart() {
- return { $unset: { startAt: '' }};
+ return { $unset: { startAt: '' } };
},
setDue(dueAt) {
- return { $set: { dueAt }};
+ return { $set: { dueAt } };
},
unsetDue() {
- return { $unset: { dueAt: '' }};
+ return { $unset: { dueAt: '' } };
},
});
@@ -267,7 +267,7 @@ 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._collection._ensureIndex({ boardId: 1, createdAt: -1 });
});
Cards.after.insert((userId, doc) => {
@@ -304,7 +304,7 @@ if (Meteor.isServer) {
});
// New activity for card moves
- Cards.after.update(function(userId, doc, fieldNames) {
+ Cards.after.update(function (userId, doc, fieldNames) {
const oldListId = this.previous.listId;
if (_.contains(fieldNames, 'listId') && doc.listId !== oldListId) {
Activities.insert({
@@ -340,20 +340,97 @@ if (Meteor.isServer) {
// Say goodbye to the former member
if (modifier.$pull && modifier.$pull.members) {
memberId = modifier.$pull.members;
- Activities.insert({
- userId,
- memberId,
- activityType: 'unjoinMember',
- boardId: doc.boardId,
- cardId: doc._id,
- });
+ // Check that the former member is member of the card
+ if (_.contains(doc.members, memberId)) {
+ Activities.insert({
+ userId,
+ memberId,
+ activityType: 'unjoinMember',
+ boardId: doc.boardId,
+ cardId: doc._id,
+ });
+ }
}
});
// Remove all activities associated with a card if we remove the card
+ // Remove also card_comments / checklists / attachments
Cards.after.remove((userId, doc) => {
Activities.remove({
cardId: doc._id,
});
+ Checklists.remove({
+ cardId: doc._id,
+ });
+ CardComments.remove({
+ cardId: doc._id,
+ });
+ Attachments.remove({
+ cardId: doc._id,
+ });
+ });
+}
+//LISTS REST API
+if (Meteor.isServer) {
+ JsonRoutes.add('GET', '/api/boards/:boardId/lists/:listId/cards', function (req, res, next) {
+ const paramBoardId = req.params.boardId;
+ const paramListId = req.params.listId;
+ Authentication.checkBoardAccess( req.userId, paramBoardId);
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: Cards.find({ boardId: paramBoardId, listId: paramListId, archived: false }).map(function (doc) {
+ return {
+ _id: doc._id,
+ title: doc.title,
+ description: doc.description,
+ };
+ }),
+ });
+ });
+
+ JsonRoutes.add('GET', '/api/boards/:boardId/lists/:listId/cards/:cardId', function (req, res, next) {
+ const paramBoardId = req.params.boardId;
+ const paramListId = req.params.listId;
+ const paramCardId = req.params.cardId;
+ Authentication.checkBoardAccess( req.userId, paramBoardId);
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: Cards.findOne({ _id: paramCardId, listId: paramListId, boardId: paramBoardId, archived: false }),
+ });
+ });
+
+ JsonRoutes.add('POST', '/api/boards/:boardId/lists/:listId/cards', function (req, res, next) {
+ Authentication.checkUserId( req.userId);
+ const paramBoardId = req.params.boardId;
+ const paramListId = req.params.listId;
+ const id = Cards.insert({
+ title: req.body.title,
+ boardId: paramBoardId,
+ listId: paramListId,
+ description: req.body.description,
+ userId : req.body.authorId,
+ sort: 0,
+ members:[ req.body.authorId ],
+ });
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: id,
+ },
+ });
+ });
+
+ JsonRoutes.add('DELETE', '/api/boards/:boardId/lists/:listId/cards/:cardId', function (req, res, next) {
+ Authentication.checkUserId( req.userId);
+ const paramBoardId = req.params.boardId;
+ const paramListId = req.params.listId;
+ const paramCardId = req.params.cardId;
+ Cards.remove({ _id: paramCardId, listId: paramListId, boardId: paramBoardId });
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: paramCardId,
+ },
+ });
});
}
diff --git a/models/checklists.js b/models/checklists.js
index 35be4dcc..537aecb0 100644
--- a/models/checklists.js
+++ b/models/checklists.js
@@ -28,22 +28,29 @@ Checklists.attachSchema(new SimpleSchema({
createdAt: {
type: Date,
denyUpdate: false,
+ autoValue() { // eslint-disable-line consistent-return
+ if (this.isInsert) {
+ return new Date();
+ } else {
+ this.unset();
+ }
+ },
},
}));
Checklists.helpers({
- itemCount () {
+ itemCount() {
return this.items.length;
},
- finishedCount () {
+ finishedCount() {
return this.items.filter((item) => {
return item.isFinished;
}).length;
},
- isFinished () {
+ isFinished() {
return 0 !== this.itemCount() && this.itemCount() === this.finishedCount();
},
- getItem (_id) {
+ getItem(_id) {
return _.findWhere(this.items, { _id });
},
itemIndex(itemId) {
@@ -73,17 +80,17 @@ Checklists.before.insert((userId, doc) => {
Checklists.mutations({
//for checklist itself
- setTitle(title){
- return { $set: { title }};
+ 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}} };
+ return { $addToSet: { items: { _id, title, isFinished: false } } };
},
removeItem(itemId) {
- return {$pull: {items: {_id : itemId}}};
+ return { $pull: { items: { _id: itemId } } };
},
editItem(itemId, title) {
if (this.getItem(itemId)) {
@@ -133,6 +140,10 @@ Checklists.mutations({
});
if (Meteor.isServer) {
+ Meteor.startup(() => {
+ Checklists._collection._ensureIndex({ cardId: 1, createdAt: 1 });
+ });
+
Checklists.after.insert((userId, doc) => {
Activities.insert({
userId,
@@ -146,13 +157,13 @@ if (Meteor.isServer) {
//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,
- // });
+ // Activities.insert({
+ // userId,
+ // activityType: 'addChecklist',
+ // boardId: doc.boardId,
+ // cardId: doc.cardId,
+ // checklistId: doc._id,
+ // });
// });
Checklists.before.remove((userId, doc) => {
@@ -162,3 +173,66 @@ if (Meteor.isServer) {
}
});
}
+
+//CARD COMMENT REST API
+if (Meteor.isServer) {
+ JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/checklists', function (req, res, next) {
+ Authentication.checkUserId( req.userId);
+ const paramCardId = req.params.cardId;
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: Checklists.find({ cardId: paramCardId }).map(function (doc) {
+ return {
+ _id: doc._id,
+ title: doc.title,
+ };
+ }),
+ });
+ });
+
+ JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId', function (req, res, next) {
+ Authentication.checkUserId( req.userId);
+ const paramChecklistId = req.params.checklistId;
+ const paramCardId = req.params.cardId;
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: Checklists.findOne({ _id: paramChecklistId, cardId: paramCardId }),
+ });
+ });
+
+ JsonRoutes.add('POST', '/api/boards/:boardId/cards/:cardId/checklists', function (req, res, next) {
+ Authentication.checkUserId( req.userId);
+ const paramCardId = req.params.cardId;
+
+ const checklistToSend = {};
+ checklistToSend.cardId = paramCardId;
+ checklistToSend.title = req.body.title;
+ checklistToSend.items = [];
+ const id = Checklists.insert(checklistToSend);
+ const checklist = Checklists.findOne({_id: id});
+ req.body.items.forEach(function (item) {
+ checklist.addItem(item);
+ }, this);
+
+
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: id,
+ },
+ });
+ });
+
+ JsonRoutes.add('DELETE', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId', function (req, res, next) {
+ Authentication.checkUserId( req.userId);
+ const paramCommentId = req.params.commentId;
+ const paramCardId = req.params.cardId;
+ Checklists.remove({ _id: paramCommentId, cardId: paramCardId });
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: paramCardId,
+ },
+ });
+ });
+}
diff --git a/models/export.js b/models/export.js
index b774cf15..7a363dd3 100644
--- a/models/export.js
+++ b/models/export.js
@@ -1,5 +1,5 @@
/* global JsonRoutes */
-if(Meteor.isServer) {
+if (Meteor.isServer) {
// todo XXX once we have a real API in place, move that route there
// todo XXX also share the route definition between the client and the server
// so that we could use something like
@@ -14,28 +14,28 @@ if(Meteor.isServer) {
* See https://blog.kayla.com.au/server-side-route-authentication-in-meteor/
* for detailed explanations
*/
- JsonRoutes.add('get', '/api/boards/:boardId', function (req, res) {
- const boardId = req.params.boardId;
- let user = null;
- // todo XXX for real API, first look for token in Authentication: header
- // then fallback to parameter
- const loginToken = req.query.authToken;
- if (loginToken) {
- const hashToken = Accounts._hashLoginToken(loginToken);
- user = Meteor.users.findOne({
- 'services.resume.loginTokens.hashedToken': hashToken,
- });
- }
+ // JsonRoutes.add('get', '/api/boards/:boardId', function (req, res) {
+ // const boardId = req.params.boardId;
+ // let user = null;
+ // // todo XXX for real API, first look for token in Authentication: header
+ // // then fallback to parameter
+ // const loginToken = req.query.authToken;
+ // if (loginToken) {
+ // const hashToken = Accounts._hashLoginToken(loginToken);
+ // user = Meteor.users.findOne({
+ // 'services.resume.loginTokens.hashedToken': hashToken,
+ // });
+ // }
- const exporter = new Exporter(boardId);
- if(exporter.canExport(user)) {
- JsonRoutes.sendResult(res, 200, exporter.build());
- } else {
- // we could send an explicit error message, but on the other hand the only
- // way to get there is by hacking the UI so let's keep it raw.
- JsonRoutes.sendResult(res, 403);
- }
- });
+ // const exporter = new Exporter(boardId);
+ // if(exporter.canExport(user)) {
+ // JsonRoutes.sendResult(res, 200, exporter.build());
+ // } else {
+ // // we could send an explicit error message, but on the other hand the only
+ // // way to get there is by hacking the UI so let's keep it raw.
+ // JsonRoutes.sendResult(res, 403);
+ // }
+ // });
}
class Exporter {
@@ -44,13 +44,13 @@ class Exporter {
}
build() {
- const byBoard = {boardId: this._boardId};
+ const byBoard = { boardId: this._boardId };
// we do not want to retrieve boardId in related elements
- const noBoardId = {fields: {boardId: 0}};
+ const noBoardId = { fields: { boardId: 0 } };
const result = {
_format: 'wekan-board-1.0.0',
};
- _.extend(result, Boards.findOne(this._boardId, {fields: {stars: 0}}));
+ _.extend(result, Boards.findOne(this._boardId, { fields: { stars: 0 } }));
result.lists = Lists.find(byBoard, noBoardId).fetch();
result.cards = Cards.find(byBoard, noBoardId).fetch();
result.comments = CardComments.find(byBoard, noBoardId).fetch();
@@ -69,29 +69,31 @@ class Exporter {
// 1- only exports users that are linked somehow to that board
// 2- do not export any sensitive information
const users = {};
- result.members.forEach((member) => {users[member.userId] = true;});
- result.lists.forEach((list) => {users[list.userId] = true;});
+ result.members.forEach((member) => { users[member.userId] = true; });
+ result.lists.forEach((list) => { users[list.userId] = true; });
result.cards.forEach((card) => {
users[card.userId] = true;
if (card.members) {
- card.members.forEach((memberId) => {users[memberId] = true;});
+ card.members.forEach((memberId) => { users[memberId] = true; });
}
});
- result.comments.forEach((comment) => {users[comment.userId] = true;});
- result.activities.forEach((activity) => {users[activity.userId] = true;});
- const byUserIds = {_id: {$in: Object.getOwnPropertyNames(users)}};
+ result.comments.forEach((comment) => { users[comment.userId] = true; });
+ result.activities.forEach((activity) => { users[activity.userId] = true; });
+ const byUserIds = { _id: { $in: Object.getOwnPropertyNames(users) } };
// we use whitelist to be sure we do not expose inadvertently
// some secret fields that gets added to User later.
- const userFields = {fields: {
- _id: 1,
- username: 1,
- 'profile.fullname': 1,
- 'profile.initials': 1,
- 'profile.avatarUrl': 1,
- }};
+ const userFields = {
+ fields: {
+ _id: 1,
+ username: 1,
+ 'profile.fullname': 1,
+ 'profile.initials': 1,
+ 'profile.avatarUrl': 1,
+ },
+ };
result.users = Users.find(byUserIds, userFields).fetch().map((user) => {
// user avatar is stored as a relative url, we export absolute
- if(user.profile.avatarUrl) {
+ if (user.profile.avatarUrl) {
user.profile.avatarUrl = FlowRouter.url(user.profile.avatarUrl);
}
return user;
diff --git a/models/import.js b/models/import.js
index 86ef75b3..4e78c53a 100644
--- a/models/import.js
+++ b/models/import.js
@@ -25,6 +25,8 @@ class TrelloCreator {
this.labels = {};
// Map of lists Trello ID => Wekan ID
this.lists = {};
+ // Map of cards Trello ID => Wekan ID
+ this.cards = {};
// The comments, indexed by Trello card id (to map when importing cards)
this.comments = {};
// the members, indexed by Trello member id => Wekan user ID
@@ -119,6 +121,18 @@ class TrelloCreator {
})]);
}
+ checkChecklists(trelloChecklists) {
+ check(trelloChecklists, [Match.ObjectIncluding({
+ idBoard: String,
+ idCard: String,
+ name: String,
+ checkItems: [Match.ObjectIncluding({
+ state: String,
+ name: String,
+ })],
+ })]);
+ }
+
// You must call parseActions before calling this one.
createBoardAndLabels(trelloBoard) {
const boardToCreate = {
@@ -131,6 +145,7 @@ class TrelloCreator {
userId: Meteor.userId(),
isAdmin: true,
isActive: true,
+ isCommentOnly: false,
}],
permission: this.getPermission(trelloBoard.prefs.permissionLevel),
slug: getSlug(trelloBoard.name) || 'board',
@@ -156,6 +171,7 @@ class TrelloCreator {
userId: wekanId,
isAdmin: this.getAdmin(trelloMembership.memberType),
isActive: true,
+ isCommentOnly: false,
});
}
}
@@ -241,6 +257,8 @@ class TrelloCreator {
}
// insert card
const cardId = Cards.direct.insert(cardToCreate);
+ // keep track of Trello id => WeKan id
+ this.cards[card.id] = cardId;
// log activity
Activities.direct.insert({
activityType: 'importCard',
@@ -280,7 +298,7 @@ class TrelloCreator {
createdAt: this._now(commentToCreate.createdAt),
// we attribute the addComment (not the import)
// to the original author - it is needed by some UI elements.
- userId: commentToCreate.userId,
+ userId: this._user(commentToCreate.userId),
});
});
}
@@ -365,6 +383,28 @@ class TrelloCreator {
});
}
+ createChecklists(trelloChecklists) {
+ trelloChecklists.forEach((checklist) => {
+ // Create the checklist
+ const checklistToCreate = {
+ cardId: this.cards[checklist.idCard],
+ title: checklist.name,
+ createdAt: this._now(),
+ };
+ const checklistId = Checklists.direct.insert(checklistToCreate);
+ // Now add the items to the checklist
+ const itemsToCreate = [];
+ checklist.checkItems.forEach((item) => {
+ itemsToCreate.push({
+ _id: checklistId + itemsToCreate.length,
+ title: item.name,
+ isFinished: item.state === 'complete',
+ });
+ });
+ Checklists.direct.update(checklistId, {$set: {items: itemsToCreate}});
+ });
+ }
+
getAdmin(trelloMemberType) {
return trelloMemberType === 'admin';
}
@@ -446,6 +486,7 @@ Meteor.methods({
trelloCreator.checkLabels(trelloBoard.labels);
trelloCreator.checkLists(trelloBoard.lists);
trelloCreator.checkCards(trelloBoard.cards);
+ trelloCreator.checkChecklists(trelloBoard.checklists);
} catch (e) {
throw new Meteor.Error('error-json-schema');
}
@@ -458,6 +499,7 @@ Meteor.methods({
const boardId = trelloCreator.createBoardAndLabels(trelloBoard);
trelloCreator.createLists(trelloBoard.lists, boardId);
trelloCreator.createCards(trelloBoard.cards, boardId);
+ trelloCreator.createChecklists(trelloBoard.checklists);
// XXX add members
return boardId;
},
diff --git a/models/invitationCodes.js b/models/invitationCodes.js
new file mode 100644
index 00000000..5761977a
--- /dev/null
+++ b/models/invitationCodes.js
@@ -0,0 +1,45 @@
+InvitationCodes = new Mongo.Collection('invitation_codes');
+
+InvitationCodes.attachSchema(new SimpleSchema({
+ code: {
+ type: String,
+ },
+ email: {
+ type: String,
+ unique: true,
+ regEx: SimpleSchema.RegEx.Email,
+ },
+ createdAt: {
+ type: Date,
+ denyUpdate: false,
+ },
+ // always be the admin if only one admin
+ authorId: {
+ type: String,
+ },
+ boardsToBeInvited: {
+ type: [String],
+ optional: true,
+ },
+ valid: {
+ type: Boolean,
+ defaultValue: true,
+ },
+}));
+
+InvitationCodes.helpers({
+ author(){
+ return Users.findOne(this.authorId);
+ },
+});
+
+// InvitationCodes.before.insert((userId, doc) => {
+ // doc.createdAt = new Date();
+ // doc.authorId = userId;
+// });
+
+if (Meteor.isServer) {
+ Boards.deny({
+ fetch: ['members'],
+ });
+}
diff --git a/models/lists.js b/models/lists.js
index 682fb096..d9a5b8e2 100644
--- a/models/lists.js
+++ b/models/lists.js
@@ -46,13 +46,13 @@ Lists.attachSchema(new SimpleSchema({
Lists.allow({
insert(userId, doc) {
- return allowIsBoardMember(userId, Boards.findOne(doc.boardId));
+ return allowIsBoardMemberNonComment(userId, Boards.findOne(doc.boardId));
},
update(userId, doc) {
- return allowIsBoardMember(userId, Boards.findOne(doc.boardId));
+ return allowIsBoardMemberNonComment(userId, Boards.findOne(doc.boardId));
},
remove(userId, doc) {
- return allowIsBoardMember(userId, Boards.findOne(doc.boardId));
+ return allowIsBoardMemberNonComment(userId, Boards.findOne(doc.boardId));
},
fetch: ['boardId'],
});
@@ -76,15 +76,15 @@ Lists.helpers({
Lists.mutations({
rename(title) {
- return { $set: { title }};
+ return { $set: { title } };
},
archive() {
- return { $set: { archived: true }};
+ return { $set: { archived: true } };
},
restore() {
- return { $set: { archived: false }};
+ return { $set: { archived: false } };
},
});
@@ -128,3 +128,60 @@ if (Meteor.isServer) {
}
});
}
+
+//LISTS REST API
+if (Meteor.isServer) {
+ JsonRoutes.add('GET', '/api/boards/:boardId/lists', function (req, res, next) {
+ const paramBoardId = req.params.boardId;
+ Authentication.checkBoardAccess( req.userId, paramBoardId);
+
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: Lists.find({ boardId: paramBoardId, archived: false }).map(function (doc) {
+ return {
+ _id: doc._id,
+ title: doc.title,
+ };
+ }),
+ });
+ });
+
+ JsonRoutes.add('GET', '/api/boards/:boardId/lists/:listId', function (req, res, next) {
+ const paramBoardId = req.params.boardId;
+ const paramListId = req.params.listId;
+ Authentication.checkBoardAccess( req.userId, paramBoardId);
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: Lists.findOne({ _id: paramListId, boardId: paramBoardId, archived: false }),
+ });
+ });
+
+ JsonRoutes.add('POST', '/api/boards/:boardId/lists', function (req, res, next) {
+ Authentication.checkUserId( req.userId);
+ const paramBoardId = req.params.boardId;
+ const id = Lists.insert({
+ title: req.body.title,
+ boardId: paramBoardId,
+ });
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: id,
+ },
+ });
+ });
+
+ JsonRoutes.add('DELETE', '/api/boards/:boardId/lists/:listId', function (req, res, next) {
+ Authentication.checkUserId( req.userId);
+ const paramBoardId = req.params.boardId;
+ const paramListId = req.params.listId;
+ Lists.remove({ _id: paramListId, boardId: paramBoardId });
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: paramListId,
+ },
+ });
+ });
+
+}
diff --git a/models/settings.js b/models/settings.js
new file mode 100644
index 00000000..e9dce26d
--- /dev/null
+++ b/models/settings.js
@@ -0,0 +1,145 @@
+Settings = new Mongo.Collection('settings');
+
+Settings.attachSchema(new SimpleSchema({
+ disableRegistration: {
+ type: Boolean,
+ },
+ 'mailServer.username': {
+ type: String,
+ optional: true,
+ },
+ 'mailServer.password': {
+ type: String,
+ optional: true,
+ },
+ 'mailServer.host': {
+ type: String,
+ optional: true,
+ },
+ 'mailServer.port': {
+ type: String,
+ optional: true,
+ },
+ 'mailServer.enableTLS': {
+ type: Boolean,
+ optional: true,
+ },
+ 'mailServer.from': {
+ type: String,
+ optional: true,
+ },
+ createdAt: {
+ type: Date,
+ denyUpdate: true,
+ },
+ modifiedAt: {
+ type: Date,
+ },
+}));
+Settings.helpers({
+ mailUrl () {
+ if (!this.mailServer.host) {
+ return null;
+ }
+ const protocol = this.mailServer.enableTLS ? 'smtps://' : 'smtp://';
+ if (!this.mailServer.username && !this.mailServer.password) {
+ return `${protocol}${this.mailServer.host}:${this.mailServer.port}/`;
+ }
+ return `${protocol}${this.mailServer.username}:${this.mailServer.password}@${this.mailServer.host}:${this.mailServer.port}/`;
+ },
+});
+Settings.allow({
+ update(userId) {
+ const user = Users.findOne(userId);
+ return user && user.isAdmin;
+ },
+});
+
+Settings.before.update((userId, doc, fieldNames, modifier) => {
+ modifier.$set = modifier.$set || {};
+ modifier.$set.modifiedAt = new Date();
+});
+
+if (Meteor.isServer) {
+ Meteor.startup(() => {
+ const setting = Settings.findOne({});
+ if(!setting){
+ const now = new Date();
+ const domain = process.env.ROOT_URL.match(/\/\/(?:www\.)?(.*)?(?:\/)?/)[1];
+ const from = `Wekan <wekan@${domain}>`;
+ const defaultSetting = {disableRegistration: false, mailServer: {
+ username: '', password: '', host: '', port: '', enableTLS: false, from,
+ }, createdAt: now, modifiedAt: now};
+ Settings.insert(defaultSetting);
+ }
+ const newSetting = Settings.findOne();
+ if (!process.env.MAIL_URL && newSetting.mailUrl())
+ process.env.MAIL_URL = newSetting.mailUrl();
+ Accounts.emailTemplates.from = process.env.MAIL_FROM ? process.env.MAIL_FROM : newSetting.mailServer.from;
+ });
+ Settings.after.update((userId, doc, fieldNames) => {
+ // assign new values to mail-from & MAIL_URL in environment
+ if (_.contains(fieldNames, 'mailServer') && doc.mailServer.host) {
+ const protocol = doc.mailServer.enableTLS ? 'smtps://' : 'smtp://';
+ if (!doc.mailServer.username && !doc.mailServer.password) {
+ process.env.MAIL_URL = `${protocol}${doc.mailServer.host}:${doc.mailServer.port}/`;
+ } else {
+ process.env.MAIL_URL = `${protocol}${doc.mailServer.username}:${doc.mailServer.password}@${doc.mailServer.host}:${doc.mailServer.port}/`;
+ }
+ Accounts.emailTemplates.from = doc.mailServer.from;
+ }
+ });
+
+ function getRandomNum (min, max) {
+ const range = max - min;
+ const rand = Math.random();
+ return (min + Math.round(rand * range));
+ }
+
+ function sendInvitationEmail (_id){
+ const icode = InvitationCodes.findOne(_id);
+ const author = Users.findOne(Meteor.userId());
+ try {
+ const params = {
+ email: icode.email,
+ inviter: Users.findOne(icode.authorId).username,
+ user: icode.email.split('@')[0],
+ icode: icode.code,
+ url: FlowRouter.url('sign-up'),
+ };
+ const lang = author.getLanguage();
+ Email.send({
+ to: icode.email,
+ from: Accounts.emailTemplates.from,
+ subject: TAPi18n.__('email-invite-register-subject', params, lang),
+ text: TAPi18n.__('email-invite-register-text', params, lang),
+ });
+ } catch (e) {
+ InvitationCodes.remove(_id);
+ throw new Meteor.Error('email-fail', e.message);
+ }
+ }
+
+ Meteor.methods({
+ sendInvitation(emails, boards) {
+ check(emails, [String]);
+ check(boards, [String]);
+ const user = Users.findOne(Meteor.userId());
+ if(!user.isAdmin){
+ throw new Meteor.Error('not-allowed');
+ }
+ emails.forEach((email) => {
+ if (email && SimpleSchema.RegEx.Email.test(email)) {
+ const code = getRandomNum(100000, 999999);
+ InvitationCodes.insert({code, email, boardsToBeInvited: boards, createdAt: new Date(), authorId: Meteor.userId()}, function(err, _id){
+ if (!err && _id) {
+ sendInvitationEmail(_id);
+ } else {
+ throw new Meteor.Error('invitation-generated-fail', err.message);
+ }
+ });
+ }
+ });
+ },
+ });
+}
diff --git a/models/unsavedEdits.js b/models/unsavedEdits.js
index 25952fb5..d4f3616a 100644
--- a/models/unsavedEdits.js
+++ b/models/unsavedEdits.js
@@ -26,6 +26,9 @@ if (Meteor.isServer) {
function isAuthor(userId, doc, fieldNames = []) {
return userId === doc.userId && fieldNames.indexOf('userId') === -1;
}
+ Meteor.startup(() => {
+ UnsavedEditCollection._collection._ensureIndex({ userId: 1 });
+ });
UnsavedEditCollection.allow({
insert: isAuthor,
update: isAuthor,
diff --git a/models/users.js b/models/users.js
index 58513231..29504aa8 100644
--- a/models/users.js
+++ b/models/users.js
@@ -1,7 +1,7 @@
// Sandstorm context is detected using the METEOR_SETTINGS environment variable
// in the package definition.
const isSandstorm = Meteor.settings && Meteor.settings.public &&
- Meteor.settings.public.sandstorm;
+ Meteor.settings.public.sandstorm;
Users = Meteor.users;
Users.attachSchema(new SimpleSchema({
@@ -91,6 +91,10 @@ Users.attachSchema(new SimpleSchema({
type: [String],
optional: true,
},
+ 'profile.icode': {
+ type: String,
+ optional: true,
+ },
services: {
type: Object,
optional: true,
@@ -100,6 +104,10 @@ Users.attachSchema(new SimpleSchema({
type: Date,
optional: true,
},
+ isAdmin: {
+ type: Boolean,
+ optional: true,
+ },
}));
// Search a user in the complete server database by its name or username. This
@@ -117,6 +125,16 @@ if (Meteor.isClient) {
return board && board.hasMember(this._id);
},
+ isNotCommentOnly() {
+ const board = Boards.findOne(Session.get('currentBoard'));
+ return board && board.hasMember(this._id) && !board.hasCommentOnly(this._id);
+ },
+
+ isCommentOnly() {
+ const board = Boards.findOne(Session.get('currentBoard'));
+ return board && board.hasCommentOnly(this._id);
+ },
+
isBoardAdmin() {
const board = Boards.findOne(Session.get('currentBoard'));
return board && board.hasAdmin(this._id);
@@ -130,32 +148,32 @@ Users.helpers({
},
starredBoards() {
- const {starredBoards = []} = this.profile;
- return Boards.find({archived: false, _id: {$in: starredBoards}});
+ const { starredBoards = [] } = this.profile;
+ return Boards.find({ archived: false, _id: { $in: starredBoards } });
},
hasStarred(boardId) {
- const {starredBoards = []} = this.profile;
+ const { starredBoards = [] } = this.profile;
return _.contains(starredBoards, boardId);
},
invitedBoards() {
- const {invitedBoards = []} = this.profile;
- return Boards.find({archived: false, _id: {$in: invitedBoards}});
+ const { invitedBoards = [] } = this.profile;
+ return Boards.find({ archived: false, _id: { $in: invitedBoards } });
},
isInvitedTo(boardId) {
- const {invitedBoards = []} = this.profile;
+ const { invitedBoards = [] } = this.profile;
return _.contains(invitedBoards, boardId);
},
hasTag(tag) {
- const {tags = []} = this.profile;
+ const { tags = [] } = this.profile;
return _.contains(tags, tag);
},
hasNotification(activityId) {
- const {notifications = []} = this.profile;
+ const { notifications = [] } = this.profile;
return _.contains(notifications, activityId);
},
@@ -165,7 +183,7 @@ Users.helpers({
},
getEmailBuffer() {
- const {emailBuffer = []} = this.profile;
+ const { emailBuffer = [] } = this.profile;
return emailBuffer;
},
@@ -290,7 +308,7 @@ Users.mutations({
},
setAvatarUrl(avatarUrl) {
- return { $set: { 'profile.avatarUrl': avatarUrl }};
+ return { $set: { 'profile.avatarUrl': avatarUrl } };
},
setShowCardsCountAt(limit) {
@@ -305,7 +323,7 @@ Meteor.methods({
if (nUsersWithUsername > 0) {
throw new Meteor.Error('username-already-taken');
} else {
- Users.update(this.userId, {$set: { username }});
+ Users.update(this.userId, { $set: { username } });
}
},
toggleSystemMessages() {
@@ -328,19 +346,19 @@ if (Meteor.isServer) {
const inviter = Meteor.user();
const board = Boards.findOne(boardId);
const allowInvite = inviter &&
- board &&
- board.members &&
- _.contains(_.pluck(board.members, 'userId'), inviter._id) &&
- _.where(board.members, {userId: inviter._id})[0].isActive &&
- _.where(board.members, {userId: inviter._id})[0].isAdmin;
+ board &&
+ board.members &&
+ _.contains(_.pluck(board.members, 'userId'), inviter._id) &&
+ _.where(board.members, { userId: inviter._id })[0].isActive &&
+ _.where(board.members, { userId: inviter._id })[0].isAdmin;
if (!allowInvite) throw new Meteor.Error('error-board-notAMember');
this.unblock();
const posAt = username.indexOf('@');
let user = null;
- if (posAt>=0) {
- user = Users.findOne({emails: {$elemMatch: {address: username}}});
+ if (posAt >= 0) {
+ user = Users.findOne({ emails: { $elemMatch: { address: username } } });
} else {
user = Users.findOne(username) || Users.findOne({ username });
}
@@ -348,8 +366,9 @@ if (Meteor.isServer) {
if (user._id === inviter._id) throw new Meteor.Error('error-user-notAllowSelf');
} else {
if (posAt <= 0) throw new Meteor.Error('error-user-doesNotExist');
-
- const email = username;
+ if (Settings.findOne().disableRegistration) throw new Meteor.Error('error-user-notCreated');
+ // Set in lowercase email before creating account
+ const email = username.toLowerCase();
username = email.substring(0, posAt);
const newUserId = Accounts.createUser({ username, email });
if (!newUserId) throw new Meteor.Error('error-user-notCreated');
@@ -377,7 +396,7 @@ if (Meteor.isServer) {
};
const lang = user.getLanguage();
Email.send({
- to: user.emails[0].address,
+ to: user.emails[0].address.toLowerCase(),
from: Accounts.emailTemplates.from,
subject: TAPi18n.__('email-invite-subject', params, lang),
text: TAPi18n.__('email-invite-text', params, lang),
@@ -385,10 +404,32 @@ if (Meteor.isServer) {
} catch (e) {
throw new Meteor.Error('email-fail', e.message);
}
-
return { username: user.username, email: user.emails[0].address };
},
});
+ Accounts.onCreateUser((options, user) => {
+ const userCount = Users.find().count();
+ if (!isSandstorm && userCount === 0) {
+ user.isAdmin = true;
+ return user;
+ }
+ const disableRegistration = Settings.findOne().disableRegistration;
+ if (!disableRegistration) {
+ return user;
+ }
+
+ if (!options || !options.profile) {
+ throw new Meteor.Error('error-invitation-code-blank', 'The invitation code is required');
+ }
+ const invitationCode = InvitationCodes.findOne({ code: options.profile.invitationcode, email: options.email, valid: true });
+ if (!invitationCode) {
+ throw new Meteor.Error('error-invitation-code-not-exist', 'The invitation code doesn\'t exist');
+ } else {
+ user.profile = { icode: options.profile.invitationcode };
+ }
+
+ return user;
+ });
}
if (Meteor.isServer) {
@@ -404,7 +445,7 @@ if (Meteor.isServer) {
// counter.
// We need to run this code on the server only, otherwise the incrementation
// will be done twice.
- Users.after.update(function(userId, user, fieldNames) {
+ Users.after.update(function (userId, user, fieldNames) {
// The `starredBoards` list is hosted on the `profile` field. If this
// field hasn't been modificated we don't need to run this hook.
if (!_.contains(fieldNames, 'profile'))
@@ -423,7 +464,7 @@ if (Meteor.isServer) {
// direction and then in the other.
function incrementBoards(boardsIds, inc) {
boardsIds.forEach((boardId) => {
- Boards.update(boardId, {$inc: {stars: inc}});
+ Boards.update(boardId, { $inc: { stars: inc } });
});
}
incrementBoards(_.difference(oldIds, newIds), -1);
@@ -458,4 +499,87 @@ if (Meteor.isServer) {
});
});
}
+
+ Users.after.insert((userId, doc) => {
+
+ //invite user to corresponding boards
+ const disableRegistration = Settings.findOne().disableRegistration;
+ if (disableRegistration) {
+ const invitationCode = InvitationCodes.findOne({ code: doc.profile.icode, valid: true });
+ if (!invitationCode) {
+ throw new Meteor.Error('error-invitation-code-not-exist');
+ } else {
+ invitationCode.boardsToBeInvited.forEach((boardId) => {
+ const board = Boards.findOne(boardId);
+ board.addMember(doc._id);
+ });
+ if (!doc.profile) {
+ doc.profile = {};
+ }
+ doc.profile.invitedBoards = invitationCode.boardsToBeInvited;
+ Users.update(doc._id, { $set: { profile: doc.profile } });
+ InvitationCodes.update(invitationCode._id, { $set: { valid: false } });
+ }
+ }
+ });
}
+
+
+// USERS REST API
+if (Meteor.isServer) {
+ JsonRoutes.add('GET', '/api/user', function(req, res, next) {
+ Authentication.checkLoggedIn(req.userId);
+ const data = Meteor.users.findOne({ _id: req.userId});
+ delete data.services;
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data,
+ });
+ });
+
+ JsonRoutes.add('GET', '/api/users', function (req, res, next) {
+ Authentication.checkUserId( req.userId);
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: Meteor.users.find({}).map(function (doc) {
+ return { _id: doc._id, username: doc.username };
+ }),
+ });
+ });
+ JsonRoutes.add('GET', '/api/users/:id', function (req, res, next) {
+ Authentication.checkUserId( req.userId);
+ const id = req.params.id;
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: Meteor.users.findOne({ _id: id }),
+ });
+ });
+ JsonRoutes.add('POST', '/api/users/', function (req, res, next) {
+ Authentication.checkUserId( req.userId);
+ const id = Accounts.createUser({
+ username: req.body.username,
+ email: req.body.email,
+ password: 'default',
+ });
+
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: id,
+ },
+ });
+ });
+
+ JsonRoutes.add('DELETE', '/api/users/:id', function (req, res, next) {
+ Authentication.checkUserId( req.userId);
+ const id = req.params.id;
+ Meteor.users.remove({ _id: id });
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: id,
+ },
+ });
+ });
+}
+
diff --git a/package.json b/package.json
index facbda35..58b647e3 100644
--- a/package.json
+++ b/package.json
@@ -1,25 +1,35 @@
{
"name": "wekan",
- "version": "0.11.0",
+ "version": "0.23.0",
"description": "The open-source Trello-like kanban",
"private": true,
"scripts": {
- "lint": "eslint .",
+ "lint": "eslint --ignore-pattern 'packages/*' .",
"test": "npm run --silent lint"
},
+ "eslintConfig": {
+ "extends": "@meteorjs/eslint-config-meteor"
+ },
"repository": {
"type": "git",
- "url": "git+https://github.com/wefork/wekan.git"
+ "url": "git+https://github.com/wekan/wekan.git"
},
"license": "MIT",
"bugs": {
- "url": "https://github.com/wefork/wekan/issues"
+ "url": "https://github.com/wekan/wekan/issues"
},
- "homepage": "https://github.com/wefork/wekan",
+ "homepage": "https://wekan.github.io",
"devDependencies": {
"eslint": "^2.0.0"
},
"dependencies": {
- "xss": "^0.2.13"
+ "babel-runtime": "^6.23.0",
+ "bcrypt": "^1.0.2",
+ "bson": "^1.0.4",
+ "es6-promise": "^4.1.0",
+ "meteor-node-stubs": "^0.2.6",
+ "winston": "^2.3.1",
+ "winston-zulip": "0.0.6",
+ "xss": "^0.3.3"
}
}
diff --git a/packages/kadira:flow-router b/packages/kadira:flow-router
new file mode 160000
+Subproject da8154738eddfe43a639bd6b5f400518a4142db
diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp
index b70b3be6..578d8e90 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 = 17,
+ appVersion = 20,
# Increment this for every release.
- appMarketingVersion = (defaultText = "0.11.0~2016-11-28"),
+ appMarketingVersion = (defaultText = "0.18.0~2017-04-02"),
# Human-readable presentation of the app version.
minUpgradableAppVersion = 0,
@@ -57,8 +57,8 @@ const pkgdef :Spk.PackageDefinition = (
market = (svg = embed "meta/icons/wekan-150.svg"),
),
- website = "https://wekan.io",
- codeUrl = "https://github.com/wefork/wekan",
+ website = "https://wekan.github.io",
+ codeUrl = "https://github.com/wekan/wekan",
license = (openSource = mit),
categories = [productivity, office],
@@ -76,11 +76,15 @@ const pkgdef :Spk.PackageDefinition = (
screenshots = [
(
- width = 512,
- height = 330,
- jpeg = embed "meta/screenshots/board-view.jpg"
+ width = 1920,
+ height = 1133,
+ png = embed "meta/screenshots/board_view_01.png"
+ ),
+ (
+ width = 1920,
+ height = 1133,
+ png = embed "meta/screenshots/board_view_02.png"
),
- # XXX The screenshots should have a standard width and height.
],
changeLog = (
diff --git a/sandstorm.js b/sandstorm.js
index 3e04d79f..2e79c27c 100644
--- a/sandstorm.js
+++ b/sandstorm.js
@@ -205,7 +205,8 @@ if (isSandstorm && Meteor.isServer) {
function updateUserPermissions(userId, permissions) {
const isActive = permissions.indexOf('participate') > -1;
const isAdmin = permissions.indexOf('configure') > -1;
- const permissionDoc = { userId, isActive, isAdmin };
+ const isCommentOnly = false;
+ const permissionDoc = { userId, isActive, isAdmin, isCommentOnly };
const boardMembers = Boards.findOne(sandstormBoard._id).members;
const memberIndex = _.pluck(boardMembers, 'userId').indexOf(userId);
diff --git a/server/authentication.js b/server/authentication.js
new file mode 100644
index 00000000..23ed8f56
--- /dev/null
+++ b/server/authentication.js
@@ -0,0 +1,52 @@
+Meteor.startup(() => {
+ Authentication = {};
+
+ Authentication.checkUserId = function (userId) {
+ if (userId === undefined) {
+ const error = new Meteor.Error('Unauthorized', 'Unauthorized');
+ error.statusCode = 401;
+ throw error;
+ }
+ const admin = Users.findOne({ _id: userId, isAdmin: true });
+
+ if (admin === undefined) {
+ const error = new Meteor.Error('Forbidden', 'Forbidden');
+ error.statusCode = 403;
+ throw error;
+ }
+
+ };
+
+ // This will only check if the user is logged in.
+ // The authorization checks for the user will have to be done inside each API endpoint
+ Authentication.checkLoggedIn = function(userId) {
+ if(userId === undefined) {
+ const error = new Meteor.Error('Unauthorized', 'Unauthorized');
+ error.statusCode = 401;
+ throw error;
+ }
+ };
+
+ // An admin should be authorized to access everything, so we use a separate check for admins
+ // This throws an error if otherReq is false and the user is not an admin
+ Authentication.checkAdminOrCondition = function(userId, otherReq) {
+ if(otherReq) return;
+ const admin = Users.findOne({ _id: userId, isAdmin: true });
+ if (admin === undefined) {
+ const error = new Meteor.Error('Forbidden', 'Forbidden');
+ error.statusCode = 403;
+ throw error;
+ }
+ };
+
+ // Helper function. Will throw an error if the user does not have read only access to the given board
+ Authentication.checkBoardAccess = function(userId, boardId) {
+ Authentication.checkLoggedIn(userId);
+
+ const board = Boards.findOne({ _id: boardId });
+ const normalAccess = board.permission === 'public' || board.members.some((e) => e.userId === userId);
+ Authentication.checkAdminOrCondition(userId, normalAccess);
+ };
+
+});
+
diff --git a/server/lib/utils.js b/server/lib/utils.js
index bc3807bb..c7763933 100644
--- a/server/lib/utils.js
+++ b/server/lib/utils.js
@@ -6,6 +6,10 @@ allowIsBoardMember = function(userId, board) {
return board && board.hasMember(userId);
};
+allowIsBoardMemberNonComment = function(userId, board) {
+ return board && board.hasMember(userId) && !board.hasCommentOnly(userId);
+};
+
allowIsBoardMemberByCard = function(userId, card) {
const board = card.board();
return board && board.hasMember(userId);
diff --git a/server/logger.js b/server/logger.js
new file mode 100644
index 00000000..70caa292
--- /dev/null
+++ b/server/logger.js
@@ -0,0 +1,66 @@
+Meteor.startup(() => {
+ Winston = require('winston');
+ require('winston-zulip');
+ const fs = require('fs');
+
+ const loggerEnable = process.env.LOGGER_ENABLE || false;
+ if (loggerEnable) {
+
+ Winston.log('info', 'logger is enable');
+ const loggers = process.env.LOGGERS.split(',') || 'console';
+ Winston.log('info', `Loggers selected : ${ process.env.LOGGERS }, if empty default is console`);
+
+ if (loggers.includes('console')) {
+ Winston.add(Winston.transports.Console, {
+ json: true,
+ timestamp: true,
+ });
+ } else {
+ //remove default logger
+ Winston.remove(Winston.transports.Console);
+ }
+
+ if (loggers.includes('file')) {
+ //create logs directory
+ fs.mkdir('logs', (err) => {
+ if (err) throw err;
+ });
+
+ const fileName = `logs/${process.env.LOGGER_FILE_NAME}` || 'logs/server.log';
+
+ Winston.add(Winston.transports.File, {
+ filename: fileName,
+ json: true,
+ options: {
+ flags: 'a+',
+ },
+ });
+ }
+
+ if (loggers.includes('zulip')) {
+ const loggerZulipUsername = process.env.LOGGER_ZULIP_USERNAME;
+ const loggerZulipApikey = process.env.LOGGER_ZULIP_APIKEY;
+ const loggerZulipRealm = process.env.LOGGER_ZULIP_REALM;
+ const loggerZulipTo = process.env.LOGGER_ZULIP_TO || 'logs';
+ const loggerZulipSubject = process.env.LOGGER_ZULIP_SUBJECT || 'wekan';
+
+ const zulipConfig = {
+ zulipUsername: loggerZulipUsername,
+ zulipApikey: loggerZulipApikey,
+ zulipRealm: loggerZulipRealm,
+ zulipTo: loggerZulipTo,
+ zulipSubject: loggerZulipSubject,
+ };
+
+ Winston.add(Winston.transports.Zulip, zulipConfig);
+
+ Winston.log('info', `zulipconfig ${zulipConfig}`);
+ }
+
+ } else {
+ //remove default logger
+ Winston.remove(Winston.transports.Console);
+ }
+ Winston.log('info', 'Logger is completly instanciate');
+});
+
diff --git a/server/notifications/email.js b/server/notifications/email.js
index 551d2923..2af6381e 100644
--- a/server/notifications/email.js
+++ b/server/notifications/email.js
@@ -28,7 +28,7 @@ Meteor.startup(() => {
try {
Email.send({
- to: user.emails[0].address,
+ to: user.emails[0].address.toLowerCase(),
from: Accounts.emailTemplates.from,
subject: TAPi18n.__('act-activity-notify', {}, user.getLanguage()),
text,
diff --git a/server/observableChanges.js b/server/observableChanges.js
new file mode 100644
index 00000000..390ae093
--- /dev/null
+++ b/server/observableChanges.js
@@ -0,0 +1,100 @@
+class Message {
+ constructor(userId, type, method, doc, selector, fieldNames, modifier) {
+ this.userId = userId;
+ this.type = type;
+ this.method = method;
+ this.doc = doc;
+ this.selector;
+ this.fieldNames = fieldNames;
+ this.modifier = modifier;
+ }
+
+}
+
+//------------- CARDS --------------------
+Cards.before.update(function (userId, doc, fieldNames, modifier, options) {
+ Winston.log('info', new Message(userId, 'card', 'update', doc, null, fieldNames, modifier));
+});
+
+Cards.before.remove(function (userId, doc) {
+ Winston.log('info', new Message(userId, 'card', 'remove', doc));
+});
+
+Cards.before.insert(function (userId, doc) {
+ Winston.log('info', new Message(userId, 'card', 'insert', doc));
+});
+
+Cards.before.upsert(function (userId, selector, modifier, options) {
+ Winston.log('info', new Message(userId, 'card', 'update', null, selector, null, modifier));
+});
+
+
+//------------- BOARDS --------------------
+Boards.before.update(function (userId, doc, fieldNames, modifier, options) {
+ Winston.log('info', new Message(userId, 'board', 'update', doc, null, fieldNames, modifier));
+});
+
+Boards.before.remove(function (userId, doc) {
+ Winston.log('info', new Message(userId, 'board', 'remove', doc));
+});
+
+Boards.before.insert(function (userId, doc) {
+ Winston.log('info', new Message(userId, 'board', 'insert', doc));
+});
+
+Boards.before.upsert(function (userId, selector, modifier, options) {
+ Winston.log('info', new Message(userId, 'board', 'update', null, selector, null, modifier));
+});
+
+//------------- LISTS --------------------
+Lists.before.update(function (userId, doc, fieldNames, modifier, options) {
+ Winston.log('info', new Message(userId, 'list', 'update', doc, null, fieldNames, modifier));
+});
+
+Lists.before.remove(function (userId, doc) {
+ Winston.log('info', new Message(userId, 'list', 'remove', doc));
+});
+
+Lists.before.insert(function (userId, doc) {
+ Winston.log('info', new Message(userId, 'list', 'insert', doc));
+});
+
+Lists.before.upsert(function (userId, selector, modifier, options) {
+ Winston.log('info', new Message(userId, 'list', 'update', null, selector, null, modifier));
+});
+
+
+//------------- CARD COMMENTS --------------------
+CardComments.before.update(function (userId, doc, fieldNames, modifier, options) {
+ Winston.log('info', new Message(userId, 'card-comments', 'update', doc, null, fieldNames, modifier));
+});
+
+CardComments.before.remove(function (userId, doc) {
+ Winston.log('info', new Message(userId, 'card-comments', 'remove', doc));
+});
+
+CardComments.before.insert(function (userId, doc) {
+ Winston.log('info', new Message(userId, 'card-comments', 'insert', doc));
+});
+
+CardComments.before.upsert(function (userId, selector, modifier, options) {
+ Winston.log('info', new Message(userId, 'card-comments', 'update', null, selector, null, modifier));
+});
+
+
+//------------- USERS --------------------
+Users.before.update(function (userId, doc, fieldNames, modifier, options) {
+ Winston.log('info', new Message(userId, 'user', 'update', doc, null, fieldNames, modifier));
+});
+
+Users.before.remove(function (userId, doc) {
+ Winston.log('info', new Message(userId, 'user', 'remove', doc));
+});
+
+Users.before.insert(function (userId, doc) {
+ Winston.log('info', new Message(userId, 'user', 'insert', doc));
+});
+
+Users.before.upsert(function (userId, selector, modifier, options) {
+ Winston.log('info', new Message(userId, 'user', 'update', null, selector, null, modifier));
+});
diff --git a/server/publications/settings.js b/server/publications/settings.js
new file mode 100644
index 00000000..c2d9fdff
--- /dev/null
+++ b/server/publications/settings.js
@@ -0,0 +1,13 @@
+Meteor.publish('setting', () => {
+ return Settings.find({}, {fields:{disableRegistration: 1}});
+});
+
+Meteor.publish('mailServer', function () {
+ if (!Match.test(this.userId, String))
+ return [];
+ const user = Users.findOne(this.userId);
+ if(user && user.isAdmin){
+ return Settings.find({}, {fields: {mailServer: 1}});
+ }
+ return [];
+});
diff --git a/server/publications/users.js b/server/publications/users.js
index 4321e32b..4fd98e13 100644
--- a/server/publications/users.js
+++ b/server/publications/users.js
@@ -9,3 +9,11 @@ Meteor.publish('user-miniprofile', function(userId) {
},
});
});
+
+Meteor.publish('user-admin', function() {
+ return Meteor.users.find(this.userId, {
+ fields: {
+ isAdmin: 1,
+ },
+ });
+});