summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.eslintrc.json8
-rw-r--r--.github/ISSUE_TEMPLATE.md10
-rw-r--r--.gitignore4
-rw-r--r--.meteor/.finished-upgraders1
-rw-r--r--.meteor/packages35
-rw-r--r--.meteor/release2
-rw-r--r--.meteor/versions104
-rw-r--r--.travis.yml6
-rw-r--r--.tx/config2
-rw-r--r--CHANGELOG.md659
-rw-r--r--Dockerfile92
-rw-r--r--LICENSE2
-rw-r--r--README.md21
-rw-r--r--client/components/activities/activities.jade8
-rw-r--r--client/components/activities/activities.styl9
-rw-r--r--client/components/boards/boardArchive.jade2
-rw-r--r--client/components/boards/boardBody.jade28
-rw-r--r--client/components/boards/boardBody.js238
-rw-r--r--client/components/boards/boardBody.styl35
-rw-r--r--client/components/boards/boardColors.styl14
-rw-r--r--client/components/boards/boardHeader.jade14
-rw-r--r--client/components/boards/boardHeader.js20
-rw-r--r--client/components/boards/boardsList.jade6
-rw-r--r--client/components/boards/boardsList.js16
-rw-r--r--client/components/boards/boardsList.styl22
-rw-r--r--client/components/cards/attachments.jade6
-rw-r--r--client/components/cards/attachments.js18
-rw-r--r--client/components/cards/attachments.styl21
-rw-r--r--client/components/cards/cardDate.js227
-rw-r--r--client/components/cards/cardDate.styl24
-rw-r--r--client/components/cards/cardDetails.jade103
-rw-r--r--client/components/cards/cardDetails.js221
-rw-r--r--client/components/cards/cardDetails.styl9
-rw-r--r--client/components/cards/cardTime.jade22
-rw-r--r--client/components/cards/cardTime.js81
-rw-r--r--client/components/cards/cardTime.styl17
-rw-r--r--client/components/cards/checklists.jade64
-rw-r--r--client/components/cards/checklists.js184
-rw-r--r--client/components/cards/checklists.styl128
-rw-r--r--client/components/cards/labels.jade3
-rw-r--r--client/components/cards/minicard.jade16
-rw-r--r--client/components/cards/minicard.styl3
-rw-r--r--client/components/forms/forms.styl53
-rw-r--r--client/components/import/import.jade1
-rw-r--r--client/components/lists/list.jade4
-rw-r--r--client/components/lists/list.js28
-rw-r--r--client/components/lists/list.styl88
-rw-r--r--client/components/lists/listBody.jade4
-rw-r--r--client/components/lists/listBody.js32
-rw-r--r--client/components/lists/listHeader.jade61
-rw-r--r--client/components/lists/listHeader.js89
-rw-r--r--client/components/main/editor.jade5
-rwxr-xr-xclient/components/main/editor.js21
-rw-r--r--client/components/main/header.jade44
-rw-r--r--client/components/main/header.js21
-rw-r--r--client/components/main/header.styl34
-rw-r--r--client/components/main/layouts.jade1
-rw-r--r--client/components/main/layouts.js16
-rw-r--r--client/components/main/layouts.styl5
-rw-r--r--client/components/settings/invitationCode.js2
-rw-r--r--client/components/settings/peopleBody.jade90
-rw-r--r--client/components/settings/peopleBody.js158
-rw-r--r--client/components/settings/peopleBody.styl15
-rw-r--r--client/components/settings/settingBody.jade33
-rw-r--r--client/components/settings/settingBody.js122
-rw-r--r--client/components/settings/settingBody.styl7
-rw-r--r--client/components/settings/settingHeader.jade9
-rw-r--r--client/components/settings/settingHeader.styl2
-rw-r--r--client/components/sidebar/sidebar.jade18
-rw-r--r--client/components/sidebar/sidebar.js19
-rw-r--r--client/components/sidebar/sidebarArchives.jade11
-rw-r--r--client/components/sidebar/sidebarArchives.js16
-rw-r--r--client/components/sidebar/sidebarFilters.jade2
-rw-r--r--client/components/sidebar/sidebarSearches.jade8
-rw-r--r--client/components/sidebar/sidebarSearches.js19
-rw-r--r--client/components/sidebar/sidebarSearches.styl2
-rw-r--r--client/components/swimlanes/swimlaneHeader.jade23
-rw-r--r--client/components/swimlanes/swimlaneHeader.js25
-rw-r--r--client/components/swimlanes/swimlanes.jade75
-rw-r--r--client/components/swimlanes/swimlanes.js235
-rw-r--r--client/components/swimlanes/swimlanes.styl54
-rw-r--r--client/components/users/userAvatar.jade12
-rw-r--r--client/components/users/userAvatar.js4
-rw-r--r--client/components/users/userHeader.jade16
-rw-r--r--client/components/users/userHeader.js37
-rw-r--r--client/config/blazeHelpers.js11
-rw-r--r--client/lib/emoji-values.js152
-rwxr-xr-xclient/lib/keyboard.js3
-rw-r--r--client/lib/modal.js2
-rw-r--r--client/lib/popup.js3
-rw-r--r--client/lib/unsavedEdits.js2
-rw-r--r--client/lib/utils.js31
-rw-r--r--config/router.js25
-rw-r--r--docker-compose.yml4
-rw-r--r--i18n/ar.i18n.json219
-rw-r--r--i18n/bg.i18n.json447
-rw-r--r--i18n/br.i18n.json103
-rw-r--r--i18n/ca.i18n.json119
-rw-r--r--i18n/cs.i18n.json233
-rw-r--r--i18n/de.i18n.json145
-rw-r--r--i18n/el.i18n.json447
-rw-r--r--i18n/en-GB.i18n.json107
-rw-r--r--i18n/en.i18n.json102
-rw-r--r--i18n/eo.i18n.json139
-rw-r--r--i18n/es-AR.i18n.json447
-rw-r--r--i18n/es.i18n.json587
-rw-r--r--i18n/eu.i18n.json111
-rw-r--r--i18n/fa.i18n.json239
-rw-r--r--i18n/fi.i18n.json107
-rw-r--r--i18n/fr.i18n.json111
-rw-r--r--i18n/gl.i18n.json103
-rw-r--r--i18n/he.i18n.json123
-rw-r--r--i18n/hu.i18n.json613
-rw-r--r--i18n/hy.i18n.json447
-rw-r--r--i18n/id.i18n.json105
-rw-r--r--i18n/ig.i18n.json447
-rw-r--r--i18n/it.i18n.json133
-rw-r--r--i18n/ja.i18n.json105
-rw-r--r--i18n/ko.i18n.json123
-rw-r--r--i18n/lv.i18n.json447
-rw-r--r--i18n/mn.i18n.json447
-rw-r--r--i18n/nb.i18n.json103
-rw-r--r--i18n/nl.i18n.json135
-rw-r--r--i18n/pl.i18n.json225
-rw-r--r--i18n/pt-BR.i18n.json113
-rw-r--r--i18n/pt.i18n.json447
-rw-r--r--i18n/ro.i18n.json103
-rw-r--r--i18n/ru.i18n.json257
-rw-r--r--i18n/sr.i18n.json103
-rw-r--r--i18n/sv.i18n.json107
-rw-r--r--i18n/ta.i18n.json103
-rw-r--r--i18n/th.i18n.json103
-rw-r--r--i18n/tr.i18n.json131
-rw-r--r--i18n/uk.i18n.json103
-rw-r--r--i18n/vi.i18n.json103
-rw-r--r--i18n/zh-CN.i18n.json111
-rw-r--r--i18n/zh-TW.i18n.json103
-rw-r--r--meta/t9n-changelog/fi.md20
-rw-r--r--models/accountSettings.js8
-rw-r--r--models/activities.js6
-rw-r--r--models/announcements.js36
-rw-r--r--models/attachments.js153
-rw-r--r--models/boards.js245
-rw-r--r--models/cardComments.js138
-rw-r--r--models/cards.js132
-rw-r--r--models/checklistItems.js145
-rw-r--r--models/checklists.js252
-rw-r--r--models/export.js4
-rw-r--r--models/integrations.js264
-rw-r--r--models/invitationCodes.js4
-rw-r--r--models/lists.js198
-rw-r--r--models/settings.js28
-rw-r--r--models/swimlanes.js219
-rw-r--r--models/trelloCreator.js72
-rw-r--r--models/users.js319
-rw-r--r--models/wekanCreator.js150
-rw-r--r--package.json16
-rw-r--r--public/fonts/roboto-bold.woffbin18568 -> 71808 bytes
-rw-r--r--public/fonts/roboto-bold.woff2bin14552 -> 52056 bytes
-rw-r--r--public/fonts/roboto-regular.woffbin18520 -> 70236 bytes
-rw-r--r--public/fonts/roboto-regular.woff2bin14584 -> 51140 bytes
-rw-r--r--sandstorm-pkgdef.capnp13
-rw-r--r--sandstorm.js8
-rw-r--r--server/authentication.js14
-rw-r--r--server/logger.js66
-rw-r--r--server/migrations.js95
-rw-r--r--server/notifications/outgoing.js5
-rw-r--r--server/observableChanges.js100
-rw-r--r--server/publications/announcements.js3
-rw-r--r--server/publications/boards.js2
-rw-r--r--server/publications/people.js7
-rw-r--r--snap-src/Caddyfile5
-rwxr-xr-xsnap-src/bin/caddy-control12
-rwxr-xr-xsnap-src/bin/config (renamed from snap-src/config)19
-rwxr-xr-xsnap-src/bin/mongodb-backup (renamed from snap-src/mongodb-backup)0
-rwxr-xr-xsnap-src/bin/mongodb-control (renamed from snap-src/mongodb-control)3
-rwxr-xr-xsnap-src/bin/mongodb-restore (renamed from snap-src/mongodb-restore)0
-rwxr-xr-xsnap-src/bin/wekan-control (renamed from snap-src/wekan-control)3
-rwxr-xr-xsnap-src/bin/wekan-help (renamed from snap-src/wekan-help)22
-rwxr-xr-xsnap-src/bin/wekan-read-settings29
-rwxr-xr-xsnap-src/wekan-read-settings36
-rwxr-xr-xsnap/hooks/configure51
-rwxr-xr-xsnap/hooks/install12
l---------snap/hooks/post-refresh1
-rw-r--r--snapcraft.yaml85
185 files changed, 12690 insertions, 3675 deletions
diff --git a/.eslintrc.json b/.eslintrc.json
index 51b2037f..0a9f3c90 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -52,7 +52,6 @@
"prefer-const": 2,
"prefer-spread": 2,
"prefer-template": 2,
- "no-console": 0,
"no-unused-vars" : "warn"
},
"globals": {
@@ -125,11 +124,14 @@
"Checklists": true,
"Settings": true,
"InvitationCodes": true,
- "Winston":true,
"JsonRoutes": true,
"Authentication": true,
"Integrations": true,
"HTTP": true,
- "AccountSettings": true
+ "AccountSettings": true,
+ "Announcements": true,
+ "Swimlanes": true,
+ "ChecklistItems": true,
+ "Npm": true
}
}
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
index 6a1a4fc6..4610f2f8 100644
--- a/.github/ISSUE_TEMPLATE.md
+++ b/.github/ISSUE_TEMPLATE.md
@@ -1,16 +1,16 @@
## Issue
-**Impacted version**: xxxx
**Server Setup Information**:
* Operating System:
-* Deployment Method(tar/sandstorm/snap/docker/etc /http frontend (nginx, httpd, ...)):
+* Deployment Method(snap/sandstorm/mongodb bundle):
+* Http frontend (Caddy, Nginx, Apache, see config examples from Wekan GitHub wiki first):
* Node Version:
* MongoDB Version:
-* ROOT_URL environment variable (Is there a subfolder?):
+* ROOT_URL environment variable http(s)://(subdomain).example.com(/suburl):
**Problem description**:
-- *be as explicit has you can*
+- *be as explicit as you can*
- *describe the problem and its symptoms*
- *explain how to reproduce*
-- *attach whatever information that can help understanding the context (screen capture, log files)*
+- *attach whatever information that can help understanding the context (screen capture, log files in .zip file)*
diff --git a/.gitignore b/.gitignore
index a5abba70..3b63d811 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,7 @@
tmp/
node_modules/
.vscode/
+.idea/
.build/*
packages/kadira-flow-router/
packages/meteor-useraccounts-core/
@@ -13,4 +14,5 @@ package-lock.json
**/stage
**/prime
**/*.snap
-.idea \ No newline at end of file
+snap/.snapcraft/
+.idea
diff --git a/.meteor/.finished-upgraders b/.meteor/.finished-upgraders
index a8020370..2a56593d 100644
--- a/.meteor/.finished-upgraders
+++ b/.meteor/.finished-upgraders
@@ -15,3 +15,4 @@ notices-for-facebook-graph-api-2
1.4.0-remove-old-dev-bundle-link
1.4.1-add-shell-server-package
1.4.3-split-account-service-packages
+1.5-add-dynamic-import-package
diff --git a/.meteor/packages b/.meteor/packages
index 7c04f207..c1b8ab88 100644
--- a/.meteor/packages
+++ b/.meteor/packages
@@ -3,13 +3,13 @@
# 'meteor add' and 'meteor remove' will edit this file for you,
# but you can also edit it by hand.
-meteor-base@1.0.4
+meteor-base@1.2.0
# Build system
-ecmascript@0.7.2
-stylus@2.513.9
-standard-minifier-css@1.3.4
-standard-minifier-js@2.0.0
+ecmascript@0.9.0
+stylus@2.513.13
+standard-minifier-css@1.3.5
+standard-minifier-js@2.2.0
mquandalle:jade
# Polyfills
@@ -17,18 +17,16 @@ es5-shim@4.6.15
# Collections
aldeed:collection2
-cfs:gridfs
cfs:standard-packages
cottz:publish-relations
dburles:collection-helpers
idmontie:migrations
matb33:collection-hooks
matteodem:easy-search
-mongo@1.1.16
+mongo@1.3.1
mquandalle:collection-mutations
# Account system
-accounts-password@1.3.5
kenton:accounts-sandstorm
service-configuration@1.0.11
useraccounts:unstyled
@@ -38,9 +36,9 @@ useraccounts:flow-routing
check@1.2.5
jquery@1.11.10
random@1.0.10
-reactive-dict@1.1.8
+reactive-dict@1.2.0
session@1.1.7
-tracker@1.1.2
+tracker@1.1.3
underscore@1.0.10
3stack:presence
alethes:pages
@@ -48,7 +46,6 @@ arillo:flow-router-helpers
audit-argument-checks@1.0.7
kadira:blaze-layout
kadira:dochead
-meteorhacks:fast-render
meteorhacks:picker
meteorhacks:subs-manager
mquandalle:autofocus
@@ -56,7 +53,7 @@ mquandalle:moment
ongoworks:speakingurl
raix:handlebar-helpers
tap:i18n
-http
+http@1.3.0
# UI components
blaze
@@ -69,13 +66,21 @@ mquandalle:mousetrap-bindglobal
mquandalle:perfect-scrollbar
peerlibrary:blaze-components@=0.15.1
perak:markdown
-seriousm:emoji-continued
templates:tabs
verron:autosize
simple:json-routes
rajit:bootstrap3-datepicker
-kadira:flow-router
-shell-server@0.2.3
+shell-server@0.3.0
simple:rest-accounts-password
useraccounts:core
email@1.2.3
+horka:swipebox
+dynamic-import@0.2.0
+staringatlights:fast-render
+staringatlights:flow-router
+
+mixmax:smart-disconnect
+accounts-password@1.5.0
+cfs:gridfs
+browser-policy
+eluck:accounts-lockout
diff --git a/.meteor/release b/.meteor/release
index 605b4e1f..56a7a07f 100644
--- a/.meteor/release
+++ b/.meteor/release
@@ -1 +1 @@
-METEOR@1.4.4.1
+METEOR@1.6.0.1
diff --git a/.meteor/versions b/.meteor/versions
index 416093aa..2ab1af11 100644
--- a/.meteor/versions
+++ b/.meteor/versions
@@ -1,23 +1,27 @@
-3stack:presence@1.0.5
-accounts-base@1.2.16
-accounts-password@1.3.5
+3stack:presence@1.1.2
+accounts-base@1.4.0
+accounts-password@1.5.0
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
+allow-deny@1.1.0
arillo:flow-router-helpers@0.5.2
audit-argument-checks@1.0.7
autoupdate@1.3.12
-babel-compiler@6.18.2
-babel-runtime@1.0.1
+babel-compiler@6.24.7
+babel-runtime@1.1.1
base64@1.0.10
binary-heap@1.0.10
blaze@2.3.2
blaze-tools@1.0.10
-boilerplate-generator@1.0.11
+boilerplate-generator@1.3.1
+browser-policy@1.1.0
+browser-policy-common@1.0.11
+browser-policy-content@1.1.0
+browser-policy-framing@1.1.0
caching-compiler@1.1.9
caching-html-compiler@1.1.2
callback-hook@1.0.10
@@ -27,7 +31,7 @@ cfs:collection@0.5.5
cfs:collection-filters@0.2.4
cfs:data-man@0.0.6
cfs:file@0.1.17
-cfs:gridfs@0.0.33
+cfs:gridfs@0.0.34
cfs:http-methods@0.0.32
cfs:http-publish@0.0.13
cfs:power-queue@0.9.11
@@ -40,61 +44,67 @@ cfs:upload-http@0.0.20
cfs:worker@0.1.4
check@1.2.5
chuangbo:cookie@1.1.0
-coffeescript@1.12.3_1
-cottz:publish-relations@2.0.7
+coffeescript@1.12.7_3
+coffeescript-compiler@1.12.7_3
+cottz:publish-relations@2.0.8
dburles:collection-helpers@1.1.0
-ddp@1.2.5
-ddp-client@1.3.4
-ddp-common@1.2.8
+ddp@1.4.0
+ddp-client@2.2.0
+ddp-common@1.3.0
ddp-rate-limiter@1.0.7
-ddp-server@1.3.14
+ddp-server@2.1.1
deps@1.0.12
diff-sequence@1.0.7
-ecmascript@0.7.3
-ecmascript-runtime@0.3.15
-ejson@1.0.13
+dynamic-import@0.2.1
+ecmascript@0.9.0
+ecmascript-runtime@0.5.0
+ecmascript-runtime-client@0.5.0
+ecmascript-runtime-server@0.5.0
+ejson@1.1.0
+eluck:accounts-lockout@0.9.0
email@1.2.3
es5-shim@4.6.15
fastclick@1.0.13
fortawesome:fontawesome@4.7.0
geojson-utils@1.0.10
+horka:swipebox@1.0.2
hot-code-push@1.0.4
html-tools@1.0.11
htmljs@1.0.11
-http@1.2.12
+http@1.3.0
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.6.0
+kenton:accounts-sandstorm@0.7.0
launch-screen@1.1.1
livedata@1.0.18
-localstorage@1.0.12
-logging@1.1.17
+localstorage@1.2.0
+logging@1.1.19
matb33:collection-hooks@0.8.4
matteodem:easy-search@1.6.4
mdg:validation-error@0.5.1
-meteor@1.6.1
-meteor-base@1.0.4
+meteor@1.8.2
+meteor-base@1.2.0
meteor-platform@1.2.6
meteorhacks:aggregate@1.3.0
meteorhacks:collection-utils@1.2.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.2.16
-minifier-js@2.0.0
+minifier-js@2.2.2
minifiers@1.1.8-faster-rebuild.0
-minimongo@1.0.21
+minimongo@1.4.3
+mixmax:smart-disconnect@0.0.4
mobile-status-bar@1.0.14
-modules@0.8.2
-modules-runtime@0.7.10
-mongo@1.1.16
+modules@0.11.0
+modules-runtime@0.9.1
+mongo@1.3.1
+mongo-dev-server@1.1.0
mongo-id@1.0.6
mongo-livedata@1.0.12
mousetrap:mousetrap@1.4.6_1
@@ -107,52 +117,54 @@ 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.9.2
-npm-mongo@2.2.24
+npm-bcrypt@0.9.3
+npm-mongo@2.2.33
observe-sequence@1.0.16
ongoworks:speakingurl@1.1.0
ordered-dict@1.0.9
peerlibrary:assert@0.2.5
peerlibrary:base-component@0.16.0
peerlibrary:blaze-components@0.15.1
-peerlibrary:computed-field@0.6.1
+peerlibrary:computed-field@0.7.0
peerlibrary:reactive-field@0.3.0
perak:markdown@1.0.5
-promise@0.8.8
+promise@0.10.0
raix:eventemitter@0.1.3
raix:handlebar-helpers@0.2.5
-rajit:bootstrap3-datepicker@1.6.4
+rajit:bootstrap3-datepicker@1.7.1
random@1.0.10
rate-limit@1.0.8
-reactive-dict@1.1.8
+reactive-dict@1.2.0
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.11
session@1.1.7
sha@1.0.9
-shell-server@0.2.3
+shell-server@0.3.1
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
+softwarerero:accounts-t9n@1.3.11
spacebars@1.0.15
-spacebars-compiler@1.1.2
+spacebars-compiler@1.1.3
srp@1.0.10
-standard-minifier-css@1.3.4
-standard-minifier-js@2.0.0
-stylus@2.513.9
+standard-minifier-css@1.3.5
+standard-minifier-js@2.2.3
+staringatlights:fast-render@2.16.5
+staringatlights:flow-router@2.12.2
+staringatlights:inject-data@2.0.5
+stylus@2.513.13
tap:i18n@1.8.2
templates:tabs@2.3.0
templating@1.3.2
-templating-compiler@1.3.2
+templating-compiler@1.3.3
templating-runtime@1.3.2
templating-tools@1.1.2
-tracker@1.1.2
+tracker@1.1.3
ui@1.0.13
underscore@1.0.10
url@1.1.0
@@ -160,6 +172,6 @@ useraccounts:core@1.14.2
useraccounts:flow-routing@1.14.2
useraccounts:unstyled@1.14.2
verron:autosize@3.0.8
-webapp@1.3.15
+webapp@1.4.0
webapp-hashing@1.0.9
zimme:active-route@2.3.2
diff --git a/.travis.yml b/.travis.yml
index bad4d10e..cde2bf33 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,9 +2,9 @@ dist: trusty
sudo: required
env:
- TRAVIS_DOCKER_COMPOSE_VERSION: 1.12.0
- TRAVIS_NODE_VERSION: 4.8.4
- TRAVIS_NPM_VERSION: 4.6.1
+ TRAVIS_DOCKER_COMPOSE_VERSION: 1.17.0
+ TRAVIS_NODE_VERSION: 8.9.3
+ TRAVIS_NPM_VERSION: 5.5.1
before_install:
- sudo apt-get update -y
diff --git a/.tx/config b/.tx/config
index 230e8f16..1813b45e 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 = en_GB:en-GB, fa_IR:fa, fi_FI:fi, hu_HU:hu, id_ID:id, no:nb, pt_BR:pt-BR, ro_RO:ro, zh_CN:zh-CN, zh_TW:zh-TW
+lang_map = bg_BG:bg, en_GB:en-GB, es_AR:es-AR, el_GR:el, fi_FI:fi, hu_HU:hu, id_ID:id, mn_MN:mn, no:nb, lv_LV:lv, 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 8d59528b..49ee9b39 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,9 +1,654 @@
-# Upcoming Wekan release
+# v0.95 2018-05-08 Wekan release
+
+This release adds the following new features:
+
+* [REST API Edit Card Labels](https://github.com/wekan/wekan/pull/1626);
+* [Add a new API route to create a new label in a given board](https://github.com/wekan/wekan/pull/1630);
+* [Admin Panel: Option to block username change](https://github.com/wekan/wekan/pull/1627).
+
+and fixed the following bugs:
+
+* [Error: title is required](https://github.com/wekan/wekan/issues/1576).
+
+Thanks to GitHub users Shahar-Y, thiagofernando and ThisNeko for their contributions.
+
+# v0.94 2018-05-03 Wekan release
+
+This release adds the following new features:
+
+* [REST API POST /cards: allow setting card members](https://github.com/wekan/wekan/pull/1622).
+
+Thanks to GitHub user couscous3 for contributions.
+
+# v0.93 2018-05-02 Wekan release
+
+This release adds the following new features:
+
+* [Checklist items lineheight to 18px, and positioning
+ improvements](https://github.com/wekan/wekan/issues/1619).
+
+Thanks to GitHub user lichtamberg for contributions.
+
+# v0.92 2018-05-01 Wekan release
+
+This release tries to fix the following bugs, please test:
+
+* [Users who register with an invitation code can't see lists/cards](https://github.com/wekan/wekan/issues/1610).
+
+Thanks to GitHub user andresmanelli for contributions.
+
+# v0.91 2018-05-01 Wekan release
+
+This release fixes the following bugs:
+
+- [Fix Wekan Import / Export lists not being sortable](https://github.com/wekan/wekan/commit/539c1ab87a098a7ddfd23cdbd663441bd609b73d).
+
+Thanks to GitHub user zebby76 for contributions.
+
+# v0.90 2018-05-01 Wekan release
+
+This release adds the following new features:
+
+- [Remove space from between checklist items, so longer checklists can be seen
+ at once](https://github.com/wekan/wekan/commit/1124f4120cd77622c0a6313e228e1a00690ff566).
+
+Thanks to GitHub user xet7 for contributions.
+
+# v0.89 2018-04-29 Wekan release
+
+This release fixes the following bugs:
+
+- [Fix Wekan import / Export for ChecklistItems](https://github.com/wekan/wekan/pull/1613).
+
+Thanks to GitHub user zebby76 for contributions.
+
+# v0.88 2018-04-27 Wekan release
+
+This release fixes the following bugs:
+
+- [Fix Trello import of ChecklistItems](https://github.com/wekan/wekan/pull/1611).
+
+Thanks to GitHub user zebby76 for contributions.
+
+# v0.87 2018-04-27 Wekan release
+
+This release fixes the following bugs:
+
+- [Sandstorm: Copy Card, Move Card and Copy Checklist Template to Many Cards - No longer works in
+ menu](https://github.com/wekan/wekan/commit/db80e738048e2729917c5e8fc18cf8ee44df7992);
+- [Snap: Use override-build instead of old deprecated
+ prepare/build/install](https://github.com/wekan/wekan/commit/075ea1c43d827099e0030c750a4c156bd3340fed);
+- [Removed not-used plugins part of Caddy download
+ URL](https://github.com/wekan/wekan/commit/7b91b341fe9c0cde42f91bf14d228820653c883d).
+
+Thanks to GitHub users kyrofa and xet7 for their contributions.
+
+# v0.86 2018-04-20 Wekan release
+
+This release adds the following new features:
+
+- Updated translations: German and Turkish;
+- Updated Caddy to newest version for Snap.
+
+Thanks to translators and Caddy developers.
+
+# v0.85 2018-04-18 Wekan release
+
+This release fixes the following bugs:
+
+- [Fix Switch List/swimlane view only working with admin privileges](https://github.com/wekan/wekan/issues/1567);
+- [Fix Wekan logo positioning](https://github.com/wekan/wekan/issues/1378);
+- [Tried to fix, but fix did not work: Fix checklists items migration error "title is required"](https://github.com/wekan/wekan/issues/1576);
+- [Removed paxctl alpine fix #1303 , because it did not work anymore, so Docker container
+ did not build correctly](https://github.com/wekan/wekan/commit/ce659632174ba25ca9b5e85b053fde02fd9c3928);
+- [Use curl to download 100% CPU fibers fixed node in snap, and remove paxctl from
+ snap package](https://github.com/wekan/wekan/commit/179ff7a12457be1592f04e1bdc15a5bb4fe9d398).
+
+Thanks to GitHub users andresmanelli, iwkse and xet7 for their contributions.
+
+# v0.84 2018-04-16 Wekan release
+
+This release adds the following new features:
+
+- [Add Checklist Items REST API](https://github.com/wekan/wekan/commit/9eef5112dc1c1c30590d19fbfd2f615714112a3f).
+
+and fixes the following bugs:
+
+- [Fix Node Fibers 100% CPU issue](https://github.com/wekan/wekan/commit/e26a4824cfb119a15767c4827190a6b9ab65b904);
+- [Plus button on a Swimlane row, always add an element on the first row](https://github.com/wekan/wekan/issues/1577);
+- [Fix Checklist REST API](https://github.com/wekan/wekan/commit/9eef5112dc1c1c30590d19fbfd2f615714112a3f);
+- [Fix Disabling "show cards count" not possible, now zero means disable](https://github.com/wekan/wekan/issues/1570);
+- [Fix Checklist not copied when copied a card and Copy Checklist Template to Many Cards](https://github.com/wekan/wekan/issues/1565);
+- [Fix Filter cards hides checklist items](https://github.com/wekan/wekan/issues/1561).
+
+Thanks to GitHub users andresmanelli, kentonv and xet7 for their contributions.
+
+# v0.83 2018-04-12 Wekan release
+
+- Updated translations: Czech and French.
+
+Thanks to translators!
+
+# v0.82 2018-04-11 Wekan release
+
+- [Restore original font and font sizes. Admin panel people and version texts
+ to darker](https://github.com/wekan/wekan/commit/db74c86e555f45a5aaaef84d2f3d4128cec77782).
+
+Thanks to GitHub users apn3a and xet7 for their contributions.
+
+# v0.81 2018-04-10 Wekan release
+
+This release adds the following new features:
+
+- [Removed checkbox from checklist name to have more of material design look](https://github.com/wekan/wekan/issues/1568);
+- [Renamed Archives to Recycle Bin](https://github.com/wekan/wekan/issues/1429);
+- [Separate translations for cards in Recycle Bin and cards count](https://github.com/wekan/wekan/commit/49c7a6c223061b9c1769143fea32fecc7d0f3c3e);
+- [Use lighter and smaller font sizes](https://github.com/wekan/wekan/commit/7b94b0470198bc22b6a52db6661f35076f7c6388);
+- [Board title as markdown in board view](https://github.com/wekan/wekan/commit/7b94b0470198bc22b6a52db6661f35076f7c6388).
+
+and fixes the following bugs:
+
+- [Removed forcing "cards" translations to lowercase in count of cards](https://github.com/wekan/wekan/issues/1571).
+
+Thanks to GitHub users BruceZCQ, Chartman123, quantazelle and xet7 for their contributions.
+
+# v0.80 2018-04-04 Wekan release
+
+This release adds the following new features:
+
+- [Changed icon of checklist name to unchecked](https://github.com/wekan/wekan/pull/1559/commits/f9539aa2a8d806e5a158d1c32f74788d051d40cb);
+- [Added meteor packages](https://github.com/wekan/wekan/commit/40d438a517f0d807894e04873358aecf44fa7c4d)
+ for security: [browser-policy](https://atmospherejs.com/meteor/browser-policy) and
+ [eluck:accounts-lockout](https://atmospherejs.com/eluck/accounts-lockout).
+
+Thanks to GitHub users quantazelle and xet7 for their contributions.
+
+# v0.79 2018-03-31 Wekan release
+
+This release adds the following new features:
+
+- [Checklist items sort fix, and checklist sort capability](https://github.com/wekan/wekan/pull/1543);
+- [Add Received Date and End Date. Between them is already existing Start and Due Date](https://github.com/wekan/wekan/pull/1550).
+
+and fixes the following bugs:
+
+- [Fix drag in lists view](https://github.com/wekan/wekan/pull/1559/commits/679e50af6449a680f958256570e8b9f1944a3a92);
+- [Set fixed width for swimlane header](https://github.com/wekan/wekan/pull/1559/commits/2e8f8924dd0d985ae4634450cfbef04e88e5d954).
+
+Thanks to GitHub users andresmanelli, rjevnikar and xet7 for their contributions.
+
+# v0.78 2018-03-17 Wekan release
+
+This release adds the following new features:
+
+- [Allow swimlanes reordering](https://github.com/wekan/wekan/commit/37c94622e476f50bf2387bc8b140454d66200e78);
+- [Import missing card fields: isOvertime, startAt and spentTime](https://github.com/wekan/wekan/commit/b475127c53031fa498da139a7d16f3e54d43b90d);
+- [Lists view is the default view when creating boards](https://github.com/wekan/wekan/commit/1ca9e96f35389c0eec2290e8e1207801ee25f907);
+- [Enabled import at Sandtorm. Keep there big DANGER warning about data loss bug.](https://github.com/wekan/wekan/commit/22923d08af4f1a63ded1d92fe6918436b598592b);
+- [Add language: Armenian](https://github.com/wekan/wekan/commit/75693d16e2a0f3d201c1036ab06e6d40eb1c0adc).
+
+and fixes the following bugs:
+
+- [Fix lint errors related to sandstorm](https://github.com/wekan/wekan/commit/0a16147470246c8f49bb918f5ddc7bb2e54fba14);
+- [Add Swimlanes to globals](https://github.com/wekan/wekan/commit/373e9782dcf87a9c1169b5d1f8175ce14e4898c9);
+- [Fix lint errors related to trello creator](https://github.com/wekan/wekan/commit/951a0db380d60f3d948ae38d50b85a54983a51de);
+- [Fix lint errors related to language names](https://github.com/wekan/wekan/commit/c0d33d97f2c8d4e9371a03d4ad3022df3ed64d3d);
+- [Avoid swimlane title overlap](https://github.com/wekan/wekan/commit/c4fa9010f34966b633c7bf7e46ad49fc101127c9);
+- [Fix scrollbar inside list and outer scroll](https://github.com/wekan/wekan/commit/a033c35a3411902b9bf8f62a40cd68f641e573d3);
+- [Remove list max-height 350px](https://github.com/wekan/wekan/commit/b6d3e79548d1e88c93fa2965a936595176a95565);
+- [Snap: Adding network hooks for configure hook to fix security denials](https://github.com/wekan/wekan/commit/9084158aece8a642dc49bf7ecc2196bf9d1af63e);
+- [Snap: Fixing problem when mongodb was not started at install/refresh](https://github.com/wekan/wekan/commit/1be8e5625fd20797910009a8221ca706fd52ab11);
+- [Fix Add Card Button dissapearing when dragging](https://github.com/wekan/wekan/commit/58e5e9b308113e5a8af5166328a68a0aafcc2558);
+- [Fix Scrollbar near top of screen when using internet explorer on Win7](https://github.com/wekan/wekan/commit/128a356b9222fa0ed824b477c2d0e1e6a0368021);
+- [Fix scroll when dragging elements. Remove scrollbars from swimlanes.](https://github.com/wekan/wekan/commit/ed8471be9b79243b016a275e5b11a6912717fbb9);
+- [Partial fix for scroll bar inside cardDetails](https://github.com/wekan/wekan/commit/ac7d44f8a8d809cd94ed5ef3640473f34c72403b);
+- [Fix swimlane header rotation on Google Chrome. After this change both Firefox 58 and Google Chrome 64
+ have properly rotated swimlane header.](https://github.com/wekan/wekan/commit/9a1b1a5bedbe44827de109731a3c3b1a07790d3e);
+- [Fix card copy and move with swimlanes](https://github.com/wekan/wekan/commit/4b53b0c90a57593c0fe2d808d2298e85f488bfa9).
+- [Fix scroll board when opening cardDetails](https://github.com/wekan/wekan/commit/454523dd4744b2bccb6805dad59abd664fdacb31);
+- [Fix swimlane info not displayed in activities](https://github.com/wekan/wekan/commit/bb37d8fa964c0d03721a664387e74300fde09eef);
+- [Fix sandstorm default swimlane creation](https://github.com/wekan/wekan/commit/f470323ee746c4e79f07d166d511867408194eb6);
+- [Extend lists to bottom of frame in lists view](https://github.com/wekan/wekan/commit/c62a2ee11febf7f98456c97dc3973509b4bfe119);
+- [Fix drag and drop issues when re-enter board](https://github.com/wekan/wekan/commit/5b0f7f8aef115b202aaff6bc25bb514426dc2009).
+
+Thanks to GitHub users andresmanelli, GhassenRjab, kubiko, lumatijev, lunatic4ever and xet7 for their contributions.
+
+# v0.77 2018-02-23 Wekan release
+
+This release adds the following new features:
+
+- [Search from card titles and descriptions on this board](https://github.com/wekan/wekan/pull/1503).
+- Add Bulgarian language.
+
+and adds the following [Snap updates](https://github.com/wekan/wekan/pull/1495):
+
+- Cleanup of snap helper scripts
+- Cleanup and snapctl settings handling
+- Fix for snap store auto review refusal
+- Adding support for automatic restart of services when setting(s) are changed.
+ No need to call systemctl restart anymore
+- Fixing snap set functionality
+- Adding optional caddy service support (by default caddy service is disabled),
+ it can be enabled by calling: snap set wekan caddy-enabled=true
+- [Service life cycle improvements](https://github.com/wekan/wekan/pull/1495)
+- [Wekan help text changes and tweaks](https://github.com/wekan/wekan/pull/1495).
+
+and fixes the following bugs:
+
+- [Fix: card-shadow no longer covered the page if you scroll down](https://github.com/wekan/wekan/pull/1496).
+
+Thanks to GitHub users GhassenRjab, kubiko and stefano-pogliani for their contributions.
+
+# v0.76 2018-02-21 Wekan release
+
+This release adds the following new features:
+
+- [Add swimlaneId to POST /api/boards/:boardId/lists/:listId/cards route](https://github.com/wekan/wekan/commit/ee0f42eeb1b10107bd8fc38cdefbdbc4f3fde108);
+- [Added path to capnp.js to make Wekan work on Sandstorm](https://github.com/wekan/wekan/commit/11e9811f82858a3d98036e142b0da69d867adebc).
+
+Known bugs:
+
+- [Disabled Import temporarily on Sandstorm because of data loss bug](https://github.com/wekan/wekan/commit/e30f6515c623de7a48f25e0b2fc75313ae5d187c);
+- [Swimlane not visible at Sandstorm](https://github.com/wekan/wekan/issues/1494).
+
+Thanks to GitHub users couscous3 and xet7 for their contributions.
+
+# v0.75 2018-02-16 Wekan release
+
+This release adds the following new features:
+
+- [Checklist templates](https://github.com/wekan/wekan/pull/1470);
+- Added [Finnish language changelog](https://github.com/wekan/wekan/tree/devel/meta/t9n-changelog)
+ and [more Finnish traslations](https://github.com/wekan/wekan/blob/devel/sandstorm-pkgdef.capnp)
+ to Sandstorm.
+
+Thanks to GitHub users erikturk and xet7 for their contributions.
+
+# v0.74 2018-02-13 Wekan release
+
+This release fixes the following bugs:
+
+- [Remove Emoji support, so MAC addresses etc show correctly](https://github.com/wekan/wekan/commit/056843d66c361594d5d4478cfe86e2e405333b91).
+ NOTE: You can still add Unicode Emojis, this only removes broken autoconversion to Emojis.
+
+Thanks to GitHub user xet7 for contributions.
+
+# v0.73 2018-02-08 Wekan release
+
+This release fixes the following bugs:
+
+- [Fix Ubuntu snap build](https://github.com/wekan/wekan/pull/1469).
+
+Thanks to GitHub user kubiko for contributions.
+
+# v0.72 2018-02-07 Wekan release
+
+This release fixes the following bugs:
+
+- [Fix card sorting](https://github.com/wekan/wekan/pull/1465);
+- [Fix import Trello board without swimlanes](https://github.com/wekan/wekan/commit/5871a478e1280818f12fcb7250b7cbccf6907cf0);
+- [Fix swimlane move parameters](https://github.com/wekan/wekan/commit/fcebb2a5373d6dea41b98b530c176cbee31bee4b).
+
+Thanks to GitHub users andresmanelli and ViViDboarder for their contributions.
+
+# v0.71 2018-02-03 Wekan release
+
+This release fixes the following bugs:
+
+- [Fix Welcome board is not editable: Added default swimlane to Welcome board](https://github.com/wekan/wekan/commit/9df3e3d26bffb2268cdcc7fa768eda60e4f0975c);
+- [Fix Import Wekan board with swimlanes](https://github.com/wekan/wekan/commit/ec0a8449ba98aea708e484d386e5a209e2be8fff).
+
+Thanks to GitHub user andresmanelli for contributions.
+
+# v0.70 2018-02-02 Wekan release
+
+This release adds the following new features:
+
+- [Add ability to edit swimlane name](https://github.com/wekan/wekan/commit/3414cb84ad8ac800e23bbda6ce12822f40d1bd19);
+- [Add swimlane popup menu and archive icon](https://github.com/wekan/wekan/commit/5953fb8a44a3582ed0d8816ffb32a5b7f41f50a3).
+
+and fixes the following bugs:
+
+- [Two empty columns in swimlane view](https://github.com/wekan/wekan/issues/1459).
+
+Thanks to GitHub user andresmanelli for contributions.
+
+# v0.69 2018-02-01 Wekan release
+
+This release fixes the following bugs:
+
+- [Fix swimlanes card details bug](https://github.com/wekan/wekan/commit/f6fb05d3f49c656e9890351f5d7c0827bf2605c1);
+- [Workaround to avoid swimlanes drag bug](https://github.com/wekan/wekan/commit/d3c110cd8f3ad16a4ced5520c27ab542cc79b548);
+- [Fix swimlanes details view in lists only mode](https://github.com/wekan/wekan/commit/ff9ca755f338e3c45a1bd726dfbce1c607f2ff4c).
+- [Fix typo in issue template](https://github.com/wekan/wekan/pull/1451).
+
+Thanks to GitHub users andresmanelli and d-Rickyy-b for their contributions.
+
+# v0.68 2018-01-30 Wekan release
+
+This release fixes the following bugs:
+
+* [Partial fix: Trello board import fails because of missing "Swimlane id"](https://github.com/wekan/wekan/issues/1442), still needs some work.
+
+Thanks to GitHub user xet7 for contributions.
+
+# v0.67 2018-01-28 Wekan release
+
+This release fixes the following bugs:
+
+* [Fix Igbo language name at menu](https://github.com/wekan/wekan/commit/9d7ff75d3fed1285273245fbe6f6a757b6180039).
+
+Thanks to GitHub user xet7 for contributions.
+
+# v0.66 2018-01-28 Wekan release
+
+This release fixes the following bugs:
+
+* [Fix Dockerfile for Debian](https://github.com/wekan/wekan/pull/1439).
+
+Thanks to GitHub user soohwa for contributions.
+
+# v0.65 2018-01-28 Wekan release
+
+This release adds the following new features:
+
+* [Swimlanes, part 1](https://github.com/wekan/wekan/issues/955);
+* Added new language: Igbo.
+
+Thanks to GitHub user andresmanelli for contributions.
+
+# v0.64 2018-01-22 Wekan release
+
+This release adds the following new features:
+
+* [Different icons for start and due date](https://github.com/wekan/wekan/pull/1420).
+* Added new languages: Mongolian and Portuguese;
+* Upgraded to Meteor 1.6.0.1, Node 8.9.3, NPM 5.5.1 and fibers 2.0.0.
+
+and fixes the following bugs:
+
+* [Fix for dragging into scrolled-down list](https://github.com/wekan/wekan/pull/1424).
+* [Fix double slash bug on snap](https://github.com/wekan/wekan/issues/962#issuecomment-357785748).
+
+Thanks to GitHub users dpoznyak, mmarschall and xet7 for their contributions.
+
+# v0.63 2017-12-20 Wekan release
+
+This release adds the following new features:
+
+* [Auto update card cover with new image uploaded via drag&drop](https://github.com/wekan/wekan/pull/1401);
+* Update to Node 4.8.7.
+
+Thanks to GitHub users thuanpq and xet7 for their contributions.
+
+# v0.62 2017-12-12 Wekan release
+
+This release fixes the following bugs:
+
+* Added missing packages to build script.
+
+Thanks to GitHub user xet7 for contributions.
+
+# v0.61 2017-12-12 Wekan release
+
+This release adds the following new features:
+
+* [Change password of any user in Standalone Wekan Admin Panel](https://github.com/wekan/wekan/pull/1372);
+* [Performance optimization: Move more global subscriptions to template subscription](https://github.com/wekan/wekan/pull/1373);
+* [Auto update card cover with latest uploaded image attachment](https://github.com/wekan/wekan/pull/1387);
+* [Always display attachment section for uploading file quickly](https://github.com/wekan/wekan/pull/1391);
+* [Make it easier to see the Add Card button at top of list](https://github.com/wekan/wekan/pull/1392);
+* [Add mixmax:smart-disconnect to lower CPU usage when browser tab is not selected](https://github.com/wekan/wekan-mongodb/issues/2);
+* Update tranlations. Add Latvian language;
+* Update to Node 4.8.6 and MongoDB 3.2.18.
+
+and fixes the following bugs:
+
+* [Bug on not being able to see Admin Panel if not having access to Board List](https://github.com/wekan/wekan/pull/1371);
+* [Bug on not able to see member avatar on sidebar activity](https://github.com/wekan/wekan/pull/1380);
+* [Don't open swipebox on update card cover / download file / delete file](https://github.com/wekan/wekan/pull/1386);
+* [Boards subscription should be placed at header for all other component can be used](https://github.com/wekan/wekan/pull/1381);
+* [Bug on long url of attachment in card activity log](https://github.com/wekan/wekan/pull/1388).
+
+Thanks to GitHub users mfshiu, thuanpq and xet7 for their contributions.
+Thanks to translators for their translations.
+
+# v0.60 2017-11-29 Wekan release
+
+This release adds the following new features:
+
+* [Add SMTP test email button to Standalone Wekan Admin Panel](https://github.com/wekan/wekan/pull/1359);
+* [Optimize for mobile web, show single list per page with navigate bar](https://github.com/wekan/wekan/pull/1365).
+
+and fixes the following bugs:
+
+* [User with comment only permissions can remove another user from a card](https://github.com/wekan/wekan/pull/1352);
+* [Frequent Subscriptions problem that make Excessive CPU usage](https://github.com/wekan/wekan/pull/1363).
+
+Thanks to GitHub users floatinghotpot, mfshiu and nztqa for their contributions.
+
+# v0.59 2017-11-23 Wekan release.
+
+This release fixes the following bugs:
+
+* [Remove incomplete logger fix](https://github.com/wekan/wekan/pull/1352).
+
+Thanks to GitHub user pierreozoux for contributions.
+
+# v0.58 2017-11-23 Wekan release
+
+This release adds the following new features:
+
+* Updated translations.
+
+Thanks to all translators.
+
+# v0.57 2017-11-23 Wekan release
+
+This release adds the following new features:
+
+* [Gogs Integration](https://github.com/wekan/wekan-gogs) as separate project. Please test and submit issues and pull requests to that project.
+
+and fixes the following bugs:
+
+* [Fix Winston logger](https://github.com/wekan/wekan/pull/1350).
+
+Thanks to GitHub users andresmanelli and pierreozoux for their contributions.
+
+# v0.56 2017-11-21 Wekan release
+
+This release adds the following new features:
+
+* [Copy/Move cards to other board in Standalone Wekan](https://github.com/wekan/wekan/pull/1330);
+* [Spent time/Overtime on card](https://github.com/wekan/wekan/pull/1344);
+* New translation: Greek.
+
+and fixes the following bugs:
+
+* [Board list with long-description boards not visible](https://github.com/wekan/wekan/pull/1346);
+* [Remove erroneous minicard title whitespace](https://github.com/wekan/wekan/pull/1347);
+* [Fix title editing with shift key at card details](https://github.com/wekan/wekan/pull/1348).
+
+Thanks to GitHub users couscous3, GhassenRjab, thuanpq and xet7 for their contributions.
+
+# v0.55 2017-11-19 Wekan release
+
+This release adds the following new features:
+
+* [Markdown in card/minicard/checlist titles and checklist items. Next line: Shift+Enter. Submit: Enter.](https://github.com/wekan/wekan/pull/1334);
+* [User Admin to Admin Panel: List users. Change: is user admin, name, fullname, email address, is user active. Not changing password yet.](https://github.com/wekan/wekan/pull/1325);
+* [REST API better error output](https://github.com/wekan/wekan/pull/1323).
+
+and fixes the following bugs:
+
+* [Emoji detection breaks MAC addresses](https://github.com/wekan/wekan/issues/1248); - this has not yet fixed all cases.
+* [Codeblocks should not be scanned for emoji](https://github.com/wekan/wekan/issues/643);
+* [Whitespace trimming breaks Markdown code block indentation](https://github.com/wekan/wekan/issues/1288):
+* [Helper to list boards for user](https://github.com/wekan/wekan/pull/1327);
+* [Error after sending invitation and joining board: Exception while invoking method 'login' TypeError: Cannot read property 'loginDisabled' of undefined](https://github.com/wekan/wekan/issues/1331);
+* [Invitation /sign-up page did not show input for invitation code](https://github.com/wekan/wekan/commit/99be745f0299b32a8a7b30204b43bff7fd5ba638).
+
+Thanks to Github users brooksbecton, milesibastos, nztqa, soohwa, thuanpq and xet7 for their contributions.
+
+# v0.54 2017-11-02 Wekan release
+
+This release adds the following new features:
+
+* [Soft WIP Limit](https://github.com/wekan/wekan/pull/1319).
+
+Thanks to GitHub users amadilsons and xet7 for their contributions.
+
+# v0.53 2017-11-02 Wekan release
+
+(This was canceled, it had some missing version numbers).
+
+# v0.52 2017-10-31 Wekan release
+
+This release adds the following new features:
+
+* [Permit editing WIP limit](https://github.com/wekan/wekan/pull/1312);
+* [Image attachment resize on smaller screens and swipebox](https://github.com/wekan/wekan/pull/1315);
+* [Add iPhone favicon for Wekan](https://github.com/wekan/wekan/issues/1317).
+
+and fixes the following bugs:
+
+* [Members do not get included on board import from Wekan](https://github.com/wekan/wekan/pull/1316).
+
+Thanks to GitHub users brooksbecton, guillaumebriday, nztqa, ocdtrekkie and Tentoe for their contributions.
+
+# v0.51 2017-10-25 Wekan release
+
+This release adds the following new features:
+
+* [REST API: Disable and enable user login. Take ownership boards of a user. List boards of user.](https://github.com/wekan/wekan/pull/1296);
+* [Add translation: Spanish of Argentina](https://github.com/wekan/wekan/commit/b105f0e2e72c49a2f1ba3f6c87532a5418192386);
+* [Add more languages to Roboto font](https://github.com/wekan/wekan/issues/1299).
+
+and fixes the following bugs:
+
+* [Segfault on Alpine Linux](https://github.com/wekan/wekan/issues/1303);
+* [Change invitation link from sign-in to sign-up](https://github.com/wekan/wekan/issues/1300);
+* [User with comment only permission can add cards](https://github.com/wekan/wekan/issues/1301).
+
+Thanks to GitHub users chromas-cro, soohwa, wenerme and xet7 for their contributions.
+
+# v0.50 2017-10-10 Wekan release
+
+This release fixes the following bugs:
+
+* [Fix and update translations](https://github.com/wekan/wekan/issues/1286).
+
+Thanks to GitHub user xet7 for contributions.
+
+# v0.49 2017-10-09 Wekan release
+
+This release fixes the following bugs:
+
+* [When WIP limit in use, hide also add card + button at top of list](https://github.com/wekan/wekan/commit/a5daf5dc29278b82e133fbe4db09a91ffc0c0d3b).
+
+Thanks to GitHub user xet7 for contributions.
+
+# v0.48 2017-10-09 Wekan release
+
+This release adds the following new features:
+
+* [WIP Limits](https://github.com/wekan/wekan/pull/1278);
+* [REST API: Create user despite disabling registration](https://github.com/wekan/wekan/issues/1232);
+* [User can leave board on Standalone Wekan](https://github.com/wekan/wekan/pull/1283).
+
+and fixes the following bugs:
+
+* [Admin announcement can be viewed without signing in](https://github.com/wekan/wekan/issues/1281).
+
+Thanks to GitHub users amadilsons, nztqa and soohwa for their contributions.
+
+# v0.47 2017-10-04 Wekan release
+
+This release adds the following new features:
+
+* [Use theme color for Slider for Comments only](https://github.com/wekan/wekan/pull/1275).
+
+Thanks to GitHub user nztqa for contributions.
+
+# v0.46 2017-10-03 Wekan release
+
+This release adds the following new features:
+
+* [Webhook parameters and response order](https://github.com/wekan/wekan/pull/1263).
+
+and fixes the following bugs:
+
+* SECURITY FIX: [Meteor allow/deny](https://blog.meteor.com/meteor-allow-deny-vulnerability-disclosure-baf398f47b25) fixed
+ [here](https://github.com/wekan/wekan/commit/c3804dc0fad0817285460d86dc1b3bdc96361f49);
+* [Fix: Slider for Comments only does not work correctly with over 21 activities](https://github.com/wekan/wekan/pull/1247).
+
+Thanks to GitHub users andresmanelli and nztqa for their contributions.
+
+# v0.45 2017-10-01 Wekan release
+
+This release adds the following new features:
+
+* [Slider for Comments only in activity feed](https://github.com/wekan/wekan/issues/1247);
+* [Site Wide Announcement](https://github.com/wekan/wekan/pull/1260).
+
+and fixes the following bugs:
+
+* [Data inconsistency when copying card](https://github.com/wekan/wekan/pull/1246). Note: There is no feature for copying card attachment yet;
+* [Hide create label from normal users, because only board admin can create labels](https://github.com/wekan/wekan/pull/1261).
+
+Thanks to GitHub user nztqa for contributions.
+
+# v0.44 2017-09-30 Wekan release
+
+This release adds the following new features:
+
+* [Confirm popup appears before Checklist Delete](https://github.com/wekan/wekan/pull/1257).
+
+and fixes the following bugs:
+
+* [Fix errors when importing from Trello](https://github.com/wekan/wekan/pull/1259).
+
+Thanks to GitHub users amadilsons and GhassenRjab for their contributions.
+
+# v0.43 2017-09-25 Wekan release
+
+This release fixes the following bugs:
+
+* [Add emojis back, because removing them broke local dev Sandstorm](https://github.com/wekan/wekan/issues/1248).
+
+Thanks to GitHub user xet7 for contributions.
+
+# v0.42 2017-09-25 Wekan release
+
+This release fixes the following bugs:
+
+* [Remove emoji support, because it breaks MAC addresses, urls, code etc](https://github.com/wekan/wekan/issues/1248).
+
+Thanks to GitHub user xet7 for contributions.
+
+# v0.41 2017-09-25 Wekan release
+
+This release fixes the following bugs:
+
+* [Can't create user and login after install. Reverting REST API: Create user despite disabling registration](https://github.com/wekan/wekan/issues/1249).
+
+Thanks to GitHub user xet7 for contributions.
+
+# v0.40 2017-09-25 Wekan release
+
+This release adds the following new features:
* [Add translations (en/de/fi) for email notifications regarding checklists and checklist
- items](https://github.com/wekan/wekan/pull/1238).
+ items](https://github.com/wekan/wekan/pull/1238);
+* [Added plus button to add card on top of the list](https://github.com/wekan/wekan/pull/1244);
+* [REST API: Create user despite disabling registration](https://github.com/wekan/wekan/issues/1232).
-Thanks to GitHub users umbertooo and xet7 for their contributions.
+and fixes the following bugs:
+
+* [Checklist items are lost when moving items to another checklist](https://github.com/wekan/wekan/pull/1240);
+* [Keep state of checklist items when moved to another checklist](https://github.com/wekan/wekan/pull/1242).
+
+Thanks to GitHub users GhassenRjab, mario-orlicky, soohwa, umbertooo and xet7 for their contributions.
# v0.39 2017-09-18 Wekan release
@@ -333,12 +978,12 @@ and fixes the following bugs:
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
+ On both cases, althought 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;
+* Show customized error msg while invitation 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
@@ -443,7 +1088,7 @@ and adds the following new features:
```
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;
@@ -624,7 +1269,7 @@ performance and security. It also features the following improvements:
password, to change the password, or to enable email confirmation (all of
which were previously impossible);
* Avatar customization, including the possibility to upload images and to choose
- one from Gravatar or the user initials (on Sandstrom we use the avatar exposed
+ one from Gravatar or the user initials (on Sandstorm we use the avatar exposed
by Sandstorm);
* Cards multi-selection to facilitate batch actions such as moving all the cards
of selection, or attaching a label or a member to them;
diff --git a/Dockerfile b/Dockerfile
index 41101ad0..c794f6dc 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM debian:8.9
+FROM debian:buster-slim
MAINTAINER wekan
# Declare Arguments
@@ -12,14 +12,15 @@ ARG ARCHITECTURE
ARG SRC_PATH
# Set the environment variables (defaults where required)
-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:-v4.8.4}
-ENV METEOR_RELEASE ${METEOR_RELEASE:-1.4.4.1}
+# DOES NOT WORK: paxctl fix for alpine linux: https://github.com/wekan/wekan/issues/1303
+# ENV BUILD_DEPS="paxctl"
+ENV BUILD_DEPS="apt-utils gnupg gosu wget curl bzip2 build-essential python git ca-certificates gcc-7"
+ENV NODE_VERSION ${NODE_VERSION:-v8.11.1}
+ENV METEOR_RELEASE ${METEOR_RELEASE:-1.6.0.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 FIBERS_VERSION ${FIBERS_VERSION:-1.0.15}
+ENV NPM_VERSION ${NPM_VERSION:-5.5.1}
+ENV FIBERS_VERSION ${FIBERS_VERSION:-2.0.0}
ENV ARCHITECTURE ${ARCHITECTURE:-linux-x64}
ENV SRC_PATH ${SRC_PATH:-./}
@@ -31,45 +32,51 @@ RUN \
useradd --user-group --system --home-dir /home/wekan wekan && \
\
# OS dependencies
- 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 }')" && \
- wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/${GOSU_VERSION}/gosu-${GOSU_ARCHITECTURE}" && \
- wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/${GOSU_VERSION}/gosu-${GOSU_ARCHITECTURE}.asc" && \
- export GNUPGHOME="$(mktemp -d)" && \
- gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 && \
- gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu && \
- rm -R "$GNUPGHOME" /usr/local/bin/gosu.asc && \
- chmod +x /usr/local/bin/gosu && \
+ apt-get update -y && apt-get install -y --no-install-recommends ${BUILD_DEPS} && \
\
# Download nodejs
- wget https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \
- wget https://nodejs.org/dist/${NODE_VERSION}/SHASUMS256.txt.asc && \
+ #wget https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \
+ #wget https://nodejs.org/dist/${NODE_VERSION}/SHASUMS256.txt.asc && \
+ #---------------------------------------------------------------------------------------------
+ # Node Fibers 100% CPU usage issue:
+ # https://github.com/wekan/wekan-mongodb/issues/2#issuecomment-381453161
+ # https://github.com/meteor/meteor/issues/9796#issuecomment-381676326
+ # https://github.com/sandstorm-io/sandstorm/blob/0f1fec013fe7208ed0fd97eb88b31b77e3c61f42/shell/server/00-startup.js#L99-L129
+ # Also see beginning of wekan/server/authentication.js
+ # import Fiber from "fibers";
+ # Fiber.poolSize = 1e9;
+ # Download node version 8.11.1 that has fix included, node binary copied from Sandstorm
+ # Description at https://releases.wekan.team/node.txt
+ # SHA256SUM: 18c99d5e79e2fe91e75157a31be30e5420787213684d4048eb91e602e092725d
+ wget https://releases.wekan.team/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \
+ echo "c85ed210a360c50d55baaf7b49419236e5241515ed21410d716f4c1f5deedb12 node-v8.11.1-linux-x64.tar.gz" >> SHASUMS256.txt.asc && \
\
# Verify nodejs authenticity
grep ${NODE_VERSION}-${ARCHITECTURE}.tar.gz SHASUMS256.txt.asc | shasum -a 256 -c - && \
- export GNUPGHOME="$(mktemp -d)" && \
-
+ #export GNUPGHOME="$(mktemp -d)" && \
+ #\
# 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 && \
+ #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 && \
+ # Ignore socket files then delete files then delete directories
+ #find "$GNUPGHOME" -type f | xargs rm -f && \
+ #find "$GNUPGHOME" -type d | xargs rm -fR && \
+ rm -f SHASUMS256.txt.asc && \
\
# Install Node
tar xvzf node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \
@@ -78,6 +85,9 @@ RUN \
ln -s /opt/nodejs/bin/node /usr/bin/node && \
ln -s /opt/nodejs/bin/npm /usr/bin/npm && \
\
+ #DOES NOT WORK: paxctl fix for alpine linux: https://github.com/wekan/wekan/issues/1303
+ #paxctl -mC `which node` && \
+ \
# Install Node dependencies
npm install -g npm@${NPM_VERSION} && \
npm install -g node-gyp && \
@@ -86,14 +96,14 @@ RUN \
# Change user to wekan and install meteor
cd /home/wekan/ && \
chown wekan:wekan --recursive /home/wekan && \
- curl https://install.meteor.com -o ./install_meteor.sh && \
+ curl https://install.meteor.com -o /home/wekan/install_meteor.sh && \
sed -i "s|RELEASE=.*|RELEASE=${METEOR_RELEASE}\"\"|g" ./install_meteor.sh && \
echo "Starting meteor ${METEOR_RELEASE} installation... \n" && \
- chown wekan:wekan ./install_meteor.sh && \
+ chown wekan:wekan /home/wekan/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; \
+ gosu wekan:wekan sh /home/wekan/install_meteor.sh; \
else \
gosu wekan:wekan git clone --recursive --depth 1 -b release/METEOR@${METEOR_EDGE} git://github.com/meteor/meteor.git /home/wekan/.meteor; \
fi; \
@@ -115,12 +125,12 @@ RUN \
gosu wekan: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: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:wekan rm -rf node_modules/bcrypt && \
gosu wekan:wekan npm install bcrypt && \
cd /home/wekan/app_build/bundle/programs/server/ && \
gosu wekan:wekan npm install && \
+ gosu wekan:wekan npm install bcrypt && \
mv /home/wekan/app_build/bundle /build && \
\
# Cleanup
diff --git a/LICENSE b/LICENSE
index 57c8d86b..04faa72e 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
The MIT License (MIT)
-Copyright (c) 2014-2017 The Wekan Team
+Copyright (c) 2014-2018 The Wekan Team
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/README.md b/README.md
index 370b9ddb..ba9a3a10 100644
--- a/README.md
+++ b/README.md
@@ -1,14 +1,19 @@
# Wekan
-[![Wekan Build Status][travis_badge]][travis_status]
-
-Freenode IRC #wekan
+[![Translate Wekan at Transifex](https://img.shields.io/badge/Translate%20Wekan-at%20Transifex-brightgreen.svg "Freenode IRC")](https://transifex.com/wekan/wekan)
-[![Wekan chat][vanila_badge]][vanila_chat]
+[![Wekan Vanila Chat][vanila_badge]][vanila_chat]
+[![IRC #wekan](https://img.shields.io/badge/IRC%20%23wekan-on%20Freenode-brightgreen.svg "Freenode IRC")](http://webchat.freenode.net?channels=%23wekan&uio=d4)
-[Translate Wekan at Transifex][translate_wekan]
-
-[Open Hub analysis of Wekan code](https://www.openhub.net/p/wekan)
+[![Contributors](https://img.shields.io/github/contributors/wekan/wekan.svg "Contributors")](https://github.com/wekan/wekan/graphs/contributors)
+[![Docker Repository on Quay](https://quay.io/repository/wekan/wekan/status "Docker Repository on Quay")](https://quay.io/repository/wekan/wekan)
+[![Docker Hub container status](https://img.shields.io/docker/build/wekanteam/wekan.svg "Docker Hub container status")](https://hub.docker.com/r/wekanteam/wekan)
+[![Docker Hub pulls](https://img.shields.io/docker/pulls/wekanteam/wekan.svg "Docker Hub Pulls")](https://hub.docker.com/r/wekanteam/wekan)
+[![Wekan Build Status][travis_badge]][travis_status]
+[![Codacy Badge](https://api.codacy.com/project/badge/Grade/02137ecec4e34c5aa303f57637196a93 "Codacy Badge")](https://www.codacy.com/app/xet7/wekan?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=wekan/wekan&amp;utm_campaign=Badge_Grade)
+[![Code Climate](https://codeclimate.com/github/wekan/wekan/badges/gpa.svg "Code Climate")](https://codeclimate.com/github/wekan/wekan)
+[![Project Dependencies](https://david-dm.org/wekan/wekan.svg "Project Dependencies")](https://david-dm.org/wekan/wekan)
+[![Code analysis at Open Hub](https://img.shields.io/badge/code%20analysis-at%20Open%20Hub-brightgreen.svg "Code analysis at Open Hub")](https://www.openhub.net/p/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 :)
@@ -80,7 +85,7 @@ with [Meteor](https://www.meteor.com).
[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]: https://wekan.github.io/screenshot.png
+[screenshot_wefork]: https://wekan.github.io/wekan-markdown.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
diff --git a/client/components/activities/activities.jade b/client/components/activities/activities.jade
index b52a2981..d3e3d5ba 100644
--- a/client/components/activities/activities.jade
+++ b/client/components/activities/activities.jade
@@ -31,7 +31,7 @@ template(name="boardActivities")
.activity-checklist(href="{{ card.absoluteUrl }}")
+viewer
= checklist.title
-
+
if($eq activityType 'addChecklistItem')
| {{{_ 'activity-checklist-item-added' checklist.title cardLink}}}.
.activity-checklist(href="{{ card.absoluteUrl }}")
@@ -44,6 +44,9 @@ template(name="boardActivities")
if($eq activityType 'archivedList')
| {{_ 'activity-archived' list.title}}.
+ if($eq activityType 'archivedSwimlane')
+ | {{_ 'activity-archived' swimlane.title}}.
+
if($eq activityType 'createBoard')
| {{_ 'activity-created' boardLabel}}.
@@ -56,6 +59,9 @@ template(name="boardActivities")
if($eq activityType 'createList')
| {{_ 'activity-added' list.title boardLabel}}.
+ if($eq activityType 'createSwimlane')
+ | {{_ 'activity-added' swimlane.title boardLabel}}.
+
if($eq activityType 'removeList')
| {{_ 'activity-removed' title boardLabel}}.
diff --git a/client/components/activities/activities.styl b/client/components/activities/activities.styl
index 2285fc0a..380e7b40 100644
--- a/client/components/activities/activities.styl
+++ b/client/components/activities/activities.styl
@@ -1,5 +1,10 @@
@import 'nib'
+.activity-title
+ margin: 0 0.5em 0.8em
+ display: flex
+ justify-content:space-between
+
.activities
clear: both
@@ -12,10 +17,14 @@
height: @width
.activity-desc
+ word-wrap: break-word
+ overflow: hidden
flex: 1
align-self: center
margin: 0
margin-left: 3px
+ overflow: hidden;
+ word-break: break-word;
.activity-comment
display: block
diff --git a/client/components/boards/boardArchive.jade b/client/components/boards/boardArchive.jade
index 724e6569..6576f742 100644
--- a/client/components/boards/boardArchive.jade
+++ b/client/components/boards/boardArchive.jade
@@ -11,4 +11,4 @@ template(name="archivedBoards")
| {{_ 'restore-board'}}
= title
else
- li.no-items-message {{_ 'no-archived-board'}}
+ li.no-items-message {{_ 'no-archived-boards'}}
diff --git a/client/components/boards/boardBody.jade b/client/components/boards/boardBody.jade
index fe10c921..29a613b9 100644
--- a/client/components/boards/boardBody.jade
+++ b/client/components/boards/boardBody.jade
@@ -14,30 +14,14 @@ template(name="board")
template(name="boardBody")
.board-wrapper(class=currentBoard.colorClass)
+sidebar
- .board-canvas(
+ .board-canvas.js-swimlanes.js-perfect-scrollbar(
class="{{#if Sidebar.isOpen}}is-sibling-sidebar-open{{/if}}"
class="{{#if MultiSelection.isActive}}is-multiselection-active{{/if}}"
class="{{#if draggingActive.get}}is-dragging-active{{/if}}")
if showOverlay.get
.board-overlay
- .lists.js-lists
- each currentBoard.lists
- +list(this)
- if currentCardIsInThisList
- +cardDetails(currentCard)
- if canSeeAddList
- +addListForm
-
-template(name="addListForm")
- .list.js-list.list-composer.js-list-composer
- .list-header
- +inlinedForm(autoclose=false)
- input.list-name-input.full-line(type="text" placeholder="{{_ 'add-list'}}"
- autocomplete="off" autofocus)
- .edit-controls.clearfix
- button.primary.confirm(type="submit") {{_ 'save'}}
- a.fa.fa-times-thin.js-close-inlined-form
- else
- a.open-list-composer.js-open-inlined-form
- i.fa.fa-plus
- | {{_ 'add-list'}}
+ if isViewSwimlanes
+ each currentBoard.swimlanes
+ +swimlane(this)
+ if isViewLists
+ +listsGroup
diff --git a/client/components/boards/boardBody.js b/client/components/boards/boardBody.js
index b3880c61..456bf9b3 100644
--- a/client/components/boards/boardBody.js
+++ b/client/components/boards/boardBody.js
@@ -1,9 +1,8 @@
const subManager = new SubsManager();
+const { calculateIndex } = Utils;
BlazeComponent.extendComponent({
onCreated() {
- this.draggingActive = new ReactiveVar(false);
- this.showOverlay = new ReactiveVar(false);
this.isBoardReady = new ReactiveVar(false);
// The pattern we use to manually handle data loading is described here:
@@ -21,40 +20,90 @@ BlazeComponent.extendComponent({
});
});
});
+ },
- this._isDragging = false;
- this._lastDragPositionX = 0;
+ onlyShowCurrentCard() {
+ return Utils.isMiniScreen() && Session.get('currentCard');
+ },
+
+}).register('board');
+BlazeComponent.extendComponent({
+ onCreated() {
+ this.showOverlay = new ReactiveVar(false);
+ this.draggingActive = new ReactiveVar(false);
+ this._isDragging = false;
// Used to set the overlay
this.mouseHasEnterCardDetails = false;
},
+ onRendered() {
+ const boardComponent = this;
+ const $swimlanesDom = boardComponent.$('.js-swimlanes');
+
+ $swimlanesDom.sortable({
+ tolerance: 'pointer',
+ appendTo: '.board-canvas',
+ helper: 'clone',
+ handle: '.js-swimlane-header',
+ items: '.js-swimlane:not(.placeholder)',
+ placeholder: 'swimlane placeholder',
+ distance: 7,
+ start(evt, ui) {
+ ui.placeholder.height(ui.helper.height());
+ EscapeActions.executeUpTo('popup-close');
+ boardComponent.setIsDragging(true);
+ },
+ stop(evt, ui) {
+ // To attribute the new index number, we need to get the DOM element
+ // of the previous and the following card -- if any.
+ const prevSwimlaneDom = ui.item.prev('.js-swimlane').get(0);
+ const nextSwimlaneDom = ui.item.next('.js-swimlane').get(0);
+ const sortIndex = calculateIndex(prevSwimlaneDom, nextSwimlaneDom, 1);
+
+ $swimlanesDom.sortable('cancel');
+ const swimlaneDomElement = ui.item.get(0);
+ const swimlane = Blaze.getData(swimlaneDomElement);
+
+ Swimlanes.update(swimlane._id, {
+ $set: {
+ sort: sortIndex.base,
+ },
+ });
- openNewListForm() {
- this.childComponents('addListForm')[0].open();
- },
+ boardComponent.setIsDragging(false);
+ },
+ });
- // XXX Flow components allow us to avoid creating these two setter methods by
- // exposing a public API to modify the component state. We need to investigate
- // best practices here.
- setIsDragging(bool) {
- this.draggingActive.set(bool);
+ function userIsMember() {
+ return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
+ }
+
+ // If there is no data in the board (ie, no lists) we autofocus the list
+ // creation form by clicking on the corresponding element.
+ const currentBoard = Boards.findOne(Session.get('currentBoard'));
+ if (userIsMember() && currentBoard.lists().count() === 0) {
+ boardComponent.openNewListForm();
+ }
},
- scrollLeft(position = 0) {
- const lists = this.$('.js-lists');
- lists && lists.animate({
- scrollLeft: position,
- });
+ isViewSwimlanes() {
+ const currentUser = Meteor.user();
+ return (currentUser.profile.boardView === 'board-view-swimlanes');
},
- currentCardIsInThisList() {
- const currentCard = Cards.findOne(Session.get('currentCard'));
- const listId = this.currentData()._id;
- return currentCard && currentCard.listId === listId;
+ isViewLists() {
+ const currentUser = Meteor.user();
+ return (currentUser.profile.boardView === 'board-view-lists');
},
- onlyShowCurrentCard() {
- return Utils.isMiniScreen() && Session.get('currentCard');
+ openNewListForm() {
+ if (this.isViewSwimlanes()) {
+ this.childComponents('swimlane')[0]
+ .childComponents('addListAndSwimlaneForm')[0].open();
+ } else if (this.isViewLists()) {
+ this.childComponents('listsGroup')[0]
+ .childComponents('addListForm')[0].open();
+ }
},
events() {
@@ -66,147 +115,26 @@ BlazeComponent.extendComponent({
this.showOverlay.set(false);
}
},
-
- // Click-and-drag action
- 'mousedown .board-canvas'(evt) {
- // Translating the board canvas using the click-and-drag action can
- // conflict with the build-in browser mechanism to select text. We
- // define a list of elements in which we disable the dragging because
- // the user will legitimately expect to be able to select some text with
- // his mouse.
- const noDragInside = ['a', 'input', 'textarea', 'p', '.js-list-header'];
- if ($(evt.target).closest(noDragInside.join(',')).length === 0 && $('.lists').prop('clientHeight') > evt.offsetY) {
- this._isDragging = true;
- this._lastDragPositionX = evt.clientX;
- }
- },
'mouseup'() {
if (this._isDragging) {
this._isDragging = false;
}
},
- 'mousemove'(evt) {
- if (this._isDragging) {
- // Update the canvas position
- this.listsDom.scrollLeft -= evt.clientX - this._lastDragPositionX;
- this._lastDragPositionX = evt.clientX;
- // Disable browser text selection while dragging
- evt.stopPropagation();
- evt.preventDefault();
- // Don't close opened card or inlined form at the end of the
- // click-and-drag.
- EscapeActions.executeUpTo('popup-close');
- EscapeActions.preventNextClick();
- }
- },
}];
},
-}).register('board');
-
-Template.boardBody.onRendered(function() {
- const self = BlazeComponent.getComponentForElement(this.firstNode);
-
- self.listsDom = this.find('.js-lists');
-
- if (!Session.get('currentCard')) {
- self.scrollLeft();
- }
-
- // We want to animate the card details window closing. We rely on CSS
- // transition for the actual animation.
- self.listsDom._uihooks = {
- removeElement(node) {
- const removeNode = _.once(() => {
- node.parentNode.removeChild(node);
- });
- if ($(node).hasClass('js-card-details')) {
- $(node).css({
- flexBasis: 0,
- padding: 0,
- });
- $(self.listsDom).one(CSSEvents.transitionend, removeNode);
- } else {
- removeNode();
- }
- },
- };
-
- $(self.listsDom).sortable({
- tolerance: 'pointer',
- helper: 'clone',
- handle: '.js-list-header',
- items: '.js-list:not(.js-list-composer)',
- placeholder: 'list placeholder',
- distance: 7,
- start(evt, ui) {
- ui.placeholder.height(ui.helper.height());
- Popup.close();
- },
- stop() {
- $(self.listsDom).find('.js-list:not(.js-list-composer)').each(
- (i, list) => {
- const data = Blaze.getData(list);
- Lists.update(data._id, {
- $set: {
- sort: i,
- },
- });
- }
- );
- },
- });
-
- function userIsMember() {
- return Meteor.user() && Meteor.user().isBoardMember();
- }
-
- // Disable drag-dropping while in multi-selection mode, or if the current user
- // is not a board member
- self.autorun(() => {
- const $listDom = $(self.listsDom);
- if ($listDom.data('sortable')) {
- $(self.listsDom).sortable('option', 'disabled',
- MultiSelection.isActive() || !userIsMember());
- }
- });
- // If there is no data in the board (ie, no lists) we autofocus the list
- // creation form by clicking on the corresponding element.
- const currentBoard = Boards.findOne(Session.get('currentBoard'));
- if (userIsMember() && currentBoard.lists().count() === 0) {
- self.openNewListForm();
- }
-});
-
-BlazeComponent.extendComponent({
- // Proxy
- open() {
- this.childComponents('inlinedForm')[0].open();
+ // XXX Flow components allow us to avoid creating these two setter methods by
+ // exposing a public API to modify the component state. We need to investigate
+ // best practices here.
+ setIsDragging(bool) {
+ this.draggingActive.set(bool);
},
- events() {
- return [{
- submit(evt) {
- evt.preventDefault();
- const titleInput = this.find('.list-name-input');
- const title = titleInput.value.trim();
- if (title) {
- Lists.insert({
- title,
- boardId: Session.get('currentBoard'),
- sort: $('.list').length,
- });
-
- titleInput.value = '';
- titleInput.focus();
- }
- },
- }];
+ scrollLeft(position = 0) {
+ const swimlanes = this.$('.js-swimlanes');
+ swimlanes && swimlanes.animate({
+ scrollLeft: position,
+ });
},
-}).register('addListForm');
-Template.boardBody.helpers({
- canSeeAddList() {
- return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
- },
-});
+}).register('boardBody');
diff --git a/client/components/boards/boardBody.styl b/client/components/boards/boardBody.styl
index df5696a2..a614c7ed 100644
--- a/client/components/boards/boardBody.styl
+++ b/client/components/boards/boardBody.styl
@@ -1,8 +1,11 @@
@import 'nib'
position()
- if arguments[0] == cover
- position: absolute
+ if arguments[0] == cover || arguments[0] == fixed-cover
+ if arguments[0] == cover
+ position: absolute
+ else
+ position: fixed
left: 0
right: 0
top: 0
@@ -12,26 +15,18 @@ position()
.board-wrapper
position: cover
+ overflow-y: hidden;
.board-canvas
position: cover
transition: margin .1s
+ overflow-y: auto;
&.is-sibling-sidebar-open
margin-right: 248px
- .lists
- align-items: flex-start
- display: flex
- flex-direction: row
- margin: 0 0 10px
- padding: 0 40px 5px 0
- overflow-x: auto
- overflow-y: hidden
- position: cover
-
.board-overlay
- position: cover
+ position: fixed-cover
top: -100px
right: -400px
background: black
@@ -43,3 +38,17 @@ position()
.open-minicard-composer,
.minicard-wrapper.is-checked
display: none
+
+@media screen and (max-width: 800px)
+ .board-wrapper
+
+ .board-canvas
+
+ .swimlane
+ border-bottom: 1px solid #CCC
+ display: flex
+ flex-direction: column
+ margin: 0
+ padding: 0 40px 0px 0
+ overflow-x: hidden
+ overflow-y: auto
diff --git a/client/components/boards/boardColors.styl b/client/components/boards/boardColors.styl
index 8e28fcfa..233659ca 100644
--- a/client/components/boards/boardColors.styl
+++ b/client/components/boards/boardColors.styl
@@ -51,11 +51,25 @@ setBoardColor(color)
&:not(.is-checked) + .minicard:hover:not(.minicard-composer)
background: lighten(color, 97%)
+ .toggle-label
+
+ &:after
+ background-color: darken(color, 20%)
+
+ .toggle-switch:checked ~ .toggle-label
+ background-color: lighten(color, 20%)
+
+ &:after
+ background-color: darken(color, 20%)
+
@media screen and (max-width: 800px)
&.pop-over .header
background: color
color: white
+ &#header ul li.current, &#header-quick-access ul li.current
+ border-bottom: 4px solid lighten(color, 20%)
+
.board-color-nephritis
setBoardColor(#27AE60)
diff --git a/client/components/boards/boardHeader.jade b/client/components/boards/boardHeader.jade
index 67acdc9e..b4ccd3b3 100644
--- a/client/components/boards/boardHeader.jade
+++ b/client/components/boards/boardHeader.jade
@@ -2,7 +2,8 @@ template(name="boardHeaderBar")
h1.header-board-menu
with currentBoard
a(class="{{#if currentUser.isBoardAdmin}}js-edit-board-title{{else}}is-disabled{{/if}}")
- = title
+ +viewer
+ = title
.board-header-btns.left
unless isMiniScreen
@@ -71,7 +72,7 @@ template(name="boardHeaderBar")
title="{{_ 'log-in'}}")
i.fa.fa-sign-in
span {{_ 'log-in'}}
-
+
if isSandstorm
if currentUser
a.board-header-btn.js-open-archived-board
@@ -87,6 +88,15 @@ template(name="boardHeaderBar")
a.board-header-btn-close.js-filter-reset(title="{{_ 'filter-clear'}}")
i.fa.fa-times-thin
+ a.board-header-btn.js-open-search-view(title="{{_ 'search'}}")
+ i.fa.fa-search
+ span {{_ 'search'}}
+
+ a.board-header-btn.js-toggle-board-view(
+ title="{{_ 'board-view'}}")
+ i.fa.fa-th-large
+ span {{_ currentUser.profile.boardView}}
+
if canModifyBoard
a.board-header-btn.js-multiselection-activate(
title="{{#if MultiSelection.isActive}}{{_ 'multi-selection-on'}}{{else}}{{_ 'multi-selection'}}{{/if}}"
diff --git a/client/components/boards/boardHeader.js b/client/components/boards/boardHeader.js
index 8983c722..e0b19246 100644
--- a/client/components/boards/boardHeader.js
+++ b/client/components/boards/boardHeader.js
@@ -62,10 +62,6 @@ BlazeComponent.extendComponent({
return user && user.hasStarred(boardId);
},
- isMiniScreen() {
- return Utils.isMiniScreen();
- },
-
// Only show the star counter if the number of star is greater than 2
showStarCounter() {
const currentBoard = Boards.findOne(Session.get('currentBoard'));
@@ -84,6 +80,14 @@ BlazeComponent.extendComponent({
'click .js-open-archived-board'() {
Modal.open('archivedBoards');
},
+ 'click .js-toggle-board-view'() {
+ const currentUser = Meteor.user();
+ if (currentUser.profile.boardView === 'board-view-swimlanes') {
+ currentUser.setBoardView('board-view-lists');
+ } else if (currentUser.profile.boardView === 'board-view-lists') {
+ currentUser.setBoardView('board-view-swimlanes');
+ }
+ },
'click .js-open-filter-view'() {
Sidebar.setView('filter');
},
@@ -92,6 +96,9 @@ BlazeComponent.extendComponent({
Sidebar.setView();
Filter.reset();
},
+ 'click .js-open-search-view'() {
+ Sidebar.setView('search');
+ },
'click .js-multiselection-activate'() {
const currentCard = Session.get('currentCard');
MultiSelection.activate();
@@ -172,6 +179,11 @@ const CreateBoard = BlazeComponent.extendComponent({
permission: visibility,
}));
+ Swimlanes.insert({
+ title: 'Default',
+ boardId: this.boardId.get(),
+ });
+
Utils.goBoardId(this.boardId.get());
},
diff --git a/client/components/boards/boardsList.jade b/client/components/boards/boardsList.jade
index ae82dfa9..95ce3678 100644
--- a/client/components/boards/boardsList.jade
+++ b/client/components/boards/boardsList.jade
@@ -20,6 +20,12 @@ template(name="boardList")
i.fa.js-star-board(
class="fa-star{{#if isStarred}} is-star-active{{else}}-o{{/if}}"
title="{{_ 'star-board-title'}}")
+
+ if hasSpentTimeCards
+ i.fa.js-has-spenttime-cards(
+ class="fa-circle{{#if hasOvertimeCards}} has-overtime-card-active{{else}} no-overtime-card-active{{/if}}"
+ title="{{#if hasOvertimeCards}}{{_ 'has-overtime-cards'}}{{else}}{{_ 'has-spenttime-cards'}}{{/if}}")
+
p.board-list-item-desc= description
li.js-add-board
a.board-list-item.label {{_ 'add-board'}}
diff --git a/client/components/boards/boardsList.js b/client/components/boards/boardsList.js
index e4bb050e..1ed88146 100644
--- a/client/components/boards/boardsList.js
+++ b/client/components/boards/boardsList.js
@@ -1,4 +1,10 @@
+const subManager = new SubsManager();
+
BlazeComponent.extendComponent({
+ onCreated() {
+ Meteor.subscribe('setting');
+ },
+
boards() {
return Boards.find({
archived: false,
@@ -13,6 +19,16 @@ BlazeComponent.extendComponent({
return user && user.hasStarred(this.currentData()._id);
},
+ hasOvertimeCards() {
+ subManager.subscribe('board', this.currentData()._id);
+ return this.currentData().hasOvertimeCards();
+ },
+
+ hasSpentTimeCards() {
+ subManager.subscribe('board', this.currentData()._id);
+ return this.currentData().hasSpentTimeCards();
+ },
+
isInvited() {
const user = Meteor.user();
return user && user.isInvitedTo(this.currentData()._id);
diff --git a/client/components/boards/boardsList.styl b/client/components/boards/boardsList.styl
index 4b5245f9..80e47685 100644
--- a/client/components/boards/boardsList.styl
+++ b/client/components/boards/boardsList.styl
@@ -17,6 +17,7 @@ $spaceBetweenTiles = 16px
opacity: 1
.board-list-item
+ overflow: hidden;
background-color: #999
color: #f6f6f6
height: 90px
@@ -43,9 +44,9 @@ $spaceBetweenTiles = 16px
line-height: 22px
.board-list-item-desc
- color: rgba(255, 255, 255, .5)
+ color: #fff
display: block
- font-size: 10px
+ font-size: 14px
font-weight: 400
line-height: 18px
@@ -73,6 +74,23 @@ $spaceBetweenTiles = 16px
transition-duration: .15s
transition-property: color, font-size, background
+ .fa-circle
+ bottom: 0;
+ font-size: 10px;
+ height: 10px;
+ line-height: 10px;
+ padding: 9px 9px;
+ position: absolute;
+ right: 0;
+ transition-duration: .15s
+ transition-property: color, font-size, background
+
+ .has-overtime-card-active
+ color: #eb4646 !important
+
+ .no-overtime-card-active
+ color: #3cb500 !important
+
.is-star-active
color: white
diff --git a/client/components/cards/attachments.jade b/client/components/cards/attachments.jade
index e35b364a..0f79323b 100644
--- a/client/components/cards/attachments.jade
+++ b/client/components/cards/attachments.jade
@@ -21,11 +21,11 @@ template(name="attachmentDeletePopup")
template(name="attachmentsGalery")
.attachments-galery
each attachments
- a.attachment-item.js-open-viewer(title="{{_ 'added'}} {{ moment uploadedAt }}")
- .attachment-thumbnail
+ .attachment-item
+ a.attachment-thumbnail.swipebox(href="{{url}}" title="{{name}}")
if isUploaded
if isImage
- img.attachment-thumbnail-img.js-preview-image(src="{{url}}")
+ img.attachment-thumbnail-img(src="{{url}}")
else
span.attachment-thumbnail-ext= extension
else
diff --git a/client/components/cards/attachments.js b/client/components/cards/attachments.js
index 95cb9f55..bc7d3979 100644
--- a/client/components/cards/attachments.js
+++ b/client/components/cards/attachments.js
@@ -11,9 +11,6 @@ Template.attachmentsGalery.events({
'click .js-download'(event) {
event.stopPropagation();
},
- 'click .js-open-viewer'() {
- // XXX Not implemented!
- },
'click .js-add-cover'() {
Cards.findOne(this.cardId).setCover(this._id);
},
@@ -63,7 +60,13 @@ Template.cardAttachmentsPopup.events({
file.boardId = card.boardId;
file.cardId = card._id;
file.userId = Meteor.userId();
- Attachments.insert(file);
+
+ const attachment = Attachments.insert(file);
+
+ if (attachment && attachment._id && attachment.isImage()) {
+ card.setCover(attachment._id);
+ }
+
Popup.close();
});
},
@@ -110,7 +113,12 @@ Template.previewClipboardImagePopup.events({
file.boardId = card.boardId;
file.cardId = card._id;
file.userId = Meteor.userId();
- Attachments.insert(file);
+ const attachment = Attachments.insert(file);
+
+ if (attachment && attachment._id && attachment.isImage()) {
+ card.setCover(attachment._id);
+ }
+
pastedResults = null;
$(document.body).pasteImageReader(() => {});
Popup.close();
diff --git a/client/components/cards/attachments.styl b/client/components/cards/attachments.styl
index 9a5d0645..4a22fd8a 100644
--- a/client/components/cards/attachments.styl
+++ b/client/components/cards/attachments.styl
@@ -58,7 +58,28 @@
.preview-clipboard-image
width: 280px
+ max-width: 100%;
height: 200px
display: block
border: 1px solid black
box-shadow: 0 1px 2px rgba(0,0,0,.2)
+
+@media screen and (max-width: 800px)
+ .attachments-galery
+ flex-direction
+ row
+ .attachment-item
+ width: 50% - 2%
+
+ .attachment-thumbnail
+ height: 130px
+ .attachment-details
+ font-size: 1.1em
+
+@media screen and (max-width: 360px)
+ .attachments-galery
+ .attachment-item
+ width: 100%
+
+ .attachment-thumbnail
+ height: 200px
diff --git a/client/components/cards/cardDate.js b/client/components/cards/cardDate.js
index 09a6761b..f33e8c19 100644
--- a/client/components/cards/cardDate.js
+++ b/client/components/cards/cardDate.js
@@ -1,10 +1,114 @@
-// Edit start & due dates
+// Edit received, start, due & end dates
+const EditCardDate = BlazeComponent.extendComponent({
+ template() {
+ return 'editCardDate';
+ },
+
+ onCreated() {
+ this.error = new ReactiveVar('');
+ this.card = this.data();
+ this.date = new ReactiveVar(moment.invalid());
+ },
+
+ onRendered() {
+ const $picker = this.$('.js-datepicker').datepicker({
+ todayHighlight: true,
+ todayBtn: 'linked',
+ language: TAPi18n.getLanguage(),
+ }).on('changeDate', function(evt) {
+ this.find('#date').value = moment(evt.date).format('L');
+ this.error.set('');
+ this.find('#time').focus();
+ }.bind(this));
+
+ if (this.date.get().isValid()) {
+ $picker.datepicker('update', this.date.get().toDate());
+ }
+ },
+
+ showDate() {
+ if (this.date.get().isValid())
+ return this.date.get().format('L');
+ return '';
+ },
+ showTime() {
+ if (this.date.get().isValid())
+ return this.date.get().format('LT');
+ return '';
+ },
+ dateFormat() {
+ return moment.localeData().longDateFormat('L');
+ },
+ timeFormat() {
+ return moment.localeData().longDateFormat('LT');
+ },
+
+ events() {
+ return [{
+ 'keyup .js-date-field'() {
+ // parse for localized date format in strict mode
+ const dateMoment = moment(this.find('#date').value, 'L', true);
+ if (dateMoment.isValid()) {
+ this.error.set('');
+ this.$('.js-datepicker').datepicker('update', dateMoment.toDate());
+ }
+ },
+ 'keyup .js-time-field'() {
+ // parse for localized time format in strict mode
+ const dateMoment = moment(this.find('#time').value, 'LT', true);
+ if (dateMoment.isValid()) {
+ this.error.set('');
+ }
+ },
+ 'submit .edit-date'(evt) {
+ evt.preventDefault();
+
+ // if no time was given, init with 12:00
+ const time = evt.target.time.value || moment(new Date().setHours(12, 0, 0)).format('LT');
+
+ const dateString = `${evt.target.date.value} ${time}`;
+ const newDate = moment(dateString, 'L LT', true);
+ if (newDate.isValid()) {
+ this._storeDate(newDate.toDate());
+ Popup.close();
+ }
+ else {
+ this.error.set('invalid-date');
+ evt.target.date.focus();
+ }
+ },
+ 'click .js-delete-date'(evt) {
+ evt.preventDefault();
+ this._deleteDate();
+ Popup.close();
+ },
+ }];
+ },
+});
+
Template.dateBadge.helpers({
canModifyCard() {
return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
},
});
+// editCardReceivedDatePopup
+(class extends EditCardDate {
+ onCreated() {
+ super.onCreated();
+ this.data().receivedAt && this.date.set(moment(this.data().receivedAt));
+ }
+
+ _storeDate(date) {
+ this.card.setReceived(date);
+ }
+
+ _deleteDate() {
+ this.card.unsetReceived();
+ }
+}).register('editCardReceivedDatePopup');
+
+
// editCardStartDatePopup
(class extends DatePicker {
onCreated() {
@@ -12,6 +116,13 @@ Template.dateBadge.helpers({
this.data().startAt && this.date.set(moment(this.data().startAt));
}
+ onRendered() {
+ super.onRendered();
+ if (moment.isDate(this.card.receivedAt)) {
+ this.$('.js-datepicker').datepicker('setStartDate', this.card.receivedAt);
+ }
+ }
+
_storeDate(date) {
this.card.setStart(date);
}
@@ -44,8 +155,31 @@ Template.dateBadge.helpers({
}
}).register('editCardDueDatePopup');
+// editCardEndDatePopup
+(class extends EditCardDate {
+ onCreated() {
+ super.onCreated();
+ this.data().endAt && this.date.set(moment(this.data().endAt));
+ }
+
+ onRendered() {
+ super.onRendered();
+ if (moment.isDate(this.card.startAt)) {
+ this.$('.js-datepicker').datepicker('setStartDate', this.card.startAt);
+ }
+ }
+
+ _storeDate(date) {
+ this.card.setEnd(date);
+ }
+
+ _deleteDate() {
+ this.card.unsetEnd();
+ }
+}).register('editCardEndDatePopup');
-// Display start & due dates
+
+// Display received, start, due & end dates
const CardDate = BlazeComponent.extendComponent({
template() {
return 'dateBadge';
@@ -74,6 +208,36 @@ const CardDate = BlazeComponent.extendComponent({
},
});
+class CardReceivedDate extends CardDate {
+ onCreated() {
+ super.onCreated();
+ const self = this;
+ self.autorun(() => {
+ self.date.set(moment(self.data().receivedAt));
+ });
+ }
+
+ classes() {
+ let classes = 'received-date' + ' ';
+ if (this.date.get().isBefore(this.now.get(), 'minute') &&
+ this.now.get().isBefore(this.data().dueAt)) {
+ classes += 'current';
+ }
+ return classes;
+ }
+
+ showTitle() {
+ return `${TAPi18n.__('card-received-on')} ${this.date.get().format('LLLL')}`;
+ }
+
+ events() {
+ return super.events().concat({
+ 'click .js-edit-date': Popup.open('editCardReceivedDate'),
+ });
+ }
+}
+CardReceivedDate.register('cardReceivedDate');
+
class CardStartDate extends CardDate {
onCreated() {
super.onCreated();
@@ -84,11 +248,12 @@ class CardStartDate extends CardDate {
}
classes() {
+ let classes = 'start-date' + ' ';
if (this.date.get().isBefore(this.now.get(), 'minute') &&
this.now.get().isBefore(this.data().dueAt)) {
- return 'current';
+ classes += 'current';
}
- return '';
+ return classes;
}
showTitle() {
@@ -113,13 +278,14 @@ class CardDueDate extends CardDate {
}
classes() {
+ let classes = 'due-date' + ' ';
if (this.now.get().diff(this.date.get(), 'days') >= 2)
- return 'long-overdue';
+ classes += 'long-overdue';
else if (this.now.get().diff(this.date.get(), 'minute') >= 0)
- return 'due';
+ classes += 'due';
else if (this.now.get().diff(this.date.get(), 'days') >= -1)
- return 'almost-due';
- return '';
+ classes += 'almost-due';
+ return classes;
}
showTitle() {
@@ -134,6 +300,44 @@ class CardDueDate extends CardDate {
}
CardDueDate.register('cardDueDate');
+class CardEndDate extends CardDate {
+ onCreated() {
+ super.onCreated();
+ const self = this;
+ self.autorun(() => {
+ self.date.set(moment(self.data().endAt));
+ });
+ }
+
+ classes() {
+ let classes = 'end-date' + ' ';
+ if (this.data.dueAt.diff(this.date.get(), 'days') >= 2)
+ classes += 'long-overdue';
+ else if (this.data.dueAt.diff(this.date.get(), 'days') >= 0)
+ classes += 'due';
+ else if (this.data.dueAt.diff(this.date.get(), 'days') >= -2)
+ classes += 'almost-due';
+ return classes;
+ }
+
+ showTitle() {
+ return `${TAPi18n.__('card-end-on')} ${this.date.get().format('LLLL')}`;
+ }
+
+ events() {
+ return super.events().concat({
+ 'click .js-edit-date': Popup.open('editCardEndDate'),
+ });
+ }
+}
+CardEndDate.register('cardEndDate');
+
+(class extends CardReceivedDate {
+ showDate() {
+ return this.date.get().format('l');
+ }
+}).register('minicardReceivedDate');
+
(class extends CardStartDate {
showDate() {
return this.date.get().format('l');
@@ -145,3 +349,10 @@ CardDueDate.register('cardDueDate');
return this.date.get().format('l');
}
}).register('minicardDueDate');
+
+(class extends CardEndDate {
+ showDate() {
+ return this.date.get().format('l');
+ }
+}).register('minicardEndDate');
+
diff --git a/client/components/cards/cardDate.styl b/client/components/cards/cardDate.styl
index 87a3ed25..9775e82b 100644
--- a/client/components/cards/cardDate.styl
+++ b/client/components/cards/cardDate.styl
@@ -30,10 +30,30 @@
&:hover, &.is-active
background-color: darken(#fd5d47, 7)
+ &.end-date
+ time
+ &::before
+ content: "\f253" // symbol: fa-hourglass-end
+
+ &.due-date
+ time
+ &::before
+ content: "\f090" // symbol: fa-sign-in
+
+ &.start-date
+ time
+ &::before
+ content: "\f08b" // symbol: fa-sign-out
+
+ &.received-date
+ time
+ &::before
+ content: "\f251" // symbol: fa-hourglass-start
+
time
&::before
font: normal normal normal 14px/1 FontAwesome
font-size: inherit
-webkit-font-smoothing: antialiased
- content: "\f017" // clock symbol
- margin-right: 0.3em \ No newline at end of file
+ margin-right: 0.3em
+
diff --git a/client/components/cards/cardDetails.jade b/client/components/cards/cardDetails.jade
index f72abe6d..b888210b 100644
--- a/client/components/cards/cardDetails.jade
+++ b/client/components/cards/cardDetails.jade
@@ -9,14 +9,44 @@ template(name="cardDetails")
a.fa.fa-navicon.card-details-menu.js-open-card-details-menu
h2.card-details-title.js-card-title(
class="{{#if canModifyCard}}js-open-inlined-form is-editable{{/if}}")
- = title
- if isWatching
- i.fa.fa-eye.card-details-watch
+ +viewer
+ = title
+ if isWatching
+ i.fa.fa-eye.card-details-watch
if archived
p.warning {{_ 'card-archived'}}
.card-details-items
+ .card-details-item.card-details-item-received
+ h3.card-details-item-title {{_ 'card-received'}}
+ if receivedAt
+ +cardReceivedDate
+ else
+ a.js-received-date {{_ 'add'}}
+
+ .card-details-item.card-details-item-start
+ h3.card-details-item-title {{_ 'card-start'}}
+ if startAt
+ +cardStartDate
+ else
+ a.js-start-date {{_ 'add'}}
+
+ .card-details-item.card-details-item-due
+ h3.card-details-item-title {{_ 'card-due'}}
+ if dueAt
+ +cardDueDate
+ else
+ a.js-due-date {{_ 'add'}}
+
+ .card-details-item.card-details-item-end
+ h3.card-details-item-title {{_ 'card-end'}}
+ if endAt
+ +cardEndDate
+ else
+ a.js-end-date {{_ 'add'}}
+
+ .card-details-items
.card-details-item.card-details-item-members
h3.card-details-item-title {{_ 'members'}}
each members
@@ -51,6 +81,15 @@ template(name="cardDetails")
= definition.name
+cardCustomField
+ .card-details-items
+ if spentTime
+ .card-details-item.card-details-item-spent
+ if isOvertime
+ h3.card-details-item-title {{_ 'overtime-hours'}}
+ else
+ h3.card-details-item-title {{_ 'spent-time-hours'}}
+ +cardSpentTime
+
//- XXX We should use "editable" to avoid repetiting ourselves
if canModifyCard
h3.card-details-item-title {{_ 'description'}}
@@ -81,16 +120,24 @@ template(name="cardDetails")
hr
+checklists(cardId = _id)
- if attachments.count
- hr
- h2
- i.fa.fa-paperclip
- | {{_ 'attachments'}}
+ hr
+ h3
+ i.fa.fa-paperclip
+ | {{_ 'attachments'}}
- +attachmentsGalery
+ +attachmentsGalery
hr
- h2 {{ _ 'activity'}}
+ .activity-title
+ h3 {{ _ 'activity'}}
+ if currentUser.isBoardMember
+ .material-toggle-switch
+ span.toggle-switch-title {{_ 'hide-system-messages'}}
+ if hiddenSystemMessages
+ input.toggle-switch(type="checkbox" id="toggleButton" checked="checked")
+ else
+ input.toggle-switch(type="checkbox" id="toggleButton")
+ label.toggle-label(for="toggleButton")
if currentUser.isBoardMember
+commentForm
if isLoaded.get
@@ -112,9 +159,12 @@ template(name="cardDetailsActionsPopup")
li: a.js-members {{_ 'card-edit-members'}}
li: a.js-labels {{_ 'card-edit-labels'}}
li: a.js-attachments {{_ 'card-edit-attachments'}}
+ li: a.js-received-date {{_ 'editCardReceivedDatePopup-title'}}
li: a.js-custom-fields {{_ 'card-edit-custom-fields'}}
li: a.js-start-date {{_ 'editCardStartDatePopup-title'}}
li: a.js-due-date {{_ 'editCardDueDatePopup-title'}}
+ li: a.js-end-date {{_ 'editCardEndDatePopup-title'}}
+ li: a.js-spent-time {{_ 'editCardSpentTimePopup-title'}}
hr
ul.pop-over-list
li: a.js-move-card-to-top {{_ 'moveCardToTop-title'}}
@@ -123,19 +173,48 @@ template(name="cardDetailsActionsPopup")
ul.pop-over-list
li: a.js-move-card {{_ 'moveCardPopup-title'}}
li: a.js-copy-card {{_ 'copyCardPopup-title'}}
+ li: a.js-copy-checklist-cards {{_ 'copyChecklistToManyCardsPopup-title'}}
unless archived
li: a.js-archive {{_ 'archive-card'}}
li: a.js-more {{_ 'cardMorePopup-title'}}
template(name="moveCardPopup")
- +boardLists
+ +boardsAndLists
template(name="copyCardPopup")
label(for='copy-card-title') {{_ 'title'}}:
textarea#copy-card-title.minicard-composer-textarea.js-card-title(autofocus)
= title
+ +boardsAndLists
+
+
+template(name="copyChecklistToManyCardsPopup")
+ label(for='copy-checklist-cards-title') {{_ 'copyChecklistToManyCardsPopup-instructions'}}:
+ textarea#copy-card-title.minicard-composer-textarea.js-card-title(autofocus)
+ | {{_ 'copyChecklistToManyCardsPopup-format'}}
+ +boardsAndLists
+
+template(name="boardsAndLists")
+ label {{_ 'boards'}}:
+ select.js-select-boards
+ each boards
+ if $eq _id currentBoard._id
+ option(value="{{_id}}" selected) {{_ 'current'}}
+ else
+ option(value="{{_id}}") {{title}}
+
+ label {{_ 'swimlanes'}}:
+ select.js-select-swimlanes
+ each swimlanes
+ option(value="{{_id}}") {{title}}
+
label {{_ 'lists'}}:
- +boardLists
+ select.js-select-lists
+ each aBoardLists
+ option(value="{{_id}}") {{title}}
+
+ .edit-controls.clearfix
+ button.primary.confirm.js-done {{_ 'done'}}
template(name="cardMembersPopup")
ul.pop-over-list.js-card-member-list
diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js
index 8d5c478d..26549fda 100644
--- a/client/components/cards/cardDetails.js
+++ b/client/components/cards/cardDetails.js
@@ -1,3 +1,6 @@
+const subManager = new SubsManager();
+const { calculateIndexData } = Utils;
+
BlazeComponent.extendComponent({
mixins() {
return [Mixins.InfiniteScrolling, Mixins.PerfectScrollbar];
@@ -18,9 +21,11 @@ BlazeComponent.extendComponent({
onCreated() {
this.isLoaded = new ReactiveVar(false);
- this.parentComponent().showOverlay.set(true);
- this.parentComponent().mouseHasEnterCardDetails = false;
+ this.parentComponent().parentComponent().showOverlay.set(true);
+ this.parentComponent().parentComponent().mouseHasEnterCardDetails = false;
this.calculateNextPeak();
+
+ Meteor.subscribe('unsaved-edits');
},
isWatching() {
@@ -28,16 +33,20 @@ BlazeComponent.extendComponent({
return card.findWatcher(Meteor.userId());
},
+ hiddenSystemMessages() {
+ return Meteor.user().hasHiddenSystemMessages();
+ },
+
canModifyCard() {
return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
},
scrollParentContainer() {
const cardPanelWidth = 510;
- const bodyBoardComponent = this.parentComponent();
+ const bodyBoardComponent = this.parentComponent().parentComponent();
- const $cardContainer = bodyBoardComponent.$('.js-lists');
const $cardView = this.$(this.firstNode());
+ const $cardContainer = bodyBoardComponent.$('.js-swimlanes');
const cardContainerScroll = $cardContainer.scrollLeft();
const cardContainerWidth = $cardContainer.width();
@@ -58,10 +67,55 @@ BlazeComponent.extendComponent({
onRendered() {
if (!Utils.isMiniScreen()) this.scrollParentContainer();
+ const $checklistsDom = this.$('.card-checklist-items');
+
+ $checklistsDom.sortable({
+ tolerance: 'pointer',
+ helper: 'clone',
+ handle: '.checklist-title',
+ items: '.js-checklist',
+ placeholder: 'checklist placeholder',
+ distance: 7,
+ start(evt, ui) {
+ ui.placeholder.height(ui.helper.height());
+ EscapeActions.executeUpTo('popup-close');
+ },
+ stop(evt, ui) {
+ let prevChecklist = ui.item.prev('.js-checklist').get(0);
+ if (prevChecklist) {
+ prevChecklist = Blaze.getData(prevChecklist).checklist;
+ }
+ let nextChecklist = ui.item.next('.js-checklist').get(0);
+ if (nextChecklist) {
+ nextChecklist = Blaze.getData(nextChecklist).checklist;
+ }
+ const sortIndex = calculateIndexData(prevChecklist, nextChecklist, 1);
+
+ $checklistsDom.sortable('cancel');
+ const checklist = Blaze.getData(ui.item.get(0)).checklist;
+
+ Checklists.update(checklist._id, {
+ $set: {
+ sort: sortIndex.base,
+ },
+ });
+ },
+ });
+
+ function userIsMember() {
+ return Meteor.user() && Meteor.user().isBoardMember();
+ }
+
+ // Disable sorting if the current user is not a board member
+ this.autorun(() => {
+ if ($checklistsDom.data('sortable')) {
+ $checklistsDom.sortable('option', 'disabled', !userIsMember());
+ }
+ });
},
onDestroyed() {
- this.parentComponent().showOverlay.set(false);
+ this.parentComponent().parentComponent().showOverlay.set(false);
},
events() {
@@ -95,9 +149,16 @@ BlazeComponent.extendComponent({
'click .js-member': Popup.open('cardMember'),
'click .js-add-members': Popup.open('cardMembers'),
'click .js-add-labels': Popup.open('cardLabels'),
+ 'click .js-received-date': Popup.open('editCardReceivedDate'),
+ 'click .js-start-date': Popup.open('editCardStartDate'),
+ 'click .js-due-date': Popup.open('editCardDueDate'),
+ 'click .js-end-date': Popup.open('editCardEndDate'),
'mouseenter .js-card-details' () {
- this.parentComponent().showOverlay.set(true);
- this.parentComponent().mouseHasEnterCardDetails = true;
+ this.parentComponent().parentComponent().showOverlay.set(true);
+ this.parentComponent().parentComponent().mouseHasEnterCardDetails = true;
+ },
+ 'click #toggleButton'() {
+ Meteor.call('toggleSystemMessages');
},
}];
},
@@ -154,20 +215,24 @@ Template.cardDetailsActionsPopup.events({
'click .js-members': Popup.open('cardMembers'),
'click .js-labels': Popup.open('cardLabels'),
'click .js-attachments': Popup.open('cardAttachments'),
+ 'click .js-received-date': Popup.open('editCardReceivedDate'),
'click .js-custom-fields': Popup.open('cardCustomFields'),
'click .js-start-date': Popup.open('editCardStartDate'),
'click .js-due-date': Popup.open('editCardDueDate'),
+ 'click .js-end-date': Popup.open('editCardEndDate'),
+ 'click .js-spent-time': Popup.open('editCardSpentTime'),
'click .js-move-card': Popup.open('moveCard'),
'click .js-copy-card': Popup.open('copyCard'),
+ 'click .js-copy-checklist-cards': Popup.open('copyChecklistToManyCards'),
'click .js-move-card-to-top' (evt) {
evt.preventDefault();
- const minOrder = _.min(this.list().cards().map((c) => c.sort));
- this.move(this.listId, minOrder - 1);
+ const minOrder = _.min(this.list().cards(this.swimlaneId).map((c) => c.sort));
+ this.move(this.swimlaneId, this.listId, minOrder - 1);
},
'click .js-move-card-to-bottom' (evt) {
evt.preventDefault();
- const maxOrder = _.max(this.list().cards().map((c) => c.sort));
- this.move(this.listId, maxOrder + 1);
+ const maxOrder = _.max(this.list().cards(this.swimlaneId).map((c) => c.sort));
+ this.move(this.swimlaneId, this.listId, maxOrder + 1);
},
'click .js-archive' (evt) {
evt.preventDefault();
@@ -191,36 +256,82 @@ Template.editCardTitleForm.onRendered(function () {
Template.editCardTitleForm.events({
'keydown .js-edit-card-title' (evt) {
// If enter key was pressed, submit the data
- if (evt.keyCode === 13) {
+ // Unless the shift key is also being pressed
+ if (evt.keyCode === 13 && !evt.shiftKey) {
$('.js-submit-edit-card-title-form').click();
}
},
});
Template.moveCardPopup.events({
- 'click .js-select-list' () {
+ 'click .js-done' () {
// XXX We should *not* get the currentCard from the global state, but
// instead from a “component” state.
const card = Cards.findOne(Session.get('currentCard'));
- const newListId = this._id;
- card.move(newListId);
+ const lSelect = $('.js-select-lists')[0];
+ const newListId = lSelect.options[lSelect.selectedIndex].value;
+ const slSelect = $('.js-select-swimlanes')[0];
+ card.swimlaneId = slSelect.options[slSelect.selectedIndex].value;
+ card.move(card.swimlaneId, newListId, 0);
Popup.close();
},
});
+BlazeComponent.extendComponent({
+ onCreated() {
+ subManager.subscribe('board', Session.get('currentBoard'));
+ this.selectedBoardId = new ReactiveVar(Session.get('currentBoard'));
+ },
+
+ boards() {
+ const boards = Boards.find({
+ archived: false,
+ 'members.userId': Meteor.userId(),
+ }, {
+ sort: ['title'],
+ });
+ return boards;
+ },
+
+ swimlanes() {
+ const board = Boards.findOne(this.selectedBoardId.get());
+ return board.swimlanes();
+ },
+
+ aBoardLists() {
+ const board = Boards.findOne(this.selectedBoardId.get());
+ return board.lists();
+ },
+
+ events() {
+ return [{
+ 'change .js-select-boards'(evt) {
+ this.selectedBoardId.set($(evt.currentTarget).val());
+ subManager.subscribe('board', this.selectedBoardId.get());
+ },
+ }];
+ },
+}).register('boardsAndLists');
+
Template.copyCardPopup.events({
- 'click .js-select-list' (evt) {
+ 'click .js-done'() {
const card = Cards.findOne(Session.get('currentCard'));
const oldId = card._id;
card._id = null;
- card.listId = this._id;
- const textarea = $(evt.currentTarget).parents('.content').find('textarea');
+ const lSelect = $('.js-select-lists')[0];
+ card.listId = lSelect.options[lSelect.selectedIndex].value;
+ const slSelect = $('.js-select-swimlanes')[0];
+ card.swimlaneId = slSelect.options[slSelect.selectedIndex].value;
+ const bSelect = $('.js-select-boards')[0];
+ card.boardId = bSelect.options[bSelect.selectedIndex].value;
+ const textarea = $('#copy-card-title');
const title = textarea.val().trim();
// insert new card to the bottom of new list
- card.sort = Lists.findOne(this._id).cards().count();
+ card.sort = Lists.findOne(card.listId).cards().count();
if (title) {
card.title = title;
+ card.coverId = '';
const _id = Cards.insert(card);
// In case the filter is active we need to add the newly inserted card in
// the list of exceptions -- cards that are not filtered. Otherwise the
@@ -233,9 +344,16 @@ Template.copyCardPopup.events({
cursor.forEach(function() {
'use strict';
const checklist = arguments[0];
+ const checklistId = checklist._id;
checklist.cardId = _id;
checklist._id = null;
- Checklists.insert(checklist);
+ const newChecklistId = Checklists.insert(checklist);
+ ChecklistItems.find({checklistId}).forEach(function(item) {
+ item._id = null;
+ item.checklistId = newChecklistId;
+ item.cardId = _id;
+ ChecklistItems.insert(item);
+ });
});
// copy card comments
@@ -252,6 +370,69 @@ Template.copyCardPopup.events({
},
});
+Template.copyChecklistToManyCardsPopup.events({
+ 'click .js-done' () {
+ const card = Cards.findOne(Session.get('currentCard'));
+ const oldId = card._id;
+ card._id = null;
+ const lSelect = $('.js-select-lists')[0];
+ card.listId = lSelect.options[lSelect.selectedIndex].value;
+ const slSelect = $('.js-select-swimlanes')[0];
+ card.swimlaneId = slSelect.options[slSelect.selectedIndex].value;
+ const bSelect = $('.js-select-boards')[0];
+ card.boardId = bSelect.options[bSelect.selectedIndex].value;
+ const textarea = $('#copy-card-title');
+ const titleEntry = textarea.val().trim();
+ // insert new card to the bottom of new list
+ card.sort = Lists.findOne(card.listId).cards().count();
+
+ if (titleEntry) {
+ const titleList = JSON.parse(titleEntry);
+ for (let i = 0; i < titleList.length; i++){
+ const obj = titleList[i];
+ card.title = obj.title;
+ card.description = obj.description;
+ card.coverId = '';
+ const _id = Cards.insert(card);
+ // In case the filter is active we need to add the newly inserted card in
+ // the list of exceptions -- cards that are not filtered. Otherwise the
+ // card will disappear instantly.
+ // See https://github.com/wekan/wekan/issues/80
+ Filter.addException(_id);
+
+ // copy checklists
+ let cursor = Checklists.find({cardId: oldId});
+ cursor.forEach(function() {
+ 'use strict';
+ const checklist = arguments[0];
+ const checklistId = checklist._id;
+ checklist.cardId = _id;
+ checklist._id = null;
+ const newChecklistId = Checklists.insert(checklist);
+ ChecklistItems.find({checklistId}).forEach(function(item) {
+ item._id = null;
+ item.checklistId = newChecklistId;
+ item.cardId = _id;
+ ChecklistItems.insert(item);
+ });
+ });
+
+ // copy card comments
+ cursor = CardComments.find({cardId: oldId});
+ cursor.forEach(function () {
+ 'use strict';
+ const comment = arguments[0];
+ comment.cardId = _id;
+ comment._id = null;
+ CardComments.insert(comment);
+ });
+ }
+ Popup.close();
+ }
+ },
+});
+
+
Template.cardMorePopup.events({
'click .js-copy-card-link-to-clipboard' () {
// Clipboard code from:
diff --git a/client/components/cards/cardDetails.styl b/client/components/cards/cardDetails.styl
index c981e2a2..e18c07a1 100644
--- a/client/components/cards/cardDetails.styl
+++ b/client/components/cards/cardDetails.styl
@@ -2,7 +2,6 @@
.card-details
padding: 0 20px
- height: 100%
flex-shrink: 0
flex-basis: 470px
will-change: flex-basis
@@ -79,15 +78,19 @@
margin-right: 0
&.card-details-item-labels,
&.card-details-item-members,
+ &.card-details-item-received,
&.card-details-item-start,
&.card-details-item-due,
+ &.card-details-item-end
+ width: 50%
+ flex-shrink: 1
&.card-details-item-customfield
max-width: 50%
flex-grow: 1
.card-details-item-title
- font-size: 14px
- color: darken(white, 45%)
+ font-size: 16px
+ color: #000
.card-label
padding-top: 5px
diff --git a/client/components/cards/cardTime.jade b/client/components/cards/cardTime.jade
new file mode 100644
index 00000000..dcfc92f0
--- /dev/null
+++ b/client/components/cards/cardTime.jade
@@ -0,0 +1,22 @@
+template(name="editCardSpentTime")
+ .edit-card-time
+ form.edit-time
+ .fields
+ label(for="time") {{_ 'time'}}
+ input.js-time-field#time(type="number" step="0.01" name="time" value="{{card.spentTime}}" placeholder=timeFormat autofocus)
+ label(for="overtime") {{_ 'overtime'}}
+ a.js-toggle-overtime
+ .materialCheckBox#overtime(class="{{#if card.isOvertime}}is-checked{{/if}}" name="overtime")
+
+ if error.get
+ .warning {{_ error.get}}
+ button.primary.wide.left.js-submit-time(type="submit") {{_ 'save'}}
+ button.js-delete-time.negate.wide.right {{_ 'delete'}}
+
+template(name="timeBadge")
+ if canModifyCard
+ a.js-edit-time.card-time(title="{{showTitle}}" class="{{#if isOvertime}}card-label-red{{else}}card-label-green{{/if}}")
+ | {{showTime}}
+ else
+ a.card-time(title="{{showTitle}}" class="{{#if isOvertime}}card-label-red{{else}}card-label-green{{/if}}")
+ | {{showTime}}
diff --git a/client/components/cards/cardTime.js b/client/components/cards/cardTime.js
new file mode 100644
index 00000000..eadcc88e
--- /dev/null
+++ b/client/components/cards/cardTime.js
@@ -0,0 +1,81 @@
+BlazeComponent.extendComponent({
+ template() {
+ return 'editCardSpentTime';
+ },
+ onCreated() {
+ this.error = new ReactiveVar('');
+ this.card = this.data();
+ },
+ toggleOvertime() {
+ this.card.isOvertime = !this.card.isOvertime;
+ $('#overtime .materialCheckBox').toggleClass('is-checked');
+
+ $('#overtime').toggleClass('is-checked');
+ },
+ storeTime(spentTime, isOvertime) {
+ this.card.setSpentTime(spentTime);
+ this.card.setOvertime(isOvertime);
+ },
+ deleteTime() {
+ this.card.unsetSpentTime();
+ },
+ events() {
+ return [{
+ //TODO : need checking this portion
+ 'submit .edit-time'(evt) {
+ evt.preventDefault();
+
+ const spentTime = parseFloat(evt.target.time.value);
+ const isOvertime = this.card.isOvertime;
+
+ if (spentTime >= 0) {
+ this.storeTime(spentTime, isOvertime);
+ Popup.close();
+ } else {
+ this.error.set('invalid-time');
+ evt.target.time.focus();
+ }
+ },
+ 'click .js-delete-time'(evt) {
+ evt.preventDefault();
+ this.deleteTime();
+ Popup.close();
+ },
+ 'click a.js-toggle-overtime': this.toggleOvertime,
+ }];
+ },
+}).register('editCardSpentTimePopup');
+
+BlazeComponent.extendComponent({
+ template() {
+ return 'timeBadge';
+ },
+ onCreated() {
+ const self = this;
+ self.time = ReactiveVar();
+ },
+ showTitle() {
+ if (this.data().isOvertime) {
+ return `${TAPi18n.__('overtime')} ${this.data().spentTime} ${TAPi18n.__('hours')}`;
+ } else {
+ return `${TAPi18n.__('card-spent')} ${this.data().spentTime} ${TAPi18n.__('hours')}`;
+ }
+ },
+ showTime() {
+ return this.data().spentTime;
+ },
+ isOvertime() {
+ return this.data().isOvertime;
+ },
+ events() {
+ return [{
+ 'click .js-edit-time': Popup.open('editCardSpentTime'),
+ }];
+ },
+}).register('cardSpentTime');
+
+Template.timeBadge.helpers({
+ canModifyCard() {
+ return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
+ },
+});
diff --git a/client/components/cards/cardTime.styl b/client/components/cards/cardTime.styl
new file mode 100644
index 00000000..3c4b43ae
--- /dev/null
+++ b/client/components/cards/cardTime.styl
@@ -0,0 +1,17 @@
+.card-time
+ display: block
+ border-radius: 4px
+ padding: 1px 3px
+ color: #fff
+
+ background-color: #dbdbdb
+ &:hover, &.is-active
+ background-color: #b3b3b3
+
+ time
+ &::before
+ font: normal normal normal 14px/1 FontAwesome
+ font-size: inherit
+ -webkit-font-smoothing: antialiased
+ content: "\f017" // clock symbol
+ margin-right: 0.3em
diff --git a/client/components/cards/checklists.jade b/client/components/cards/checklists.jade
index 7ecc5dd3..ae680bd5 100644
--- a/client/components/cards/checklists.jade
+++ b/client/components/cards/checklists.jade
@@ -1,8 +1,14 @@
template(name="checklists")
- h2 {{_ 'checklists'}}
+ h3 {{_ 'checklists'}}
+ if toggleDeleteDialog.get
+ .board-overlay#card-details-overlay
+ +checklistDeleteDialog(checklist = checklistToDelete)
+
+
.card-checklist-items
each checklist in currentCard.checklists
+checklistDetail(checklist = checklist)
+
if canModifyCard
+inlinedForm(autoclose=false classNames="js-add-checklist" cardId = cardId)
+addChecklistItemForm
@@ -12,19 +18,37 @@ template(name="checklists")
| {{_ 'add-checklist'}}...
template(name="checklistDetail")
- +inlinedForm(classNames="js-edit-checklist-title" checklist = checklist)
- +editChecklistItemForm(checklist = checklist)
- else
- .checklist-title
- .checkbox.fa.fa-check-square-o
- if canModifyCard
- a.js-delete-checklist {{_ "delete"}}...
- span.checklist-stat(class="{{#if checklist.isFinished}}is-finished{{/if}}") {{checklist.finishedCount}}/{{checklist.itemCount}}
- if canModifyCard
- h2.title.js-open-inlined-form.is-editable {{checklist.title}}
- else
- h2.title {{checklist.title}}
- +checklistItems(checklist = checklist)
+ .js-checklist.checklist
+ +inlinedForm(classNames="js-edit-checklist-title" checklist = checklist)
+ +editChecklistItemForm(checklist = checklist)
+ else
+ .checklist-title
+ span
+ if canModifyCard
+ a.js-delete-checklist.toggle-delete-checklist-dialog {{_ "delete"}}...
+
+ span.checklist-stat(class="{{#if checklist.isFinished}}is-finished{{/if}}") {{checklist.finishedCount}}/{{checklist.itemCount}}
+ if canModifyCard
+ h2.title.js-open-inlined-form.is-editable
+ +viewer
+ = checklist.title
+ else
+ h2.title
+ +viewer
+ = checklist.title
+ +checklistItems(checklist = checklist)
+
+template(name="checklistDeleteDialog")
+ .js-confirm-checklist-delete
+ p
+ i(class="fa fa-exclamation-triangle" aria-hidden="true")
+ p
+ | {{_ 'confirm-checklist-delete-dialog'}}
+ span {{checklist.title}}
+ | ?
+ .js-checklist-delete-buttons
+ button.confirm-checklist-delete(type="button") {{_ 'delete'}}
+ button.toggle-delete-checklist-dialog(type="button") {{_ 'cancel'}}
template(name="addChecklistItemForm")
textarea.js-add-checklist-item(rows='1' autofocus)
@@ -47,7 +71,7 @@ template(name="editChecklistItemForm")
template(name="checklistItems")
.checklist-items.js-checklist-items
- each item in checklist.getItems
+ each item in checklist.items
+inlinedForm(classNames="js-edit-checklist-item" item = item checklist = checklist)
+editChecklistItemForm(type = 'item' item = item checklist = checklist)
else
@@ -61,10 +85,14 @@ template(name="checklistItems")
| {{_ 'add-checklist-item'}}...
template(name='itemDetail')
- .item.js-checklist-item
+ .js-checklist-item.checklist-item
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}}
+ .item-title.js-open-inlined-form.is-editable(class="{{#if item.isFinished }}is-checked{{/if}}")
+ +viewer
+ = item.title
else
.materialCheckBox(class="{{#if item.isFinished }}is-checked{{/if}}")
- .item-title(class="{{#if item.isFinished }}is-checked{{/if}}") {{item.title}}
+ .item-title(class="{{#if item.isFinished }}is-checked{{/if}}")
+ +viewer
+ = item.title
diff --git a/client/components/cards/checklists.js b/client/components/cards/checklists.js
index bd9d275a..1f05aded 100644
--- a/client/components/cards/checklists.js
+++ b/client/components/cards/checklists.js
@@ -1,11 +1,14 @@
+const { calculateIndexData } = Utils;
+
function initSorting(items) {
items.sortable({
tolerance: 'pointer',
helper: 'clone',
items: '.js-checklist-item:not(.placeholder)',
- axis: 'y',
+ connectWith: '.js-checklist-items',
+ appendTo: '.board-canvas',
distance: 7,
- placeholder: 'placeholder',
+ placeholder: 'checklist-item placeholder',
scroll: false,
start(evt, ui) {
ui.placeholder.height(ui.helper.height());
@@ -13,57 +16,57 @@ function initSorting(items) {
},
stop(evt, ui) {
const parent = ui.item.parents('.js-checklist-items');
- const orderedItems = [];
- parent.find('.js-checklist-item').each(function(i, item) {
- const checklistItem = Blaze.getData(item).item;
- orderedItems.push(checklistItem._id);
- });
- items.sortable('cancel');
- const formerParent = ui.item.parents('.js-checklist-items');
- let checklist = Blaze.getData(parent.get(0)).checklist;
- const oldChecklist = Blaze.getData(formerParent.get(0)).checklist;
- if (oldChecklist._id !== checklist._id) {
- const currentItem = Blaze.getData(ui.item.get(0)).item;
- for (let i = 0; i < orderedItems.length; i++) {
- let itemId = orderedItems[i];
- if (itemId !== currentItem._id) continue;
- checklist.addItem(currentItem.title);
- checklist = Checklists.findOne({_id: checklist._id});
- itemId = checklist._id + (checklist.newItemIndex - 1);
- if (currentItem.finished) {
- checklist.finishItem(itemId);
- }
- orderedItems[i] = itemId;
- oldChecklist.removeItem(currentItem._id);
- }
+ const checklistId = Blaze.getData(parent.get(0)).checklist._id;
+ let prevItem = ui.item.prev('.js-checklist-item').get(0);
+ if (prevItem) {
+ prevItem = Blaze.getData(prevItem).item;
}
- checklist.sortItems(orderedItems);
+ let nextItem = ui.item.next('.js-checklist-item').get(0);
+ if (nextItem) {
+ nextItem = Blaze.getData(nextItem).item;
+ }
+ const nItems = 1;
+ const sortIndex = calculateIndexData(prevItem, nextItem, nItems);
+ const checklistDomElement = ui.item.get(0);
+ const checklistData = Blaze.getData(checklistDomElement);
+ const checklistItem = checklistData.item;
+
+ items.sortable('cancel');
+
+ checklistItem.move(checklistId, sortIndex.base);
},
});
}
-Template.checklists.onRendered(function () {
- const self = BlazeComponent.getComponentForElement(this.firstNode);
- self.itemsDom = this.$('.card-checklist-items');
- initSorting(self.itemsDom);
- self.itemsDom.mousedown(function(evt) {
- evt.stopPropagation();
- });
+BlazeComponent.extendComponent({
+ onRendered() {
+ const self = this;
+ self.itemsDom = this.$('.js-checklist-items');
+ initSorting(self.itemsDom);
+ self.itemsDom.mousedown(function(evt) {
+ evt.stopPropagation();
+ });
+
+ function userIsMember() {
+ return Meteor.user() && Meteor.user().isBoardMember();
+ }
- function userIsMember() {
- return Meteor.user() && Meteor.user().isBoardMember();
- }
+ // Disable sorting if the current user is not a board member
+ self.autorun(() => {
+ const $itemsDom = $(self.itemsDom);
+ if ($itemsDom.data('sortable')) {
+ $(self.itemsDom).sortable('option', 'disabled', !userIsMember());
+ }
+ });
+ },
- // Disable sorting if the current user is not a board member
- self.autorun(() => {
- const $itemsDom = $(self.itemsDom);
- if ($itemsDom.data('sortable')) {
- $(self.itemsDom).sortable('option', 'disabled', !userIsMember());
- }
- });
-});
+ canModifyCard() {
+ return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
+ },
+}).register('checklistDetail');
BlazeComponent.extendComponent({
+
addChecklist(event) {
event.preventDefault();
const textarea = this.find('textarea.js-add-checklist-item');
@@ -92,13 +95,38 @@ BlazeComponent.extendComponent({
const checklist = this.currentData().checklist;
if (title) {
- checklist.addItem(title);
+ ChecklistItems.insert({
+ title,
+ checklistId: checklist._id,
+ cardId: checklist.cardId,
+ sort: checklist.itemCount(),
+ });
}
// We keep the form opened, empty it.
textarea.value = '';
textarea.focus();
},
+ canModifyCard() {
+ return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
+ },
+
+ deleteChecklist() {
+ const checklist = this.currentData().checklist;
+ if (checklist && checklist._id) {
+ Checklists.remove(checklist._id);
+ this.toggleDeleteDialog.set(false);
+ }
+ },
+
+ deleteItem() {
+ const checklist = this.currentData().checklist;
+ const item = this.currentData().item;
+ if (checklist && item && item._id) {
+ ChecklistItems.remove(item._id);
+ }
+ },
+
editChecklist(event) {
event.preventDefault();
const textarea = this.find('textarea.js-edit-checklist-item');
@@ -107,38 +135,24 @@ BlazeComponent.extendComponent({
checklist.setTitle(title);
},
- canModifyCard() {
- return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
- },
-
editChecklistItem(event) {
event.preventDefault();
const textarea = this.find('textarea.js-edit-checklist-item');
const title = textarea.value.trim();
- const itemId = this.currentData().item._id;
- const checklist = this.currentData().checklist;
- checklist.editItem(itemId, title);
- },
-
- deleteItem() {
- const checklist = this.currentData().checklist;
const item = this.currentData().item;
- if (checklist && item && item._id) {
- checklist.removeItem(item._id);
- }
+ item.setTitle(title);
},
- deleteChecklist() {
- const checklist = this.currentData().checklist;
- if (checklist && checklist._id) {
- Checklists.remove(checklist._id);
- }
+ onCreated() {
+ this.toggleDeleteDialog = new ReactiveVar(false);
+ this.checklistToDelete = null; //Store data context to pass to checklistDeleteDialog template
},
pressKey(event) {
- //If user press enter key inside a form, submit it, so user doesn't have to leave keyboard to submit a form.
- if (event.keyCode === 13) {
+ //If user press enter key inside a form, submit it
+ //Unless the user is also holding down the 'shift' key
+ if (event.keyCode === 13 && !event.shiftKey) {
event.preventDefault();
const $form = $(event.currentTarget).closest('form');
$form.find('button[type=submit]').click();
@@ -146,18 +160,50 @@ BlazeComponent.extendComponent({
},
events() {
+ const events = {
+ 'click .toggle-delete-checklist-dialog'(event) {
+ if($(event.target).hasClass('js-delete-checklist')){
+ this.checklistToDelete = this.currentData().checklist; //Store data context
+ }
+ this.toggleDeleteDialog.set(!this.toggleDeleteDialog.get());
+ },
+ };
+
return [{
+ ...events,
'submit .js-add-checklist': this.addChecklist,
'submit .js-edit-checklist-title': this.editChecklist,
'submit .js-add-checklist-item': this.addChecklistItem,
'submit .js-edit-checklist-item': this.editChecklistItem,
'click .js-delete-checklist-item': this.deleteItem,
- 'click .js-delete-checklist': this.deleteChecklist,
+ 'click .confirm-checklist-delete': this.deleteChecklist,
keydown: this.pressKey,
}];
},
}).register('checklists');
+Template.checklistDeleteDialog.onCreated(() => {
+ const $cardDetails = this.$('.card-details');
+ this.scrollState = { position: $cardDetails.scrollTop(), //save current scroll position
+ top: false, //required for smooth scroll animation
+ };
+ //Callback's purpose is to only prevent scrolling after animation is complete
+ $cardDetails.animate({ scrollTop: 0 }, 500, () => { this.scrollState.top = true; });
+
+ //Prevent scrolling while dialog is open
+ $cardDetails.on('scroll', () => {
+ if(this.scrollState.top) { //If it's already in position, keep it there. Otherwise let animation scroll
+ $cardDetails.scrollTop(0);
+ }
+ });
+});
+
+Template.checklistDeleteDialog.onDestroyed(() => {
+ const $cardDetails = this.$('.card-details');
+ $cardDetails.off('scroll'); //Reactivate scrolling
+ $cardDetails.animate( { scrollTop: this.scrollState.position });
+});
+
Template.itemDetail.helpers({
canModifyCard() {
return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
@@ -169,12 +215,12 @@ BlazeComponent.extendComponent({
const checklist = this.currentData().checklist;
const item = this.currentData().item;
if (checklist && item && item._id) {
- checklist.toggleItem(item._id);
+ item.toggleItem();
}
},
events() {
return [{
- 'click .item .check-box': this.toggleItem,
+ 'click .js-checklist-item .check-box': this.toggleItem,
}];
},
}).register('itemDetail');
diff --git a/client/components/cards/checklists.styl b/client/components/cards/checklists.styl
index 77668349..d48c1851 100644
--- a/client/components/cards/checklists.styl
+++ b/client/components/cards/checklists.styl
@@ -26,7 +26,7 @@ textarea.js-add-checklist-item, textarea.js-edit-checklist-item
.title
font-size: 18px
- line-height: 30px
+ line-height: 25px
.checklist-stat
margin: 0 0.5em
@@ -38,34 +38,102 @@ textarea.js-add-checklist-item, textarea.js-edit-checklist-item
.js-delete-checklist
@extends .delete-text
-.checklist-items
- margin: 0 0 0.5em 1.33em
- .item
- line-height: 25px
- font-size: 1.1em
- margin-top: 3px
- display: flex
- &:hover
- background-color: darken(white, 8%)
-
- .check-box
- margin-top: 5px
- &.is-checked
- border-bottom: 2px solid #3cb500
- border-right: 2px solid #3cb500
-
- .item-title
- flex: 1
- padding-left: 10px;
- &.is-checked
- color: #8c8c8c
- font-style: italic
-
- .js-delete-checklist-item
- @extends .delete-text
- padding: 12px 0 0 0
+.js-confirm-checklist-delete
+ background-color: darken(white, 3%)
+ position: absolute
+ float: left;
+ width: 60%
+ margin-top: 0
+ margin-left: 13%
+ padding-bottom: 2%
+ padding-left: 3%
+ padding-right: 3%
+ z-index: 17
+ border-radius: 3px
+
+ p
+ position: relative
+ margin-top: 3%
+ width: 100%
+ text-align: center
+ span
+ font-weight: bold
+
+ i
+ font-size: 2em
+
+ .js-checklist-delete-buttons
+ position: relative
+ padding: left 2% right 2%
+ .confirm-checklist-delete
+ margin-left: 12%
+ float: left
+ .toggle-delete-checklist-dialog
+ margin-right: 12%
+ float: right
+
+#card-details-overlay
+ top: 0
+ bottom: -600px
+ right: 0
+
+.checklist
+ background: darken(white, 3%)
+
+ &.placeholder
+ background: darken(white, 20%)
+ border-radius: 2px
+
+ &.ui-sortable-helper
+ box-shadow: -2px 2px 8px rgba(0, 0, 0, .3),
+ 0 0 1px rgba(0, 0, 0, .5)
+ transform: rotate(4deg)
+ cursor: grabbing
+
+
+.checklist-item
+ margin: 0 0 0 0.1em
+ line-height: 18px
+ font-size: 1.1em
+ margin-top: 3px
+ display: flex
+ background: darken(white, 3%)
+
+ &.placeholder
+ background: darken(white, 20%)
+ border-radius: 2px
+
+ &.ui-sortable-helper
+ box-shadow: -2px 2px 8px rgba(0, 0, 0, .3),
+ 0 0 1px rgba(0, 0, 0, .5)
+ transform: rotate(4deg)
+ cursor: grabbing
+
+ &:hover
+ background-color: darken(white, 8%)
+
+ .check-box
+ margin: 0.1em 0 0 0;
+ &.is-checked
+ border-bottom: 2px solid #3cb500
+ border-right: 2px solid #3cb500
+
+ .item-title
+ flex: 1
+ padding-left: 10px;
+ &.is-checked
+ color: #8c8c8c
+ font-style: italic
+ & .viewer
+ p
+ margin-bottom: 2px
+
+.js-delete-checklist-item
+ margin: 0 0 0.5em 1.33em
+ @extends .delete-text
+ padding: 12px 0 0 0
- .add-checklist-item
- padding-top: 0.5em
- display: inline-block
+.add-checklist-item
+ margin: 0.2em 0 0.5em 1.33em
+ display: inline-block
diff --git a/client/components/cards/labels.jade b/client/components/cards/labels.jade
index 31bd4d06..6c6efb08 100644
--- a/client/components/cards/labels.jade
+++ b/client/components/cards/labels.jade
@@ -34,4 +34,5 @@ template(name="cardLabelsPopup")
= name
if(isLabelSelected ../_id)
i.card-label-selectable-icon.fa.fa-check
- a.quiet-button.full.js-add-label {{_ 'label-create'}}
+ if currentUser.isBoardAdmin
+ a.quiet-button.full.js-add-label {{_ 'label-create'}}
diff --git a/client/components/cards/minicard.jade b/client/components/cards/minicard.jade
index 6fd83386..9fa4dd57 100644
--- a/client/components/cards/minicard.jade
+++ b/client/components/cards/minicard.jade
@@ -6,14 +6,20 @@ template(name="minicard")
.minicard-labels
each labels
.minicard-label(class="card-label-{{color}}" title="{{name}}")
- .minicard-title= title
+ .minicard-title
+ +viewer
+ = title
.dates
if startAt
- .date
- +minicardStartDate
+ .date
+ +minicardStartDate
if dueAt
- .date
- +minicardDueDate
+ .date
+ +minicardDueDate
+ if spentTime
+ .date
+ +cardSpentTime
+
if members
.minicard-members.js-minicard-members
each members
diff --git a/client/components/cards/minicard.styl b/client/components/cards/minicard.styl
index a6aad896..d59f1f63 100644
--- a/client/components/cards/minicard.styl
+++ b/client/components/cards/minicard.styl
@@ -77,6 +77,9 @@
height: @width
border-radius: 2px
margin-left: 3px
+ .minicard-title
+ p:last-child
+ margin-bottom: 0
.dates
display: flex;
flex-direction: row;
diff --git a/client/components/forms/forms.styl b/client/components/forms/forms.styl
index 81780a6f..0a905943 100644
--- a/client/components/forms/forms.styl
+++ b/client/components/forms/forms.styl
@@ -633,6 +633,59 @@ button
a, .quiet
color: white
+// Material Design Toggle Switch
+.material-toggle-switch
+ display: flex
+
+.toggle-label
+ position: relative
+ display: block
+ height: 20px
+ width: 44px
+ background-color: #a6a6a6
+ border-radius: 100px
+ cursor: pointer
+ transition: all 0.3s ease
+
+ &:after
+ position: absolute
+ left: -2px
+ top: -3px
+ display: block
+ width: 26px
+ height: 26px
+ border-radius: 100px
+ background-color: #fff
+ box-shadow: 0px 3px 3px rgba(0,0,0,0.05)
+ content: ''
+ transition: all 0.3s ease
+
+ &:active
+ &:after
+ transform: scale(1.15, 0.85)
+
+.toggle-switch:checked ~ .toggle-label
+ background-color: #6fbeb5
+
+ &:after
+ left: 20px
+ background-color: #179588
+
+.toggle-switch:checked:disabled ~ .toggle-label
+ background-color: #d5d5d5
+ pointer-events: none
+
+ &:after
+ background-color: #bcbdbc
+
+.toggle-switch
+ display: none
+
+.toggle-switch-title
+ margin: 0 0.5em
+ display: flex
+
+
@media screen and (max-width: 800px)
.edit-controls,
.add-controls
diff --git a/client/components/import/import.jade b/client/components/import/import.jade
index 5e737cc6..a1fbd83b 100644
--- a/client/components/import/import.jade
+++ b/client/components/import/import.jade
@@ -16,6 +16,7 @@ template(name="importTextarea")
textarea.js-import-json(placeholder="{{_ 'import-json-placeholder'}}" autofocus)
| {{jsonText}}
if isSandstorm
+ h1.warning DANGER !!! THIS DESTROYS YOUR IMPORTED DATA, CAUSES BOARD NOT FOUND ERROR WHEN YOU OPEN THIS GRAIN AGAIN https://github.com/wekan/wekan/issues/1430
p.warning {{_ 'import-sandstorm-warning'}}
input.primary.wide(type="submit" value="{{_ 'import'}}")
diff --git a/client/components/lists/list.jade b/client/components/lists/list.jade
index c959b87f..c02e0dd6 100644
--- a/client/components/lists/list.jade
+++ b/client/components/lists/list.jade
@@ -2,3 +2,7 @@ template(name='list')
.list.js-list(id="js-list-{{_id}}")
+listHeader
+listBody
+
+template(name='miniList')
+ a.mini-list.js-select-list.js-list(id="js-list-{{_id}}")
+ +listHeader
diff --git a/client/components/lists/list.js b/client/components/lists/list.js
index 9c191348..38a87674 100644
--- a/client/components/lists/list.js
+++ b/client/components/lists/list.js
@@ -18,13 +18,18 @@ BlazeComponent.extendComponent({
// callback, we basically solve all issues related to reactive updates. A
// comment below provides further details.
onRendered() {
- const boardComponent = this.parentComponent();
+ const boardComponent = this.parentComponent().parentComponent();
+
+ function userIsMember() {
+ return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
+ }
+
const itemsSelector = '.js-minicard:not(.placeholder, .js-card-composer)';
const $cards = this.$('.js-minicards');
$cards.sortable({
- connectWith: '.js-minicards',
+ connectWith: '.js-minicards:not(.js-list-full)',
tolerance: 'pointer',
- appendTo: 'body',
+ appendTo: '.board-canvas',
helper(evt, item) {
const helper = item.clone();
if (MultiSelection.isActive()) {
@@ -40,7 +45,6 @@ BlazeComponent.extendComponent({
},
distance: 7,
items: itemsSelector,
- scroll: false,
placeholder: 'minicard-wrapper placeholder',
start(evt, ui) {
ui.placeholder.height(ui.helper.height());
@@ -55,6 +59,7 @@ BlazeComponent.extendComponent({
const nCards = MultiSelection.isActive() ? MultiSelection.count() : 1;
const sortIndex = calculateIndex(prevCardDom, nextCardDom, nCards);
const listId = Blaze.getData(ui.item.parents('.list').get(0))._id;
+ const swimlaneId = Blaze.getData(ui.item.parents('.swimlane').get(0))._id;
// Normally the jquery-ui sortable library moves the dragged DOM element
// to its new position, which disrupts Blaze reactive updates mechanism
@@ -67,21 +72,17 @@ BlazeComponent.extendComponent({
if (MultiSelection.isActive()) {
Cards.find(MultiSelection.getMongoSelector()).forEach((card, i) => {
- card.move(listId, sortIndex.base + i * sortIndex.increment);
+ card.move(swimlaneId, listId, sortIndex.base + i * sortIndex.increment);
});
} else {
const cardDomElement = ui.item.get(0);
const card = Blaze.getData(cardDomElement);
- card.move(listId, sortIndex.base);
+ card.move(swimlaneId, listId, sortIndex.base);
}
boardComponent.setIsDragging(false);
},
});
- function userIsMember() {
- return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
- }
-
// Disable drag-dropping if the current user is not a board member or is comment only
this.autorun(() => {
$cards.sortable('option', 'disabled', !userIsMember());
@@ -114,3 +115,10 @@ BlazeComponent.extendComponent({
});
},
}).register('list');
+
+Template.miniList.events({
+ 'click .js-select-list'() {
+ const listId = this._id;
+ Session.set('currentList', listId);
+ },
+});
diff --git a/client/components/lists/list.styl b/client/components/lists/list.styl
index cf939a6e..fa32ff6d 100644
--- a/client/components/lists/list.styl
+++ b/client/components/lists/list.styl
@@ -9,8 +9,8 @@
// Even if this background color is the same as the body we can't leave it
// transparent, because that won't work during a list drag.
background: darken(white, 13%)
- height: 100%
border-left: 1px solid darken(white, 20%)
+ border-bottom: 1px solid #CCC
padding: 0
float: left
@@ -53,6 +53,9 @@
&.ui-sortable-handle
cursor: grab
+ .list-header-left-icon
+ display: none
+
.list-header-name
display: inline
font-size: 16px
@@ -69,21 +72,30 @@
padding-left: 10px
color: #a6a6a6
- .list-header-menu-icon
+ .list-header-menu
position: absolute
padding: 7px
margin-top: 1px
top: -@padding
right: -@padding
+ .list-header-plus-icon
+ color: #a6a6a6
+ margin-right: 10px
+
+ .highlight
+ color: #ce1414
+
.list-body
- flex: 1
+ flex: 1 1 auto
+ flex-direction: column
display: flex
overflow-y: auto
padding: 5px 11px
.minicards
- flex: 1
+ flex-grow: 1
+ flex-shrink: 0
form
margin-bottom: 9px
@@ -107,3 +119,71 @@
background: #fafafa
color: #222
box-shadow: 0 1px 2px rgba(0,0,0,.2)
+
+#js-wip-limit-edit
+ padding-top: 2%
+
+ p
+ margin-bottom: 0
+
+ input
+ display: inline-block
+
+ .wip-limit-value
+ width: 20%
+ margin-right: 5%
+
+ .wip-limit-error
+ display: none
+
+ .soft-wip-limit
+ margin-right: 8px
+
+ div
+ float: left
+
+@media screen and (max-width: 800px)
+ .mini-list
+ flex: 0 0 60px
+ height: 60px
+ width: 100%
+ border-left: 0px
+ border-bottom: 1px solid darken(white, 20%)
+
+ .list
+ display: block
+ width: 100%
+ border-left: 0px
+
+ &.ui-sortable-helper
+ flex: 0 0 60px
+ height: 60px
+ width: 100%
+ border-left: 0px
+ border-bottom: 1px solid darken(white, 20%)
+
+ .list-header.ui-sortable-handle
+ cursor: grabbing
+
+ &.placeholder
+ flex: 0 0 60px
+ height: 60px
+ width: 100%
+ border-left: 0px
+ border-bottom: 1px solid darken(white, 20%)
+
+ .list-header
+
+ .list-header-left-icon
+ display: inline
+ padding: 7px
+ padding-right: 27px
+ margin-top: 1px
+ top: -@padding
+ left: -@padding
+
+ .list-header-menu-icon
+ position: absolute
+ padding: 7px
+ top: -@padding
+ right: 17px
diff --git a/client/components/lists/listBody.jade b/client/components/lists/listBody.jade
index 01aa7179..32c6b278 100644
--- a/client/components/lists/listBody.jade
+++ b/client/components/lists/listBody.jade
@@ -1,10 +1,10 @@
template(name="listBody")
.list-body.js-perfect-scrollbar
- .minicards.clearfix.js-minicards
+ .minicards.clearfix.js-minicards(class="{{#if reachedWipLimit}}js-list-full{{/if}}")
if cards.count
+inlinedForm(autoclose=false position="top")
+addCardForm(listId=_id position="top")
- each cards
+ each (cards (idOrNull ../../_id))
a.minicard-wrapper.js-minicard(href=absoluteUrl
class="{{#if cardIsSelected}}is-selected{{/if}}"
class="{{#if MultiSelection.isSelected _id}}is-checked{{/if}}")
diff --git a/client/components/lists/listBody.js b/client/components/lists/listBody.js
index edac5b03..24e5cf5d 100644
--- a/client/components/lists/listBody.js
+++ b/client/components/lists/listBody.js
@@ -40,6 +40,14 @@ BlazeComponent.extendComponent({
console.log("labelIds", labelIds);
console.log("customFields", customFields);
+ const boardId = this.data().board()._id;
+ let swimlaneId = '';
+ const boardView = Meteor.user().profile.boardView;
+ if (boardView === 'board-view-swimlanes')
+ swimlaneId = this.parentComponent().parentComponent().data()._id;
+ else if (boardView === 'board-view-lists')
+ swimlaneId = Swimlanes.findOne({boardId})._id;
+
if (title) {
const _id = Cards.insert({
title,
@@ -49,6 +57,7 @@ BlazeComponent.extendComponent({
listId: this.data()._id,
boardId: this.data().board()._id,
sort: sortIndex,
+ swimlaneId,
});
// In case the filter is active we need to add the newly inserted card in
// the list of exceptions -- cards that are not filtered. Otherwise the
@@ -101,6 +110,22 @@ BlazeComponent.extendComponent({
MultiSelection.toggle(this.currentData()._id);
},
+ idOrNull(swimlaneId) {
+ const currentUser = Meteor.user();
+ if (currentUser.profile.boardView === 'board-view-swimlanes')
+ return swimlaneId;
+ return undefined;
+ },
+
+ canSeeAddCard() {
+ return !this.reachedWipLimit() && Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
+ },
+
+ reachedWipLimit() {
+ const list = Template.currentData();
+ return !list.getWipLimit('soft') && list.getWipLimit('enabled') && list.getWipLimit('value') <= list.cards().count();
+ },
+
events() {
return [{
'click .js-minicard': this.clickOnMiniCard,
@@ -246,10 +271,3 @@ 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 11905586..61771449 100644
--- a/client/components/lists/listHeader.jade
+++ b/client/components/lists/listHeader.jade
@@ -3,17 +3,40 @@ template(name="listHeader")
+inlinedForm
+editListTitleForm
else
+ if isMiniScreen
+ if currentList
+ a.list-header-left-icon.fa.fa-angle-left.js-unselect-list
h2.list-header-name(
class="{{#if currentUser.isBoardMember}}js-open-inlined-form is-editable{{/if}}")
= title
+ if wipLimit.enabled
+ |&nbsp;(
+ span(class="{{#if reachedWipLimit}}highlight{{/if}}") {{cards.count}}
+ |/#{wipLimit.value})
+
if showCardsCountForList cards.count
= cards.count
- span.lowercase
- | {{_ 'cards'}}
- if currentUser.isBoardMember
+ span
+ | {{_ 'cards-count'}}
+ if isMiniScreen
+ if currentList
+ if isWatching
+ i.list-header-watch-icon.fa.fa-eye
+ div.list-header-menu
+ unless currentUser.isCommentOnly
+ if canSeeAddCard
+ a.js-add-card.fa.fa-plus.list-header-plus-icon
+ a.fa.fa-navicon.js-open-list-menu
+ else
+ a.list-header-menu-icon.fa.fa-angle-right.js-select-list
+ else if currentUser.isBoardMember
if isWatching
i.list-header-watch-icon.fa.fa-eye
- a.list-header-menu-icon.fa.fa-navicon.js-open-list-menu
+ div.list-header-menu
+ unless currentUser.isCommentOnly
+ if canSeeAddCard
+ a.js-add-card.fa.fa-plus.list-header-plus-icon
+ a.fa.fa-navicon.js-open-list-menu
template(name="editListTitleForm")
.list-composer
@@ -28,10 +51,13 @@ template(name="listActionPopup")
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
+ hr
+ if currentUser.isBoardAdmin
+ ul.pop-over-list
+ li: a.js-set-wip-limit {{#if isWipLimitEnabled }}{{_ 'edit-wip-limit'}}{{else}}{{_ 'setWipLimitPopup-title'}}{{/if}}
+ hr
ul.pop-over-list
li: a.js-close-list {{_ 'archive-list'}}
hr
@@ -63,3 +89,26 @@ template(name="listDeletePopup")
unless archived
p {{_ "list-delete-suggest-archive"}}
button.js-confirm.negate.full(type="submit") {{_ 'delete'}}
+
+template(name="setWipLimitPopup")
+ #js-wip-limit-edit
+ label {{_ 'set-wip-limit-value'}}
+ ul.pop-over-list
+ li: a.js-enable-wip-limit {{_ 'enable-wip-limit'}}
+ if isWipLimitEnabled
+ i.fa.fa-check
+ if isWipLimitEnabled
+ p
+ input.wip-limit-value(type="number" value="{{ wipLimitValue }}" min="1" max="99")
+ input.wip-limit-apply(type="submit" value="{{_ 'apply'}}")
+ input.wip-limit-error
+ p
+ .soft-wip-limit
+ .materialCheckBox(class="{{#if isWipLimitSoft}}is-checked{{/if}}")
+ label {{_ 'soft-wip-limit'}}
+
+template(name="wipLimitErrorPopup")
+ .wip-limit-invalid
+ p {{_ 'wipLimitErrorPopup-dialog-pt1'}}
+ p {{_ 'wipLimitErrorPopup-dialog-pt2'}}
+ button.full.js-back-view(type="submit") {{_ 'cancel'}}
diff --git a/client/components/lists/listHeader.js b/client/components/lists/listHeader.js
index 1ad9f9dd..4b6bf196 100644
--- a/client/components/lists/listHeader.js
+++ b/client/components/lists/listHeader.js
@@ -1,4 +1,9 @@
BlazeComponent.extendComponent({
+ canSeeAddCard() {
+ const list = Template.currentData();
+ return !list.getWipLimit('enabled') || list.getWipLimit('soft') || !this.reachedWipLimit();
+ },
+
editTitle(evt) {
evt.preventDefault();
const newTitle = this.childComponents('inlinedForm')[0].getValue().trim();
@@ -17,33 +22,45 @@ BlazeComponent.extendComponent({
return Meteor.user().getLimitToShowCardsCount();
},
+ reachedWipLimit() {
+ const list = Template.currentData();
+ return list.getWipLimit('enabled') && list.getWipLimit('value') <= list.cards().count();
+ },
+
showCardsCountForList(count) {
- return count > this.limitToShowCardsCount();
+ const limit = this.limitToShowCardsCount();
+ return limit > 0 && count > limit;
},
events() {
return [{
'click .js-open-list-menu': Popup.open('listAction'),
+ 'click .js-add-card' (evt) {
+ const listDom = $(evt.target).parents(`#js-list-${this.currentData()._id}`)[0];
+ const listComponent = BlazeComponent.getComponentForElement(listDom);
+ listComponent.openForm({
+ position: 'top',
+ });
+ },
+ 'click .js-unselect-list'() {
+ Session.set('currentList', null);
+ },
submit: this.editTitle,
}];
},
}).register('listHeader');
Template.listActionPopup.helpers({
+ isWipLimitEnabled() {
+ return Template.currentData().getWipLimit('enabled');
+ },
+
isWatching() {
return this.findWatcher(Meteor.userId());
},
});
Template.listActionPopup.events({
- 'click .js-add-card' () {
- const listDom = document.getElementById(`js-list-${this._id}`);
- const listComponent = BlazeComponent.getComponentForElement(listDom);
- listComponent.openForm({
- position: 'top',
- });
- Popup.close();
- },
'click .js-list-subscribe' () {},
'click .js-select-cards' () {
const cardIds = this.allCards().map((card) => card._id);
@@ -62,9 +79,63 @@ Template.listActionPopup.events({
this.archive();
Popup.close();
},
+ 'click .js-set-wip-limit': Popup.open('setWipLimit'),
'click .js-more': Popup.open('listMore'),
});
+BlazeComponent.extendComponent({
+ applyWipLimit() {
+ const list = Template.currentData();
+ const limit = parseInt(Template.instance().$('.wip-limit-value').val(), 10);
+
+ if(limit < list.cards().count() && !list.getWipLimit('soft')){
+ Template.instance().$('.wip-limit-error').click();
+ } else {
+ Meteor.call('applyWipLimit', list._id, limit);
+ Popup.back();
+ }
+ },
+
+ enableSoftLimit() {
+ const list = Template.currentData();
+
+ if(list.getWipLimit('soft') && list.getWipLimit('value') < list.cards().count()){
+ list.setWipLimit(list.cards().count());
+ }
+ Meteor.call('enableSoftLimit', Template.currentData()._id);
+ },
+
+ enableWipLimit() {
+ const list = Template.currentData();
+ // Prevent user from using previously stored wipLimit.value if it is less than the current number of cards in the list
+ if(!list.getWipLimit('enabled') && list.getWipLimit('value') < list.cards().count()){
+ list.setWipLimit(list.cards().count());
+ }
+ Meteor.call('enableWipLimit', list._id);
+ },
+
+ isWipLimitSoft() {
+ return Template.currentData().getWipLimit('soft');
+ },
+
+ isWipLimitEnabled() {
+ return Template.currentData().getWipLimit('enabled');
+ },
+
+ wipLimitValue(){
+ return Template.currentData().getWipLimit('value');
+ },
+
+ events() {
+ return [{
+ 'click .js-enable-wip-limit': this.enableWipLimit,
+ 'click .wip-limit-apply': this.applyWipLimit,
+ 'click .wip-limit-error': Popup.open('wipLimitError'),
+ 'click .materialCheckBox': this.enableSoftLimit,
+ }];
+ },
+}).register('setWipLimitPopup');
+
Template.listMorePopup.events({
'click .js-delete': Popup.afterConfirm('listDelete', function () {
Popup.close();
diff --git a/client/components/main/editor.jade b/client/components/main/editor.jade
index f10d64a1..31f533e6 100644
--- a/client/components/main/editor.jade
+++ b/client/components/main/editor.jade
@@ -9,6 +9,5 @@ template(name="editor")
template(name="viewer")
.viewer
+mentions
- +emoji
- +markdown
- {{> UI.contentBlock }}
+ +markdown
+ {{> UI.contentBlock }}
diff --git a/client/components/main/editor.js b/client/components/main/editor.js
index 5987b772..888fbe00 100755
--- a/client/components/main/editor.js
+++ b/client/components/main/editor.js
@@ -4,25 +4,6 @@ Template.editor.onRendered(() => {
autosize($textarea);
$textarea.escapeableTextComplete([
- // Emoji
- {
- match: /\B:([\-+\w]*)$/,
- search(term, callback) {
- callback(Emoji.values.map((emoji) => {
- return emoji.includes(term) ? emoji : null;
- }).filter(Boolean));
- },
- template(value) {
- const imgSrc = Emoji.baseImagePath + value;
- const image = `<img src="${imgSrc}.png" />`;
- return image + value;
- },
- replace(value) {
- return `:${value}:`;
- },
- index: 1,
- },
-
// User mentions
{
match: /\B@([\w.]*)$/,
@@ -47,7 +28,7 @@ Template.editor.onRendered(() => {
import sanitizeXss from 'xss';
// XXX I believe we should compute a HTML rendered field on the server that
-// would handle markdown, emoji and user mentions. We can simply have two
+// would handle markdown and user mentions. We can simply have two
// fields, one source, and one compiled version (in HTML) and send only the
// compiled version to most users -- who don't need to edit.
// In the meantime, all the transformation are done on the client using the
diff --git a/client/components/main/header.jade b/client/components/main/header.jade
index bd0af880..dd071b3e 100644
--- a/client/components/main/header.jade
+++ b/client/components/main/header.jade
@@ -7,19 +7,31 @@ template(name="header")
unless isSandstorm
if currentUser
#header-quick-access(class=currentBoard.colorClass)
- ul
- li
- a(href="{{pathFor 'home'}}")
- span.fa.fa-home
- | {{_ 'all-boards'}}
- each currentUser.starredBoards
- li.separator -
- li(class="{{#if $.Session.equals 'currentBoard' _id}}current{{/if}}")
- a(href="{{pathFor 'board' id=_id slug=slug}}")
- = title
- else
- li.current {{_ 'quick-access-description'}}
+ if isMiniScreen
+ ul
+ li
+ a(href="{{pathFor 'home'}}")
+ span.fa.fa-home
+ if currentList
+ each currentBoard.lists
+ li(class="{{#if $.Session.equals 'currentList' _id}}current{{/if}}")
+ a.js-select-list
+ = title
+ #header-new-board-icon
+ else
+ ul
+ li
+ a(href="{{pathFor 'home'}}")
+ span.fa.fa-home
+ | {{_ 'all-boards'}}
+ each currentUser.starredBoards
+ li.separator -
+ li(class="{{#if $.Session.equals 'currentBoard' _id}}current{{/if}}")
+ a(href="{{pathFor 'board' id=_id slug=slug}}")
+ = title
+ else
+ li.current {{_ 'quick-access-description'}}
a#header-new-board-icon.js-create-board
i.fa.fa-plus(title="Create a new board")
@@ -49,6 +61,14 @@ template(name="header")
if appIsOffline
+offlineWarning
+ if currentUser.isBoardMember
+ if hasAnnouncement
+ .announcement
+ p
+ i.fa.fa-bullhorn
+ | #{announcement}
+ i.fa.fa-times-circle.js-close-announcement
+
template(name="offlineWarning")
.offline-warning
p
diff --git a/client/components/main/header.js b/client/components/main/header.js
index 49acbfef..7fbc5716 100644
--- a/client/components/main/header.js
+++ b/client/components/main/header.js
@@ -1,3 +1,6 @@
+Meteor.subscribe('user-admin');
+Meteor.subscribe('boards');
+
Template.header.helpers({
wrappedHeader() {
return !Session.get('currentBoard');
@@ -10,8 +13,26 @@ Template.header.helpers({
appIsOffline() {
return !Meteor.status().connected;
},
+
+ hasAnnouncement() {
+ const announcements = Announcements.findOne();
+ return announcements && announcements.enabled;
+ },
+
+ announcement() {
+ $('.announcement').show();
+ const announcements = Announcements.findOne();
+ return announcements && announcements.body;
+ },
});
Template.header.events({
'click .js-create-board': Popup.open('headerBarCreateBoard'),
+ 'click .js-close-announcement'() {
+ $('.announcement').hide();
+ },
+ 'click .js-select-list'() {
+ Session.set('currentList', this._id);
+ Session.set('currentCard', null);
+ },
});
diff --git a/client/components/main/header.styl b/client/components/main/header.styl
index 0e35d38a..f9455f8e 100644
--- a/client/components/main/header.styl
+++ b/client/components/main/header.styl
@@ -4,6 +4,7 @@
color: white
transition: background-color 0.4s
background: #2980B9
+ z-index: 17
#header-main-bar
height: 40px
@@ -28,13 +29,12 @@
font-size: 0.9em
margin-right: 10px
-
.wekan-logo
- display: block
- margin: 3px auto 0
+ margin: 3px auto auto
width: 97px
opacity: 0.6
transition: opacity 0.15s
+ float: right
&:hover
opacity: 0.9
@@ -99,6 +99,7 @@
height: 28px
font-size: 12px
display: flex
+ z-index: 17
#header-user-bar,
#header-new-board-icon,
@@ -191,12 +192,35 @@
bottom: 0px
ul
- width: calc(100% - 150px)
+ width: calc(100% - 60px)
overflow: ellipsis
+ padding: 10px
+ margin: -10px
li
- height: 28px
+ height: 100%
+ padding: 12px 0px
+ margin: -10px 0px
+
+ a
+ height: 100%
+ padding: 12px 10px
+ margin: -10px 0px
+
+ .fa-home
+ font-size: 26px
+ margin-top: -2px
+
+ #header-new-board-icon
+ display: none
+
+ #header-user-bar
+ position: absolute
+ right: 0px
+ padding: 10px
+ margin: -10px
+.announcement,
.offline-warning
width: 100%
text-align: center
diff --git a/client/components/main/layouts.jade b/client/components/main/layouts.jade
index a51a35e0..4d76aabb 100644
--- a/client/components/main/layouts.jade
+++ b/client/components/main/layouts.jade
@@ -8,6 +8,7 @@ head
difficult to do that cleanly with Blaze -- at least without adding extra
packages.
link(rel="shortcut icon" href="/wekan-favicon.png")
+ link(rel="apple-touch-icon" href="/wekan-favicon.png")
link(rel="manifest" href="/wekan-manifest.json")
template(name="userFormsLayout")
diff --git a/client/components/main/layouts.js b/client/components/main/layouts.js
index 1936d7aa..f12718a7 100644
--- a/client/components/main/layouts.js
+++ b/client/components/main/layouts.js
@@ -1,7 +1,3 @@
-Meteor.subscribe('boards');
-Meteor.subscribe('setting');
-Meteor.subscribe('user-admin');
-
BlazeLayout.setRoot('body');
const i18nTagToT9n = (i18nTag) => {
@@ -21,10 +17,14 @@ Template.userFormsLayout.onRendered(() => {
Template.userFormsLayout.helpers({
languages() {
return _.map(TAPi18n.getLanguages(), (lang, code) => {
- return {
- tag: code,
- name: lang.name === 'br' ? 'Brezhoneg' : lang.name,
- };
+ const tag = code;
+ let name = lang.name;
+ if (lang.name === 'br') {
+ name = 'Brezhoneg';
+ } else if (lang.name === 'ig') {
+ name = 'Igbo';
+ }
+ return { tag, name };
}).sort(function(a, b) {
if (a.name === b.name) {
return 0;
diff --git a/client/components/main/layouts.styl b/client/components/main/layouts.styl
index 734a5e83..a79ff337 100644
--- a/client/components/main/layouts.styl
+++ b/client/components/main/layouts.styl
@@ -270,11 +270,6 @@ kbd
.grabbing
cursor: grabbing
-.emoji
- height: 18px
- width: 18px
- vertical-align: text-bottom
-
// Implement a thiner close icon as suggested in
// https://github.com/FortAwesome/Font-Awesome/issues/1540#issuecomment-68689950
.fa.fa-times-thin:before
diff --git a/client/components/settings/invitationCode.js b/client/components/settings/invitationCode.js
index a403d8ab..c02f860f 100644
--- a/client/components/settings/invitationCode.js
+++ b/client/components/settings/invitationCode.js
@@ -1,6 +1,6 @@
Template.invitationCode.onRendered(() => {
const setting = Settings.findOne();
- if (!setting || !setting.disableRegistration) {
+ if (setting || setting.disableRegistration) {
$('#invitationcode').hide();
}
});
diff --git a/client/components/settings/peopleBody.jade b/client/components/settings/peopleBody.jade
new file mode 100644
index 00000000..a3506a24
--- /dev/null
+++ b/client/components/settings/peopleBody.jade
@@ -0,0 +1,90 @@
+template(name="people")
+ .setting-content
+ unless currentUser.isAdmin
+ | {{_ 'error-notAuthorized'}}
+ else
+ .content-title
+ span {{_ 'people'}}
+ .content-body
+ .side-menu
+ ul
+ li.active
+ a.js-setting-menu(data-id="people-setting") {{_ 'people'}}
+ .main-body
+ if loading.get
+ +spinner
+ else if people.get
+ +peopleGeneral
+
+template(name="peopleGeneral")
+ table
+ tbody
+ tr
+ th {{_ 'username'}}
+ th {{_ 'fullname'}}
+ th {{_ 'admin'}}
+ th {{_ 'email'}}
+ th {{_ 'verified'}}
+ th {{_ 'createdAt'}}
+ th {{_ 'active'}}
+ th
+ each user in peopleList
+ +peopleRow(userId=user._id)
+
+template(name="peopleRow")
+ tr
+ td.username {{ userData.username }}
+ td {{ userData.profile.fullname }}
+ td
+ if userData.isAdmin
+ | {{_ 'yes'}}
+ else
+ | {{_ 'no'}}
+ td {{ userData.emails.[0].address }}
+ td
+ if userData.emails.[0].verified
+ | {{_ 'yes'}}
+ else
+ | {{_ 'no'}}
+ td {{ moment userData.createdAt 'LLL' }}
+ td
+ if userData.loginDisabled
+ | {{_ 'no'}}
+ else
+ | {{_ 'yes'}}
+ td
+ a.edit-user
+ | {{_ 'edit'}}
+
+template(name="editUserPopup")
+ form
+ label.hide.userId(type="text" value=user._id)
+ label
+ | {{_ 'fullname'}}
+ input.js-profile-fullname(type="text" value=user.profile.fullname autofocus)
+ label
+ | {{_ 'username'}}
+ span.error.hide.username-taken
+ | {{_ 'error-username-taken'}}
+ input.js-profile-username(type="text" value=user.username)
+ label
+ | {{_ 'email'}}
+ span.error.hide.email-taken
+ | {{_ 'error-email-taken'}}
+ input.js-profile-email(type="email" value="{{user.emails.[0].address}}")
+ label
+ | {{_ 'admin'}}
+ select.select-role.js-profile-isadmin
+ option(value="false") {{_ 'no'}}
+ option(value="true" selected="{{user.isAdmin}}") {{_ 'yes'}}
+ label
+ | {{_ 'active'}}
+ select.select-active.js-profile-isactive
+ option(value="false") {{_ 'yes'}}
+ option(value="true" selected="{{user.loginDisabled}}") {{_ 'no'}}
+ hr
+ label
+ | {{_ 'password'}}
+ input.js-profile-password(type="password")
+
+ input.primary.wide(type="submit" value="{{_ 'save'}}")
diff --git a/client/components/settings/peopleBody.js b/client/components/settings/peopleBody.js
new file mode 100644
index 00000000..7cc992f2
--- /dev/null
+++ b/client/components/settings/peopleBody.js
@@ -0,0 +1,158 @@
+const usersPerPage = 25;
+
+BlazeComponent.extendComponent({
+ mixins() {
+ return [Mixins.InfiniteScrolling];
+ },
+ onCreated() {
+ this.error = new ReactiveVar('');
+ this.loading = new ReactiveVar(false);
+ this.people = new ReactiveVar(true);
+
+ this.page = new ReactiveVar(1);
+ this.loadNextPageLocked = false;
+ this.callFirstWith(null, 'resetNextPeak');
+ this.autorun(() => {
+ const limit = this.page.get() * usersPerPage;
+
+ this.subscribe('people', limit, () => {
+ this.loadNextPageLocked = false;
+ const nextPeakBefore = this.callFirstWith(null, 'getNextPeak');
+ this.calculateNextPeak();
+ const nextPeakAfter = this.callFirstWith(null, 'getNextPeak');
+ if (nextPeakBefore === nextPeakAfter) {
+ this.callFirstWith(null, 'resetNextPeak');
+ }
+ });
+ });
+ },
+ loadNextPage() {
+ if (this.loadNextPageLocked === false) {
+ this.page.set(this.page.get() + 1);
+ this.loadNextPageLocked = true;
+ }
+ },
+ calculateNextPeak() {
+ const element = this.find('.main-body');
+ if (element) {
+ const altitude = element.scrollHeight;
+ this.callFirstWith(this, 'setNextPeak', altitude);
+ }
+ },
+ reachNextPeak() {
+ this.loadNextPage();
+ },
+ setError(error) {
+ this.error.set(error);
+ },
+ setLoading(w) {
+ this.loading.set(w);
+ },
+ peopleList() {
+ return Users.find({}, {
+ fields: {_id: true},
+ });
+ },
+}).register('people');
+
+Template.peopleRow.helpers({
+ userData() {
+ const userCollection = this.esSearch ? ESSearchResults : Users;
+ return userCollection.findOne(this.userId);
+ },
+});
+
+Template.editUserPopup.helpers({
+ user() {
+ return Users.findOne(this.userId);
+ },
+});
+
+BlazeComponent.extendComponent({
+ onCreated() {
+ },
+ user() {
+ return Users.findOne(this.userId);
+ },
+ events() {
+ return [{
+ 'click a.edit-user': Popup.open('editUser'),
+ }];
+ },
+}).register('peopleRow');
+
+Template.editUserPopup.events({
+ submit(evt, tpl) {
+ evt.preventDefault();
+ const user = Users.findOne(this.userId);
+ const fullname = tpl.find('.js-profile-fullname').value.trim();
+ const username = tpl.find('.js-profile-username').value.trim();
+ const password = tpl.find('.js-profile-password').value;
+ const isAdmin = tpl.find('.js-profile-isadmin').value.trim();
+ const isActive = tpl.find('.js-profile-isactive').value.trim();
+ const email = tpl.find('.js-profile-email').value.trim();
+
+ const isChangePassword = password.length > 0;
+ const isChangeUserName = username !== user.username;
+ const isChangeEmail = email.toLowerCase() !== user.emails[0].address.toLowerCase();
+
+ Users.update(this.userId, {
+ $set: {
+ 'profile.fullname': fullname,
+ 'isAdmin': isAdmin === 'true',
+ 'loginDisabled': isActive === 'true',
+ },
+ });
+
+ if(isChangePassword){
+ Meteor.call('setPassword', password, this.userId);
+ }
+
+ if (isChangeUserName && isChangeEmail) {
+ Meteor.call('setUsernameAndEmail', username, email.toLowerCase(), this.userId, function (error) {
+ const usernameMessageElement = tpl.$('.username-taken');
+ const emailMessageElement = tpl.$('.email-taken');
+ if (error) {
+ const errorElement = error.error;
+ if (errorElement === 'username-already-taken') {
+ usernameMessageElement.show();
+ emailMessageElement.hide();
+ } else if (errorElement === 'email-already-taken') {
+ usernameMessageElement.hide();
+ emailMessageElement.show();
+ }
+ } else {
+ usernameMessageElement.hide();
+ emailMessageElement.hide();
+ Popup.close();
+ }
+ });
+ } else if (isChangeUserName) {
+ Meteor.call('setUsername', username, this.userId, function (error) {
+ const usernameMessageElement = tpl.$('.username-taken');
+ if (error) {
+ const errorElement = error.error;
+ if (errorElement === 'username-already-taken') {
+ usernameMessageElement.show();
+ }
+ } else {
+ usernameMessageElement.hide();
+ Popup.close();
+ }
+ });
+ } else if (isChangeEmail) {
+ Meteor.call('setEmail', email.toLowerCase(), this.userId, function (error) {
+ const emailMessageElement = tpl.$('.email-taken');
+ if (error) {
+ const errorElement = error.error;
+ if (errorElement === 'email-already-taken') {
+ emailMessageElement.show();
+ }
+ } else {
+ emailMessageElement.hide();
+ Popup.close();
+ }
+ });
+ } else Popup.close();
+ },
+});
diff --git a/client/components/settings/peopleBody.styl b/client/components/settings/peopleBody.styl
new file mode 100644
index 00000000..84db44a7
--- /dev/null
+++ b/client/components/settings/peopleBody.styl
@@ -0,0 +1,15 @@
+.main-body
+ overflow: scroll;
+
+table
+ border-collapse: collapse;
+ width: 100%;
+ color: #000;
+
+ td, th
+ border: 1px solid #d2d0d0;
+ text-align: left;
+ padding: 8px;
+
+ tr:nth-child(even)
+ background-color: #dddddd;
diff --git a/client/components/settings/settingBody.jade b/client/components/settings/settingBody.jade
index 5864efd5..5bc7972d 100644
--- a/client/components/settings/settingBody.jade
+++ b/client/components/settings/settingBody.jade
@@ -14,6 +14,8 @@ template(name="setting")
a.js-setting-menu(data-id="email-setting") {{_ 'email'}}
li
a.js-setting-menu(data-id="account-setting") {{_ 'accounts'}}
+ li
+ a.js-setting-menu(data-id="announcement-setting") {{_ 'admin-announcement'}}
.main-body
if loading.get
+spinner
@@ -23,6 +25,8 @@ template(name="setting")
+email
else if accountSetting.get
+accountSettings
+ else if announcementSetting.get
+ +announcementSettings
template(name="general")
ul#registration-setting.setting-detail
@@ -85,9 +89,12 @@ template(name='email')
li
button.js-save.primary {{_ 'save'}}
+ li
+ button.js-send-smtp-test-email.primary {{_ 'send-smtp-test'}}
+
template(name='accountSettings')
ul#account-setting.setting-detail
- li.smtp-form
+ li.accounts-form
.title {{_ 'accounts-allowEmailChange'}}
.form-group.flex
input.form-control#accounts-allowEmailChange(type="radio" name="allowEmailChange" value="true" checked="{{#if allowEmailChange}}checked{{/if}}")
@@ -95,4 +102,28 @@ template(name='accountSettings')
input.form-control#accounts-allowEmailChange(type="radio" name="allowEmailChange" value="false" checked="{{#unless allowEmailChange}}checked{{/unless}}")
span {{_ 'no'}}
li
+ li.accounts-form
+ .title {{_ 'accounts-allowUserNameChange'}}
+ .form-group.flex
+ input.form-control#accounts-allowUserNameChange(type="radio" name="allowUserNameChange" value="true" checked="{{#if allowUserNameChange}}checked{{/if}}")
+ span {{_ 'yes'}}
+ input.form-control#accounts-allowUserNameChange(type="radio" name="allowUserNameChange" value="false" checked="{{#unless allowUserNameChange}}checked{{/unless}}")
+ span {{_ 'no'}}
+ li
button.js-accounts-save.primary {{_ 'save'}}
+
+template(name='announcementSettings')
+ ul#announcement-setting.setting-detail
+ li
+ a.flex.js-toggle-activemessage
+ .materialCheckBox(class="{{#if currentSetting.enabled}}is-checked{{/if}}")
+
+ span {{_ 'admin-announcement-active'}}
+ li
+ .admin-announcement(class="{{#if currentSetting.enabled}}{{else}}hide{{/if}}")
+ ul
+ li
+ .title {{_ 'admin-announcement-title'}}
+ textarea#admin-announcement.form-control= currentSetting.body
+ li
+ button.js-announcement-save.primary {{_ 'save'}}
diff --git a/client/components/settings/settingBody.js b/client/components/settings/settingBody.js
index a2993426..7230d893 100644
--- a/client/components/settings/settingBody.js
+++ b/client/components/settings/settingBody.js
@@ -1,7 +1,3 @@
-Meteor.subscribe('setting');
-Meteor.subscribe('mailServer');
-Meteor.subscribe('accountSettings');
-
BlazeComponent.extendComponent({
onCreated() {
this.error = new ReactiveVar('');
@@ -9,6 +5,12 @@ BlazeComponent.extendComponent({
this.generalSetting = new ReactiveVar(true);
this.emailSetting = new ReactiveVar(false);
this.accountSetting = new ReactiveVar(false);
+ this.announcementSetting = new ReactiveVar(false);
+
+ Meteor.subscribe('setting');
+ Meteor.subscribe('mailServer');
+ Meteor.subscribe('accountSettings');
+ Meteor.subscribe('announcements');
},
setError(error) {
@@ -21,7 +23,7 @@ BlazeComponent.extendComponent({
checkField(selector) {
const value = $(selector).val();
- if(!value || value.trim() === ''){
+ if (!value || value.trim() === '') {
$(selector).parents('li.smtp-form').addClass('has-error');
throw Error('blank field');
} else {
@@ -29,7 +31,7 @@ BlazeComponent.extendComponent({
}
},
- currentSetting(){
+ currentSetting() {
return Settings.findOne();
},
@@ -42,35 +44,36 @@ BlazeComponent.extendComponent({
sort: ['title'],
});
},
- toggleRegistration(){
+ toggleRegistration() {
this.setLoading(true);
const registrationClosed = this.currentSetting().disableRegistration;
- Settings.update(Settings.findOne()._id, {$set:{disableRegistration: !registrationClosed}});
+ Settings.update(Settings.findOne()._id, {$set: {disableRegistration: !registrationClosed}});
this.setLoading(false);
- if(registrationClosed){
+ if (registrationClosed) {
$('.invite-people').slideUp();
- }else{
+ } else {
$('.invite-people').slideDown();
}
},
- toggleTLS(){
+ toggleTLS() {
$('#mail-server-tls').toggleClass('is-checked');
},
- switchMenu(event){
+ switchMenu(event) {
const target = $(event.target);
- if(!target.hasClass('active')){
+ 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);
this.accountSetting.set('account-setting' === targetID);
+ this.announcementSetting.set('announcement-setting' === targetID);
}
},
- checkBoard(event){
+ checkBoard(event) {
let target = $(event.target);
- if(!target.hasClass('js-toggle-board-choose')){
+ if (!target.hasClass('js-toggle-board-choose')) {
target = target.parent();
}
const checkboxId = target.attr('id');
@@ -78,7 +81,7 @@ BlazeComponent.extendComponent({
$(`#${checkboxId}`).toggleClass('is-checked');
},
- inviteThroughEmail(){
+ inviteThroughEmail() {
const emails = $('#email-to-invite').val().trim().split('\n').join(',').split(',');
const boardsToInvite = [];
$('.js-toggle-board-choose .materialCheckBox.is-checked').each(function () {
@@ -101,19 +104,23 @@ BlazeComponent.extendComponent({
}
},
- saveMailServerInfo(){
+ saveMailServerInfo() {
this.setLoading(true);
$('li').removeClass('has-error');
- try{
+ 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}});
+ 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 {
@@ -122,7 +129,23 @@ BlazeComponent.extendComponent({
},
- events(){
+ sendSMTPTestEmail() {
+ Meteor.call('sendSMTPTestEmail', (err, ret) => {
+ if (!err && ret) { /* eslint-disable no-console */
+ const message = `${TAPi18n.__(ret.message)}: ${ret.email}`;
+ console.log(message);
+ alert(message);
+ } else {
+ const reason = err.reason || '';
+ const message = `${TAPi18n.__(err.error)}\n${reason}`;
+ console.log(message, err);
+ alert(message);
+ }
+ /* eslint-enable no-console */
+ });
+ },
+
+ events() {
return [{
'click a.js-toggle-registration': this.toggleRegistration,
'click a.js-toggle-tls': this.toggleTLS,
@@ -130,25 +153,76 @@ BlazeComponent.extendComponent({
'click a.js-toggle-board-choose': this.checkBoard,
'click button.js-email-invite': this.inviteThroughEmail,
'click button.js-save': this.saveMailServerInfo,
+ 'click button.js-send-smtp-test-email': this.sendSMTPTestEmail,
}];
},
}).register('setting');
BlazeComponent.extendComponent({
- saveAllowEmailChange() {
+
+ saveAccountsChange() {
const allowEmailChange = ($('input[name=allowEmailChange]:checked').val() === 'true');
+ const allowUserNameChange = ($('input[name=allowUserNameChange]:checked').val() === 'true');
AccountSettings.update('accounts-allowEmailChange', {
- $set: { 'booleanValue': allowEmailChange },
+ $set: {'booleanValue': allowEmailChange},
+ });
+ AccountSettings.update('accounts-allowUserNameChange', {
+ $set: {'booleanValue': allowUserNameChange},
});
},
allowEmailChange() {
return AccountSettings.findOne('accounts-allowEmailChange').booleanValue;
},
+ allowUserNameChange() {
+ return AccountSettings.findOne('accounts-allowUserNameChange').booleanValue;
+ },
events() {
return [{
- 'click button.js-accounts-save': this.saveAllowEmailChange,
+ 'click button.js-accounts-save': this.saveAccountsChange,
}];
},
}).register('accountSettings');
+
+BlazeComponent.extendComponent({
+ onCreated() {
+ this.loading = new ReactiveVar(false);
+ },
+
+ setLoading(w) {
+ this.loading.set(w);
+ },
+
+ currentSetting() {
+ return Announcements.findOne();
+ },
+
+ saveMessage() {
+ const message = $('#admin-announcement').val().trim();
+ Announcements.update(Announcements.findOne()._id, {
+ $set: {'body': message},
+ });
+ },
+
+ toggleActive() {
+ this.setLoading(true);
+ const isActive = this.currentSetting().enabled;
+ Announcements.update(Announcements.findOne()._id, {
+ $set: {'enabled': !isActive},
+ });
+ this.setLoading(false);
+ if (isActive) {
+ $('.admin-announcement').slideUp();
+ } else {
+ $('.admin-announcement').slideDown();
+ }
+ },
+
+ events() {
+ return [{
+ 'click a.js-toggle-activemessage': this.toggleActive,
+ 'click button.js-announcement-save': this.saveMessage,
+ }];
+ },
+}).register('announcementSettings');
diff --git a/client/components/settings/settingBody.styl b/client/components/settings/settingBody.styl
index 118d364c..fec64cee 100644
--- a/client/components/settings/settingBody.styl
+++ b/client/components/settings/settingBody.styl
@@ -61,10 +61,11 @@
.is-checked
border-bottom: 2px solid #2980b9;
border-right: 2px solid #2980b9;
-
- span
+
+ span
padding: 0 0.5rem
-
+
+ .admin-announcement,
.invite-people
padding-left 20px;
li
diff --git a/client/components/settings/settingHeader.jade b/client/components/settings/settingHeader.jade
index c22cf5c6..c2d4db3a 100644
--- a/client/components/settings/settingHeader.jade
+++ b/client/components/settings/settingHeader.jade
@@ -9,13 +9,14 @@ template(name="settingHeaderBar")
a.setting-header-btn.settings(href="{{pathFor 'setting'}}")
i.fa(class="fa-cog")
span {{_ 'settings'}}
+
+ a.setting-header-btn.people(href="{{pathFor 'people'}}")
+ i.fa(class="fa-users")
+ span {{_ 'people'}}
+
a.setting-header-btn.informations(href="{{pathFor 'information'}}")
i.fa(class="fa-info-circle")
span {{_ 'info'}}
-//TODO
-// a.setting-header-btn.people
-// i.fa(class="fa-users")
-// span {{_ 'people'}}
else
a.setting-header-btn.js-log-in(
diff --git a/client/components/settings/settingHeader.styl b/client/components/settings/settingHeader.styl
index 995ed26d..3699f180 100644
--- a/client/components/settings/settingHeader.styl
+++ b/client/components/settings/settingHeader.styl
@@ -22,4 +22,4 @@
+ span
display: inline-block
margin-top: 1px
- margin-right: 10px \ No newline at end of file
+ margin-right: 10px
diff --git a/client/components/sidebar/sidebar.jade b/client/components/sidebar/sidebar.jade
index 6045b371..6085c2ad 100644
--- a/client/components/sidebar/sidebar.jade
+++ b/client/components/sidebar/sidebar.jade
@@ -82,23 +82,27 @@ template(name="memberPopup")
ul.pop-over-list
li
a.js-filter-member {{_ 'filter-cards'}}
- if currentUser.isBoardAdmin
- unless isSandstorm
+ unless isSandstorm
+ if currentUser.isBoardAdmin
li
a.js-change-role
| {{_ 'change-permissions'}}
span.quiet (#{memberType})
- li
- if $eq currentUser._id userId
- a.js-leave-member {{_ 'leave-board'}}
- else
- a.js-remove-member {{_ 'remove-from-board'}}
+ li
+ if $eq currentUser._id userId
+ a.js-leave-member {{_ 'leave-board'}}
+ else if currentUser.isBoardAdmin
+ a.js-remove-member {{_ 'remove-from-board'}}
template(name="removeMemberPopup")
p {{_ 'remove-member-pop' name=user.profile.fullname username=user.username boardTitle=board.title}}
button.js-confirm.negate.full(type="submit") {{_ 'remove-member'}}
+template(name="leaveBoardPopup")
+ p {{_ 'leave-board-pop' boardTitle=board.title}}
+ button.js-confirm.negate.full(type="submit") {{_ 'leave-board'}}
+
template(name="addMemberPopup")
.js-search-member
+esInput(index="users")
diff --git a/client/components/sidebar/sidebar.js b/client/components/sidebar/sidebar.js
index 59a2b42c..5a9de74b 100644
--- a/client/components/sidebar/sidebar.js
+++ b/client/components/sidebar/sidebar.js
@@ -4,6 +4,7 @@ const defaultView = 'home';
const viewTitles = {
filter: 'filter-cards',
+ search: 'search-cards',
multiselection: 'multi-selection',
customFields: 'custom-fields',
archives: 'archives',
@@ -154,15 +155,13 @@ Template.memberPopup.events({
Boards.findOne(boardId).removeMember(memberId);
Popup.close();
}),
- 'click .js-leave-member'() {
+ 'click .js-leave-member': Popup.afterConfirm('leaveBoard', () => {
const boardId = Session.get('currentBoard');
- Meteor.call('quitBoard', boardId, (err, ret) => {
- if (!ret && ret) {
- Popup.close();
- FlowRouter.go('home');
- }
+ Meteor.call('quitBoard', boardId, () => {
+ Popup.close();
+ FlowRouter.go('home');
});
- },
+ }),
});
Template.removeMemberPopup.helpers({
@@ -174,6 +173,12 @@ Template.removeMemberPopup.helpers({
},
});
+Template.leaveBoardPopup.helpers({
+ board() {
+ return Boards.findOne(Session.get('currentBoard'));
+ },
+});
+
Template.membersWidget.helpers({
isInvited() {
const user = Meteor.user();
diff --git a/client/components/sidebar/sidebarArchives.jade b/client/components/sidebar/sidebarArchives.jade
index aa14fc30..ee6cac01 100644
--- a/client/components/sidebar/sidebarArchives.jade
+++ b/client/components/sidebar/sidebarArchives.jade
@@ -25,3 +25,14 @@ template(name="archivesSidebar")
= title
else
li.no-items-message {{_ 'no-archived-lists'}}
+
+ +tabContent(slug="swimlanes")
+ ul.archived-lists
+ each archivedSwimlanes
+ li.archived-lists-item
+ if currentUser.isBoardMember
+ button.js-restore-swimlane
+ i.fa.fa-undo
+ = title
+ else
+ li.no-items-message {{_ 'no-archived-swimlanes'}}
diff --git a/client/components/sidebar/sidebarArchives.js b/client/components/sidebar/sidebarArchives.js
index c8196f23..6102bf11 100644
--- a/client/components/sidebar/sidebarArchives.js
+++ b/client/components/sidebar/sidebarArchives.js
@@ -3,6 +3,7 @@ BlazeComponent.extendComponent({
return [
{ name: TAPi18n.__('cards'), slug: 'cards' },
{ name: TAPi18n.__('lists'), slug: 'lists' },
+ { name: TAPi18n.__('swimlanes'), slug: 'swimlanes' },
];
},
@@ -20,6 +21,13 @@ BlazeComponent.extendComponent({
});
},
+ archivedSwimlanes() {
+ return Swimlanes.find({
+ archived: true,
+ boardId: Session.get('currentBoard'),
+ });
+ },
+
cardIsInArchivedList() {
return this.currentData().list().archived;
},
@@ -32,7 +40,9 @@ BlazeComponent.extendComponent({
return [{
'click .js-restore-card'() {
const card = this.currentData();
- card.restore();
+ if(card.canBeRestored()){
+ card.restore();
+ }
},
'click .js-delete-card': Popup.afterConfirm('cardDelete', function() {
const cardId = this._id;
@@ -43,6 +53,10 @@ BlazeComponent.extendComponent({
const list = this.currentData();
list.restore();
},
+ 'click .js-restore-swimlane'() {
+ const swimlane = this.currentData();
+ swimlane.restore();
+ },
}];
},
}).register('archivesSidebar');
diff --git a/client/components/sidebar/sidebarFilters.jade b/client/components/sidebar/sidebarFilters.jade
index 9a9774bb..273df8c2 100644
--- a/client/components/sidebar/sidebarFilters.jade
+++ b/client/components/sidebar/sidebarFilters.jade
@@ -59,7 +59,7 @@ template(name="multiselectionSidebar")
if name
= name
else
- span.quiet {{_ "label-default" color}}
+ span.quiet {{_ "label-default" (_ (concat "color-" color))}}
if allSelectedElementHave 'label' _id
i.fa.fa-check
else if someSelectedElementHave 'label' _id
diff --git a/client/components/sidebar/sidebarSearches.jade b/client/components/sidebar/sidebarSearches.jade
new file mode 100644
index 00000000..2ad5b00f
--- /dev/null
+++ b/client/components/sidebar/sidebarSearches.jade
@@ -0,0 +1,8 @@
+template(name="searchSidebar")
+ form.js-search-term-form
+ input(type="text" name="searchTerm" placeholder="{{_ 'search-example'}}" autofocus)
+ .list-body.js-perfect-scrollbar
+ .minicards.clearfix.js-minicards
+ each (results)
+ a.minicard-wrapper.js-minicard(href=absoluteUrl)
+ +minicard(this)
diff --git a/client/components/sidebar/sidebarSearches.js b/client/components/sidebar/sidebarSearches.js
new file mode 100644
index 00000000..111a86b8
--- /dev/null
+++ b/client/components/sidebar/sidebarSearches.js
@@ -0,0 +1,19 @@
+BlazeComponent.extendComponent({
+ onCreated() {
+ this.term = new ReactiveVar('');
+ },
+
+ results() {
+ const currentBoard = Boards.findOne(Session.get('currentBoard'));
+ return currentBoard.searchCards(this.term.get());
+ },
+
+ events() {
+ return [{
+ 'submit .js-search-term-form'(evt) {
+ evt.preventDefault();
+ this.term.set(evt.target.searchTerm.value);
+ },
+ }];
+ },
+}).register('searchSidebar');
diff --git a/client/components/sidebar/sidebarSearches.styl b/client/components/sidebar/sidebarSearches.styl
new file mode 100644
index 00000000..6b8ad904
--- /dev/null
+++ b/client/components/sidebar/sidebarSearches.styl
@@ -0,0 +1,2 @@
+input
+ max-width: 100%
diff --git a/client/components/swimlanes/swimlaneHeader.jade b/client/components/swimlanes/swimlaneHeader.jade
new file mode 100644
index 00000000..483de06f
--- /dev/null
+++ b/client/components/swimlanes/swimlaneHeader.jade
@@ -0,0 +1,23 @@
+template(name="swimlaneHeader")
+ .swimlane-header-wrap.js-swimlane-header
+ +inlinedForm
+ +editSwimlaneTitleForm
+ else
+ .swimlane-header(
+ class="{{#if currentUser.isBoardMember}}js-open-inlined-form is-editable{{/if}}")
+ = title
+ .swimlane-header-menu
+ unless currentUser.isCommentOnly
+ a.fa.fa-navicon.js-open-swimlane-menu
+
+template(name="editSwimlaneTitleForm")
+ .list-composer
+ input.list-name-input.full-line(type="text" value=title autofocus)
+ .edit-controls.clearfix
+ button.primary.confirm(type="submit") {{_ 'save'}}
+ a.fa.fa-times-thin.js-close-inlined-form
+
+template(name="swimlaneActionPopup")
+ unless currentUser.isCommentOnly
+ ul.pop-over-list
+ li: a.js-close-swimlane {{_ 'archive-swimlane'}}
diff --git a/client/components/swimlanes/swimlaneHeader.js b/client/components/swimlanes/swimlaneHeader.js
new file mode 100644
index 00000000..50635f86
--- /dev/null
+++ b/client/components/swimlanes/swimlaneHeader.js
@@ -0,0 +1,25 @@
+BlazeComponent.extendComponent({
+ editTitle(evt) {
+ evt.preventDefault();
+ const newTitle = this.childComponents('inlinedForm')[0].getValue().trim();
+ const swimlane = this.currentData();
+ if (newTitle) {
+ swimlane.rename(newTitle.trim());
+ }
+ },
+
+ events() {
+ return [{
+ 'click .js-open-swimlane-menu': Popup.open('swimlaneAction'),
+ submit: this.editTitle,
+ }];
+ },
+}).register('swimlaneHeader');
+
+Template.swimlaneActionPopup.events({
+ 'click .js-close-swimlane' (evt) {
+ evt.preventDefault();
+ this.archive();
+ Popup.close();
+ },
+});
diff --git a/client/components/swimlanes/swimlanes.jade b/client/components/swimlanes/swimlanes.jade
new file mode 100644
index 00000000..76f54c66
--- /dev/null
+++ b/client/components/swimlanes/swimlanes.jade
@@ -0,0 +1,75 @@
+template(name="swimlane")
+ .swimlane.js-lists.js-swimlane
+ +swimlaneHeader
+ if isMiniScreen
+ if currentList
+ +list(currentList)
+ else
+ each currentBoard.lists
+ +miniList(this)
+ if currentUser.isBoardMember
+ +addListForm
+ else
+ each currentBoard.lists
+ +list(this)
+ if currentCardIsInThisList _id ../_id
+ +cardDetails(currentCard)
+ if currentUser.isBoardMember
+ +addListAndSwimlaneForm
+
+template(name="listsGroup")
+ .swimlane.list-group.js-lists
+ if isMiniScreen
+ if currentList
+ +list(currentList)
+ else
+ each currentBoard.lists
+ +miniList(this)
+ if currentUser.isBoardMember
+ +addListForm
+ else
+ each currentBoard.lists
+ +list(this)
+ if currentCardIsInThisList _id null
+ +cardDetails(currentCard)
+ if currentUser.isBoardMember
+ +addListForm
+
+template(name="addListAndSwimlaneForm")
+ .list.list-composer.js-list-composer
+ .list-header
+ +inlinedForm(autoclose=false)
+ input.list-name-input.full-line(type="text" placeholder="{{_ 'add-list'}}"
+ autocomplete="off" autofocus)
+ .edit-controls.clearfix
+ button.primary.confirm(type="submit") {{_ 'save'}}
+ a.fa.fa-times-thin.js-close-inlined-form
+ else
+ a.open-list-composer.js-open-inlined-form
+ i.fa.fa-plus
+ | {{_ 'add-list'}}
+ .list-header
+ +inlinedForm(autoclose=false)
+ input.swimlane-name-input.full-line(type="text" placeholder="{{_ 'add-swimlane'}}"
+ autocomplete="off" autofocus)
+ .edit-controls.clearfix
+ button.primary.confirm(type="submit") {{_ 'save'}}
+ a.fa.fa-times-thin.js-close-inlined-form
+ else
+ a.open-list-composer.js-open-inlined-form
+ i.fa.fa-plus
+ | {{_ 'add-swimlane'}}
+
+template(name="addListForm")
+ .list.list-composer.js-list-composer
+ .list-header
+ +inlinedForm(autoclose=false)
+ input.list-name-input.full-line(type="text" placeholder="{{_ 'add-list'}}"
+ autocomplete="off" autofocus)
+ .edit-controls.clearfix
+ button.primary.confirm(type="submit") {{_ 'save'}}
+ a.fa.fa-times-thin.js-close-inlined-form
+ else
+ a.open-list-composer.js-open-inlined-form
+ i.fa.fa-plus
+ | {{_ 'add-list'}}
diff --git a/client/components/swimlanes/swimlanes.js b/client/components/swimlanes/swimlanes.js
new file mode 100644
index 00000000..7965c2bc
--- /dev/null
+++ b/client/components/swimlanes/swimlanes.js
@@ -0,0 +1,235 @@
+const { calculateIndex } = Utils;
+
+function currentCardIsInThisList(listId, swimlaneId) {
+ const currentCard = Cards.findOne(Session.get('currentCard'));
+ const currentUser = Meteor.user();
+ if (currentUser.profile.boardView === 'board-view-lists')
+ return currentCard && currentCard.listId === listId;
+ else if (currentUser.profile.boardView === 'board-view-swimlanes')
+ return currentCard && currentCard.listId === listId && currentCard.swimlaneId === swimlaneId;
+ else
+ return false;
+}
+
+function initSortable(boardComponent, $listsDom) {
+ // We want to animate the card details window closing. We rely on CSS
+ // transition for the actual animation.
+ $listsDom._uihooks = {
+ removeElement(node) {
+ const removeNode = _.once(() => {
+ node.parentNode.removeChild(node);
+ });
+ if ($(node).hasClass('js-card-details')) {
+ $(node).css({
+ flexBasis: 0,
+ padding: 0,
+ });
+ $listsDom.one(CSSEvents.transitionend, removeNode);
+ } else {
+ removeNode();
+ }
+ },
+ };
+
+ $listsDom.sortable({
+ tolerance: 'pointer',
+ helper: 'clone',
+ handle: '.js-list-header',
+ items: '.js-list:not(.js-list-composer)',
+ placeholder: 'list placeholder',
+ distance: 7,
+ start(evt, ui) {
+ ui.placeholder.height(ui.helper.height());
+ EscapeActions.executeUpTo('popup-close');
+ boardComponent.setIsDragging(true);
+ },
+ stop(evt, ui) {
+ // To attribute the new index number, we need to get the DOM element
+ // of the previous and the following card -- if any.
+ const prevListDom = ui.item.prev('.js-list').get(0);
+ const nextListDom = ui.item.next('.js-list').get(0);
+ const sortIndex = calculateIndex(prevListDom, nextListDom, 1);
+
+ $listsDom.sortable('cancel');
+ const listDomElement = ui.item.get(0);
+ const list = Blaze.getData(listDomElement);
+
+ Lists.update(list._id, {
+ $set: {
+ sort: sortIndex.base,
+ },
+ });
+
+ boardComponent.setIsDragging(false);
+ },
+ });
+
+ function userIsMember() {
+ return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
+ }
+
+ // Disable drag-dropping while in multi-selection mode, or if the current user
+ // is not a board member
+ boardComponent.autorun(() => {
+ const $listDom = $listsDom;
+ if ($listDom.data('sortable')) {
+ $listsDom.sortable('option', 'disabled',
+ MultiSelection.isActive() || !userIsMember());
+ }
+ });
+}
+
+BlazeComponent.extendComponent({
+ onRendered() {
+ const boardComponent = this.parentComponent();
+ const $listsDom = this.$('.js-lists');
+
+ if (!Session.get('currentCard')) {
+ boardComponent.scrollLeft();
+ }
+
+ initSortable(boardComponent, $listsDom);
+ },
+ onCreated() {
+ this.draggingActive = new ReactiveVar(false);
+
+ this._isDragging = false;
+ this._lastDragPositionX = 0;
+ },
+
+ id() {
+ return this._id;
+ },
+
+ currentCardIsInThisList(listId, swimlaneId) {
+ return currentCardIsInThisList(listId, swimlaneId);
+ },
+
+ events() {
+ return [{
+ // Click-and-drag action
+ 'mousedown .board-canvas'(evt) {
+ // Translating the board canvas using the click-and-drag action can
+ // conflict with the build-in browser mechanism to select text. We
+ // define a list of elements in which we disable the dragging because
+ // the user will legitimately expect to be able to select some text with
+ // his mouse.
+ const noDragInside = ['a', 'input', 'textarea', 'p', '.js-list-header'];
+ if ($(evt.target).closest(noDragInside.join(',')).length === 0 && this.$('.swimlane').prop('clientHeight') > evt.offsetY) {
+ this._isDragging = true;
+ this._lastDragPositionX = evt.clientX;
+ }
+ },
+ 'mouseup'() {
+ if (this._isDragging) {
+ this._isDragging = false;
+ }
+ },
+ 'mousemove'(evt) {
+ if (this._isDragging) {
+ // Update the canvas position
+ this.listsDom.scrollLeft -= evt.clientX - this._lastDragPositionX;
+ this._lastDragPositionX = evt.clientX;
+ // Disable browser text selection while dragging
+ evt.stopPropagation();
+ evt.preventDefault();
+ // Don't close opened card or inlined form at the end of the
+ // click-and-drag.
+ EscapeActions.executeUpTo('popup-close');
+ EscapeActions.preventNextClick();
+ }
+ },
+ }];
+ },
+}).register('swimlane');
+
+BlazeComponent.extendComponent({
+ // Proxy
+ open() {
+ this.childComponents('inlinedForm')[0].open();
+ },
+
+ events() {
+ return [{
+ submit(evt) {
+ evt.preventDefault();
+ const titleInput = this.find('.list-name-input');
+ const title = titleInput.value.trim();
+ if (title) {
+ Lists.insert({
+ title,
+ boardId: Session.get('currentBoard'),
+ sort: $('.list').length,
+ });
+
+ titleInput.value = '';
+ titleInput.focus();
+ }
+ },
+ }];
+ },
+}).register('addListForm');
+
+BlazeComponent.extendComponent({
+ // Proxy
+ open() {
+ this.childComponents('inlinedForm')[0].open();
+ },
+
+ events() {
+ return [{
+ submit(evt) {
+ evt.preventDefault();
+ let titleInput = this.find('.list-name-input');
+ if (titleInput) {
+ const title = titleInput.value.trim();
+ if (title) {
+ Lists.insert({
+ title,
+ boardId: Session.get('currentBoard'),
+ sort: $('.list').length,
+ });
+
+ titleInput.value = '';
+ titleInput.focus();
+ }
+ } else {
+ titleInput = this.find('.swimlane-name-input');
+ const title = titleInput.value.trim();
+ if (title) {
+ Swimlanes.insert({
+ title,
+ boardId: Session.get('currentBoard'),
+ sort: $('.swimlane').length,
+ });
+
+ titleInput.value = '';
+ titleInput.focus();
+ }
+ }
+ },
+ }];
+ },
+}).register('addListAndSwimlaneForm');
+
+Template.swimlane.helpers({
+ canSeeAddList() {
+ return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
+ },
+});
+
+BlazeComponent.extendComponent({
+ currentCardIsInThisList(listId, swimlaneId) {
+ return currentCardIsInThisList(listId, swimlaneId);
+ },
+ onRendered() {
+ const boardComponent = this.parentComponent();
+ const $listsDom = this.$('.js-lists');
+
+ if (!Session.get('currentCard')) {
+ boardComponent.scrollLeft();
+ }
+
+ initSortable(boardComponent, $listsDom);
+ },
+}).register('listsGroup');
diff --git a/client/components/swimlanes/swimlanes.styl b/client/components/swimlanes/swimlanes.styl
new file mode 100644
index 00000000..dce298b0
--- /dev/null
+++ b/client/components/swimlanes/swimlanes.styl
@@ -0,0 +1,54 @@
+@import 'nib'
+
+.swimlane
+ // Even if this background color is the same as the body we can't leave it
+ // transparent, because that won't work during a swimlane drag.
+ background: darken(white, 13%)
+ display: flex
+ flex-direction: row
+ overflow: 0;
+ max-height: 100%
+
+ &.placeholder
+ background-color: rgba(0, 0, 0, .2)
+ border-color: transparent
+ box-shadow: none
+ height: 100px
+
+ &.ui-sortable-helper
+ box-shadow: -2px 2px 8px rgba(0, 0, 0, .3),
+ 0 0 1px rgba(0, 0, 0, .5)
+ transform: rotate(2deg)
+ cursor: grabbing
+
+ .swimlane-header.ui-sortable-handle
+ cursor: grabbing
+
+ .swimlane-header-wrap
+ display: flex;
+ flex-direction: row;
+ flex: 0 0 50px;
+ padding-bottom: 30px;
+ border-bottom: 1px solid #CCC
+
+ .swimlane-header
+ writing-mode: vertical-rl;
+ transform: rotate(180deg);
+ font-size: 14px;
+ line-height: 50px;
+ margin-top: 50px;
+ font-weight: bold;
+ min-height: 9px;
+ width: 50px;
+ overflow: hidden;
+ -o-text-overflow: ellipsis;
+ text-overflow: ellipsis;
+ word-wrap: break-word;
+ text-align: center;
+
+ .swimlane-header-menu
+ position: absolute
+ padding: 20px 20px
+
+.list-group
+ height: 100%
diff --git a/client/components/users/userAvatar.jade b/client/components/users/userAvatar.jade
index c61f2365..83e2c8d0 100644
--- a/client/components/users/userAvatar.jade
+++ b/client/components/users/userAvatar.jade
@@ -71,10 +71,10 @@ template(name="cardMemberPopup")
.info
h3= user.profile.fullname
p.quiet @{{ user.username }}
- if currentUser.isBoardMember
- ul.pop-over-list
- li: a.js-remove-member {{_ 'remove-member-from-card'}}
+ ul.pop-over-list
+ if currentUser.isNotCommentOnly
+ li: a.js-remove-member {{_ 'remove-member-from-card'}}
- if $eq currentUser._id user._id
- with currentUser
- li: a.js-edit-profile {{_ 'edit-profile'}}
+ if $eq currentUser._id user._id
+ with currentUser
+ li: a.js-edit-profile {{_ 'edit-profile'}}
diff --git a/client/components/users/userAvatar.js b/client/components/users/userAvatar.js
index 1066c632..be7a85d2 100644
--- a/client/components/users/userAvatar.js
+++ b/client/components/users/userAvatar.js
@@ -1,5 +1,3 @@
-Meteor.subscribe('my-avatars');
-
Template.userAvatar.helpers({
userData() {
// We need to handle a special case for the search results provided by the
@@ -54,6 +52,8 @@ Template.userAvatarInitials.helpers({
BlazeComponent.extendComponent({
onCreated() {
this.error = new ReactiveVar('');
+
+ Meteor.subscribe('my-avatars');
},
avatarUrlOptions() {
diff --git a/client/components/users/userHeader.jade b/client/components/users/userHeader.jade
index f67f82ee..a8fdb143 100644
--- a/client/components/users/userHeader.jade
+++ b/client/components/users/userHeader.jade
@@ -3,10 +3,11 @@ template(name="headerUserBar")
a.header-user-bar-name.js-open-header-member-menu
.header-user-bar-avatar
+userAvatar(userId=currentUser._id)
- if currentUser.profile.fullname
- = currentUser.profile.fullname
- else
- = currentUser.username
+ unless isMiniScreen
+ if currentUser.profile.fullname
+ = currentUser.profile.fullname
+ else
+ = currentUser.username
template(name="memberMenuPopup")
ul.pop-over-list
@@ -32,7 +33,10 @@ template(name="editProfilePopup")
| {{_ 'username'}}
span.error.hide.username-taken
| {{_ 'error-username-taken'}}
- input.js-profile-username(type="text" value=username)
+ if allowUserNameChange
+ input.js-profile-username(type="text" value=username)
+ else
+ input.js-profile-username(type="text" value=username readonly)
label
| {{_ 'initials'}}
input.js-profile-initials(type="text" value=profile.initials)
@@ -85,5 +89,5 @@ template(name="changeSettingsPopup")
li
label.bold
| {{_ 'show-cards-minimum-count'}}
- input#show-cards-count-at.inline-input.left(type="number" value="#{showCardsCountAt}" min="1" max="99" onkeydown="return false")
+ input#show-cards-count-at.inline-input.left(type="number" value="#{showCardsCountAt}" min="0" max="99" onkeydown="return false")
input.js-apply-show-cards-at.left(type="submit" value="{{_ 'apply'}}")
diff --git a/client/components/users/userHeader.js b/client/components/users/userHeader.js
index 90205ee1..d96a9b3d 100644
--- a/client/components/users/userHeader.js
+++ b/client/components/users/userHeader.js
@@ -24,6 +24,9 @@ Template.editProfilePopup.helpers({
allowEmailChange() {
return AccountSettings.findOne('accounts-allowEmailChange').booleanValue;
},
+ allowUserNameChange() {
+ return AccountSettings.findOne('accounts-allowUserNameChange').booleanValue;
+ },
});
Template.editProfilePopup.events({
@@ -35,14 +38,16 @@ Template.editProfilePopup.events({
const email = tpl.find('.js-profile-email').value.trim();
let isChangeUserName = false;
let isChangeEmail = false;
- Users.update(Meteor.userId(), {$set: {
- 'profile.fullname': fullname,
- 'profile.initials': initials,
- }});
+ Users.update(Meteor.userId(), {
+ $set: {
+ 'profile.fullname': fullname,
+ 'profile.initials': initials,
+ },
+ });
isChangeUserName = username !== Meteor.user().username;
isChangeEmail = email.toLowerCase() !== Meteor.user().emails[0].address.toLowerCase();
if (isChangeUserName && isChangeEmail) {
- Meteor.call('setUsernameAndEmail', username, email.toLowerCase(), function(error) {
+ Meteor.call('setUsernameAndEmail', username, email.toLowerCase(), Meteor.userId(), function (error) {
const usernameMessageElement = tpl.$('.username-taken');
const emailMessageElement = tpl.$('.email-taken');
if (error) {
@@ -61,7 +66,7 @@ Template.editProfilePopup.events({
}
});
} else if (isChangeUserName) {
- Meteor.call('setUsername', username, function(error) {
+ Meteor.call('setUsername', username, Meteor.userId(), function (error) {
const messageElement = tpl.$('.username-taken');
if (error) {
messageElement.show();
@@ -71,7 +76,7 @@ Template.editProfilePopup.events({
}
});
} else if (isChangeEmail) {
- Meteor.call('setEmail', email.toLowerCase(), function(error) {
+ Meteor.call('setEmail', email.toLowerCase(), Meteor.userId(), function (error) {
const messageElement = tpl.$('.email-taken');
if (error) {
messageElement.show();
@@ -105,18 +110,24 @@ Template.editNotificationPopup.events({
// XXX For some reason the useraccounts autofocus isnt working in this case.
// See https://github.com/meteor-useraccounts/core/issues/384
-Template.changePasswordPopup.onRendered(function() {
+Template.changePasswordPopup.onRendered(function () {
this.find('#at-field-current_password').focus();
});
Template.changeLanguagePopup.helpers({
languages() {
return _.map(TAPi18n.getLanguages(), (lang, code) => {
- return {
- tag: code,
- name: lang.name === 'br' ? 'Brezhoneg' : lang.name,
- };
- }).sort(function(a, b) {
+ // Same code in /client/components/main/layouts.js
+ // TODO : Make code reusable
+ const tag = code;
+ let name = lang.name;
+ if (lang.name === 'br') {
+ name = 'Brezhoneg';
+ } else if (lang.name === 'ig') {
+ name = 'Igbo';
+ }
+ return { tag, name };
+ }).sort(function (a, b) {
if (a.name === b.name) {
return 0;
} else {
diff --git a/client/config/blazeHelpers.js b/client/config/blazeHelpers.js
index 73ee24b6..e058d722 100644
--- a/client/config/blazeHelpers.js
+++ b/client/config/blazeHelpers.js
@@ -16,6 +16,17 @@ Blaze.registerHelper('currentCard', () => {
}
});
+Blaze.registerHelper('currentList', () => {
+ const listId = Session.get('currentList');
+ if (listId) {
+ return Lists.findOne(listId);
+ } else {
+ return null;
+ }
+});
+
Blaze.registerHelper('getUser', (userId) => Users.findOne(userId));
Blaze.registerHelper('concat', (...args) => args.slice(0, -1).join(''));
+
+Blaze.registerHelper('isMiniScreen', () => Utils.isMiniScreen());
diff --git a/client/lib/emoji-values.js b/client/lib/emoji-values.js
deleted file mode 100644
index 1f07ac62..00000000
--- a/client/lib/emoji-values.js
+++ /dev/null
@@ -1,152 +0,0 @@
-Emoji.values = ['+1', '-1', '100', '1234', '8ball', 'a', 'ab', 'abc', 'abcd',
-'accept', 'aerial_tramway', 'airplane', 'alarm_clock', 'alien', 'ambulance',
-'anchor', 'angel', 'anger', 'angry', 'anguished', 'ant', 'apple', 'aquarius',
-'aries', 'arrow_backward', 'arrow_double_down', 'arrow_double_up', 'arrow_down',
-'arrow_down_small', 'arrow_forward', 'arrow_heading_down', 'arrow_heading_up',
-'arrow_left', 'arrow_lower_left', 'arrow_lower_right', 'arrow_right',
-'arrow_right_hook', 'arrow_up', 'arrow_up_down', 'arrow_up_small',
-'arrow_upper_left', 'arrow_upper_right', 'arrows_clockwise',
-'arrows_counterclockwise', 'art', 'articulated_lorry', 'astonished', 'atm', 'b',
-'baby', 'baby_bottle', 'baby_chick', 'baby_symbol', 'baggage_claim', 'balloon',
-'ballot_box_with_check', 'bamboo', 'banana', 'bangbang', 'bank', 'bar_chart',
-'barber', 'baseball', 'basketball', 'bath', 'bathtub', 'battery', 'bear', 'bee',
-'beer', 'beers', 'beetle', 'beginner', 'bell', 'bento', 'bicyclist', 'bike',
-'bikini', 'bird', 'birthday', 'black_circle', 'black_joker', 'black_nib',
-'black_square', 'black_square_button', 'blossom', 'blowfish', 'blue_book',
-'blue_car', 'blue_heart', 'blush', 'boar', 'boat', 'bomb', 'book', 'bookmark',
-'bookmark_tabs', 'books', 'boom', 'boot', 'bouquet', 'bow', 'bowling', 'bowtie',
-'boy', 'bread', 'bride_with_veil', 'bridge_at_night', 'briefcase',
-'broken_heart', 'bug', 'bulb', 'bullettrain_front', 'bullettrain_side', 'bus',
-'busstop', 'bust_in_silhouette', 'busts_in_silhouette', 'cactus', 'cake',
-'calendar', 'calling', 'camel', 'camera', 'cancer', 'candy', 'capital_abcd',
-'capricorn', 'car', 'card_index', 'carousel_horse', 'cat', 'cat2', 'cd',
-'chart', 'chart_with_downwards_trend', 'chart_with_upwards_trend',
-'checkered_flag', 'cherries', 'cherry_blossom', 'chestnut', 'chicken',
-'children_crossing', 'chocolate_bar', 'christmas_tree', 'church', 'cinema',
-'circus_tent', 'city_sunrise', 'city_sunset', 'cl', 'clap', 'clapper',
-'clipboard', 'clock1', 'clock10', 'clock1030', 'clock11', 'clock1130',
-'clock12', 'clock1230', 'clock130', 'clock2', 'clock230', 'clock3', 'clock330',
-'clock4', 'clock430', 'clock5', 'clock530', 'clock6', 'clock630', 'clock7',
-'clock730', 'clock8', 'clock830', 'clock9', 'clock930', 'closed_book',
-'closed_lock_with_key', 'closed_umbrella', 'cloud', 'clubs', 'cn', 'cocktail',
-'coffee', 'cold_sweat', 'collision', 'computer', 'confetti_ball', 'confounded',
-'confused', 'congratulations', 'construction', 'construction_worker',
-'convenience_store', 'cookie', 'cool', 'cop', 'copyright', 'corn', 'couple',
-'couple_with_heart', 'couplekiss', 'cow', 'cow2', 'credit_card', 'crocodile',
-'crossed_flags', 'crown', 'cry', 'crying_cat_face', 'crystal_ball', 'cupid',
-'curly_loop', 'currency_exchange', 'curry', 'custard', 'customs', 'cyclone',
-'dancer', 'dancers', 'dango', 'dart', 'dash', 'date', 'de', 'deciduous_tree',
-'department_store', 'diamond_shape_with_a_dot_inside', 'diamonds',
-'disappointed', 'disappointed_relieved', 'dizzy', 'dizzy_face', 'do_not_litter',
-'dog', 'dog2', 'dollar', 'dolls', 'dolphin', 'donut', 'door', 'doughnut',
-'dragon', 'dragon_face', 'dress', 'dromedary_camel', 'droplet', 'dvd', 'e-mail',
-'ear', 'ear_of_rice', 'earth_africa', 'earth_americas', 'earth_asia', 'egg',
-'eggplant', 'eight', 'eight_pointed_black_star', 'eight_spoked_asterisk',
-'electric_plug', 'elephant', 'email', 'end', 'envelope', 'es', 'euro',
-'european_castle', 'european_post_office', 'evergreen_tree', 'exclamation',
-'expressionless', 'eyeglasses', 'eyes', 'facepunch', 'factory', 'fallen_leaf',
-'family', 'fast_forward', 'fax', 'fearful', 'feelsgood', 'feet', 'ferris_wheel',
-'file_folder', 'finnadie', 'fire', 'fire_engine', 'fireworks',
-'first_quarter_moon', 'first_quarter_moon_with_face', 'fish', 'fish_cake',
-'fishing_pole_and_fish', 'fist', 'five', 'flags', 'flashlight', 'floppy_disk',
-'flower_playing_cards', 'flushed', 'foggy', 'football', 'fork_and_knife',
-'fountain', 'four', 'four_leaf_clover', 'fr', 'free', 'fried_shrimp', 'fries',
-'frog', 'frowning', 'fu', 'fuelpump', 'full_moon', 'full_moon_with_face',
-'game_die', 'gb', 'gem', 'gemini', 'ghost', 'gift', 'gift_heart', 'girl',
-'globe_with_meridians', 'goat', 'goberserk', 'godmode', 'golf', 'grapes',
-'green_apple', 'green_book', 'green_heart', 'grey_exclamation', 'grey_question',
-'grimacing', 'grin', 'grinning', 'guardsman', 'guitar', 'gun', 'haircut',
-'hamburger', 'hammer', 'hamster', 'hand', 'handbag', 'hankey', 'hash',
-'hatched_chick', 'hatching_chick', 'headphones', 'hear_no_evil', 'heart',
-'heart_decoration', 'heart_eyes', 'heart_eyes_cat', 'heartbeat', 'heartpulse',
-'hearts', 'heavy_check_mark', 'heavy_division_sign', 'heavy_dollar_sign',
-'heavy_exclamation_mark', 'heavy_minus_sign', 'heavy_multiplication_x',
-'heavy_plus_sign', 'helicopter', 'herb', 'hibiscus', 'high_brightness',
-'high_heel', 'hocho', 'honey_pot', 'honeybee', 'horse', 'horse_racing',
-'hospital', 'hotel', 'hotsprings', 'hourglass', 'hourglass_flowing_sand',
-'house', 'house_with_garden', 'hurtrealbad', 'hushed', 'ice_cream', 'icecream',
-'id', 'ideograph_advantage', 'imp', 'inbox_tray', 'incoming_envelope',
-'information_desk_person', 'information_source', 'innocent', 'interrobang',
-'iphone', 'it', 'izakaya_lantern', 'jack_o_lantern', 'japan', 'japanese_castle',
-'japanese_goblin', 'japanese_ogre', 'jeans', 'joy', 'joy_cat', 'jp', 'key',
-'keycap_ten', 'kimono', 'kiss', 'kissing', 'kissing_cat', 'kissing_closed_eyes',
-'kissing_face', 'kissing_heart', 'kissing_smiling_eyes', 'koala', 'koko', 'kr',
-'large_blue_circle', 'large_blue_diamond', 'large_orange_diamond',
-'last_quarter_moon', 'last_quarter_moon_with_face', 'laughing', 'leaves',
-'ledger', 'left_luggage', 'left_right_arrow', 'leftwards_arrow_with_hook',
-'lemon', 'leo', 'leopard', 'libra', 'light_rail', 'link', 'lips', 'lipstick',
-'lock', 'lock_with_ink_pen', 'lollipop', 'loop', 'loudspeaker', 'love_hotel',
-'love_letter', 'low_brightness', 'm', 'mag', 'mag_right', 'mahjong', 'mailbox',
-'mailbox_closed', 'mailbox_with_mail', 'mailbox_with_no_mail', 'man',
-'man_with_gua_pi_mao', 'man_with_turban', 'mans_shoe', 'maple_leaf', 'mask',
-'massage', 'meat_on_bone', 'mega', 'melon', 'memo', 'mens', 'metal', 'metro',
-'microphone', 'microscope', 'milky_way', 'minibus', 'minidisc',
-'mobile_phone_off', 'money_with_wings', 'moneybag', 'monkey', 'monkey_face',
-'monorail', 'moon', 'mortar_board', 'mount_fuji', 'mountain_bicyclist',
-'mountain_cableway', 'mountain_railway', 'mouse', 'mouse2', 'movie_camera',
-'moyai', 'muscle', 'mushroom', 'musical_keyboard', 'musical_note',
-'musical_score', 'mute', 'nail_care', 'name_badge', 'neckbeard', 'necktie',
-'negative_squared_cross_mark', 'neutral_face', 'new', 'new_moon',
-'new_moon_with_face', 'newspaper', 'ng', 'nine', 'no_bell', 'no_bicycles',
-'no_entry', 'no_entry_sign', 'no_good', 'no_mobile_phones', 'no_mouth',
-'no_pedestrians', 'no_smoking', 'non-potable_water', 'nose', 'notebook',
-'notebook_with_decorative_cover', 'notes', 'nut_and_bolt', 'o', 'o2', 'ocean',
-'octocat', 'octopus', 'oden', 'office', 'ok', 'ok_hand', 'ok_woman',
-'older_man', 'older_woman', 'on', 'oncoming_automobile', 'oncoming_bus',
-'oncoming_police_car', 'oncoming_taxi', 'one', 'open_file_folder', 'open_hands',
-'open_mouth', 'ophiuchus', 'orange_book', 'outbox_tray', 'ox', 'page_facing_up',
-'page_with_curl', 'pager', 'palm_tree', 'panda_face', 'paperclip', 'parking',
-'part_alternation_mark', 'partly_sunny', 'passport_control', 'paw_prints',
-'peach', 'pear', 'pencil', 'pencil2', 'penguin', 'pensive', 'performing_arts',
-'persevere', 'person_frowning', 'person_with_blond_hair',
-'person_with_pouting_face', 'phone', 'pig', 'pig2', 'pig_nose', 'pill',
-'pineapple', 'pisces', 'pizza', 'plus1', 'point_down', 'point_left',
-'point_right', 'point_up', 'point_up_2', 'police_car', 'poodle', 'poop',
-'post_office', 'postal_horn', 'postbox', 'potable_water', 'pouch',
-'poultry_leg', 'pound', 'pouting_cat', 'pray', 'princess', 'punch',
-'purple_heart', 'purse', 'pushpin', 'put_litter_in_its_place', 'question',
-'rabbit', 'rabbit2', 'racehorse', 'radio', 'radio_button', 'rage', 'rage1',
-'rage2', 'rage3', 'rage4', 'railway_car', 'rainbow', 'raised_hand',
-'raised_hands', 'raising_hand', 'ram', 'ramen', 'rat', 'recycle', 'red_car',
-'red_circle', 'registered', 'relaxed', 'relieved', 'repeat', 'repeat_one',
-'restroom', 'revolving_hearts', 'rewind', 'ribbon', 'rice', 'rice_ball',
-'rice_cracker', 'rice_scene', 'ring', 'rocket', 'roller_coaster', 'rooster',
-'rose', 'rotating_light', 'round_pushpin', 'rowboat', 'ru', 'rugby_football',
-'runner', 'running', 'running_shirt_with_sash', 'sa', 'sagittarius', 'sailboat',
-'sake', 'sandal', 'santa', 'satellite', 'satisfied', 'saxophone', 'school',
-'school_satchel', 'scissors', 'scorpius', 'scream', 'scream_cat', 'scroll',
-'seat', 'secret', 'see_no_evil', 'seedling', 'seven', 'shaved_ice', 'sheep',
-'shell', 'ship', 'shipit', 'shirt', 'shit', 'shoe', 'shower', 'signal_strength',
-'six', 'six_pointed_star', 'ski', 'skull', 'sleeping', 'sleepy', 'slot_machine',
-'small_blue_diamond', 'small_orange_diamond', 'small_red_triangle',
-'small_red_triangle_down', 'smile', 'smile_cat', 'smiley', 'smiley_cat',
-'smiling_imp', 'smirk', 'smirk_cat', 'smoking', 'snail', 'snake', 'snowboarder',
-'snowflake', 'snowman', 'sob', 'soccer', 'soon', 'sos', 'sound',
-'space_invader', 'spades', 'spaghetti', 'sparkler', 'sparkles',
-'sparkling_heart', 'speak_no_evil', 'speaker', 'speech_balloon', 'speedboat',
-'squirrel', 'star', 'star2', 'stars', 'station', 'statue_of_liberty',
-'steam_locomotive', 'stew', 'straight_ruler', 'strawberry', 'stuck_out_tongue',
-'stuck_out_tongue_closed_eyes', 'stuck_out_tongue_winking_eye', 'sun_with_face',
-'sunflower', 'sunglasses', 'sunny', 'sunrise', 'sunrise_over_mountains',
-'surfer', 'sushi', 'suspect', 'suspension_railway', 'sweat', 'sweat_drops',
-'sweat_smile', 'sweet_potato', 'swimmer', 'symbols', 'syringe', 'tada',
-'tanabata_tree', 'tangerine', 'taurus', 'taxi', 'tea', 'telephone',
-'telephone_receiver', 'telescope', 'tennis', 'tent', 'thought_balloon', 'three',
-'thumbsdown', 'thumbsup', 'ticket', 'tiger', 'tiger2', 'tired_face', 'tm',
-'toilet', 'tokyo_tower', 'tomato', 'tongue', 'top', 'tophat', 'tractor',
-'traffic_light', 'train', 'train2', 'tram', 'triangular_flag_on_post',
-'triangular_ruler', 'trident', 'triumph', 'trolleybus', 'trollface', 'trophy',
-'tropical_drink', 'tropical_fish', 'truck', 'trumpet', 'tshirt', 'tulip',
-'turtle', 'tv', 'twisted_rightwards_arrows', 'two', 'two_hearts',
-'two_men_holding_hands', 'two_women_holding_hands', 'u5272', 'u5408', 'u55b6',
-'u6307', 'u6708', 'u6709', 'u6e80', 'u7121', 'u7533', 'u7981', 'u7a7a', 'uk',
-'umbrella', 'unamused', 'underage', 'unlock', 'up', 'us', 'v',
-'vertical_traffic_light', 'vhs', 'vibration_mode', 'video_camera', 'video_game',
-'violin', 'virgo', 'volcano', 'vs', 'walking', 'waning_crescent_moon',
-'waning_gibbous_moon', 'warning', 'watch', 'water_buffalo', 'watermelon',
-'wave', 'wavy_dash', 'waxing_crescent_moon', 'waxing_gibbous_moon', 'wc',
-'weary', 'wedding', 'whale', 'whale2', 'wheelchair', 'white_check_mark',
-'white_circle', 'white_flower', 'white_square', 'white_square_button',
-'wind_chime', 'wine_glass', 'wink', 'wolf', 'woman', 'womans_clothes',
-'womans_hat', 'womens', 'worried', 'wrench', 'x', 'yellow_heart', 'yen', 'yum',
-'zap', 'zero', 'zzz'];
diff --git a/client/lib/keyboard.js b/client/lib/keyboard.js
index 24955929..7abfa88d 100755
--- a/client/lib/keyboard.js
+++ b/client/lib/keyboard.js
@@ -91,9 +91,6 @@ Template.keyboardShortcuts.helpers({
keys: ['@'],
action: 'shortcut-autocomplete-members',
}, {
- keys: [':'],
- action: 'shortcut-autocomplete-emoji',
- }, {
keys: ['SPACE'],
action: 'shortcut-assign-self',
}],
diff --git a/client/lib/modal.js b/client/lib/modal.js
index 1ca8804b..d5350264 100644
--- a/client/lib/modal.js
+++ b/client/lib/modal.js
@@ -31,7 +31,7 @@ window.Modal = new class {
this._currentModal.set({ header, modalName });
this._onCloseGoTo = onCloseGoTo;
}
-};
+}();
Blaze.registerHelper('Modal', Modal);
diff --git a/client/lib/popup.js b/client/lib/popup.js
index 3658d883..0a700f82 100644
--- a/client/lib/popup.js
+++ b/client/lib/popup.js
@@ -190,7 +190,7 @@ window.Popup = new class {
return title !== translationKey ? title : defaultTitle;
};
}
-};
+}();
// We close a potential opened popup on any left click on the document, or go
// one step back by pressing escape.
@@ -205,4 +205,3 @@ escapeActions.forEach((actionName) => {
}
);
});
-
diff --git a/client/lib/unsavedEdits.js b/client/lib/unsavedEdits.js
index 17bb29b5..9c02eb84 100644
--- a/client/lib/unsavedEdits.js
+++ b/client/lib/unsavedEdits.js
@@ -1,5 +1,3 @@
-Meteor.subscribe('unsaved-edits');
-
// `UnsavedEdits` is a global key-value store used to save drafts of user
// inputs. We used to have the notion of a `cachedValue` that was local to a
// component but the global store has multiple advantages:
diff --git a/client/lib/utils.js b/client/lib/utils.js
index 9a9ff654..1f44c60d 100644
--- a/client/lib/utils.js
+++ b/client/lib/utils.js
@@ -33,6 +33,37 @@ Utils = {
return $(window).width() <= 800;
},
+ calculateIndexData(prevData, nextData, nItems = 1) {
+ let base, increment;
+ // If we drop the card to an empty column
+ if (!prevData && !nextData) {
+ base = 0;
+ increment = 1;
+ // If we drop the card in the first position
+ } else if (!prevData) {
+ base = nextData.sort - 1;
+ increment = -1;
+ // If we drop the card in the last position
+ } else if (!nextData) {
+ base = prevData.sort + 1;
+ increment = 1;
+ }
+ // In the general case take the average of the previous and next element
+ // sort indexes.
+ else {
+ const prevSortIndex = prevData.sort;
+ const nextSortIndex = nextData.sort;
+ increment = (nextSortIndex - prevSortIndex) / (nItems + 1);
+ base = prevSortIndex + increment;
+ }
+ // XXX Return a generator that yield values instead of a base with a
+ // increment number.
+ return {
+ base,
+ increment,
+ };
+ },
+
// Determine the new sort index
calculateIndex(prevCardDomElement, nextCardDomElement, nCards = 1) {
let base, increment;
diff --git a/config/router.js b/config/router.js
index 7f657820..1f80004a 100644
--- a/config/router.js
+++ b/config/router.js
@@ -8,6 +8,7 @@ FlowRouter.route('/', {
triggersEnter: [AccountsTemplates.ensureSignedIn],
action() {
Session.set('currentBoard', null);
+ Session.set('currentList', null);
Session.set('currentCard', null);
Filter.reset();
@@ -88,6 +89,7 @@ FlowRouter.route('/import/:source', {
Session.set('fromBoard', Session.get('currentBoard'));
}
Session.set('currentBoard', null);
+ Session.set('currentList', null);
Session.set('currentCard', null);
Session.set('importSource', params.source);
@@ -106,6 +108,7 @@ FlowRouter.route('/setting', {
AccountsTemplates.ensureSignedIn,
() => {
Session.set('currentBoard', null);
+ Session.set('currentList', null);
Session.set('currentCard', null);
Filter.reset();
@@ -126,6 +129,7 @@ FlowRouter.route('/information', {
AccountsTemplates.ensureSignedIn,
() => {
Session.set('currentBoard', null);
+ Session.set('currentList', null);
Session.set('currentCard', null);
Filter.reset();
@@ -140,6 +144,27 @@ FlowRouter.route('/information', {
},
});
+FlowRouter.route('/people', {
+ name: 'people',
+ triggersEnter: [
+ AccountsTemplates.ensureSignedIn,
+ () => {
+ Session.set('currentBoard', null);
+ Session.set('currentList', null);
+ Session.set('currentCard', null);
+
+ Filter.reset();
+ EscapeActions.executeAll();
+ },
+ ],
+ action() {
+ BlazeLayout.render('defaultLayout', {
+ headerBar: 'settingHeaderBar',
+ content: 'people',
+ });
+ },
+});
+
FlowRouter.notFound = {
action() {
BlazeLayout.render('defaultLayout', { content: 'notFound' });
diff --git a/docker-compose.yml b/docker-compose.yml
index ae0e5b90..0f03055b 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -3,7 +3,7 @@ version: '2'
services:
wekandb:
- image: mongo:3.2.16
+ image: mongo:3.2.19
container_name: wekan-db
restart: always
command: mongod --smallfiles --oplogSize 128
@@ -16,7 +16,7 @@ services:
- wekan-db-dump:/dump
wekan:
- image: wekanteam/wekan:latest
+ image: quay.io/wekan/wekan
container_name: wekan-app
restart: always
networks:
diff --git a/i18n/ar.i18n.json b/i18n/ar.i18n.json
index ebf743d8..4e77fa42 100644
--- a/i18n/ar.i18n.json
+++ b/i18n/ar.i18n.json
@@ -9,9 +9,10 @@
"act-createCard": "اضاف __card__ الى __list__",
"act-createList": "اضاف __list__ الى __board__",
"act-addBoardMember": "اضاف __member__ الى __board__",
- "act-archivedBoard": "قام بأرشفة __board__",
- "act-archivedCard": "قام بأرشفة __card__",
- "act-archivedList": "قام بأرشفة __list__",
+ "act-archivedBoard": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
"act-importBoard": "إستورد __board__",
"act-importCard": "إستورد __card__",
"act-importList": "إستورد __list__",
@@ -26,7 +27,7 @@
"activities": "الأنشطة",
"activity": "النشاط",
"activity-added": "تمت إضافة %s ل %s",
- "activity-archived": "إلى الأرشيف %s",
+ "activity-archived": "%s moved to Recycle Bin",
"activity-attached": "إرفاق %s ل %s",
"activity-created": "أنشأ %s",
"activity-excluded": "استبعاد %s عن %s",
@@ -44,6 +45,7 @@
"add-attachment": "إضافة مرفق",
"add-board": "إضافة لوحة",
"add-card": "إضافة بطاقة",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "إضافة قائمة تدقيق",
"add-checklist-item": "إضافة عنصر إلى قائمة التحقق",
"add-cover": "إضافة غلاف",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "الأعضاء",
"admin": "المدير",
"admin-desc": "إمكانية مشاهدة و تعديل و حذف أعضاء ، و تعديل إعدادات اللوحة أيضا.",
+ "admin-announcement": "إعلان",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Announcement from Administrator",
"all-boards": "كل اللوحات",
"and-n-other-card": "And __count__ other بطاقة",
"and-n-other-card_plural": "And __count__ other بطاقات",
"apply": "طبق",
"app-is-offline": "يتمّ تحميل ويكان، يرجى الانتظار. سيؤدي تحديث الصفحة إلى فقدان البيانات. إذا لم يتم تحميل ويكان، يرجى التحقق من أن خادم ويكان لم يتوقف. ",
- "archive": "أرشيف",
- "archive-all": "أرشيف الكل",
- "archive-board": "أرشيف اللوحة",
- "archive-card": "أرشيف البطاقة",
- "archive-list": "قائمة الأرشيفات",
- "archive-selection": "أرشف المُحدّد",
- "archiveBoardPopup-title": "أرشيف اللوحة ؟",
- "archived-items": "عناصر مؤرشفة",
- "archived-boards": "لوحات مؤرشفة",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
"restore-board": "استعادة اللوحة",
- "no-archived-boards": "لا توجد لوحات مؤرشفة.",
- "archives": "أرشيفات",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
"assign-member": "تعيين عضو",
"attached": "أُرفق)",
"attachment": "مرفق",
@@ -91,15 +97,19 @@
"boardChangeWatchPopup-title": "تغيير المتابعة",
"boardMenuPopup-title": "قائمة اللوحة",
"boards": "لوحات",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "القائمات",
"bucket-example": "مثل « todo list » على سبيل المثال",
"cancel": "إلغاء",
- "card-archived": "هذه البطاقة أُرشفت.",
+ "card-archived": "This card is moved to Recycle Bin.",
"card-comments-title": "%s تعليقات لهذه البطاقة",
"card-delete-notice": "هذا حذف أبديّ . سوف تفقد كل الإجراءات المنوطة بهذه البطاقة",
"card-delete-pop": "سيتم إزالة جميع الإجراءات من تبعات النشاط، وأنك لن تكون قادرا على إعادة فتح البطاقة. لا يوجد التراجع.",
- "card-delete-suggest-archive": "يمكنك أرشفة بطاقة لحذفها من اللوحة والمحافظة على النشاط.",
+ "card-delete-suggest-archive": "You can move a card Recycle Bin to remove it from the board and preserve the activity.",
"card-due": "مستحق",
"card-due-on": "مستحق في",
+ "card-spent": "Spent Time",
"card-edit-attachments": "تعديل المرفقات",
"card-edit-labels": "تعديل العلامات",
"card-edit-members": "تعديل الأعضاء",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "أعضاء",
"cardMorePopup-title": "المزيد",
"cards": "بطاقات",
+ "cards-count": "بطاقات",
"change": "Change",
"change-avatar": "تعديل الصورة الشخصية",
"change-password": "تغيير كلمة المرور",
@@ -130,7 +141,7 @@
"clipboard": "Clipboard or drag & drop",
"close": "غلق",
"close-board": "غلق اللوحة",
- "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.",
+ "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
"color-black": "black",
"color-blue": "blue",
"color-green": "green",
@@ -146,8 +157,12 @@
"comment-only": "التعليق فقط",
"comment-only-desc": "يمكن التعليق على بطاقات فقط.",
"computer": "حاسوب",
- "copy-card-link-to-clipboard": "Copy card link to clipboard",
- "copyCardPopup-title": "Copy Card",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+ "copy-card-link-to-clipboard": "نسخ رابط البطاقة إلى الحافظة",
+ "copyCardPopup-title": "نسخ البطاقة",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
"create": "إنشاء",
"createBoardPopup-title": "إنشاء لوحة",
"chooseBoardSourcePopup-title": "استيراد لوحة",
@@ -167,8 +182,11 @@
"edit": "تعديل",
"edit-avatar": "تعديل الصورة الشخصية",
"edit-profile": "تعديل الملف الشخصي",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
"editCardStartDatePopup-title": "تغيير تاريخ البدء",
"editCardDueDatePopup-title": "تغيير تاريخ الاستحقاق",
+ "editCardSpentTimePopup-title": "Change spent time",
"editLabelPopup-title": "تعديل العلامة",
"editNotificationPopup-title": "تصحيح الإشعار",
"editProfilePopup-title": "تعديل الملف الشخصي",
@@ -176,6 +194,7 @@
"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-fail-text": "Error trying to send email",
"email-invalid": "Invalid email",
"email-invite": "Invite via Email",
"email-invite-subject": "__inviter__ sent you an invitation",
@@ -185,6 +204,7 @@
"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.",
+ "enable-wip-limit": "Enable WIP Limit",
"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",
@@ -195,7 +215,7 @@
"error-user-notAllowSelf": "لا يمكنك دعوة نفسك",
"error-user-notCreated": "This user is not created",
"error-username-taken": "إسم المستخدم مأخوذ مسبقا",
- "error-email-taken": "Email has already been taken",
+ "error-email-taken": "البريد الإلكتروني مأخوذ بالفعل",
"export-board": "Export board",
"filter": "تصفية",
"filter-cards": "تصفية البطاقات",
@@ -226,9 +246,11 @@
"import-show-user-mapping": "Review members mapping",
"import-user-select": "Pick the Wekan user you want to use as this member",
"importMapMembersAddPopup-title": "حدّد عضو ويكان",
- "info": "Version",
+ "info": "الإصدار",
"initials": "أولية",
"invalid-date": "تاريخ غير صالح",
+ "invalid-time": "Invalid time",
+ "invalid-user": "Invalid user",
"joined": "انضمّ",
"just-invited": "You are just invited to this board",
"keyboard-shortcuts": "اختصار لوحة المفاتيح",
@@ -239,18 +261,22 @@
"language": "لغة",
"last-admin-desc": "لا يمكن تعديل الأدوار لأن ذلك يتطلب صلاحيات المدير.",
"leave-board": "مغادرة اللوحة",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "مغادرة اللوحة ؟",
"link-card": "ربط هذه البطاقة",
- "list-archive-cards": "أرضفت بطاقات هذه القائمة",
- "list-archive-cards-pop": "سيقتضي هذا أرشفة جميع بطاقات هذه القائمة. لمشاهدة أرشيف البطاقات أو إعادتها إلى اللوحة، اضغط على -القائمة- ثم - أرشيف العناصر-",
+ "list-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
"list-move-cards": "نقل بطاقات هذه القائمة",
"list-select-cards": "تحديد بطاقات هذه القائمة",
"listActionPopup-title": "قائمة الإجراءات",
+ "swimlaneActionPopup-title": "Swimlane Actions",
"listImportCardPopup-title": "Import a Trello card",
"listMorePopup-title": "المزيد",
"link-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": "يمكنك أرشفة قائمة لحذفها من اللوحة والمحافظة على النشاط.",
+ "list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve the activity.",
"lists": "القائمات",
+ "swimlanes": "Swimlanes",
"log-out": "تسجيل الخروج",
"log-in": "تسجيل الدخول",
"loginPopup-title": "تسجيل الدخول",
@@ -259,17 +285,18 @@
"menu": "القائمة",
"move-selection": "Move selection",
"moveCardPopup-title": "نقل البطاقة",
- "moveCardToBottom-title": "Move to Bottom",
- "moveCardToTop-title": "Move to Top",
+ "moveCardToBottom-title": "التحرك إلى القاع",
+ "moveCardToTop-title": "التحرك إلى الأعلى",
"moveSelectionPopup-title": "Move selection",
"multi-selection": "تحديد أكثر من واحدة",
"multi-selection-on": "Multi-Selection is on",
- "muted": "Muted",
+ "muted": "مكتوم",
"muted-info": "You will never be notified of any changes in this board",
"my-boards": "لوحاتي",
"name": "اسم",
- "no-archived-cards": "لا توجد بطاقات مؤرشفة.",
- "no-archived-lists": "لا توجد قوائم مؤرشفة.",
+ "no-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
"no-results": "لا توجد نتائج",
"normal": "عادي",
"normal-desc": "يمكن مشاهدة و تعديل البطاقات. لا يمكن تغيير إعدادات الضبط.",
@@ -282,7 +309,7 @@
"page-not-found": "صفحة غير موجودة",
"password": "كلمة المرور",
"paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)",
- "participating": "Participating",
+ "participating": "المشاركة",
"preview": "Preview",
"previewAttachedImagePopup-title": "Preview",
"previewClipboardImagePopup-title": "Preview",
@@ -294,8 +321,8 @@
"quick-access-description": "أضف لوحة إلى المفضلة لإنشاء اختصار في هذا الشريط.",
"remove-cover": "حذف الغلاف",
"remove-from-board": "حذف من اللوحة",
- "remove-label": "Remove Label",
- "listDeletePopup-title": "Delete List ?",
+ "remove-label": "إزالة التصنيف",
+ "listDeletePopup-title": "حذف القائمة ؟",
"remove-member": "حذف العضو",
"remove-member-from-card": "حذف من البطاقة",
"remove-member-pop": "حذف __name__ (__username__) من __boardTitle__ ? سيتم حذف هذا العضو من جميع بطاقة اللوحة مع إرسال إشعار له بذاك.",
@@ -305,7 +332,11 @@
"restore": "استعادة",
"save": "حفظ",
"search": "بحث",
- "select-color": "Select Color",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text to search for?",
+ "select-color": "اختيار اللون",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
"shortcut-assign-self": "Assign yourself to current card",
"shortcut-autocomplete-emoji": "الإكمال التلقائي للرموز التعبيرية",
"shortcut-autocomplete-members": "الإكمال التلقائي لأسماء الأعضاء",
@@ -315,9 +346,9 @@
"shortcut-show-shortcuts": "عرض قائمة الإختصارات ،تلك",
"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",
+ "show-cards-minimum-count": "إظهار عدد البطاقات إذا كانت القائمة تتضمن أكثر من",
+ "sidebar-open": "فتح الشريط الجانبي",
+ "sidebar-close": "إغلاق الشريط الجانبي",
"signupPopup-title": "إنشاء حساب",
"star-board-title": "اضغط لإضافة هذه اللوحة إلى المفضلة . سوف يتم إظهارها على رأس بقية اللوحات.",
"starred-boards": "اللوحات المفضلة",
@@ -326,69 +357,91 @@
"team": "فريق",
"this-board": "هذه اللوحة",
"this-card": "هذه البطاقة",
- "time": "Time",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
+ "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": "إلغاء تعيين العضو",
"unsaved-description": "لديك وصف غير محفوظ",
- "unwatch": "Unwatch",
+ "unwatch": "غير مُشاهد",
"upload": "Upload",
"upload-avatar": "رفع صورة شخصية",
"uploaded-avatar": "تم رفع الصورة الشخصية",
"username": "اسم المستخدم",
"view-it": "شاهدها",
- "warn-list-archived": "انتبه : هذه البطاقة في أرشيف القائمات",
- "watch": "Watch",
- "watching": "Watching",
+ "warn-list-archived": "warning: this card is in an list at Recycle Bin",
+ "watch": "مُشاهد",
+ "watching": "مشاهدة",
"watching-info": "You will be notified of any change in this board",
"welcome-board": "لوحة التّرحيب",
- "welcome-list1": "Basics",
- "welcome-list2": "Advanced",
+ "welcome-swimlane": "Milestone 1",
+ "welcome-list1": "المبادئ",
+ "welcome-list2": "متقدم",
"what-to-do": "ماذا تريد أن تنجز?",
- "admin-panel": "Admin Panel",
- "settings": "Settings",
- "people": "People",
- "registration": "Registration",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
+ "admin-panel": "لوحة التحكم",
+ "settings": "الإعدادات",
+ "people": "الناس",
+ "registration": "تسجيل",
"disable-self-registration": "Disable Self-Registration",
- "invite": "Invite",
- "invite-people": "Invite People",
+ "invite": "دعوة",
+ "invite-people": "الناس المدعوين",
"to-boards": "إلى اللوحات",
- "email-addresses": "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-tls-description": "تفعيل دعم TLS من اجل خادم SMTP",
+ "smtp-host": "مضيف SMTP",
+ "smtp-port": "منفذ SMTP",
"smtp-username": "اسم المستخدم",
"smtp-password": "كلمة المرور",
- "smtp-tls": "TLS support",
- "send-from": "From",
- "invitation-code": "Invitation Code",
- "email-invite-register-subject": "__inviter__ sent you an invitation",
+ "smtp-tls": "دعم التي ال سي",
+ "send-from": "من",
+ "send-smtp-test": "Send a test email to yourself",
+ "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",
- "error-notAuthorized": "You are not authorized to view this page.",
- "outgoing-webhooks": "Outgoing Webhooks",
- "outgoingWebhooksPopup-title": "Outgoing Webhooks",
- "new-outgoing-webhook": "New Outgoing Webhook",
- "no-name": "(Unknown)",
- "Wekan_version": "Wekan version",
- "Node_version": "Node version",
- "OS_Arch": "OS Arch",
- "OS_Cpus": "OS CPU Count",
- "OS_Freemem": "OS Free Memory",
- "OS_Loadavg": "OS Load Average",
- "OS_Platform": "OS Platform",
- "OS_Release": "OS Release",
- "OS_Totalmem": "OS Total Memory",
- "OS_Type": "OS Type",
- "OS_Uptime": "OS Uptime",
- "hours": "hours",
- "minutes": "minutes",
- "seconds": "seconds",
- "yes": "Yes",
- "no": "No",
- "accounts": "Accounts",
- "accounts-allowEmailChange": "Allow Email Change"
+ "email-smtp-test-subject": "SMTP Test Email From Wekan",
+ "email-smtp-test-text": "You have successfully sent an email",
+ "error-invitation-code-not-exist": "رمز الدعوة غير موجود",
+ "error-notAuthorized": "أنتَ لا تملك الصلاحيات لرؤية هذه الصفحة.",
+ "outgoing-webhooks": "الويبهوك الصادرة",
+ "outgoingWebhooksPopup-title": "الويبهوك الصادرة",
+ "new-outgoing-webhook": "ويبهوك جديدة ",
+ "no-name": "(غير معروف)",
+ "Wekan_version": "إصدار ويكان",
+ "Node_version": "إصدار النود",
+ "OS_Arch": "معمارية نظام التشغيل",
+ "OS_Cpus": "استهلاك وحدة المعالجة المركزية لنظام التشغيل",
+ "OS_Freemem": "الذاكرة الحرة لنظام التشغيل",
+ "OS_Loadavg": "متوسط حمل نظام التشغيل",
+ "OS_Platform": "منصة نظام التشغيل",
+ "OS_Release": "إصدار نظام التشغيل",
+ "OS_Totalmem": "الذاكرة الكلية لنظام التشغيل",
+ "OS_Type": "نوع نظام التشغيل",
+ "OS_Uptime": "مدة تشغيل نظام التشغيل",
+ "hours": "الساعات",
+ "minutes": "الدقائق",
+ "seconds": "الثواني",
+ "yes": "نعم",
+ "no": "لا",
+ "accounts": "الحسابات",
+ "accounts-allowEmailChange": "السماح بتغيير البريد الإلكتروني",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Created at",
+ "verified": "Verified",
+ "active": "Active",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
} \ No newline at end of file
diff --git a/i18n/bg.i18n.json b/i18n/bg.i18n.json
new file mode 100644
index 00000000..26fea252
--- /dev/null
+++ b/i18n/bg.i18n.json
@@ -0,0 +1,447 @@
+{
+ "accept": "Accept",
+ "act-activity-notify": "[Wekan] Известия за дейности",
+ "act-addAttachment": "attached __attachment__ to __card__",
+ "act-addChecklist": "added checklist __checklist__ to __card__",
+ "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
+ "act-addComment": "Коментира в __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": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
+ "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": "Действия",
+ "activity": "Дейности",
+ "activity-added": "добави %s към %s",
+ "activity-archived": "%s moved to Recycle Bin",
+ "activity-attached": "прикачи %s към %s",
+ "activity-created": "създаде %s",
+ "activity-excluded": "изключи %s от %s",
+ "activity-imported": "импортира %s в/във %s от %s",
+ "activity-imported-board": "импортира %s от %s",
+ "activity-joined": "joined %s",
+ "activity-moved": "премести %s от %s в/във %s",
+ "activity-on": "на %s",
+ "activity-removed": "премахна %s от %s",
+ "activity-sent": "изпрати %s до %s",
+ "activity-unjoined": "unjoined %s",
+ "activity-checklist-added": "добави списък със задачи към %s",
+ "activity-checklist-item-added": "добави точка към '%s' в/във %s",
+ "add": "Добави",
+ "add-attachment": "Добави прикачен файл",
+ "add-board": "Добави дъска",
+ "add-card": "Добави карта",
+ "add-swimlane": "Добави коридор",
+ "add-checklist": "Добави списък със задачи",
+ "add-checklist-item": "Добави точка към списъка със задачи",
+ "add-cover": "Добави корица",
+ "add-label": "Добави етикет",
+ "add-list": "Добави списък",
+ "add-members": "Добави членове",
+ "added": "Добавено",
+ "addMemberPopup-title": "Членове",
+ "admin": "Администратор",
+ "admin-desc": "Can view and edit cards, remove members, and change settings for the board.",
+ "admin-announcement": "Съобщение",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Announcement from Administrator",
+ "all-boards": "Всички дъски",
+ "and-n-other-card": "And __count__ other card",
+ "and-n-other-card_plural": "And __count__ other cards",
+ "apply": "Приложи",
+ "app-is-offline": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
+ "restore-board": "Restore Board",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
+ "assign-member": "Assign member",
+ "attached": "прикачен",
+ "attachment": "Прикаченн файл",
+ "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.",
+ "attachmentDeletePopup-title": "Желаете ли да изтриете прикачения файл?",
+ "attachments": "Прикачени файлове",
+ "auto-watch": "Автоматично наблюдаване на дъските, когато са създадени",
+ "avatar-too-big": "Аватарът е прекалено голям (максимум 70KB)",
+ "back": "Назад",
+ "board-change-color": "Промени цвета",
+ "board-nb-stars": "%s звезди",
+ "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": "Промени наблюдаването",
+ "boardMenuPopup-title": "Board Menu",
+ "boards": "Дъски",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Коридори",
+ "board-view-lists": "Списъци",
+ "bucket-example": "Like “Bucket List” for example",
+ "cancel": "Cancel",
+ "card-archived": "This card is moved to Recycle Bin.",
+ "card-comments-title": "Тази карта има %s коментар.",
+ "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 move a card Recycle Bin to remove it from the board and preserve the activity.",
+ "card-due": "Готова за",
+ "card-due-on": "Готова за",
+ "card-spent": "Изработено време",
+ "card-edit-attachments": "Промени прикачените файлове",
+ "card-edit-labels": "Промени етикетите",
+ "card-edit-members": "Промени членовете",
+ "card-labels-title": "Променете етикетите за тази карта",
+ "card-members-title": "Add or remove members of the board from the card.",
+ "card-start": "Начало",
+ "card-start-on": "Starts on",
+ "cardAttachmentsPopup-title": "Attach From",
+ "cardDeletePopup-title": "Желаете да изтриете картата?",
+ "cardDetailsActionsPopup-title": "Опции",
+ "cardLabelsPopup-title": "Етикети",
+ "cardMembersPopup-title": "Членове",
+ "cardMorePopup-title": "Още",
+ "cards": "Карти",
+ "cards-count": "Карти",
+ "change": "Change",
+ "change-avatar": "Промени аватара",
+ "change-password": "Промени паролата",
+ "change-permissions": "Change permissions",
+ "change-settings": "Промени настройките",
+ "changeAvatarPopup-title": "Промени аватара",
+ "changeLanguagePopup-title": "Промени езика",
+ "changePasswordPopup-title": "Промени паролата",
+ "changePermissionsPopup-title": "Change Permissions",
+ "changeSettingsPopup-title": "Промяна на настройките",
+ "checklists": "Списъци със задачи",
+ "click-to-star": "Click to star this board.",
+ "click-to-unstar": "Натиснете, за да премахнете тази дъска от любими.",
+ "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 “Recycle Bin” 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": "Напиши коментар",
+ "comment-only": "Само коментар",
+ "comment-only-desc": "Може да коментира само в карти.",
+ "computer": "Computer",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+ "copy-card-link-to-clipboard": "Копирай връзката на картата в клипборда",
+ "copyCardPopup-title": "Копирай картата",
+ "copyChecklistToManyCardsPopup-title": "Копирай шаблона за чеклисти в много карти",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
+ "create": "Create",
+ "createBoardPopup-title": "Create Board",
+ "chooseBoardSourcePopup-title": "Import board",
+ "createLabelPopup-title": "Create Label",
+ "current": "current",
+ "date": "Дата",
+ "decline": "Decline",
+ "default-avatar": "Основен аватар",
+ "delete": "Изтрий",
+ "deleteLabelPopup-title": "Желаете да изтриете етикета?",
+ "description": "Описание",
+ "disambiguateMultiLabelPopup-title": "Disambiguate Label Action",
+ "disambiguateMultiMemberPopup-title": "Disambiguate Member Action",
+ "discard": "Discard",
+ "done": "Done",
+ "download": "Сваляне",
+ "edit": "Промени",
+ "edit-avatar": "Промени аватара",
+ "edit-profile": "Промяна на профила",
+ "edit-wip-limit": "Промени WIP лимита",
+ "soft-wip-limit": "Soft WIP Limit",
+ "editCardStartDatePopup-title": "Промени началната дата",
+ "editCardDueDatePopup-title": "Промени датата за готовност",
+ "editCardSpentTimePopup-title": "Промени изработеното време",
+ "editLabelPopup-title": "Change Label",
+ "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": "Неуспешно изпращане на имейла",
+ "email-fail-text": "Възникна грешка при изпращането на имейла",
+ "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__",
+ "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.",
+ "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.",
+ "enable-wip-limit": "Enable WIP Limit",
+ "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",
+ "error-email-taken": "Имейлът е вече зает",
+ "export-board": "Export board",
+ "filter": "Филтър",
+ "filter-cards": "Филтрирай картите",
+ "filter-clear": "Премахване на филтрите",
+ "filter-no-label": "No label",
+ "filter-no-member": "No member",
+ "filter-on": "Има приложени филтри",
+ "filter-on-desc": "В момента филтрирате картите в тази дъска. Моля, натиснете тук, за да промените филтъра.",
+ "filter-to-selection": "Филтрирай избраните",
+ "fullname": "Име",
+ "header-logo-title": "Go back to your boards page.",
+ "hide-system-messages": "Скриване на системните съобщения",
+ "headerBarCreateBoardPopup-title": "Create Board",
+ "home": "Home",
+ "import": "Import",
+ "import-board": "import board",
+ "import-board-c": "Import board",
+ "import-board-title-trello": "Import board from Trello",
+ "import-board-title-wekan": "Import board from Wekan",
+ "import-sandstorm-warning": "Imported board will delete all existing data on board and replace it with imported board.",
+ "from-trello": "From Trello",
+ "from-wekan": "From Wekan",
+ "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.",
+ "import-board-instruction-wekan": "In your Wekan board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.",
+ "import-json-placeholder": "Paste your valid JSON data here",
+ "import-map-members": "Map members",
+ "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users",
+ "import-show-user-mapping": "Review members mapping",
+ "import-user-select": "Pick the Wekan user you want to use as this member",
+ "importMapMembersAddPopup-title": "Select Wekan member",
+ "info": "Версия",
+ "initials": "Инициали",
+ "invalid-date": "Невалидна дата",
+ "invalid-time": "Невалиден час",
+ "invalid-user": "Невалиден потребител",
+ "joined": "joined",
+ "just-invited": "You are just invited to this board",
+ "keyboard-shortcuts": "Keyboard shortcuts",
+ "label-create": "Създай етикет",
+ "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": "Етикети",
+ "language": "Език",
+ "last-admin-desc": "You can’t change roles because there must be at least one admin.",
+ "leave-board": "Leave Board",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "Leave Board ?",
+ "link-card": "Връзка към тази карта",
+ "list-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
+ "list-move-cards": "Премести всички карти в този списък",
+ "list-select-cards": "Избери всички карти в този списък",
+ "listActionPopup-title": "List Actions",
+ "swimlaneActionPopup-title": "Swimlane Actions",
+ "listImportCardPopup-title": "Import a Trello card",
+ "listMorePopup-title": "Още",
+ "link-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 move a list to Recycle Bin to remove it from the board and preserve the activity.",
+ "lists": "Списъци",
+ "swimlanes": "Коридори",
+ "log-out": "Изход",
+ "log-in": "Вход",
+ "loginPopup-title": "Вход",
+ "memberMenuPopup-title": "Настройки на профила",
+ "members": "Членове",
+ "menu": "Меню",
+ "move-selection": "Move selection",
+ "moveCardPopup-title": "Премести картата",
+ "moveCardToBottom-title": "Премести в края",
+ "moveCardToTop-title": "Премести в началото",
+ "moveSelectionPopup-title": "Move selection",
+ "multi-selection": "Множествен избор",
+ "multi-selection-on": "Множественият избор е приложен",
+ "muted": "Muted",
+ "muted-info": "You will never be notified of any changes in this board",
+ "my-boards": "Моите дъски",
+ "name": "Име",
+ "no-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
+ "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": "Получавате информация за всички карти, в които сте отбелязани или сте създали",
+ "notify-watch": "Получавате информация за всички дъски, списъци и карти, които наблюдавате",
+ "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": "Парола",
+ "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": "Профил",
+ "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": "Желаете да изтриете списъка?",
+ "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": "Възстанови",
+ "save": "Запази",
+ "search": "Търсене",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text to search for?",
+ "select-color": "Избери цвят",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
+ "shortcut-assign-self": "Assign yourself to current card",
+ "shortcut-autocomplete-emoji": "Autocomplete emoji",
+ "shortcut-autocomplete-members": "Autocomplete members",
+ "shortcut-clear-filters": "Изчистване на всички филтри",
+ "shortcut-close-dialog": "Close Dialog",
+ "shortcut-filter-my-cards": "Филтрирай моите карти",
+ "shortcut-show-shortcuts": "Bring up this shortcuts list",
+ "shortcut-toggle-filterbar": "Отвори/затвори сайдбара с филтри",
+ "shortcut-toggle-sidebar": "Toggle Board Sidebar",
+ "show-cards-minimum-count": "Покажи бройката на картите, ако списъка съдържа повече от",
+ "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-description": "Любимите дъски се показват в началото на списъка Ви.",
+ "subscribe": "Subscribe",
+ "team": "Team",
+ "this-board": "this board",
+ "this-card": "тази карта",
+ "spent-time-hours": "Изработено време (часа)",
+ "overtime-hours": "Оувъртайм (часа)",
+ "overtime": "Оувъртайм",
+ "has-overtime-cards": "Има карти с оувъртайм",
+ "has-spenttime-cards": "Има карти с изработено време",
+ "time": "Време",
+ "title": "Title",
+ "tracking": "Следене",
+ "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
+ "unassign-member": "Unassign member",
+ "unsaved-description": "You have an unsaved description.",
+ "unwatch": "Спри наблюдаването",
+ "upload": "Upload",
+ "upload-avatar": "Качване на аватар",
+ "uploaded-avatar": "Качихте аватар",
+ "username": "Потребителско име",
+ "view-it": "View it",
+ "warn-list-archived": "warning: this card is in an list at Recycle Bin",
+ "watch": "Наблюдавай",
+ "watching": "Наблюдава",
+ "watching-info": "You will be notified of any change in this board",
+ "welcome-board": "Welcome Board",
+ "welcome-swimlane": "Milestone 1",
+ "welcome-list1": "Basics",
+ "welcome-list2": "Advanced",
+ "what-to-do": "What do you want to do?",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
+ "admin-panel": "Администраторски панел",
+ "settings": "Настройки",
+ "people": "Хора",
+ "registration": "Регистрация",
+ "disable-self-registration": "Disable Self-Registration",
+ "invite": "Покани",
+ "invite-people": "Покани хора",
+ "to-boards": "To board(s)",
+ "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": "От",
+ "send-smtp-test": "Изпрати тестов имейл на себе си",
+ "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.",
+ "email-smtp-test-subject": "SMTP тестов имейл, изпратен от Wekan",
+ "email-smtp-test-text": "Успешно изпратихте имейл",
+ "error-invitation-code-not-exist": "Invitation code doesn't exist",
+ "error-notAuthorized": "You are not authorized to view this page.",
+ "outgoing-webhooks": "Outgoing Webhooks",
+ "outgoingWebhooksPopup-title": "Outgoing Webhooks",
+ "new-outgoing-webhook": "New Outgoing Webhook",
+ "no-name": "(Unknown)",
+ "Wekan_version": "Версия на Wekan",
+ "Node_version": "Версия на Node",
+ "OS_Arch": "Архитектура на ОС",
+ "OS_Cpus": "Брой CPU ядра",
+ "OS_Freemem": "Свободна памет",
+ "OS_Loadavg": "ОС средно натоварване",
+ "OS_Platform": "ОС платформа",
+ "OS_Release": "ОС Версия",
+ "OS_Totalmem": "ОС Общо памет",
+ "OS_Type": "Тип ОС",
+ "OS_Uptime": "OS Ъптайм",
+ "hours": "часа",
+ "minutes": "минути",
+ "seconds": "секунди",
+ "yes": "Да",
+ "no": "Не",
+ "accounts": "Профили",
+ "accounts-allowEmailChange": "Разреши промяна на имейла",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Създаден на",
+ "verified": "Потвърден",
+ "active": "Активен",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
+} \ No newline at end of file
diff --git a/i18n/br.i18n.json b/i18n/br.i18n.json
index c6882ba1..817615bf 100644
--- a/i18n/br.i18n.json
+++ b/i18n/br.i18n.json
@@ -9,9 +9,10 @@
"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-archivedBoard": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
"act-importBoard": "imported __board__",
"act-importCard": "imported __card__",
"act-importList": "imported __list__",
@@ -26,7 +27,7 @@
"activities": "Oberiantizoù",
"activity": "Oberiantiz",
"activity-added": "%s ouzhpennet da %s",
- "activity-archived": "%s diellaouet",
+ "activity-archived": "%s moved to Recycle Bin",
"activity-attached": "%s liammet ouzh %s",
"activity-created": "%s krouet",
"activity-excluded": "excluded %s from %s",
@@ -44,6 +45,7 @@
"add-attachment": "Add Attachment",
"add-board": "Add Board",
"add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Add Checklist",
"add-checklist-item": "Add an item to checklist",
"add-cover": "Ouzphenn ur golo",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "Izili",
"admin": "Merour",
"admin-desc": "Can view and edit cards, remove members, and change settings for the board.",
+ "admin-announcement": "Announcement",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Announcement from Administrator",
"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": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
- "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",
- "archived-boards": "Archived Boards",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
"restore-board": "Restore Board",
- "no-archived-boards": "No Archived Boards.",
- "archives": "Archives",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
"assign-member": "Assign member",
"attached": "attached",
"attachment": "Attachment",
@@ -91,15 +97,19 @@
"boardChangeWatchPopup-title": "Change Watch",
"boardMenuPopup-title": "Board Menu",
"boards": "Boards",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Lists",
"bucket-example": "Like “Bucket List” for example",
"cancel": "Cancel",
- "card-archived": "This card is archived.",
+ "card-archived": "This card is moved to Recycle Bin.",
"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-delete-suggest-archive": "You can move a card Recycle Bin to remove it from the board and preserve the activity.",
"card-due": "Due",
"card-due-on": "Due on",
+ "card-spent": "Spent Time",
"card-edit-attachments": "Edit attachments",
"card-edit-labels": "Edit labels",
"card-edit-members": "Edit members",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "Izili",
"cardMorePopup-title": "Muioc’h",
"cards": "Kartennoù",
+ "cards-count": "Kartennoù",
"change": "Change",
"change-avatar": "Change Avatar",
"change-password": "Kemmañ ger-tremen",
@@ -130,7 +141,7 @@
"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.",
+ "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
"color-black": "du",
"color-blue": "glas",
"color-green": "gwer",
@@ -146,8 +157,12 @@
"comment-only": "Comment only",
"comment-only-desc": "Can comment on cards only.",
"computer": "Computer",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
"copy-card-link-to-clipboard": "Copy card link to clipboard",
"copyCardPopup-title": "Copy Card",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
"create": "Krouiñ",
"createBoardPopup-title": "Create Board",
"chooseBoardSourcePopup-title": "Import board",
@@ -167,8 +182,11 @@
"edit": "Kemmañ",
"edit-avatar": "Change Avatar",
"edit-profile": "Edit Profile",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
"editCardStartDatePopup-title": "Change start date",
"editCardDueDatePopup-title": "Change due date",
+ "editCardSpentTimePopup-title": "Change spent time",
"editLabelPopup-title": "Change Label",
"editNotificationPopup-title": "Edit Notification",
"editProfilePopup-title": "Edit Profile",
@@ -176,6 +194,7 @@
"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-fail-text": "Error trying to send email",
"email-invalid": "Invalid email",
"email-invite": "Invite via Email",
"email-invite-subject": "__inviter__ sent you an invitation",
@@ -185,6 +204,7 @@
"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.",
+ "enable-wip-limit": "Enable WIP Limit",
"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",
@@ -229,6 +249,8 @@
"info": "Version",
"initials": "Initials",
"invalid-date": "Invalid date",
+ "invalid-time": "Invalid time",
+ "invalid-user": "Invalid user",
"joined": "joined",
"just-invited": "You are just invited to this board",
"keyboard-shortcuts": "Keyboard shortcuts",
@@ -239,18 +261,22 @@
"language": "Yezh",
"last-admin-desc": "You can’t change roles because there must be at least one admin.",
"leave-board": "Leave Board",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "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-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
"list-move-cards": "Move all cards in this list",
"list-select-cards": "Select all cards in this list",
"listActionPopup-title": "List Actions",
+ "swimlaneActionPopup-title": "Swimlane 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.",
+ "list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve the activity.",
"lists": "Lists",
+ "swimlanes": "Swimlanes",
"log-out": "Log Out",
"log-in": "Log In",
"loginPopup-title": "Log In",
@@ -268,8 +294,9 @@
"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-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
"no-results": "No results",
"normal": "Normal",
"normal-desc": "Can view and edit cards. Can't change settings.",
@@ -305,7 +332,11 @@
"restore": "Restore",
"save": "Save",
"search": "Search",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text to search for?",
"select-color": "Select Color",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
"shortcut-assign-self": "Assign yourself to current card",
"shortcut-autocomplete-emoji": "Autocomplete emoji",
"shortcut-autocomplete-members": "Autocomplete members",
@@ -326,6 +357,11 @@
"team": "Team",
"this-board": "this board",
"this-card": "this card",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"tracking": "Tracking",
@@ -338,14 +374,18 @@
"uploaded-avatar": "Uploaded an avatar",
"username": "Username",
"view-it": "View it",
- "warn-list-archived": "warning: this card is in an archived list",
+ "warn-list-archived": "warning: this card is in an list at Recycle Bin",
"watch": "Watch",
"watching": "Watching",
"watching-info": "You will be notified of any change in this board",
"welcome-board": "Welcome Board",
+ "welcome-swimlane": "Milestone 1",
"welcome-list1": "Basics",
"welcome-list2": "Advanced",
"what-to-do": "What do you want to do?",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
"admin-panel": "Admin Panel",
"settings": "Settings",
"people": "People",
@@ -364,9 +404,12 @@
"smtp-password": "Ger-tremen",
"smtp-tls": "TLS support",
"send-from": "From",
+ "send-smtp-test": "Send a test email to yourself",
"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.",
+ "email-smtp-test-subject": "SMTP Test Email From Wekan",
+ "email-smtp-test-text": "You have successfully sent an email",
"error-invitation-code-not-exist": "Invitation code doesn't exist",
"error-notAuthorized": "You are not authorized to view this page.",
"outgoing-webhooks": "Outgoing Webhooks",
@@ -390,5 +433,15 @@
"yes": "Yes",
"no": "No",
"accounts": "Accounts",
- "accounts-allowEmailChange": "Allow Email Change"
+ "accounts-allowEmailChange": "Allow Email Change",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Created at",
+ "verified": "Verified",
+ "active": "Active",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
} \ No newline at end of file
diff --git a/i18n/ca.i18n.json b/i18n/ca.i18n.json
index a3a0e7aa..02e07af8 100644
--- a/i18n/ca.i18n.json
+++ b/i18n/ca.i18n.json
@@ -2,16 +2,17 @@
"accept": "Accepta",
"act-activity-notify": "[Wekan] Notificació d'activitat",
"act-addAttachment": "adjuntat __attachment__ a __card__",
- "act-addChecklist": "added checklist __checklist__ to __card__",
- "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
+ "act-addChecklist": "afegida la checklist _checklist__ a __card__",
+ "act-addChecklistItem": "afegit __checklistItem__ a la checklist __checklist__ on __card__",
"act-addComment": "comentat a __card__: __comment__",
"act-createBoard": "creat __board__",
"act-createCard": "afegit/da __card__ a __list__",
"act-createList": "afegit/da __list__ a __board__",
"act-addBoardMember": "afegit/da __member__ a __board__",
- "act-archivedBoard": "__board__ arxivat",
- "act-archivedCard": "__card__ arxivat/da",
- "act-archivedList": "__list__ arxivat/da",
+ "act-archivedBoard": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
"act-importBoard": "__board__ importat",
"act-importCard": "__card__ importat",
"act-importList": "__list__ importat",
@@ -26,7 +27,7 @@
"activities": "Activitats",
"activity": "Activitat",
"activity-added": "ha afegit %s a %s",
- "activity-archived": "ha arxivat %s",
+ "activity-archived": "%s moved to Recycle Bin",
"activity-attached": "ha adjuntat %s a %s",
"activity-created": "ha creat %s",
"activity-excluded": "ha exclòs %s de %s",
@@ -39,11 +40,12 @@
"activity-sent": "ha enviat %s %s",
"activity-unjoined": "desassignat %s",
"activity-checklist-added": "Checklist afegida a %s",
- "activity-checklist-item-added": "\nafegit checklist item de'%s' a %s",
+ "activity-checklist-item-added": "afegida entrada de checklist de '%s' a %s",
"add": "Afegeix",
"add-attachment": "Afegeix adjunt",
"add-board": "Afegeix Tauler",
"add-card": "Afegeix fitxa",
+ "add-swimlane": "Afegix Carril de Natació",
"add-checklist": "Afegeix checklist",
"add-checklist-item": "Afegeix un ítem",
"add-cover": "Afegeix coberta",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "Membres",
"admin": "Administrador",
"admin-desc": "Pots veure i editar fitxes, eliminar membres, i canviar la configuració del tauler",
+ "admin-announcement": "Bàndol",
+ "admin-announcement-active": "Activar bàndol del Sistema",
+ "admin-announcement-title": "Bàndol de l'administració",
"all-boards": "Tots els taulers",
"and-n-other-card": "And __count__ other card",
"and-n-other-card_plural": "And __count__ other cards",
"apply": "Aplica",
"app-is-offline": "Wekan s'està carregant, esperau si us plau. Refrescar la pàgina causarà la pérdua de les dades. Si Wekan no carrega, verificau que el servei de Wekan no estigui aturat",
- "archive": "Desa",
- "archive-all": "Desa Tot",
- "archive-board": "Arxiva tauler",
- "archive-card": "Arxiva fitxa",
- "archive-list": "Arxiva llista",
- "archive-selection": "Arxiva selecció",
- "archiveBoardPopup-title": "Arxivar el tauler?",
- "archived-items": "Elements arxivats",
- "archived-boards": "Taulers Arxivats",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
"restore-board": "Restaura Tauler",
- "no-archived-boards": "Taulers no arxivats",
- "archives": "Arxivats",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
"assign-member": "Assignar membre",
"attached": "adjuntat",
"attachment": "Adjunt",
@@ -91,15 +97,19 @@
"boardChangeWatchPopup-title": "Canvia seguiment",
"boardMenuPopup-title": "Menú del tauler",
"boards": "Taulers",
+ "board-view": "Visió del tauler",
+ "board-view-swimlanes": "Carrils de Natació",
+ "board-view-lists": "Llistes",
"bucket-example": "Igual que “Bucket List”, per exemple",
"cancel": "Cancel·la",
- "card-archived": "Aquesta fitxa està arxivada.",
+ "card-archived": "This card is moved to Recycle Bin.",
"card-comments-title": "Aquesta fitxa té %s comentaris.",
"card-delete-notice": "L'esborrat és permanent. Perdreu totes les accions associades a aquesta fitxa.",
"card-delete-pop": "Totes les accions s'eliminaran de l'activitat i no podreu tornar a obrir la fitxa. No es pot desfer.",
- "card-delete-suggest-archive": "Podeu arxivar una fitxa per extreure-la del tauler i preservar l'activitat.",
+ "card-delete-suggest-archive": "You can move a card Recycle Bin to remove it from the board and preserve the activity.",
"card-due": "Finalitza",
"card-due-on": "Finalitza a",
+ "card-spent": "Temps Dedicat",
"card-edit-attachments": "Edita arxius adjunts",
"card-edit-labels": "Edita etiquetes",
"card-edit-members": "Edita membres",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "Membres",
"cardMorePopup-title": "Més",
"cards": "Fitxes",
+ "cards-count": "Fitxes",
"change": "Canvia",
"change-avatar": "Canvia Avatar",
"change-password": "Canvia la clau",
@@ -130,7 +141,7 @@
"clipboard": "Portaretalls o estirar i amollar",
"close": "Tanca",
"close-board": "Tanca tauler",
- "close-board-pop": "Podràs restaurar el tauler, seleccionant \"Arxivats\" de la finistra principal",
+ "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
"color-black": "negre",
"color-blue": "blau",
"color-green": "verd",
@@ -146,8 +157,12 @@
"comment-only": "Només comentaris",
"comment-only-desc": "Només pots fer comentaris a les fitxes",
"computer": "Ordinador",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
"copy-card-link-to-clipboard": "Copia l'enllaç de la ftixa al porta-retalls",
"copyCardPopup-title": "Copia la fitxa",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Títols de fitxa i Descripcions de destí en aquest format JSON",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Títol de la primera fitxa\", \"description\":\"Descripció de la primera fitxa\"}, {\"title\":\"Títol de la segona fitxa\",\"description\":\"Descripció de la segona fitxa\"},{\"title\":\"Títol de l'última fitxa\",\"description\":\"Descripció de l'última fitxa\"} ]",
"create": "Crea",
"createBoardPopup-title": "Crea tauler",
"chooseBoardSourcePopup-title": "Importa Tauler",
@@ -167,8 +182,11 @@
"edit": "Edita",
"edit-avatar": "Canvia Avatar",
"edit-profile": "Edita el teu Perfil",
+ "edit-wip-limit": "Edita el Límit de Treball en Progrès",
+ "soft-wip-limit": "Soft WIP Limit",
"editCardStartDatePopup-title": "Canvia data d'inici",
"editCardDueDatePopup-title": "Canvia data de finalització",
+ "editCardSpentTimePopup-title": "Canvia temps dedicat",
"editLabelPopup-title": "Canvia etiqueta",
"editNotificationPopup-title": "Edita la notificació",
"editProfilePopup-title": "Edita teu Perfil",
@@ -176,6 +194,7 @@
"email-enrollAccount-subject": "An account created for you on __siteName__",
"email-enrollAccount-text": "Hola __user__,\n\nPer començar a utilitzar el servei, segueix l'enllaç següent.\n\n__url__\n\nGràcies.",
"email-fail": "Error enviant el correu",
+ "email-fail-text": "Error en intentar enviar e-mail",
"email-invalid": "Adreça de correu invàlida",
"email-invite": "Convida mitjançant correu electrònic",
"email-invite-subject": "__inviter__ t'ha convidat",
@@ -185,6 +204,7 @@
"email-sent": "Correu enviat",
"email-verifyEmail-subject": "Verify your email address on __siteName__",
"email-verifyEmail-text": "Hola __user__, \n\n per verificar el teu correu, segueix l'enllaç següent.\n\n __url__\n\n Gràcies.",
+ "enable-wip-limit": "Activa e Límit de Treball en Progrès",
"error-board-doesNotExist": "Aquest tauler no existeix",
"error-board-notAdmin": "Necessites ser administrador d'aquest tauler per dur a lloc aquest acció",
"error-board-notAMember": "Necessites ser membre d'aquest tauler per dur a terme aquesta acció",
@@ -195,7 +215,7 @@
"error-user-notAllowSelf": "No et pots convidar a tu mateix",
"error-user-notCreated": "L'usuari no s'ha creat",
"error-username-taken": "Aquest usuari ja existeix",
- "error-email-taken": "Email has already been taken",
+ "error-email-taken": "L'adreça de correu electrònic ja és en ús",
"export-board": "Exporta tauler",
"filter": "Filtre",
"filter-cards": "Fitxes de filtre",
@@ -215,7 +235,7 @@
"import-board-c": "Importa tauler",
"import-board-title-trello": "Importa tauler des de Trello",
"import-board-title-wekan": "I",
- "import-sandstorm-warning": "Imported board will delete all existing data on board and replace it with imported board.",
+ "import-sandstorm-warning": "Estau segur que voleu esborrar aquesta checklist?",
"from-trello": "Des de Trello",
"from-wekan": "Des de Wekan",
"import-board-instruction-trello": "En el teu tauler Trello, ves a 'Menú', 'Més'.' Imprimir i Exportar', 'Exportar JSON', i copia el text resultant.",
@@ -229,6 +249,8 @@
"info": "Versió",
"initials": "Inicials",
"invalid-date": "Data invàlida",
+ "invalid-time": "Temps Invàlid",
+ "invalid-user": "Usuari invàlid",
"joined": "s'ha unit",
"just-invited": "Has estat convidat a aquest tauler",
"keyboard-shortcuts": "Dreceres de teclat",
@@ -239,18 +261,22 @@
"language": "Idioma",
"last-admin-desc": "No podeu canviar rols perquè ha d'haver-hi almenys un administrador.",
"leave-board": "Abandona tauler",
+ "leave-board-pop": "De debò voleu abandonar __boardTitle__? Se us eliminarà de totes les fitxes d'aquest tauler.",
+ "leaveBoardPopup-title": "Abandonar Tauler?",
"link-card": "Enllaç a aquesta fitxa",
- "list-archive-cards": "Arxiva totes les fitxes d'aquesta llista",
- "list-archive-cards-pop": "Això eliminarà totes les fitxes d'aquesta llista del tauler. Per veure les fitxes arxivades i recuperar-les en el tauler, feu clic a \" Menú \"/ \" Articles Arxivat \".",
+ "list-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
"list-move-cards": "Mou totes les fitxes d'aquesta llista",
"list-select-cards": "Selecciona totes les fitxes d'aquesta llista",
"listActionPopup-title": "Accions de la llista",
+ "swimlaneActionPopup-title": "Accions de Carril de Natació",
"listImportCardPopup-title": "importa una fitxa de Trello",
"listMorePopup-title": "Més",
"link-list": "Enllaça a aquesta llista",
"list-delete-pop": "Totes les accions seran esborrades de la llista d'activitats i no serà possible recuperar la llista",
- "list-delete-suggest-archive": "Pots arxivar una llista per eliminar-la del tauler i preservar la seva activitat",
+ "list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve the activity.",
"lists": "Llistes",
+ "swimlanes": "Carrils de Natació",
"log-out": "Finalitza la sessió",
"log-in": "Ingresa",
"loginPopup-title": "Inicia sessió",
@@ -268,8 +294,9 @@
"muted-info": "No seràs notificat dels canvis en aquest tauler",
"my-boards": "Els meus taulers",
"name": "Nom",
- "no-archived-cards": "No hi ha fitxes arxivades.",
- "no-archived-lists": "No hi ha llistes arxivades.",
+ "no-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
"no-results": "Sense resultats",
"normal": "Normal",
"normal-desc": "Podeu veure i editar fitxes. No podeu canviar la configuració.",
@@ -305,7 +332,11 @@
"restore": "Restaura",
"save": "Desa",
"search": "Cerca",
+ "search-cards": "Cerca títols de fitxa i descripcions en aquest tauler",
+ "search-example": "Text que cercar?",
"select-color": "Selecciona color",
+ "set-wip-limit-value": "Limita el màxim nombre de tasques en aquesta llista",
+ "setWipLimitPopup-title": "Configura el Límit de Treball en Progrès",
"shortcut-assign-self": "Assigna't la ftixa actual",
"shortcut-autocomplete-emoji": "Autocompleta emoji",
"shortcut-autocomplete-members": "Autocompleta membres",
@@ -326,6 +357,11 @@
"team": "Equip",
"this-board": "aquest tauler",
"this-card": "aquesta fitxa",
+ "spent-time-hours": "Temps dedicat (hores)",
+ "overtime-hours": "Temps de més (hores)",
+ "overtime": "Temps de més",
+ "has-overtime-cards": "Té fitxes amb temps de més",
+ "has-spenttime-cards": "Té fitxes amb temps dedicat",
"time": "Hora",
"title": "Títol",
"tracking": "En seguiment",
@@ -338,14 +374,18 @@
"uploaded-avatar": "Avatar actualitzat",
"username": "Nom d'Usuari",
"view-it": "Vist",
- "warn-list-archived": "Avís: aquesta fitxa està en una llista arxivada",
+ "warn-list-archived": "warning: this card is in an list at Recycle Bin",
"watch": "Observa",
"watching": "En observació",
"watching-info": "Seràs notificat de cada canvi en aquest tauler",
"welcome-board": "Tauler de benvinguda",
+ "welcome-swimlane": "Objectiu 1",
"welcome-list1": "Bàsics",
"welcome-list2": "Avançades",
"what-to-do": "Què vols fer?",
+ "wipLimitErrorPopup-title": "Límit de Treball en Progrès invàlid",
+ "wipLimitErrorPopup-dialog-pt1": "El nombre de tasques en esta llista és superior al límit de Treball en Progrès que heu definit.",
+ "wipLimitErrorPopup-dialog-pt2": "Si us plau mogui algunes taques fora d'aquesta llista, o configuri un límit de Treball en Progrès superior.",
"admin-panel": "Tauler d'administració",
"settings": "Configuració",
"people": "Persones",
@@ -364,14 +404,17 @@
"smtp-password": "Contrasenya",
"smtp-tls": "Suport TLS",
"send-from": "De",
+ "send-smtp-test": "Envia't un correu electrònic de prova",
"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",
+ "email-smtp-test-subject": "Correu de Prova SMTP de Wekan",
+ "email-smtp-test-text": "Has enviat un missatge satisfactòriament",
"error-invitation-code-not-exist": "El codi d'invitació no existeix",
"error-notAuthorized": "No estau autoritzats per veure aquesta pàgina",
- "outgoing-webhooks": "Outgoing Webhooks",
- "outgoingWebhooksPopup-title": "Outgoing Webhooks",
- "new-outgoing-webhook": "New Outgoing Webhook",
+ "outgoing-webhooks": "Webhooks sortints",
+ "outgoingWebhooksPopup-title": "Webhooks sortints",
+ "new-outgoing-webhook": "Nou Webook sortint",
"no-name": "Importa tauler des de Wekan",
"Wekan_version": "Versió Wekan",
"Node_version": "Versió Node",
@@ -390,5 +433,15 @@
"yes": "Si",
"no": "No",
"accounts": "Comptes",
- "accounts-allowEmailChange": "Permet modificar correu electrònic"
+ "accounts-allowEmailChange": "Permet modificar correu electrònic",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Creat ",
+ "verified": "Verificat",
+ "active": "Actiu",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
} \ No newline at end of file
diff --git a/i18n/cs.i18n.json b/i18n/cs.i18n.json
index ca2cf7ef..09c6f4e6 100644
--- a/i18n/cs.i18n.json
+++ b/i18n/cs.i18n.json
@@ -2,16 +2,17 @@
"accept": "Přijmout",
"act-activity-notify": "[Wekan] Notifikace aktivit",
"act-addAttachment": "přiložen __attachment__ do __card__",
- "act-addChecklist": "added checklist __checklist__ to __card__",
- "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
+ "act-addChecklist": "přidán checklist __checklist__ do __card__",
+ "act-addChecklistItem": "přidán __checklistItem__ do checklistu __checklist__ v __card__",
"act-addComment": "komentář k __card__: __comment__",
"act-createBoard": "přidání __board__",
"act-createCard": "přidání __card__ do __list__",
"act-createList": "přidání __list__ do __board__",
"act-addBoardMember": "přidání __member__ do __board__",
- "act-archivedBoard": "archivace __board__",
- "act-archivedCard": "archivace __card__",
- "act-archivedList": "archivace __list__",
+ "act-archivedBoard": "__board__ bylo přesunuto do koše",
+ "act-archivedCard": "__card__ bylo přesunuto do koše",
+ "act-archivedList": "__list__ bylo přesunuto do koše",
+ "act-archivedSwimlane": "__swimlane__ bylo přesunuto do koše",
"act-importBoard": "import __board__",
"act-importCard": "import __card__",
"act-importList": "import __list__",
@@ -26,7 +27,7 @@
"activities": "Aktivity",
"activity": "Aktivita",
"activity-added": "%s přidáno k %s",
- "activity-archived": "%s archivováno",
+ "activity-archived": "%s bylo přesunuto do koše",
"activity-attached": "přiloženo %s k %s",
"activity-created": "%s vytvořeno",
"activity-excluded": "%s vyjmuto z %s",
@@ -44,6 +45,7 @@
"add-attachment": "Přidat přílohu",
"add-board": "Přidat tablo",
"add-card": "Přidat kartu",
+ "add-swimlane": "Přidat Swimlane",
"add-checklist": "Přidat zaškrtávací seznam",
"add-checklist-item": "Přidat položku do zaškrtávacího seznamu",
"add-cover": "Přidat obal",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "Členové",
"admin": "Administrátor",
"admin-desc": "Může zobrazovat a upravovat karty, mazat členy a měnit nastavení tabla.",
+ "admin-announcement": "Oznámení",
+ "admin-announcement-active": "Aktivní oznámení v celém systému",
+ "admin-announcement-title": "Oznámení od administrátora",
"all-boards": "Všechna tabla",
"and-n-other-card": "A __count__ další karta(y)",
"and-n-other-card_plural": "A __count__ dalších karet",
"apply": "Použít",
- "app-is-offline": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
- "archive": "Archiv",
- "archive-all": "Archivovat vše",
- "archive-board": "Archivovat tablo",
- "archive-card": "Archivovat kartu",
- "archive-list": "Archive List",
- "archive-selection": "Archivovat výběr",
- "archiveBoardPopup-title": "Archivovat tablo?",
- "archived-items": "Archivované položky",
- "archived-boards": "Archivaná tabla",
+ "app-is-offline": "Wekan se načítá, prosím čekejte. Obnovení stránky způsobí ztrátu dat. Pokud se Wekan nenačte, zkontrolujte prosím, jestli se server s Wekanem nezastavil.",
+ "archive": "Přesunout do koše",
+ "archive-all": "Přesunout všechno do koše",
+ "archive-board": "Přesunout tablo do koše",
+ "archive-card": "Přesunout kartu do koše",
+ "archive-list": "Přesunout seznam do koše",
+ "archive-swimlane": "Přesunout swimlane do koše",
+ "archive-selection": "Přesunout výběr do koše",
+ "archiveBoardPopup-title": "Chcete přesunout tablo do koše?",
+ "archived-items": "Koš",
+ "archived-boards": "Tabla v koši",
"restore-board": "Obnovit tablo",
- "no-archived-boards": "Žádná archivovaná tabla",
- "archives": "Archivy",
+ "no-archived-boards": "Žádná tabla v koši",
+ "archives": "Koš",
"assign-member": "Přiřadit člena",
"attached": "přiloženo",
"attachment": "Příloha",
@@ -88,18 +94,22 @@
"boardChangeColorPopup-title": "Změnit pozadí tabla",
"boardChangeTitlePopup-title": "Přejmenovat tablo",
"boardChangeVisibilityPopup-title": "Upravit viditelnost",
- "boardChangeWatchPopup-title": "Change Watch",
+ "boardChangeWatchPopup-title": "Změnit sledování",
"boardMenuPopup-title": "Menu tabla",
"boards": "Tabla",
+ "board-view": "Náhled tabla",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Seznamy",
"bucket-example": "Například \"Než mě odvedou\"",
"cancel": "Zrušit",
- "card-archived": "Tato karta je archivována.",
+ "card-archived": "Karta byla přesunuta do koše.",
"card-comments-title": "Tato karta má %s komentářů.",
"card-delete-notice": "Smazání je trvalé. Přijdete o všechny akce asociované s touto kartou.",
"card-delete-pop": "Všechny akce budou odstraněny z kanálu aktivity a nebude možné kartu znovu otevřít. Toto nelze vrátit zpět.",
- "card-delete-suggest-archive": "Kartu můžete archivovat a tím ji odstranit z tabla a přitom zachovat aktivity.",
+ "card-delete-suggest-archive": "Kartu můžete přesunout do koše a tím ji odstranit z tabla a přitom zachovat aktivity.",
"card-due": "Termín",
"card-due-on": "Do",
+ "card-spent": "Strávený čas",
"card-edit-attachments": "Upravit přílohy",
"card-edit-labels": "Upravit štítky",
"card-edit-members": "Upravit členy",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "Členové",
"cardMorePopup-title": "Více",
"cards": "Karty",
+ "cards-count": "Karty",
"change": "Změnit",
"change-avatar": "Změnit avatar",
"change-password": "Změnit heslo",
@@ -130,7 +141,7 @@
"clipboard": "Schránka nebo potáhnout a pustit",
"close": "Zavřít",
"close-board": "Zavřít tablo",
- "close-board-pop": "Budete moci obnovit tablo kliknutím na tlačítko \"Archivy\" v hlavním menu.",
+ "close-board-pop": "Kliknutím na tlačítko \"Recyklovat\" budete moci obnovit tablo z koše.",
"color-black": "černá",
"color-blue": "modrá",
"color-green": "zelená",
@@ -143,17 +154,21 @@
"color-yellow": "žlutá",
"comment": "Komentář",
"comment-placeholder": "Text komentáře",
- "comment-only": "Comment only",
- "comment-only-desc": "Can comment on cards only.",
+ "comment-only": "Pouze komentáře",
+ "comment-only-desc": "Může přidávat komentáře pouze do karet.",
"computer": "Počítač",
+ "confirm-checklist-delete-dialog": "Opravdu chcete smazat tento checklist?",
"copy-card-link-to-clipboard": "Kopírovat adresu karty do mezipaměti",
"copyCardPopup-title": "Kopírovat kartu",
+ "copyChecklistToManyCardsPopup-title": "Kopírovat checklist do více karet",
+ "copyChecklistToManyCardsPopup-instructions": "Názvy a popisy cílové karty v tomto formátu JSON",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Nadpis první karty\", \"description\":\"Popis druhé karty\"}, {\"title\":\"Nadpis druhé karty\",\"description\":\"Popis druhé karty\"},{\"title\":\"Nadpis poslední kary\",\"description\":\"Popis poslední karty\"} ]",
"create": "Vytvořit",
"createBoardPopup-title": "Vytvořit tablo",
"chooseBoardSourcePopup-title": "Importovat tablo",
"createLabelPopup-title": "Vytvořit štítek",
"current": "Aktuální",
- "date": "Date",
+ "date": "Datum",
"decline": "Zamítnout",
"default-avatar": "Výchozí avatar",
"delete": "Smazat",
@@ -167,8 +182,11 @@
"edit": "Upravit",
"edit-avatar": "Změnit avatar",
"edit-profile": "Upravit profil",
+ "edit-wip-limit": "Upravit WIP Limit",
+ "soft-wip-limit": "Mírný WIP limit",
"editCardStartDatePopup-title": "Změnit datum startu úkolu",
"editCardDueDatePopup-title": "Změnit datum dokončení úkolu",
+ "editCardSpentTimePopup-title": "Změnit strávený čas",
"editLabelPopup-title": "Změnit štítek",
"editNotificationPopup-title": "Změnit notifikace",
"editProfilePopup-title": "Upravit profil",
@@ -176,6 +194,7 @@
"email-enrollAccount-subject": "Byl vytvořen účet na __siteName__",
"email-enrollAccount-text": "Ahoj __user__,\n\nMůžeš začít používat službu kliknutím na odkaz níže.\n\n__url__\n\nDěkujeme.",
"email-fail": "Odeslání emailu selhalo",
+ "email-fail-text": "Chyba při pokusu o odeslání emailu",
"email-invalid": "Neplatný email",
"email-invite": "Pozvat pomocí emailu",
"email-invite-subject": "__inviter__ odeslal pozvánku",
@@ -185,6 +204,7 @@
"email-sent": "Email byl odeslán",
"email-verifyEmail-subject": "Ověř svou emailovou adresu na",
"email-verifyEmail-text": "Ahoj __user__,\n\nPro ověření emailové adresy klikni na odkaz níže.\n\n__url__\n\nDěkujeme.",
+ "enable-wip-limit": "Povolit WIP Limit",
"error-board-doesNotExist": "Toto tablo neexistuje",
"error-board-notAdmin": "K provedení změny musíš být administrátor tohoto tabla",
"error-board-notAMember": "K provedení změny musíš být členem tohoto tabla",
@@ -194,41 +214,43 @@
"error-user-doesNotExist": "Tento uživatel neexistuje",
"error-user-notAllowSelf": "Nemůžeš pozvat sám sebe",
"error-user-notCreated": "Tento uživatel není vytvořen",
- "error-username-taken": "This username is already taken",
- "error-email-taken": "Email has already been taken",
+ "error-username-taken": "Toto uživatelské jméno již existuje",
+ "error-email-taken": "Tento email byl již použit",
"export-board": "Exportovat tablo",
"filter": "Filtr",
"filter-cards": "Filtrovat karty",
"filter-clear": "Vyčistit filtr",
- "filter-no-label": "No label",
- "filter-no-member": "No member",
+ "filter-no-label": "Žádný štítek",
+ "filter-no-member": "Žádný člen",
"filter-on": "Filtr je zapnut",
"filter-on-desc": "Filtrujete karty tohoto tabla. Pro úpravu filtru klikni sem.",
"filter-to-selection": "Filtrovat výběr",
"fullname": "Celé jméno",
"header-logo-title": "Jit zpět na stránku s tably.",
- "hide-system-messages": "Hide system messages",
+ "hide-system-messages": "Skrýt systémové zprávy",
"headerBarCreateBoardPopup-title": "Vytvořit tablo",
"home": "Domů",
"import": "Import",
- "import-board": "import board",
+ "import-board": "Importovat tablo",
"import-board-c": "Importovat tablo",
"import-board-title-trello": "Import board from Trello",
- "import-board-title-wekan": "Import board from Wekan",
- "import-sandstorm-warning": "Imported board will delete all existing data on board and replace it with imported board.",
- "from-trello": "From Trello",
- "from-wekan": "From Wekan",
+ "import-board-title-wekan": "Importovat tablo z Wekanu",
+ "import-sandstorm-warning": "Importované tablo spaže všechny existující data v tablu a nahradí je importovaným tablem.",
+ "from-trello": "Z Trella",
+ "from-wekan": "Z Wekanu",
"import-board-instruction-trello": "Na svém Trello tablu, otevři 'Menu', pak 'More', 'Print and Export', 'Export JSON', a zkopíruj výsledný text",
- "import-board-instruction-wekan": "In your Wekan board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.",
+ "import-board-instruction-wekan": "Ve vašem Wekan tablu jděte do 'Menu', klikněte na 'Exportovat tablo' a zkopírujte text ze staženého souboru.",
"import-json-placeholder": "Sem vlož validní JSON data",
- "import-map-members": "Map members",
+ "import-map-members": "Mapovat členy",
"import-members-map": "Toto importované tablo obsahuje několik členů. Namapuj členy z importu na uživatelské účty Wekan.",
"import-show-user-mapping": "Zkontrolovat namapování členů",
"import-user-select": "Vyber uživatele Wekan, kterého chceš použít pro tohoto člena",
- "importMapMembersAddPopup-title": "Select Wekan member",
- "info": "Version",
+ "importMapMembersAddPopup-title": "Vybrat Wekan uživatele",
+ "info": "Verze",
"initials": "Iniciály",
- "invalid-date": "Invalid date",
+ "invalid-date": "Neplatné datum",
+ "invalid-time": "Neplatný čas",
+ "invalid-user": "Neplatný uživatel",
"joined": "spojeno",
"just-invited": "Právě jsi byl pozván(a) do tohoto tabla",
"keyboard-shortcuts": "Klávesové zkratky",
@@ -239,18 +261,22 @@
"language": "Jazyk",
"last-admin-desc": "Nelze změnit role, protože musí existovat alespoň jeden administrátor.",
"leave-board": "Opustit tablo",
+ "leave-board-pop": "Opravdu chcete opustit tablo __boardTitle__? Odstraníte se tím i ze všech karet v tomto tablu.",
+ "leaveBoardPopup-title": "Opustit tablo?",
"link-card": "Odkázat na tuto kartu",
- "list-archive-cards": "Archivovat všechny karty na tomto seznamu",
- "list-archive-cards-pop": "Toto odstraní z tabla všechny karty z tohoto seznamu. Pro zobrazení archivovaných karet a jejich opětovné obnovení, klikni v \"Menu\" > \"Archivované položky\".",
+ "list-archive-cards": "Přesunout všechny karty v tomto seznamu do koše",
+ "list-archive-cards-pop": "Toto odstraní z tabla všechny karty z tohoto seznamu. Pro zobrazení karet v koši a jejich opětovné obnovení, klikni v \"Menu\" > \"Archivované položky\".",
"list-move-cards": "Přesunout všechny karty v tomto seznamu",
"list-select-cards": "Vybrat všechny karty v tomto seznamu",
"listActionPopup-title": "Vypsat akce",
+ "swimlaneActionPopup-title": "Akce swimlane",
"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.",
+ "link-list": "Odkaz na tento seznam",
+ "list-delete-pop": "Všechny akce budou odstraněny z kanálu aktivity a nebude možné kartu obnovit. Toto nelze vrátit zpět.",
+ "list-delete-suggest-archive": "Kartu můžete přesunout do koše a tím ji odstranit z tabla a přitom zachovat aktivity.",
"lists": "Seznamy",
+ "swimlanes": "Swimlanes",
"log-out": "Odhlásit",
"log-in": "Přihlásit",
"loginPopup-title": "Přihlásit",
@@ -259,30 +285,31 @@
"menu": "Menu",
"move-selection": "Přesunout výběr",
"moveCardPopup-title": "Přesunout kartu",
- "moveCardToBottom-title": "Move to Bottom",
- "moveCardToTop-title": "Move to Top",
+ "moveCardToBottom-title": "Přesunout dolu",
+ "moveCardToTop-title": "Přesunout nahoru",
"moveSelectionPopup-title": "Přesunout výběr",
"multi-selection": "Multi-výběr",
"multi-selection-on": "Multi-výběr je zapnut",
- "muted": "Muted",
- "muted-info": "You will never be notified of any changes in this board",
+ "muted": "Umlčeno",
+ "muted-info": "Nikdy nedostanete oznámení o změně v tomto tablu.",
"my-boards": "Moje tabla",
"name": "Jméno",
- "no-archived-cards": "Žádné archivované karty.",
- "no-archived-lists": "Žádné archivované seznamy.",
+ "no-archived-cards": "Žádné karty v koši",
+ "no-archived-lists": "Žádné seznamy v koši",
+ "no-archived-swimlanes": "Žádné swimlane v koši",
"no-results": "Žádné výsledky",
"normal": "Normální",
"normal-desc": "Může zobrazovat a upravovat karty. Nemůže měnit nastavení.",
"not-accepted-yet": "Pozvánka ještě nebyla přijmuta",
- "notify-participate": "Receive updates to any cards you participate as creater or member",
- "notify-watch": "Receive updates to any boards, lists, or cards you’re watching",
+ "notify-participate": "Dostane aktualizace do všech karet, ve kterých se účastní jako tvůrce nebo člen",
+ "notify-watch": "Dostane aktualitace to všech tabel, seznamů nebo karet, které sledujete",
"optional": "volitelný",
"or": "nebo",
"page-maybe-private": "Tato stránka může být soukromá. Můžete ji zobrazit po <a href='%s'>přihlášení</a>.",
"page-not-found": "Stránka nenalezena.",
"password": "Heslo",
"paste-or-dragdrop": "vložit, nebo přetáhnout a pustit soubor obrázku (pouze obrázek)",
- "participating": "Participating",
+ "participating": "Zúčastnění",
"preview": "Náhled",
"previewAttachedImagePopup-title": "Náhled",
"previewClipboardImagePopup-title": "Náhled",
@@ -294,8 +321,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": "Remove Label",
- "listDeletePopup-title": "Delete List ?",
+ "remove-label": "Odstranit štítek",
+ "listDeletePopup-title": "Smazat seznam?",
"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.",
@@ -305,9 +332,13 @@
"restore": "Obnovit",
"save": "Uložit",
"search": "Hledat",
- "select-color": "Select Color",
+ "search-cards": "Hledat nadpisy a popisy karet v tomto tablu",
+ "search-example": "Hledaný text",
+ "select-color": "Vybrat barvu",
+ "set-wip-limit-value": "Nastaví limit pro maximální počet úkolů v seznamu.",
+ "setWipLimitPopup-title": "Nastavit WIP Limit",
"shortcut-assign-self": "Přiřadit sebe k aktuální kartě",
- "shortcut-autocomplete-emoji": "Autocomplete emoji",
+ "shortcut-autocomplete-emoji": "Automatické dokončování emoji",
"shortcut-autocomplete-members": "Automatický výběr uživatel",
"shortcut-clear-filters": "Vyčistit všechny filtry",
"shortcut-close-dialog": "Zavřít dialog",
@@ -315,9 +346,9 @@
"shortcut-show-shortcuts": "Otevřít tento seznam odkazů",
"shortcut-toggle-filterbar": "Přepnout lištu filtrování",
"shortcut-toggle-sidebar": "Přepnout lištu tabla",
- "show-cards-minimum-count": "Show cards count if list contains more than",
- "sidebar-open": "Open Sidebar",
- "sidebar-close": "Close Sidebar",
+ "show-cards-minimum-count": "Zobrazit počet karet pokud seznam obsahuje více než ",
+ "sidebar-open": "Otevřít boční panel",
+ "sidebar-close": "Zavřít boční panel",
"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",
@@ -326,52 +357,64 @@
"team": "Tým",
"this-board": "toto tablo",
"this-card": "tuto kartu",
- "time": "Time",
+ "spent-time-hours": "Strávený čas (hodiny)",
+ "overtime-hours": "Přesčas (hodiny)",
+ "overtime": "Přesčas",
+ "has-overtime-cards": "Obsahuje karty s přesčasy",
+ "has-spenttime-cards": "Obsahuje karty se stráveným časem",
+ "time": "Čas",
"title": "Název",
- "tracking": "Tracking",
- "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
+ "tracking": "Pozorující",
+ "tracking-info": "Budete informováni o všech změnách v kartách, u kterých jste tvůrce nebo člen.",
"unassign-member": "Vyřadit člena",
"unsaved-description": "Popis neni uložen.",
- "unwatch": "Unwatch",
+ "unwatch": "Přestat sledovat",
"upload": "Nahrát",
"upload-avatar": "Nahrát avatar",
"uploaded-avatar": "Avatar nahrán",
"username": "Uživatelské jméno",
"view-it": "Zobrazit",
- "warn-list-archived": "varování: tato karta je v archivovaném seznamu",
- "watch": "Watch",
- "watching": "Watching",
- "watching-info": "You will be notified of any change in this board",
- "welcome-board": "Welcome Board",
- "welcome-list1": "Basics",
- "welcome-list2": "Advanced",
+ "warn-list-archived": "varování: tuto kartu obsahuje seznam v koši",
+ "watch": "Sledovat",
+ "watching": "Sledující",
+ "watching-info": "Bude vám oznámena každá změna v tomto tablu",
+ "welcome-board": "Uvítací tablo",
+ "welcome-swimlane": "Milník 1",
+ "welcome-list1": "Základní",
+ "welcome-list2": "Pokročilé",
"what-to-do": "Co chcete dělat?",
- "admin-panel": "Admin Panel",
+ "wipLimitErrorPopup-title": "Neplatný WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "Počet úkolů v tomto seznamu je vyšší než definovaný WIP limit.",
+ "wipLimitErrorPopup-dialog-pt2": "Přesuňte prosím některé úkoly mimo tento seznam, nebo nastavte vyšší WIP limit.",
+ "admin-panel": "Administrátorský panel",
"settings": "Nastavení",
"people": "Lidé",
"registration": "Registrace",
- "disable-self-registration": "Disable Self-Registration",
+ "disable-self-registration": "Vypnout svévolnou registraci",
"invite": "Pozvánka",
- "invite-people": "Invite People",
- "to-boards": "To board(s)",
+ "invite-people": "Pozvat lidi",
+ "to-boards": "Do tabel",
"email-addresses": "Emailové adresy",
- "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-description": "Adresa SMTP serveru, který zpracovává vaše emaily.",
+ "smtp-port-description": "Port, který používá Váš SMTP server pro odchozí emaily.",
+ "smtp-tls-description": "Zapnout TLS podporu pro SMTP server",
"smtp-host": "SMTP Host",
"smtp-port": "SMTP Port",
"smtp-username": "Uživatelské jméno",
"smtp-password": "Heslo",
- "smtp-tls": "TLS support",
+ "smtp-tls": "podpora TLS",
"send-from": "Od",
- "invitation-code": "Invitation Code",
+ "send-smtp-test": "Poslat si zkušební email.",
+ "invitation-code": "Kód pozvánky",
"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",
+ "email-invite-register-text": "Ahoj __user__,\n\n__inviter__ tě přizval ke spolupráci ve Wekanu.\n\nNásleduj prosím odkaz níže:\n\n__url__\n\nKód Tvé pozvánky je: __icode__\n\nDěkujeme.",
+ "email-smtp-test-subject": "SMTP Testovací email z Wekanu",
+ "email-smtp-test-text": "Email byl úspěšně odeslán",
+ "error-invitation-code-not-exist": "Kód pozvánky neexistuje.",
"error-notAuthorized": "Nejste autorizován k prohlížení této stránky.",
- "outgoing-webhooks": "Outgoing Webhooks",
- "outgoingWebhooksPopup-title": "Outgoing Webhooks",
- "new-outgoing-webhook": "New Outgoing Webhook",
+ "outgoing-webhooks": "Odchozí Webhooky",
+ "outgoingWebhooksPopup-title": "Odchozí Webhooky",
+ "new-outgoing-webhook": "Nové odchozí Webhooky",
"no-name": "(Neznámé)",
"Wekan_version": "Wekan verze",
"Node_version": "Node verze",
@@ -379,10 +422,10 @@
"OS_Cpus": "OS Počet CPU",
"OS_Freemem": "OS Volná paměť",
"OS_Loadavg": "OS Průměrná zátěž systém",
- "OS_Platform": "OS Platform",
- "OS_Release": "OS Release",
+ "OS_Platform": "Platforma OS",
+ "OS_Release": "Verze OS",
"OS_Totalmem": "OS Celková paměť",
- "OS_Type": "OS Type",
+ "OS_Type": "Typ OS",
"OS_Uptime": "OS Doba běhu systému",
"hours": "hodin",
"minutes": "minut",
@@ -390,5 +433,15 @@
"yes": "Ano",
"no": "Ne",
"accounts": "Účty",
- "accounts-allowEmailChange": "Povolit změnu Emailu"
+ "accounts-allowEmailChange": "Povolit změnu Emailu",
+ "accounts-allowUserNameChange": "Povolit změnu uživatelského jména",
+ "createdAt": "Vytvořeno v",
+ "verified": "Ověřen",
+ "active": "Aktivní",
+ "card-received": "Přijato",
+ "card-received-on": "Přijaté v",
+ "card-end": "Konec",
+ "card-end-on": "Končí v",
+ "editCardReceivedDatePopup-title": "Změnit datum přijetí",
+ "editCardEndDatePopup-title": "Změnit datum konce"
} \ No newline at end of file
diff --git a/i18n/de.i18n.json b/i18n/de.i18n.json
index bc1120ed..ee508a2c 100644
--- a/i18n/de.i18n.json
+++ b/i18n/de.i18n.json
@@ -9,9 +9,10 @@
"act-createCard": "hat __card__ zu __list__ hinzugefügt",
"act-createList": "hat __list__ zu __board__ hinzugefügt",
"act-addBoardMember": "hat __member__ zu __board__ hinzugefügt",
- "act-archivedBoard": "hat __board__ archiviert",
- "act-archivedCard": "hat __card__ archiviert",
- "act-archivedList": "hat __list__ archiviert",
+ "act-archivedBoard": "__board__ in den Papierkorb verschoben",
+ "act-archivedCard": "__card__ in den Papierkorb verschoben",
+ "act-archivedList": "__list__ in den Papierkorb verschoben",
+ "act-archivedSwimlane": "__swimlane__ in den Papierkorb verschoben",
"act-importBoard": "hat __board__ importiert",
"act-importCard": "hat __card__ importiert",
"act-importList": "hat __list__ importiert",
@@ -26,7 +27,7 @@
"activities": "Aktivitäten",
"activity": "Aktivität",
"activity-added": "hat %s zu %s hinzugefügt",
- "activity-archived": "hat %s archiviert",
+ "activity-archived": "%s in den Papierkorb verschoben",
"activity-attached": "hat %s an %s angehängt",
"activity-created": "hat %s erstellt",
"activity-excluded": "hat %s von %s ausgeschlossen",
@@ -44,6 +45,7 @@
"add-attachment": "Datei anhängen",
"add-board": "neues Board",
"add-card": "Karte hinzufügen",
+ "add-swimlane": "Swimlane hinzufügen",
"add-checklist": "Checkliste hinzufügen",
"add-checklist-item": "Punkt zu einer Checkliste hinzufügen",
"add-cover": "Cover hinzufügen",
@@ -53,28 +55,32 @@
"added": "Hinzugefügt",
"addMemberPopup-title": "Mitglieder",
"admin": "Admin",
- "admin-desc": "Kann Karten anschauen und bearbeiten, Mitglieder entfernen und Boardeinstellungen ändern.",
+ "admin-desc": "Kann Karten anzeigen und bearbeiten, Mitglieder entfernen und Boardeinstellungen ändern.",
+ "admin-announcement": "Ankündigung",
+ "admin-announcement-active": "Aktive systemweite Ankündigungen",
+ "admin-announcement-title": "Ankündigung des Administrators",
"all-boards": "Alle Boards",
"and-n-other-card": "und eine andere Karte",
"and-n-other-card_plural": "und __count__ andere Karten",
"apply": "Übernehmen",
"app-is-offline": "Wekan lädt gerade, bitte warten Sie. Wenn Sie die Seite neu laden, gehen nicht übertragene Änderungen verloren. Sollte Wekan nicht geladen werden, überprüfen Sie bitte, ob der Server noch läuft.",
- "archive": "Archiv",
- "archive-all": "Alles archivieren",
- "archive-board": "Board archivieren",
- "archive-card": "Karte archivieren",
- "archive-list": "Liste archivieren",
- "archive-selection": "Auswahl archivieren",
- "archiveBoardPopup-title": "Board archivieren?",
- "archived-items": "Archivierte Einträge",
- "archived-boards": "Achivierte Boards",
+ "archive": "In den Papierkorb verschieben",
+ "archive-all": "Alles in den Papierkorb verschieben",
+ "archive-board": "Board in den Papierkorb verschieben",
+ "archive-card": "Karte in den Papierkorb verschieben",
+ "archive-list": "Liste in den Papierkorb verschieben",
+ "archive-swimlane": "Swimlane in den Papierkorb verschieben",
+ "archive-selection": "Auswahl in den Papierkorb verschieben",
+ "archiveBoardPopup-title": "Board in den Papierkorb verschieben?",
+ "archived-items": "Papierkorb",
+ "archived-boards": "Boards im Papierkorb",
"restore-board": "Board wiederherstellen",
- "no-archived-boards": "keine archivierten Boards",
- "archives": "Archive",
+ "no-archived-boards": "Keine Boards im Papierkorb.",
+ "archives": "Papierkorb",
"assign-member": "Mitglied zuweisen",
"attached": "angehängt",
"attachment": "Anhang",
- "attachment-delete-pop": "Das Löschen eines Anhangs kann nicht wieder rückgängig gemacht werden.",
+ "attachment-delete-pop": "Das Löschen eines Anhangs kann nicht rückgängig gemacht werden.",
"attachmentDeletePopup-title": "Anhang löschen?",
"attachments": "Anhänge",
"auto-watch": "Neue Boards nach Erstellung automatisch beobachten",
@@ -85,21 +91,25 @@
"board-not-found": "Board nicht gefunden",
"board-private-info": "Dieses Board wird <strong>privat</strong> sein.",
"board-public-info": "Dieses Board wird <strong>öffentlich</strong> sein.",
- "boardChangeColorPopup-title": "Boardfarbe ändern",
+ "boardChangeColorPopup-title": "Farbe des Boards ändern",
"boardChangeTitlePopup-title": "Board umbenennen",
"boardChangeVisibilityPopup-title": "Sichtbarkeit ändern",
"boardChangeWatchPopup-title": "Beobachtung ändern",
"boardMenuPopup-title": "Boardmenü",
"boards": "Boards",
+ "board-view": "Boardansicht",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Listen",
"bucket-example": "z.B. \"Löffelliste\"",
"cancel": "Abbrechen",
- "card-archived": "Diese Karte wurde archiviert.",
- "card-comments-title": "Diese Karte hat %s Kommentare.",
- "card-delete-notice": "Löschen ist unwiderruflich. Alle Aktionen die dieser Karte zugeordnet sind werden ebenfalls gelöscht.",
- "card-delete-pop": "Alle Aktionen werden vom Aktivitätsfeed entfernt und die Karte kann nicht mehr geöffnet werden. Das Löschen kann nicht widerrufen werden!",
- "card-delete-suggest-archive": "Sie können eine Karte archivieren, um sie von dem Board zu entfernen und die Aktivitäten zu behalten.",
- "card-due": "Ende",
- "card-due-on": "Ende am",
+ "card-archived": "Diese Karte wurde in den Papierkorb verschoben",
+ "card-comments-title": "Diese Karte hat %s Kommentar(e).",
+ "card-delete-notice": "Löschen kann nicht rückgängig gemacht werden. Alle Aktionen, die dieser Karte zugeordnet sind, werden ebenfalls gelöscht.",
+ "card-delete-pop": "Alle Aktionen werden aus dem Aktivitätsfeed entfernt und die Karte kann nicht wiedereröffnet werden. Die Aktion kann nicht rückgängig gemacht werden.",
+ "card-delete-suggest-archive": "Sie können eine Karte in den Papierkorb verschieben, um sie vom Board zu entfernen und die Aktivitäten zu behalten.",
+ "card-due": "Fällig",
+ "card-due-on": "Fällig am",
+ "card-spent": "Aufgewendete Zeit",
"card-edit-attachments": "Anhänge ändern",
"card-edit-labels": "Labels ändern",
"card-edit-members": "Mitglieder ändern",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "Mitglieder",
"cardMorePopup-title": "Mehr",
"cards": "Karten",
+ "cards-count": "Karten",
"change": "Ändern",
"change-avatar": "Profilbild ändern",
"change-password": "Passwort ändern",
@@ -125,12 +136,12 @@
"changePermissionsPopup-title": "Berechtigungen ändern",
"changeSettingsPopup-title": "Einstellungen ändern",
"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.",
+ "click-to-star": "Klicken Sie, um das Board mit einem Stern zu markieren.",
+ "click-to-unstar": "Klicken Sie, um den Stern vom Board zu entfernen.",
"clipboard": "Zwischenablage oder Drag & Drop",
"close": "Schließen",
"close-board": "Board schließen",
- "close-board-pop": "Sie können das Board wiederherstellen, indem Sie den \"Archiv\"-Button in der Kopfzeile der Startseite anklicken.",
+ "close-board-pop": "Sie können das Board wiederherstellen, indem Sie die Schaltfläche \"Papierkorb\" in der Kopfzeile der Startseite anklicken.",
"color-black": "schwarz",
"color-blue": "blau",
"color-green": "grün",
@@ -146,8 +157,12 @@
"comment-only": "Nur kommentierbar",
"comment-only-desc": "Kann Karten nur Kommentieren",
"computer": "Computer",
- "copy-card-link-to-clipboard": "Kopiere die Karte in die Zwischenablage",
+ "confirm-checklist-delete-dialog": "Sind Sie sicher, dass Sie die Checkliste löschen möchten?",
+ "copy-card-link-to-clipboard": "Kopiere Link zur Karte in die Zwischenablage",
"copyCardPopup-title": "Karte kopieren",
+ "copyChecklistToManyCardsPopup-title": "Checklistenvorlage in mehrere Karten kopieren",
+ "copyChecklistToManyCardsPopup-instructions": "Titel und Beschreibungen der Zielkarten im folgenden JSON-Format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Titel der ersten Karte\", \"description\":\"Beschreibung der ersten Karte\"}, {\"title\":\"Titel der zweiten Karte\",\"description\":\"Beschreibung der zweiten Karte\"},{\"title\":\"Titel der letzten Karte\",\"description\":\"Beschreibung der letzten Karte\"} ]",
"create": "Erstellen",
"createBoardPopup-title": "Board erstellen",
"chooseBoardSourcePopup-title": "Board importieren",
@@ -167,8 +182,11 @@
"edit": "Bearbeiten",
"edit-avatar": "Profilbild ändern",
"edit-profile": "Profil ändern",
+ "edit-wip-limit": "WIP-Limit bearbeiten",
+ "soft-wip-limit": "Soft WIP-Limit",
"editCardStartDatePopup-title": "Startdatum ändern",
- "editCardDueDatePopup-title": "Enddatum ändern",
+ "editCardDueDatePopup-title": "Fälligkeitsdatum ändern",
+ "editCardSpentTimePopup-title": "Aufgewendete Zeit ändern",
"editLabelPopup-title": "Label ändern",
"editNotificationPopup-title": "Benachrichtigung ändern",
"editProfilePopup-title": "Profil ändern",
@@ -176,6 +194,7 @@
"email-enrollAccount-subject": "Ihr Benutzerkonto auf __siteName__ wurde erstellt",
"email-enrollAccount-text": "Hallo __user__,\n\num den Dienst nutzen zu können, klicken Sie bitte auf folgenden Link:\n\n__url__\n\nDanke.",
"email-fail": "Senden der E-Mail fehlgeschlagen",
+ "email-fail-text": "Fehler beim Senden des E-Mails",
"email-invalid": "Ungültige E-Mail-Adresse",
"email-invite": "via E-Mail einladen",
"email-invite-subject": "__inviter__ hat Ihnen eine Einladung geschickt",
@@ -185,6 +204,7 @@
"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.",
+ "enable-wip-limit": "WIP-Limit einschalten",
"error-board-doesNotExist": "Dieses Board existiert nicht",
"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",
@@ -203,7 +223,7 @@
"filter-no-label": "Kein Label",
"filter-no-member": "Kein Mitglied",
"filter-on": "Filter ist aktiv",
- "filter-on-desc": "Sie filtern die Karten in diesem Board. Klicken um die Filter zu bearbeiten.",
+ "filter-on-desc": "Sie filtern die Karten in diesem Board. Klicken Sie, um den Filter zu bearbeiten.",
"filter-to-selection": "Ergebnisse auswählen",
"fullname": "Vollständiger Name",
"header-logo-title": "Zurück zur Board Seite.",
@@ -222,35 +242,41 @@
"import-board-instruction-wekan": "Gehen Sie in Ihrem Wekan board auf 'Menü', und dann auf 'Board exportieren'. Kopieren Sie anschließend den Text aus der heruntergeladenen Datei.",
"import-json-placeholder": "Fügen Sie die korrekten JSON-Daten hier ein",
"import-map-members": "Mitglieder zuordnen",
- "import-members-map": "Das importierte Board hat einige Mitglieder. Bitte ordnen Sie die Mitglieder, die importiert werden sollen, Wekan-Nutzern zu",
+ "import-members-map": "Das importierte Board hat Mitglieder. Bitte ordnen Sie jene, die importiert werden sollen, vorhandenen Wekan-Nutzern zu",
"import-show-user-mapping": "Mitgliederzuordnung überprüfen",
"import-user-select": "Wählen Sie den Wekan-Nutzer aus, der dieses Mitglied sein soll",
"importMapMembersAddPopup-title": "Wekan-Nutzer auswählen",
"info": "Version",
"initials": "Initialen",
"invalid-date": "Ungültiges Datum",
+ "invalid-time": "Ungültige Zeitangabe",
+ "invalid-user": "Ungültiger Benutzer",
"joined": "beigetreten",
"just-invited": "Sie wurden soeben zu diesem Board eingeladen",
"keyboard-shortcuts": "Tastaturkürzel",
"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.",
+ "label-delete-pop": "Aktion kann nicht rückgängig gemacht werden. Das Label wird von allen Karten entfernt und seine Historie gelöscht.",
"labels": "Labels",
"language": "Sprache",
"last-admin-desc": "Sie können keine Rollen ändern, weil es mindestens einen Administrator geben muss.",
"leave-board": "Board verlassen",
+ "leave-board-pop": "Sind Sie sicher, dass Sie __boardTitle__ verlassen möchten? Sie werden von allen Karten in diesem Board entfernt.",
+ "leaveBoardPopup-title": "Board verlassen?",
"link-card": "Link zu dieser Karte",
- "list-archive-cards": "Alle Karten in dieser Liste archivieren",
- "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-archive-cards": "Alle Karten dieser Liste in den Papierkorb verschieben",
+ "list-archive-cards-pop": "Alle Karten dieser Liste werden vom Board entfernt. Um Karten im Papierkorb anzuzeigen und wiederherzustellen, klicken Sie auf \"Menü\" > \"Papierkorb\".",
"list-move-cards": "Alle Karten in dieser Liste verschieben",
"list-select-cards": "Alle Karten in dieser Liste auswählen",
"listActionPopup-title": "Listenaktionen",
+ "swimlaneActionPopup-title": "Swimlaneaktionen",
"listImportCardPopup-title": "Eine Trello-Karte importieren",
"listMorePopup-title": "Mehr",
"link-list": "Link zu dieser Liste",
- "list-delete-pop": "Alle Aktionen werden aus dem Verlauf gelöscht. Die Liste kann nicht wiederhergestellt werden.",
- "list-delete-suggest-archive": "Listen können archiviert werden um sie aus dem Board zu entfernen und den Verlauf zu erhalten.",
+ "list-delete-pop": "Alle Aktionen werden aus dem Verlauf gelöscht und die Liste kann nicht wiederhergestellt werden.",
+ "list-delete-suggest-archive": "Listen können in den Papierkorb verschoben werden, um sie aus dem Board zu entfernen und die Aktivitäten zu behalten.",
"lists": "Listen",
+ "swimlanes": "Swimlanes",
"log-out": "Ausloggen",
"log-in": "Einloggen",
"loginPopup-title": "Einloggen",
@@ -259,22 +285,23 @@
"menu": "Menü",
"move-selection": "Auswahl verschieben",
"moveCardPopup-title": "Karte verschieben",
- "moveCardToBottom-title": "Zum Ende verschieben",
+ "moveCardToBottom-title": "Ans Ende verschieben",
"moveCardToTop-title": "Zum Anfang verschieben",
"moveSelectionPopup-title": "Auswahl verschieben",
"multi-selection": "Mehrfachauswahl",
"multi-selection-on": "Mehrfachauswahl ist aktiv",
"muted": "Stumm",
- "muted-info": "Sie werden über keine Änderung in diesem Board benachrichtigt",
+ "muted-info": "Sie werden nicht über Änderungen auf diesem Board benachrichtigt",
"my-boards": "Meine Boards",
"name": "Name",
- "no-archived-cards": "Keine archivierten Karten.",
- "no-archived-lists": "Keine archivierten Listen.",
+ "no-archived-cards": "Keine Karten im Papierkorb.",
+ "no-archived-lists": "Keine Listen im Papierkorb.",
+ "no-archived-swimlanes": "Keine Swimlanes im Papierkorb.",
"no-results": "Keine Ergebnisse",
"normal": "Normal",
- "normal-desc": "Kann Karten anschauen und bearbeiten, aber keine Einstellungen ändern.",
+ "normal-desc": "Kann Karten anzeigen und bearbeiten, aber keine Einstellungen ändern.",
"not-accepted-yet": "Die Einladung wurde noch nicht angenommen",
- "notify-participate": "Benachrichtigungen über alle Karten erhalten, bei denen Sie als Ersteller oder Mitglied teilnehmen",
+ "notify-participate": "Benachrichtigungen zu allen Karten erhalten, an denen Sie teilnehmen",
"notify-watch": "Benachrichtigungen über alle Boards, Listen oder Karten erhalten, die Sie beobachten",
"optional": "optional",
"or": "oder",
@@ -305,7 +332,11 @@
"restore": "Wiederherstellen",
"save": "Speichern",
"search": "Suchen",
+ "search-cards": "Suche nach Kartentiteln und Beschreibungen auf diesem Board",
+ "search-example": "Suchbegriff",
"select-color": "Farbe auswählen",
+ "set-wip-limit-value": "Setzen Sie ein Limit für die maximale Anzahl von Aufgaben in dieser Liste",
+ "setWipLimitPopup-title": "WIP-Limit setzen",
"shortcut-assign-self": "Fügen Sie sich zur aktuellen Karte hinzu",
"shortcut-autocomplete-emoji": "Emojis vervollständigen",
"shortcut-autocomplete-members": "Mitglieder vervollständigen",
@@ -319,13 +350,18 @@
"sidebar-open": "Seitenleiste öffnen",
"sidebar-close": "Seitenleiste schließen",
"signupPopup-title": "Benutzerkonto erstellen",
- "star-board-title": "Klicken um das Board mit einem Stern zu markieren. Es erscheint dann oben in ihrer Boardliste.",
+ "star-board-title": "Klicken Sie, 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",
"team": "Team",
"this-board": "dieses Board",
"this-card": "diese Karte",
+ "spent-time-hours": "Aufgewendete Zeit (Stunden)",
+ "overtime-hours": "Mehrarbeit (Stunden)",
+ "overtime": "Mehrarbeit",
+ "has-overtime-cards": "Hat Karten mit Mehrarbeit",
+ "has-spenttime-cards": "Hat Karten mit aufgewendeten Zeiten",
"time": "Zeit",
"title": "Titel",
"tracking": "Folgen",
@@ -338,14 +374,18 @@
"uploaded-avatar": "Profilbild hochgeladen",
"username": "Benutzername",
"view-it": "Ansehen",
- "warn-list-archived": "Warnung: Diese Karte befindet sich in einer archivierten Liste",
+ "warn-list-archived": "Warnung: Diese Karte befindet sich in einer Liste im Papierkorb!",
"watch": "Beobachten",
"watching": "Beobachten",
"watching-info": "Sie werden über alle Änderungen in diesem Board benachrichtigt",
"welcome-board": "Willkommen-Board",
+ "welcome-swimlane": "Meilenstein 1",
"welcome-list1": "Grundlagen",
"welcome-list2": "Fortgeschritten",
"what-to-do": "Was wollen Sie tun?",
+ "wipLimitErrorPopup-title": "Ungültiges WIP-Limit",
+ "wipLimitErrorPopup-dialog-pt1": "Die Anzahl von Aufgaben in dieser Liste ist größer als das von Ihnen definierte WIP-Limit.",
+ "wipLimitErrorPopup-dialog-pt2": "Bitte verschieben Sie einige Aufgaben aus dieser Liste oder setzen Sie ein grösseres WIP-Limit.",
"admin-panel": "Administration",
"settings": "Einstellungen",
"people": "Nutzer",
@@ -364,9 +404,12 @@
"smtp-password": "Passwort",
"smtp-tls": "TLS Unterstützung",
"send-from": "Absender",
+ "send-smtp-test": "Test-E-Mail an sich selbst schicken",
"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.",
+ "email-smtp-test-subject": "SMTP-Test-E-Mail von Wekan",
+ "email-smtp-test-text": "Sie haben erfolgreich eine E-Mail versandt",
"error-invitation-code-not-exist": "Ungültiger Einladungscode",
"error-notAuthorized": "Sie sind nicht berechtigt diese Seite zu sehen.",
"outgoing-webhooks": "Ausgehende Webhooks",
@@ -390,5 +433,15 @@
"yes": "Ja",
"no": "Nein",
"accounts": "Konten",
- "accounts-allowEmailChange": "Zulassen E-Mail ändern"
+ "accounts-allowEmailChange": "Ändern der E-Mailadresse erlauben",
+ "accounts-allowUserNameChange": "Ändern des Benutzernamens erlauben",
+ "createdAt": "Erstellt am",
+ "verified": "Geprüft",
+ "active": "Aktiv",
+ "card-received": "Empfangen",
+ "card-received-on": "Empfangen am",
+ "card-end": "Ende",
+ "card-end-on": "Endet am",
+ "editCardReceivedDatePopup-title": "Empfangsdatum ändern",
+ "editCardEndDatePopup-title": "Enddatum ändern"
} \ No newline at end of file
diff --git a/i18n/el.i18n.json b/i18n/el.i18n.json
new file mode 100644
index 00000000..0befbe1f
--- /dev/null
+++ b/i18n/el.i18n.json
@@ -0,0 +1,447 @@
+{
+ "accept": "Accept",
+ "act-activity-notify": "[Wekan] Activity Notification",
+ "act-addAttachment": "attached __attachment__ to __card__",
+ "act-addChecklist": "added checklist __checklist__ to __card__",
+ "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __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": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
+ "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": "%s moved to Recycle Bin",
+ "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",
+ "activity-checklist-item-added": "added checklist item to '%s' in %s",
+ "add": "Προσθήκη",
+ "add-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Προσθήκη Κάρτας",
+ "add-swimlane": "Add Swimlane",
+ "add-checklist": "Add Checklist",
+ "add-checklist-item": "Add an item to checklist",
+ "add-cover": "Add Cover",
+ "add-label": "Προσθήκη Ετικέτας",
+ "add-list": "Προσθήκη Λίστας",
+ "add-members": "Προσθήκη Μελών",
+ "added": "Προστέθηκε",
+ "addMemberPopup-title": "Μέλοι",
+ "admin": "Διαχειριστής",
+ "admin-desc": "Can view and edit cards, remove members, and change settings for the board.",
+ "admin-announcement": "Announcement",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Announcement from Administrator",
+ "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": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
+ "restore-board": "Restore Board",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
+ "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": "Πίσω",
+ "board-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",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Λίστες",
+ "bucket-example": "Like “Bucket List” for example",
+ "cancel": "Ακύρωση",
+ "card-archived": "This card is moved to Recycle Bin.",
+ "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 move a card Recycle Bin to remove it from the board and preserve the activity.",
+ "card-due": "Έως",
+ "card-due-on": "Έως τις",
+ "card-spent": "Spent Time",
+ "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": "Διαγραφή Κάρτας;",
+ "cardDetailsActionsPopup-title": "Card Actions",
+ "cardLabelsPopup-title": "Ετικέτες",
+ "cardMembersPopup-title": "Μέλοι",
+ "cardMorePopup-title": "Περισσότερα",
+ "cards": "Κάρτες",
+ "cards-count": "Κάρτες",
+ "change": "Αλλαγή",
+ "change-avatar": "Change Avatar",
+ "change-password": "Αλλαγή Κωδικού",
+ "change-permissions": "Change permissions",
+ "change-settings": "Αλλαγή Ρυθμίσεων",
+ "changeAvatarPopup-title": "Change Avatar",
+ "changeLanguagePopup-title": "Αλλαγή Γλώσσας",
+ "changePasswordPopup-title": "Αλλαγή Κωδικού",
+ "changePermissionsPopup-title": "Change Permissions",
+ "changeSettingsPopup-title": "Αλλαγή Ρυθμίσεων",
+ "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-board": "Close Board",
+ "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
+ "color-black": "μαύρο",
+ "color-blue": "μπλε",
+ "color-green": "πράσινο",
+ "color-lime": "λάιμ",
+ "color-orange": "πορτοκαλί",
+ "color-pink": "ροζ",
+ "color-purple": "μωβ",
+ "color-red": "κόκκινο",
+ "color-sky": "ουρανός",
+ "color-yellow": "κίτρινο",
+ "comment": "Comment",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "Can comment on cards only.",
+ "computer": "Υπολογιστής",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+ "copy-card-link-to-clipboard": "Copy card link to clipboard",
+ "copyCardPopup-title": "Copy Card",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
+ "create": "Δημιουργία",
+ "createBoardPopup-title": "Create Board",
+ "chooseBoardSourcePopup-title": "Import board",
+ "createLabelPopup-title": "Create Label",
+ "current": "current",
+ "date": "Ημερομηνία",
+ "decline": "Decline",
+ "default-avatar": "Default avatar",
+ "delete": "Διαγραφή",
+ "deleteLabelPopup-title": "Delete Label?",
+ "description": "Description",
+ "disambiguateMultiLabelPopup-title": "Disambiguate Label Action",
+ "disambiguateMultiMemberPopup-title": "Disambiguate Member Action",
+ "discard": "Απόρριψη",
+ "done": "Done",
+ "download": "Download",
+ "edit": "Edit",
+ "edit-avatar": "Change Avatar",
+ "edit-profile": "Edit Profile",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
+ "editCardStartDatePopup-title": "Change start date",
+ "editCardDueDatePopup-title": "Change due date",
+ "editCardSpentTimePopup-title": "Change spent time",
+ "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-fail-text": "Error trying to send email",
+ "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.",
+ "enable-wip-limit": "Enable WIP Limit",
+ "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": "Το κείμενο δεν είναι έγκυρο 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",
+ "error-email-taken": "Email has already been taken",
+ "export-board": "Export board",
+ "filter": "Φίλτρο",
+ "filter-cards": "Filter Cards",
+ "filter-clear": "Clear filter",
+ "filter-no-label": "No label",
+ "filter-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": "Πλήρες Όνομα",
+ "header-logo-title": "Go back to your boards page.",
+ "hide-system-messages": "Hide system messages",
+ "headerBarCreateBoardPopup-title": "Create Board",
+ "home": "Home",
+ "import": "Εισαγωγή",
+ "import-board": "import board",
+ "import-board-c": "Import board",
+ "import-board-title-trello": "Import board from Trello",
+ "import-board-title-wekan": "Import board from Wekan",
+ "import-sandstorm-warning": "Imported board will delete all existing data on board and replace it with imported board.",
+ "from-trello": "Από το Trello",
+ "from-wekan": "Από το Wekan",
+ "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.",
+ "import-board-instruction-wekan": "In your Wekan board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.",
+ "import-json-placeholder": "Paste your valid JSON data here",
+ "import-map-members": "Map members",
+ "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users",
+ "import-show-user-mapping": "Review members mapping",
+ "import-user-select": "Pick the Wekan user you want to use as this member",
+ "importMapMembersAddPopup-title": "Select Wekan member",
+ "info": "Έκδοση",
+ "initials": "Initials",
+ "invalid-date": "Invalid date",
+ "invalid-time": "Invalid time",
+ "invalid-user": "Invalid user",
+ "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": "Ετικέτες",
+ "language": "Γλώσσα",
+ "last-admin-desc": "You can’t change roles because there must be at least one admin.",
+ "leave-board": "Leave Board",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "Leave Board ?",
+ "link-card": "Link to this card",
+ "list-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
+ "list-move-cards": "Move all cards in this list",
+ "list-select-cards": "Select all cards in this list",
+ "listActionPopup-title": "List Actions",
+ "swimlaneActionPopup-title": "Swimlane Actions",
+ "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 move a list to Recycle Bin to remove it from the board and preserve the activity.",
+ "lists": "Λίστες",
+ "swimlanes": "Swimlanes",
+ "log-out": "Αποσύνδεση",
+ "log-in": "Σύνδεση",
+ "loginPopup-title": "Σύνδεση",
+ "memberMenuPopup-title": "Member Settings",
+ "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": "Όνομα",
+ "no-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
+ "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": "ή",
+ "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": "Η σελίδα δεν βρέθηκε.",
+ "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": "Διαγραφή Λίστας;",
+ "remove-member": "Αφαίρεση Μέλους",
+ "remove-member-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": "Αφαίρεση Μέλους;",
+ "rename": "Μετανομασία",
+ "rename-board": "Rename Board",
+ "restore": "Restore",
+ "save": "Αποθήκευση",
+ "search": "Αναζήτηση",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text to search for?",
+ "select-color": "Επιλέξτε Χρώμα",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
+ "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": "Δημιουργία Λογαριασμού",
+ "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": "Ομάδα",
+ "this-board": "this board",
+ "this-card": "αυτή η κάρτα",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
+ "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 list at Recycle Bin",
+ "watch": "Watch",
+ "watching": "Watching",
+ "watching-info": "You will be notified of any change in this board",
+ "welcome-board": "Welcome Board",
+ "welcome-swimlane": "Milestone 1",
+ "welcome-list1": "Basics",
+ "welcome-list2": "Advanced",
+ "what-to-do": "What do you want to do?",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
+ "admin-panel": "Admin Panel",
+ "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 Διευθύνσεις",
+ "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 υποστήριξη",
+ "send-from": "Από",
+ "send-smtp-test": "Send a test email to yourself",
+ "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.",
+ "email-smtp-test-subject": "SMTP Test Email From Wekan",
+ "email-smtp-test-text": "You have successfully sent an email",
+ "error-invitation-code-not-exist": "Ο κωδικός πρόσκλησης δεν υπάρχει",
+ "error-notAuthorized": "You are not authorized to view this page.",
+ "outgoing-webhooks": "Outgoing Webhooks",
+ "outgoingWebhooksPopup-title": "Outgoing Webhooks",
+ "new-outgoing-webhook": "New Outgoing Webhook",
+ "no-name": "(Άγνωστο)",
+ "Wekan_version": "Wekan έκδοση",
+ "Node_version": "Node version",
+ "OS_Arch": "OS Arch",
+ "OS_Cpus": "OS CPU Count",
+ "OS_Freemem": "OS Free Memory",
+ "OS_Loadavg": "OS Load Average",
+ "OS_Platform": "OS Platform",
+ "OS_Release": "OS Release",
+ "OS_Totalmem": "OS Total Memory",
+ "OS_Type": "OS Type",
+ "OS_Uptime": "OS Uptime",
+ "hours": "ώρες",
+ "minutes": "λεπτά",
+ "seconds": "δευτερόλεπτα",
+ "yes": "Ναι",
+ "no": "Όχι",
+ "accounts": "Λογαριασμοί",
+ "accounts-allowEmailChange": "Allow Email Change",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Created at",
+ "verified": "Verified",
+ "active": "Active",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
+} \ No newline at end of file
diff --git a/i18n/en-GB.i18n.json b/i18n/en-GB.i18n.json
index 8db041a5..d9b4c0f9 100644
--- a/i18n/en-GB.i18n.json
+++ b/i18n/en-GB.i18n.json
@@ -9,9 +9,10 @@
"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-archivedBoard": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
"act-importBoard": "imported __board__",
"act-importCard": "imported __card__",
"act-importList": "imported __list__",
@@ -26,7 +27,7 @@
"activities": "Activities",
"activity": "Activity",
"activity-added": "added %s to %s",
- "activity-archived": "archived %s",
+ "activity-archived": "%s moved to Recycle Bin",
"activity-attached": "attached %s to %s",
"activity-created": "created %s",
"activity-excluded": "excluded %s from %s",
@@ -44,6 +45,7 @@
"add-attachment": "Add Attachment",
"add-board": "Add Board",
"add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Add Checklist",
"add-checklist-item": "Add an item to checklist",
"add-cover": "Add Cover",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "Members",
"admin": "Admin",
"admin-desc": "Can view and edit cards, remove members, and change settings for the board.",
+ "admin-announcement": "Announcement",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Announcement from Administrator",
"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": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
- "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",
- "archived-boards": "Archived Boards",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
"restore-board": "Restore Board",
- "no-archived-boards": "No Archived Boards.",
- "archives": "Archives",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
"assign-member": "Assign member",
"attached": "attached",
"attachment": "Attachment",
@@ -80,7 +86,7 @@
"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-change-color": "Change colour",
"board-nb-stars": "%s stars",
"board-not-found": "Board not found",
"board-private-info": "This board will be <strong>private</strong>.",
@@ -91,15 +97,19 @@
"boardChangeWatchPopup-title": "Change Watch",
"boardMenuPopup-title": "Board Menu",
"boards": "Boards",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Lists",
"bucket-example": "Like “Bucket List” for example",
"cancel": "Cancel",
- "card-archived": "This card is archived.",
+ "card-archived": "This card is moved to Recycle Bin.",
"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-delete-suggest-archive": "You can move a card to the Recycle Bin to remove it from the board and preserve its activity.",
"card-due": "Due",
"card-due-on": "Due on",
+ "card-spent": "Spent Time",
"card-edit-attachments": "Edit attachments",
"card-edit-labels": "Edit labels",
"card-edit-members": "Edit members",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "Members",
"cardMorePopup-title": "More",
"cards": "Cards",
+ "cards-count": "Cards",
"change": "Change",
"change-avatar": "Change Avatar",
"change-password": "Change Password",
@@ -130,7 +141,7 @@
"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.",
+ "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
"color-black": "black",
"color-blue": "blue",
"color-green": "green",
@@ -146,8 +157,12 @@
"comment-only": "Comment only",
"comment-only-desc": "Can comment on cards only.",
"computer": "Computer",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
"copy-card-link-to-clipboard": "Copy card link to clipboard",
"copyCardPopup-title": "Copy Card",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
"create": "Create",
"createBoardPopup-title": "Create Board",
"chooseBoardSourcePopup-title": "Import board",
@@ -167,8 +182,11 @@
"edit": "Edit",
"edit-avatar": "Change Avatar",
"edit-profile": "Edit Profile",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
"editCardStartDatePopup-title": "Change start date",
"editCardDueDatePopup-title": "Change due date",
+ "editCardSpentTimePopup-title": "Change spent time",
"editLabelPopup-title": "Change Label",
"editNotificationPopup-title": "Edit Notification",
"editProfilePopup-title": "Edit Profile",
@@ -176,6 +194,7 @@
"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-fail-text": "Error trying to send email",
"email-invalid": "Invalid email",
"email-invite": "Invite via email",
"email-invite-subject": "__inviter__ sent you an invitation",
@@ -185,6 +204,7 @@
"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.",
+ "enable-wip-limit": "Enable WIP Limit",
"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",
@@ -229,6 +249,8 @@
"info": "Version",
"initials": "Initials",
"invalid-date": "Invalid date",
+ "invalid-time": "Invalid time",
+ "invalid-user": "Invalid user",
"joined": "joined",
"just-invited": "You are just invited to this board",
"keyboard-shortcuts": "Keyboard shortcuts",
@@ -239,18 +261,22 @@
"language": "Language",
"last-admin-desc": "You can’t change roles because there must be at least one admin.",
"leave-board": "Leave Board",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "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-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
"list-move-cards": "Move all cards in this list",
"list-select-cards": "Select all cards in this list",
"listActionPopup-title": "List Actions",
+ "swimlaneActionPopup-title": "Swimlane 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.",
+ "list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve its activity.",
"lists": "Lists",
+ "swimlanes": "Swimlanes",
"log-out": "Log Out",
"log-in": "Log In",
"loginPopup-title": "Log In",
@@ -268,8 +294,9 @@
"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-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
"no-results": "No results",
"normal": "Normal",
"normal-desc": "Can view and edit cards. Can't change settings.",
@@ -305,7 +332,11 @@
"restore": "Restore",
"save": "Save",
"search": "Search",
- "select-color": "Select Color",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text to search for?",
+ "select-color": "Select Colour",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
"shortcut-assign-self": "Assign yourself to current card",
"shortcut-autocomplete-emoji": "Autocomplete emoji",
"shortcut-autocomplete-members": "Autocomplete members",
@@ -326,6 +357,11 @@
"team": "Team",
"this-board": "this board",
"this-card": "this card",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"tracking": "Tracking",
@@ -338,14 +374,18 @@
"uploaded-avatar": "Uploaded an avatar",
"username": "Username",
"view-it": "View it",
- "warn-list-archived": "warning: this card is in an archived list",
+ "warn-list-archived": "warning: this card is in a list in the Recycle Bin",
"watch": "Watch",
"watching": "Watching",
"watching-info": "You will be notified of any changes in this board",
"welcome-board": "Welcome Board",
+ "welcome-swimlane": "Milestone 1",
"welcome-list1": "Basics",
"welcome-list2": "Advanced",
"what-to-do": "What do you want to do?",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
"admin-panel": "Admin Panel",
"settings": "Settings",
"people": "People",
@@ -364,9 +404,12 @@
"smtp-password": "Password",
"smtp-tls": "TLS support",
"send-from": "From",
+ "send-smtp-test": "Send a test email to yourself",
"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 collaboration.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.",
+ "email-smtp-test-subject": "SMTP Test Email From Wekan",
+ "email-smtp-test-text": "You have successfully sent an email",
"error-invitation-code-not-exist": "Invitation code doesn't exist",
"error-notAuthorized": "You are not authorised to view this page.",
"outgoing-webhooks": "Outgoing Webhooks",
@@ -390,5 +433,15 @@
"yes": "Yes",
"no": "No",
"accounts": "Accounts",
- "accounts-allowEmailChange": "Allow Email Change"
+ "accounts-allowEmailChange": "Allow Email Change",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Created at",
+ "verified": "Verified",
+ "active": "Active",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
} \ No newline at end of file
diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json
index e954e6eb..e22808fe 100644
--- a/i18n/en.i18n.json
+++ b/i18n/en.i18n.json
@@ -10,9 +10,10 @@
"act-createCustomField": "created custom field __customField__",
"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-archivedBoard": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
"act-importBoard": "imported __board__",
"act-importCard": "imported __card__",
"act-importList": "imported __list__",
@@ -27,7 +28,7 @@
"activities": "Activities",
"activity": "Activity",
"activity-added": "added %s to %s",
- "activity-archived": "archived %s",
+ "activity-archived": "%s moved to Recycle Bin",
"activity-attached": "attached %s to %s",
"activity-created": "created %s",
"activity-customfield-created": "created custom field %s",
@@ -46,6 +47,7 @@
"add-attachment": "Add Attachment",
"add-board": "Add Board",
"add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Add Checklist",
"add-checklist-item": "Add an item to checklist",
"add-cover": "Add Cover",
@@ -56,23 +58,27 @@
"addMemberPopup-title": "Members",
"admin": "Admin",
"admin-desc": "Can view and edit cards, remove members, and change settings for the board.",
+ "admin-announcement": "Announcement",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Announcement from Administrator",
"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": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
- "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",
- "archived-boards": "Archived Boards",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
"restore-board": "Restore Board",
- "no-archived-boards": "No Archived Boards.",
- "archives": "Archives",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
"assign-member": "Assign member",
"attached": "attached",
"attachment": "Attachment",
@@ -93,15 +99,19 @@
"boardChangeWatchPopup-title": "Change Watch",
"boardMenuPopup-title": "Board Menu",
"boards": "Boards",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Lists",
"bucket-example": "Like “Bucket List” for example",
"cancel": "Cancel",
- "card-archived": "This card is archived.",
+ "card-archived": "This card is moved to Recycle Bin.",
"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-delete-suggest-archive": "You can move a card Recycle Bin to remove it from the board and preserve the activity.",
"card-due": "Due",
"card-due-on": "Due on",
+ "card-spent": "Spent Time",
"card-edit-attachments": "Edit attachments",
"card-edit-custom-fields": "Edit custom fields",
"card-edit-labels": "Edit labels",
@@ -119,6 +129,7 @@
"cardMembersPopup-title": "Members",
"cardMorePopup-title": "More",
"cards": "Cards",
+ "cards-count": "Cards",
"change": "Change",
"change-avatar": "Change Avatar",
"change-password": "Change Password",
@@ -135,7 +146,7 @@
"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.",
+ "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
"color-black": "black",
"color-blue": "blue",
"color-green": "green",
@@ -151,8 +162,12 @@
"comment-only": "Comment only",
"comment-only-desc": "Can comment on cards only.",
"computer": "Computer",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
"copy-card-link-to-clipboard": "Copy card link to clipboard",
"copyCardPopup-title": "Copy Card",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
"create": "Create",
"createBoardPopup-title": "Create Board",
"chooseBoardSourcePopup-title": "Import board",
@@ -186,6 +201,8 @@
"edit": "Edit",
"edit-avatar": "Change Avatar",
"edit-profile": "Edit Profile",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
"editCardStartDatePopup-title": "Change start date",
"editCardDueDatePopup-title": "Change due date",
"editCustomFieldPopup-title": "Edit Field",
@@ -196,6 +213,7 @@
"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-fail-text": "Error trying to send email",
"email-invalid": "Invalid email",
"email-invite": "Invite via Email",
"email-invite-subject": "__inviter__ sent you an invitation",
@@ -205,6 +223,7 @@
"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.",
+ "enable-wip-limit": "Enable WIP Limit",
"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",
@@ -249,6 +268,8 @@
"info": "Version",
"initials": "Initials",
"invalid-date": "Invalid date",
+ "invalid-time": "Invalid time",
+ "invalid-user": "Invalid user",
"joined": "joined",
"just-invited": "You are just invited to this board",
"keyboard-shortcuts": "Keyboard shortcuts",
@@ -259,18 +280,22 @@
"language": "Language",
"last-admin-desc": "You can’t change roles because there must be at least one admin.",
"leave-board": "Leave Board",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "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-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
"list-move-cards": "Move all cards in this list",
"list-select-cards": "Select all cards in this list",
"listActionPopup-title": "List Actions",
+ "swimlaneActionPopup-title": "Swimlane 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.",
+ "list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve the activity.",
"lists": "Lists",
+ "swimlanes": "Swimlanes",
"log-out": "Log Out",
"log-in": "Log In",
"loginPopup-title": "Log In",
@@ -288,8 +313,9 @@
"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-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
"no-results": "No results",
"normal": "Normal",
"normal-desc": "Can view and edit cards. Can't change settings.",
@@ -325,7 +351,11 @@
"restore": "Restore",
"save": "Save",
"search": "Search",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text to search for?",
"select-color": "Select Color",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
"shortcut-assign-self": "Assign yourself to current card",
"shortcut-autocomplete-emoji": "Autocomplete emoji",
"shortcut-autocomplete-members": "Autocomplete members",
@@ -346,6 +376,11 @@
"team": "Team",
"this-board": "this board",
"this-card": "this card",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"tracking": "Tracking",
@@ -359,14 +394,18 @@
"uploaded-avatar": "Uploaded an avatar",
"username": "Username",
"view-it": "View it",
- "warn-list-archived": "warning: this card is in an archived list",
+ "warn-list-archived": "warning: this card is in an list at Recycle Bin",
"watch": "Watch",
"watching": "Watching",
"watching-info": "You will be notified of any change in this board",
"welcome-board": "Welcome Board",
+ "welcome-swimlane": "Milestone 1",
"welcome-list1": "Basics",
"welcome-list2": "Advanced",
"what-to-do": "What do you want to do?",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
"admin-panel": "Admin Panel",
"settings": "Settings",
"people": "People",
@@ -385,9 +424,12 @@
"smtp-password": "Password",
"smtp-tls": "TLS support",
"send-from": "From",
+ "send-smtp-test": "Send a test email to yourself",
"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.",
+ "email-smtp-test-subject": "SMTP Test Email From Wekan",
+ "email-smtp-test-text": "You have successfully sent an email",
"error-invitation-code-not-exist": "Invitation code doesn't exist",
"error-notAuthorized": "You are not authorized to view this page.",
"outgoing-webhooks": "Outgoing Webhooks",
@@ -412,5 +454,15 @@
"yes": "Yes",
"no": "No",
"accounts": "Accounts",
- "accounts-allowEmailChange": "Allow Email Change"
+ "accounts-allowEmailChange": "Allow Email Change",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Created at",
+ "verified": "Verified",
+ "active": "Active",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
}
diff --git a/i18n/eo.i18n.json b/i18n/eo.i18n.json
index 5da9e81a..5b783648 100644
--- a/i18n/eo.i18n.json
+++ b/i18n/eo.i18n.json
@@ -5,17 +5,18 @@
"act-addChecklist": "added checklist __checklist__ to __card__",
"act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __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-createBoard": "Kreiis __board__",
+ "act-createCard": "Aldonis __card__ al __list__",
+ "act-createList": "Aldonis __card__ al __board__",
+ "act-addBoardMember": "Aldonis __member__ al __board__",
+ "act-archivedBoard": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
"act-importBoard": "imported __board__",
"act-importCard": "imported __card__",
"act-importList": "imported __list__",
- "act-joinMember": "aldonis __member__ al __card__",
+ "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__",
@@ -25,10 +26,10 @@
"actions": "Akcioj",
"activities": "Aktivaĵoj",
"activity": "Aktivaĵo",
- "activity-added": "aldonis %s al %s",
- "activity-archived": "archived %s",
+ "activity-added": "Aldonis %s al %s",
+ "activity-archived": "%s moved to Recycle Bin",
"activity-attached": "attached %s to %s",
- "activity-created": "kreiis %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",
@@ -36,7 +37,7 @@
"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-sent": "Sendis %s al %s",
"activity-unjoined": "unjoined %s",
"activity-checklist-added": "added checklist to %s",
"activity-checklist-item-added": "added checklist item to '%s' in %s",
@@ -44,6 +45,7 @@
"add-attachment": "Add Attachment",
"add-board": "Add Board",
"add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Add Checklist",
"add-checklist-item": "Add an item to checklist",
"add-cover": "Add Cover",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "Membroj",
"admin": "Admin",
"admin-desc": "Can view and edit cards, remove members, and change settings for the board.",
+ "admin-announcement": "Announcement",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Announcement from Administrator",
"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": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
- "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",
- "archived-boards": "Archived Boards",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
"restore-board": "Restore Board",
- "no-archived-boards": "No Archived Boards.",
- "archives": "Arkivoj",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
"assign-member": "Assign member",
"attached": "attached",
"attachment": "Attachment",
@@ -91,29 +97,34 @@
"boardChangeWatchPopup-title": "Change Watch",
"boardMenuPopup-title": "Board Menu",
"boards": "Boards",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Listoj",
"bucket-example": "Like “Bucket List” for example",
"cancel": "Cancel",
- "card-archived": "Karto arkivita.",
+ "card-archived": "This card is moved to Recycle Bin.",
"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-delete-suggest-archive": "You can move a card Recycle Bin to remove it from the board and preserve the activity.",
"card-due": "Due",
"card-due-on": "Due on",
+ "card-spent": "Spent Time",
"card-edit-attachments": "Edit attachments",
"card-edit-labels": "Redakti etikedojn",
- "card-edit-members": "Redakti membroj",
+ "card-edit-members": "Redakti membrojn",
"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 ",
+ "card-start-on": "Komencas je la",
"cardAttachmentsPopup-title": "Attach From",
"cardDeletePopup-title": "Delete Card?",
"cardDetailsActionsPopup-title": "Card Actions",
"cardLabelsPopup-title": "Etikedoj",
"cardMembersPopup-title": "Membroj",
"cardMorePopup-title": "Pli",
- "cards": "Karto",
+ "cards": "Kartoj",
+ "cards-count": "Kartoj",
"change": "Ŝanĝi",
"change-avatar": "Change Avatar",
"change-password": "Ŝangi pasvorton",
@@ -130,7 +141,7 @@
"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.",
+ "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
"color-black": "nigra",
"color-blue": "blua",
"color-green": "verda",
@@ -146,10 +157,14 @@
"comment-only": "Comment only",
"comment-only-desc": "Can comment on cards only.",
"computer": "Komputilo",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
"copy-card-link-to-clipboard": "Copy card link to clipboard",
"copyCardPopup-title": "Copy Card",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
"create": "Krei",
- "createBoardPopup-title": "Krei ",
+ "createBoardPopup-title": "Krei tavolon",
"chooseBoardSourcePopup-title": "Import board",
"createLabelPopup-title": "Create Label",
"current": "current",
@@ -166,16 +181,20 @@
"download": "Elŝuti",
"edit": "Redakti",
"edit-avatar": "Change Avatar",
- "edit-profile": "Redakti profilo",
- "editCardStartDatePopup-title": "Redakti komencdato",
+ "edit-profile": "Redakti profilon",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
+ "editCardStartDatePopup-title": "Redakti komencdaton",
"editCardDueDatePopup-title": "Change due date",
- "editLabelPopup-title": "Ŝanĝi etikedo",
+ "editCardSpentTimePopup-title": "Change spent time",
+ "editLabelPopup-title": "Ŝanĝi etikedon",
"editNotificationPopup-title": "Edit Notification",
- "editProfilePopup-title": "Redakti profilo",
+ "editProfilePopup-title": "Redakti profilon",
"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-fail": "Malsukcesis sendi retpoŝton",
+ "email-fail-text": "Error trying to send email",
"email-invalid": "Nevalida retpoŝtadreso",
"email-invite": "Inviti per retpoŝto",
"email-invite-subject": "__inviter__ sent you an invitation",
@@ -185,6 +204,7 @@
"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.",
+ "enable-wip-limit": "Enable WIP Limit",
"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",
@@ -208,7 +228,7 @@
"fullname": "Full Name",
"header-logo-title": "Go back to your boards page.",
"hide-system-messages": "Hide system messages",
- "headerBarCreateBoardPopup-title": "Krei ",
+ "headerBarCreateBoardPopup-title": "Krei tavolon",
"home": "Hejmo",
"import": "Importi",
"import-board": "import board",
@@ -229,6 +249,8 @@
"info": "Version",
"initials": "Initials",
"invalid-date": "Invalid date",
+ "invalid-time": "Invalid time",
+ "invalid-user": "Invalid user",
"joined": "joined",
"just-invited": "You are just invited to this board",
"keyboard-shortcuts": "Keyboard shortcuts",
@@ -239,18 +261,22 @@
"language": "Lingvo",
"last-admin-desc": "You can’t change roles because there must be at least one admin.",
"leave-board": "Leave Board",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "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-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
"list-move-cards": "Movu ĉiujn kartojn en tiu listo.",
"list-select-cards": "Elektu ĉiujn kartojn en tiu listo.",
"listActionPopup-title": "List Actions",
+ "swimlaneActionPopup-title": "Swimlane 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.",
+ "list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve the activity.",
"lists": "Listoj",
+ "swimlanes": "Swimlanes",
"log-out": "Elsaluti",
"log-in": "Ensaluti",
"loginPopup-title": "Ensaluti",
@@ -268,8 +294,9 @@
"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-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
"no-results": "Neniaj rezultoj",
"normal": "Normala",
"normal-desc": "Can view and edit cards. Can't change settings.",
@@ -305,7 +332,11 @@
"restore": "Forigi",
"save": "Savi",
"search": "Serĉi",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text to search for?",
"select-color": "Select Color",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
"shortcut-assign-self": "Assign yourself to current card",
"shortcut-autocomplete-emoji": "Autocomplete emoji",
"shortcut-autocomplete-members": "Autocomplete members",
@@ -326,6 +357,11 @@
"team": "Teamo",
"this-board": "this board",
"this-card": "this card",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Tempo",
"title": "Titolo",
"tracking": "Tracking",
@@ -338,14 +374,18 @@
"uploaded-avatar": "Uploaded an avatar",
"username": "Uzantnomo",
"view-it": "View it",
- "warn-list-archived": "warning: this card is in an archived list",
+ "warn-list-archived": "warning: this card is in an list at Recycle Bin",
"watch": "Rigardi",
"watching": "Rigardante",
"watching-info": "You will be notified of any change in this board",
"welcome-board": "Welcome Board",
+ "welcome-swimlane": "Milestone 1",
"welcome-list1": "Basics",
"welcome-list2": "Advanced",
"what-to-do": "Kion vi volas fari?",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
"admin-panel": "Admin Panel",
"settings": "Settings",
"people": "People",
@@ -364,9 +404,12 @@
"smtp-password": "Pasvorto",
"smtp-tls": "TLS support",
"send-from": "From",
+ "send-smtp-test": "Send a test email to yourself",
"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.",
+ "email-smtp-test-subject": "SMTP Test Email From Wekan",
+ "email-smtp-test-text": "You have successfully sent an email",
"error-invitation-code-not-exist": "Invitation code doesn't exist",
"error-notAuthorized": "You are not authorized to view this page.",
"outgoing-webhooks": "Outgoing Webhooks",
@@ -390,5 +433,15 @@
"yes": "Yes",
"no": "No",
"accounts": "Accounts",
- "accounts-allowEmailChange": "Allow Email Change"
+ "accounts-allowEmailChange": "Allow Email Change",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Created at",
+ "verified": "Verified",
+ "active": "Active",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
} \ No newline at end of file
diff --git a/i18n/es-AR.i18n.json b/i18n/es-AR.i18n.json
new file mode 100644
index 00000000..d450d000
--- /dev/null
+++ b/i18n/es-AR.i18n.json
@@ -0,0 +1,447 @@
+{
+ "accept": "Aceptar",
+ "act-activity-notify": "[Wekan] Notificación de Actividad",
+ "act-addAttachment": "adjunto __attachment__ a __card__",
+ "act-addChecklist": "lista de ítems __checklist__ agregada a __card__",
+ "act-addChecklistItem": " __checklistItem__ agregada a lista de ítems __checklist__ en __card__",
+ "act-addComment": "comentado en __card__: __comment__",
+ "act-createBoard": "__board__ creado",
+ "act-createCard": "agregada __card__ a __list__",
+ "act-createList": "agregada __list__ a __board__",
+ "act-addBoardMember": "agregado __member__ a __board__",
+ "act-archivedBoard": "__board__ movido a Papelera de Reciclaje",
+ "act-archivedCard": "__card__ movido a Papelera de Reciclaje",
+ "act-archivedList": "__list__ movido a Papelera de Reciclaje",
+ "act-archivedSwimlane": "__swimlane__ movido a Papelera de Reciclaje",
+ "act-importBoard": "__board__ importado",
+ "act-importCard": "__card__ importada",
+ "act-importList": "__list__ importada",
+ "act-joinMember": "__member__ agregado a __card__",
+ "act-moveCard": "__card__ movida de __oldList__ a __list__",
+ "act-removeBoardMember": "__member__ removido de __board__",
+ "act-restoredCard": "__card__ restaurada a __board__",
+ "act-unjoinMember": "__member__ removido de __card__",
+ "act-withBoardTitle": "__board__ [Wekan]",
+ "act-withCardTitle": "__card__ [__board__] ",
+ "actions": "Acciones",
+ "activities": "Actividades",
+ "activity": "Actividad",
+ "activity-added": "agregadas %s a %s",
+ "activity-archived": "%s movido a Papelera de Reciclaje",
+ "activity-attached": "adjuntadas %s a %s",
+ "activity-created": "creadas %s",
+ "activity-excluded": "excluidas %s de %s",
+ "activity-imported": "importadas %s en %s de %s",
+ "activity-imported-board": "importadas %s de %s",
+ "activity-joined": "unidas %s",
+ "activity-moved": "movidas %s de %s a %s",
+ "activity-on": "en %s",
+ "activity-removed": "eliminadas %s de %s",
+ "activity-sent": "enviadas %s a %s",
+ "activity-unjoined": "separadas %s",
+ "activity-checklist-added": "agregada lista de tareas a %s",
+ "activity-checklist-item-added": "agregado item de lista de tareas a '%s' en %s",
+ "add": "Agregar",
+ "add-attachment": "Agregar Adjunto",
+ "add-board": "Agregar Tablero",
+ "add-card": "Agregar Tarjeta",
+ "add-swimlane": "Agregar Calle",
+ "add-checklist": "Agregar Lista de Tareas",
+ "add-checklist-item": "Agregar ítem a lista de tareas",
+ "add-cover": "Agregar Portadas",
+ "add-label": "Agregar Etiqueta",
+ "add-list": "Agregar Lista",
+ "add-members": "Agregar Miembros",
+ "added": "Agregadas",
+ "addMemberPopup-title": "Miembros",
+ "admin": "Administrador",
+ "admin-desc": "Puede ver y editar tarjetas, eliminar miembros, y cambiar opciones para el tablero.",
+ "admin-announcement": "Anuncio",
+ "admin-announcement-active": "Anuncio del Sistema Activo",
+ "admin-announcement-title": "Anuncio del Administrador",
+ "all-boards": "Todos los tableros",
+ "and-n-other-card": "Y __count__ otra tarjeta",
+ "and-n-other-card_plural": "Y __count__ otras tarjetas",
+ "apply": "Aplicar",
+ "app-is-offline": "Wekan está cargándose, por favor espere. Refrescar la página va a causar pérdida de datos. Si Wekan no se carga, por favor revise que el servidor de Wekan no se haya detenido.",
+ "archive": "Mover a Papelera de Reciclaje",
+ "archive-all": "Mover Todo a la Papelera de Reciclaje",
+ "archive-board": "Mover Tablero a la Papelera de Reciclaje",
+ "archive-card": "Mover Tarjeta a la Papelera de Reciclaje",
+ "archive-list": "Mover Lista a la Papelera de Reciclaje",
+ "archive-swimlane": "Mover Calle a la Papelera de Reciclaje",
+ "archive-selection": "Mover selección a la Papelera de Reciclaje",
+ "archiveBoardPopup-title": "¿Mover Tablero a la Papelera de Reciclaje?",
+ "archived-items": "Papelera de Reciclaje",
+ "archived-boards": "Tableros en la Papelera de Reciclaje",
+ "restore-board": "Restaurar Tablero",
+ "no-archived-boards": "No hay tableros en la Papelera de Reciclaje",
+ "archives": "Papelera de Reciclaje",
+ "assign-member": "Asignar miembro",
+ "attached": "adjunto(s)",
+ "attachment": "Adjunto",
+ "attachment-delete-pop": "Borrar un adjunto es permanente. No hay deshacer.",
+ "attachmentDeletePopup-title": "¿Borrar Adjunto?",
+ "attachments": "Adjuntos",
+ "auto-watch": "Seguir tableros automáticamente al crearlos",
+ "avatar-too-big": "El avatar es muy grande (70KB max)",
+ "back": "Atrás",
+ "board-change-color": "Cambiar color",
+ "board-nb-stars": "%s estrellas",
+ "board-not-found": "Tablero no encontrado",
+ "board-private-info": "Este tablero va a ser <strong>privado</strong>.",
+ "board-public-info": "Este tablero va a ser <strong>público</strong>.",
+ "boardChangeColorPopup-title": "Cambiar Fondo del Tablero",
+ "boardChangeTitlePopup-title": "Renombrar Tablero",
+ "boardChangeVisibilityPopup-title": "Cambiar Visibilidad",
+ "boardChangeWatchPopup-title": "Alternar Seguimiento",
+ "boardMenuPopup-title": "Menú del Tablero",
+ "boards": "Tableros",
+ "board-view": "Vista de Tablero",
+ "board-view-swimlanes": "Calles",
+ "board-view-lists": "Listas",
+ "bucket-example": "Como \"Lista de Contenedores\" por ejemplo",
+ "cancel": "Cancelar",
+ "card-archived": "Esta tarjeta es movida a la Papelera de Reciclaje",
+ "card-comments-title": "Esta tarjeta tiene %s comentario.",
+ "card-delete-notice": "Borrar es permanente. Perderás todas las acciones asociadas con esta tarjeta.",
+ "card-delete-pop": "Todas las acciones van a ser eliminadas del agregador de actividad y no podrás re-abrir la tarjeta. No hay deshacer.",
+ "card-delete-suggest-archive": "Tu puedes mover una tarjeta a la Papelera de Reciclaje para removerla del tablero y preservar la actividad.",
+ "card-due": "Vence",
+ "card-due-on": "Vence en",
+ "card-spent": "Tiempo Empleado",
+ "card-edit-attachments": "Editar adjuntos",
+ "card-edit-labels": "Editar etiquetas",
+ "card-edit-members": "Editar miembros",
+ "card-labels-title": "Cambiar las etiquetas de la tarjeta.",
+ "card-members-title": "Agregar o eliminar de la tarjeta miembros del tablero.",
+ "card-start": "Empieza",
+ "card-start-on": "Empieza el",
+ "cardAttachmentsPopup-title": "Adjuntar De",
+ "cardDeletePopup-title": "¿Borrar Tarjeta?",
+ "cardDetailsActionsPopup-title": "Acciones de la Tarjeta",
+ "cardLabelsPopup-title": "Etiquetas",
+ "cardMembersPopup-title": "Miembros",
+ "cardMorePopup-title": "Mas",
+ "cards": "Tarjetas",
+ "cards-count": "Tarjetas",
+ "change": "Cambiar",
+ "change-avatar": "Cambiar Avatar",
+ "change-password": "Cambiar Contraseña",
+ "change-permissions": "Cambiar permisos",
+ "change-settings": "Cambiar Opciones",
+ "changeAvatarPopup-title": "Cambiar Avatar",
+ "changeLanguagePopup-title": "Cambiar Lenguaje",
+ "changePasswordPopup-title": "Cambiar Contraseña",
+ "changePermissionsPopup-title": "Cambiar Permisos",
+ "changeSettingsPopup-title": "Cambiar Opciones",
+ "checklists": "Listas de ítems",
+ "click-to-star": "Clickeá para darle una estrella a este tablero.",
+ "click-to-unstar": "Clickeá para sacarle la estrella al tablero.",
+ "clipboard": "Portapapeles o arrastrar y soltar",
+ "close": "Cerrar",
+ "close-board": "Cerrar Tablero",
+ "close-board-pop": "Podrás restaurar el tablero apretando el botón \"Papelera de Reciclaje\" del encabezado en inicio.",
+ "color-black": "negro",
+ "color-blue": "azul",
+ "color-green": "verde",
+ "color-lime": "lima",
+ "color-orange": "naranja",
+ "color-pink": "rosa",
+ "color-purple": "púrpura",
+ "color-red": "rojo",
+ "color-sky": "cielo",
+ "color-yellow": "amarillo",
+ "comment": "Comentario",
+ "comment-placeholder": "Comentar",
+ "comment-only": "Comentar solamente",
+ "comment-only-desc": "Puede comentar en tarjetas solamente.",
+ "computer": "Computadora",
+ "confirm-checklist-delete-dialog": "¿Estás segur@ que querés borrar la lista de ítems?",
+ "copy-card-link-to-clipboard": "Copiar enlace a tarjeta en el portapapeles",
+ "copyCardPopup-title": "Copiar Tarjeta",
+ "copyChecklistToManyCardsPopup-title": "Copiar Plantilla Checklist a Muchas Tarjetas",
+ "copyChecklistToManyCardsPopup-instructions": "Títulos y Descripciones de la Tarjeta Destino en este formato JSON",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Título de primera tarjeta\", \"description\":\"Descripción de primera tarjeta\"}, {\"title\":\"Título de segunda tarjeta\",\"description\":\"Descripción de segunda tarjeta\"},{\"title\":\"Título de última tarjeta\",\"description\":\"Descripción de última tarjeta\"} ]",
+ "create": "Crear",
+ "createBoardPopup-title": "Crear Tablero",
+ "chooseBoardSourcePopup-title": "Importar tablero",
+ "createLabelPopup-title": "Crear Etiqueta",
+ "current": "actual",
+ "date": "Fecha",
+ "decline": "Rechazar",
+ "default-avatar": "Avatar por defecto",
+ "delete": "Borrar",
+ "deleteLabelPopup-title": "¿Borrar Etiqueta?",
+ "description": "Descripción",
+ "disambiguateMultiLabelPopup-title": "Desambiguación de Acción de Etiqueta",
+ "disambiguateMultiMemberPopup-title": "Desambiguación de Acción de Miembro",
+ "discard": "Descartar",
+ "done": "Hecho",
+ "download": "Descargar",
+ "edit": "Editar",
+ "edit-avatar": "Cambiar Avatar",
+ "edit-profile": "Editar Perfil",
+ "edit-wip-limit": "Editar Lìmite de TEP",
+ "soft-wip-limit": "Límite TEP suave",
+ "editCardStartDatePopup-title": "Cambiar fecha de inicio",
+ "editCardDueDatePopup-title": "Cambiar fecha de vencimiento",
+ "editCardSpentTimePopup-title": "Cambiar tiempo empleado",
+ "editLabelPopup-title": "Cambiar Etiqueta",
+ "editNotificationPopup-title": "Editar Notificación",
+ "editProfilePopup-title": "Editar Perfil",
+ "email": "Email",
+ "email-enrollAccount-subject": "Una cuenta creada para vos en __siteName__",
+ "email-enrollAccount-text": "Hola __user__,\n\nPara empezar a usar el servicio, simplemente clickeá en el enlace de abajo.\n\n__url__\n\nGracias.",
+ "email-fail": "Fallo envío de email",
+ "email-fail-text": "Error intentando enviar email",
+ "email-invalid": "Email inválido",
+ "email-invite": "Invitar vía Email",
+ "email-invite-subject": "__inviter__ te envió una invitación",
+ "email-invite-text": "Querido __user__,\n\n__inviter__ te invita a unirte al tablero \"__board__\" para colaborar.\n\nPor favor sigue el enlace de abajo:\n\n__url__\n\nGracias.",
+ "email-resetPassword-subject": "Restaurá tu contraseña en __siteName__",
+ "email-resetPassword-text": "Hola __user__,\n\nPara restaurar tu contraseña, simplemente clickeá el enlace de abajo.\n\n__url__\n\nGracias.",
+ "email-sent": "Email enviado",
+ "email-verifyEmail-subject": "Verificá tu dirección de email en __siteName__",
+ "email-verifyEmail-text": "Hola __user__,\n\nPara verificar tu cuenta de email, simplemente clickeá el enlace de abajo.\n\n__url__\n\nGracias.",
+ "enable-wip-limit": "Activar Límite TEP",
+ "error-board-doesNotExist": "Este tablero no existe",
+ "error-board-notAdmin": "Necesitás ser administrador de este tablero para hacer eso",
+ "error-board-notAMember": "Necesitás ser miembro de este tablero para hacer eso",
+ "error-json-malformed": "Tu texto no es JSON válido",
+ "error-json-schema": "Tus datos JSON no incluyen la información correcta en el formato adecuado",
+ "error-list-doesNotExist": "Esta lista no existe",
+ "error-user-doesNotExist": "Este usuario no existe",
+ "error-user-notAllowSelf": "No podés invitarte a vos mismo",
+ "error-user-notCreated": " El usuario no se creó",
+ "error-username-taken": "El nombre de usuario ya existe",
+ "error-email-taken": "El email ya existe",
+ "export-board": "Exportar tablero",
+ "filter": "Filtrar",
+ "filter-cards": "Filtrar Tarjetas",
+ "filter-clear": "Sacar filtro",
+ "filter-no-label": "Sin etiqueta",
+ "filter-no-member": "No es miembro",
+ "filter-on": "El filtro está activado",
+ "filter-on-desc": "Estás filtrando cartas en este tablero. Clickeá acá para editar el filtro.",
+ "filter-to-selection": "Filtrar en la selección",
+ "fullname": "Nombre Completo",
+ "header-logo-title": "Retroceder a tu página de tableros.",
+ "hide-system-messages": "Esconder mensajes del sistema",
+ "headerBarCreateBoardPopup-title": "Crear Tablero",
+ "home": "Inicio",
+ "import": "Importar",
+ "import-board": "importar tablero",
+ "import-board-c": "Importar tablero",
+ "import-board-title-trello": "Importar tablero de Trello",
+ "import-board-title-wekan": "Importar tablero de Wekan",
+ "import-sandstorm-warning": "El tablero importado va a borrar todos los datos existentes en el tablero y reemplazarlos con los del tablero en cuestión.",
+ "from-trello": "De Trello",
+ "from-wekan": "De Wekan",
+ "import-board-instruction-trello": "En tu tablero de Trello, ve a 'Menú', luego a 'Más', 'Imprimir y Exportar', 'Exportar JSON', y copia el texto resultante.",
+ "import-board-instruction-wekan": "En tu tablero Wekan, ve a 'Menú', luego a 'Exportar tablero', y copia el texto en el archivo descargado.",
+ "import-json-placeholder": "Pegá tus datos JSON válidos acá",
+ "import-map-members": "Mapear Miembros",
+ "import-members-map": "Tu tablero importado tiene algunos miembros. Por favor mapeá los miembros que quieras importar/convertir a usuarios de Wekan.",
+ "import-show-user-mapping": "Revisar mapeo de miembros",
+ "import-user-select": "Elegí el usuario de Wekan que querés usar como éste miembro",
+ "importMapMembersAddPopup-title": "Elegí el miembro de Wekan.",
+ "info": "Versión",
+ "initials": "Iniciales",
+ "invalid-date": "Fecha inválida",
+ "invalid-time": "Tiempo inválido",
+ "invalid-user": "Usuario inválido",
+ "joined": "unido",
+ "just-invited": "Fuiste invitado a este tablero",
+ "keyboard-shortcuts": "Atajos de teclado",
+ "label-create": "Crear Etiqueta",
+ "label-default": "%s etiqueta (por defecto)",
+ "label-delete-pop": "No hay deshacer. Esto va a eliminar esta etiqueta de todas las tarjetas y destruir su historia.",
+ "labels": "Etiquetas",
+ "language": "Lenguaje",
+ "last-admin-desc": "No podés cambiar roles porque tiene que haber al menos un administrador.",
+ "leave-board": "Dejar Tablero",
+ "leave-board-pop": "¿Estás seguro que querés dejar __boardTitle__? Vas a salir de todas las tarjetas en este tablero.",
+ "leaveBoardPopup-title": "¿Dejar Tablero?",
+ "link-card": "Enlace a esta tarjeta",
+ "list-archive-cards": "Mover todas las tarjetas en esta lista a la Papelera de Reciclaje",
+ "list-archive-cards-pop": "Esto va a remover las tarjetas en esta lista del tablero. Para ver tarjetas en la Papelera de Reciclaje y traerlas de vuelta al tablero, clickeá \"Menú\" > \"Papelera de Reciclaje\".",
+ "list-move-cards": "Mueve todas las tarjetas en esta lista",
+ "list-select-cards": "Selecciona todas las tarjetas en esta lista",
+ "listActionPopup-title": "Listar Acciones",
+ "swimlaneActionPopup-title": "Acciones de la Calle",
+ "listImportCardPopup-title": "Importar una tarjeta Trello",
+ "listMorePopup-title": "Mas",
+ "link-list": "Enlace a esta lista",
+ "list-delete-pop": "Todas las acciones van a ser eliminadas del agregador de actividad y no podás recuperar la lista. No se puede deshacer.",
+ "list-delete-suggest-archive": "Podés mover la lista a la Papelera de Reciclaje para remvoerla del tablero y preservar la actividad.",
+ "lists": "Listas",
+ "swimlanes": "Calles",
+ "log-out": "Salir",
+ "log-in": "Entrar",
+ "loginPopup-title": "Entrar",
+ "memberMenuPopup-title": "Opciones de Miembros",
+ "members": "Miembros",
+ "menu": "Menú",
+ "move-selection": "Mover selección",
+ "moveCardPopup-title": "Mover Tarjeta",
+ "moveCardToBottom-title": "Mover al Final",
+ "moveCardToTop-title": "Mover al Tope",
+ "moveSelectionPopup-title": "Mover selección",
+ "multi-selection": "Multi-Selección",
+ "multi-selection-on": "Multi-selección está activo",
+ "muted": "Silenciado",
+ "muted-info": "No serás notificado de ningún cambio en este tablero",
+ "my-boards": "Mis Tableros",
+ "name": "Nombre",
+ "no-archived-cards": "No hay tarjetas en la Papelera de Reciclaje",
+ "no-archived-lists": "No hay listas en la Papelera de Reciclaje",
+ "no-archived-swimlanes": "No hay calles en la Papelera de Reciclaje",
+ "no-results": "No hay resultados",
+ "normal": "Normal",
+ "normal-desc": "Puede ver y editar tarjetas. No puede cambiar opciones.",
+ "not-accepted-yet": "Invitación no aceptada todavía",
+ "notify-participate": "Recibí actualizaciones en cualquier tarjeta que participés como creador o miembro",
+ "notify-watch": "Recibí actualizaciones en cualquier tablero, lista, o tarjeta que estés siguiendo",
+ "optional": "opcional",
+ "or": "o",
+ "page-maybe-private": "Esta página puede ser privada. Vos podrás verla <a href='%s'>entrando</a>.",
+ "page-not-found": "Página no encontrada.",
+ "password": "Contraseña",
+ "paste-or-dragdrop": "pegar, arrastrar y soltar el archivo de imagen a esto (imagen sola)",
+ "participating": "Participando",
+ "preview": "Previsualización",
+ "previewAttachedImagePopup-title": "Previsualización",
+ "previewClipboardImagePopup-title": "Previsualización",
+ "private": "Privado",
+ "private-desc": "Este tablero es privado. Solo personas agregadas a este tablero pueden verlo y editarlo.",
+ "profile": "Perfil",
+ "public": "Público",
+ "public-desc": "Este tablero es público. Es visible para cualquiera con un enlace y se va a mostrar en los motores de búsqueda como Google. Solo personas agregadas a este tablero pueden editarlo.",
+ "quick-access-description": "Dale una estrella al tablero para agregar un acceso directo en esta barra.",
+ "remove-cover": "Remover Portada",
+ "remove-from-board": "Remover del Tablero",
+ "remove-label": "Remover Etiqueta",
+ "listDeletePopup-title": "¿Borrar Lista?",
+ "remove-member": "Remover Miembro",
+ "remove-member-from-card": "Remover de Tarjeta",
+ "remove-member-pop": "¿Remover __name__ (__username__) de __boardTitle__? Los miembros va a ser removido de todas las tarjetas en este tablero. Serán notificados.",
+ "removeMemberPopup-title": "¿Remover Miembro?",
+ "rename": "Renombrar",
+ "rename-board": "Renombrar Tablero",
+ "restore": "Restaurar",
+ "save": "Grabar",
+ "search": "Buscar",
+ "search-cards": "Buscar en títulos y descripciones de tarjeta en este tablero",
+ "search-example": "¿Texto a buscar?",
+ "select-color": "Seleccionar Color",
+ "set-wip-limit-value": "Fijar un límite para el número máximo de tareas en esta lista",
+ "setWipLimitPopup-title": "Establecer Límite TEP",
+ "shortcut-assign-self": "Asignarte a vos mismo en la tarjeta actual",
+ "shortcut-autocomplete-emoji": "Autocompletar emonji",
+ "shortcut-autocomplete-members": "Autocompletar miembros",
+ "shortcut-clear-filters": "Limpiar todos los filtros",
+ "shortcut-close-dialog": "Cerrar Diálogo",
+ "shortcut-filter-my-cards": "Filtrar mis tarjetas",
+ "shortcut-show-shortcuts": "Traer esta lista de atajos",
+ "shortcut-toggle-filterbar": "Activar/Desactivar Barra Lateral de Filtros",
+ "shortcut-toggle-sidebar": "Activar/Desactivar Barra Lateral de Tableros",
+ "show-cards-minimum-count": "Mostrar cuenta de tarjetas si la lista contiene más que",
+ "sidebar-open": "Abrir Barra Lateral",
+ "sidebar-close": "Cerrar Barra Lateral",
+ "signupPopup-title": "Crear Cuenta",
+ "star-board-title": "Clickear para darle una estrella a este tablero. Se mostrará arriba en el tope de tu lista de tableros.",
+ "starred-boards": "Tableros con estrellas",
+ "starred-boards-description": "Tableros con estrellas se muestran en el tope de tu lista de tableros.",
+ "subscribe": "Suscribirse",
+ "team": "Equipo",
+ "this-board": "este tablero",
+ "this-card": "esta tarjeta",
+ "spent-time-hours": "Tiempo empleado (horas)",
+ "overtime-hours": "Sobretiempo (horas)",
+ "overtime": "Sobretiempo",
+ "has-overtime-cards": "Tiene tarjetas con sobretiempo",
+ "has-spenttime-cards": "Ha gastado tarjetas de tiempo",
+ "time": "Hora",
+ "title": "Título",
+ "tracking": "Seguimiento",
+ "tracking-info": "Serás notificado de cualquier cambio a aquellas tarjetas en las que seas creador o miembro.",
+ "unassign-member": "Desasignar miembro",
+ "unsaved-description": "Tienes una descripción sin guardar.",
+ "unwatch": "Dejar de seguir",
+ "upload": "Cargar",
+ "upload-avatar": "Cargar un avatar",
+ "uploaded-avatar": "Cargado un avatar",
+ "username": "Nombre de usuario",
+ "view-it": "Verlo",
+ "warn-list-archived": "cuidado; esta tarjeta está en la Papelera de Reciclaje",
+ "watch": "Seguir",
+ "watching": "Siguiendo",
+ "watching-info": "Serás notificado de cualquier cambio en este tablero",
+ "welcome-board": "Tablero de Bienvenida",
+ "welcome-swimlane": "Hito 1",
+ "welcome-list1": "Básicos",
+ "welcome-list2": "Avanzado",
+ "what-to-do": "¿Qué querés hacer?",
+ "wipLimitErrorPopup-title": "Límite TEP Inválido",
+ "wipLimitErrorPopup-dialog-pt1": " El número de tareas en esta lista es mayor que el límite TEP que definiste.",
+ "wipLimitErrorPopup-dialog-pt2": "Por favor mové algunas tareas fuera de esta lista, o seleccioná un límite TEP más alto.",
+ "admin-panel": "Panel de Administración",
+ "settings": "Opciones",
+ "people": "Gente",
+ "registration": "Registro",
+ "disable-self-registration": "Desactivar auto-registro",
+ "invite": "Invitar",
+ "invite-people": "Invitar Gente",
+ "to-boards": "A tarjeta(s)",
+ "email-addresses": "Dirección de Email",
+ "smtp-host-description": "La dirección del servidor SMTP que maneja tus emails",
+ "smtp-port-description": "El puerto que tu servidor SMTP usa para correos salientes",
+ "smtp-tls-description": "Activar soporte TLS para el servidor SMTP",
+ "smtp-host": "Servidor SMTP",
+ "smtp-port": "Puerto SMTP",
+ "smtp-username": "Usuario",
+ "smtp-password": "Contraseña",
+ "smtp-tls": "Soporte TLS",
+ "send-from": "De",
+ "send-smtp-test": "Enviarse un email de prueba",
+ "invitation-code": "Código de Invitación",
+ "email-invite-register-subject": "__inviter__ te envió una invitación",
+ "email-invite-register-text": "Querido __user__,\n\n__inviter__ te invita a Wekan para colaborar.\n\nPor favor sigue el enlace de abajo:\n__url__\n\nI tu código de invitación es: __icode__\n\nGracias.",
+ "email-smtp-test-subject": "Email de Prueba SMTP de Wekan",
+ "email-smtp-test-text": "Enviaste el correo correctamente",
+ "error-invitation-code-not-exist": "El código de invitación no existe",
+ "error-notAuthorized": "No estás autorizado para ver esta página.",
+ "outgoing-webhooks": "Ganchos Web Salientes",
+ "outgoingWebhooksPopup-title": "Ganchos Web Salientes",
+ "new-outgoing-webhook": "Nuevo Gancho Web",
+ "no-name": "(desconocido)",
+ "Wekan_version": "Versión de Wekan",
+ "Node_version": "Versión de Node",
+ "OS_Arch": "Arch del SO",
+ "OS_Cpus": "Cantidad de CPU del SO",
+ "OS_Freemem": "Memoria Libre del SO",
+ "OS_Loadavg": "Carga Promedio del SO",
+ "OS_Platform": "Plataforma del SO",
+ "OS_Release": "Revisión del SO",
+ "OS_Totalmem": "Memoria Total del SO",
+ "OS_Type": "Tipo de SO",
+ "OS_Uptime": "Tiempo encendido del SO",
+ "hours": "horas",
+ "minutes": "minutos",
+ "seconds": "segundos",
+ "yes": "Si",
+ "no": "No",
+ "accounts": "Cuentas",
+ "accounts-allowEmailChange": "Permitir Cambio de Email",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Creado en",
+ "verified": "Verificado",
+ "active": "Activo",
+ "card-received": "Recibido",
+ "card-received-on": "Recibido en",
+ "card-end": "Termino",
+ "card-end-on": "Termina en",
+ "editCardReceivedDatePopup-title": "Cambiar fecha de recepción",
+ "editCardEndDatePopup-title": "Cambiar fecha de término"
+} \ No newline at end of file
diff --git a/i18n/es.i18n.json b/i18n/es.i18n.json
index 5dca2df5..532c7df4 100644
--- a/i18n/es.i18n.json
+++ b/i18n/es.i18n.json
@@ -1,287 +1,314 @@
{
"accept": "Aceptar",
- "act-activity-notify": "[Wekan] Notificación de Actividad",
- "act-addAttachment": "adjuntado __attachment__ a __card__",
- "act-addChecklist": "added checklist __checklist__ to __card__",
- "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
- "act-addComment": "comentado en __card__: __comment__",
- "act-createBoard": "creado __board__",
- "act-createCard": "añadido __card__ a __list__",
- "act-createList": "añadido __list__ a __board__",
- "act-addBoardMember": "añadido __member__ a __board__",
- "act-archivedBoard": "__board__ archivado",
- "act-archivedCard": "__card__ archivada",
- "act-archivedList": "__list__ archivada",
- "act-importBoard": "__board__ importado",
- "act-importCard": "__card__ importada",
- "act-importList": "__list__ importada",
- "act-joinMember": "añadido __member__ to __card__",
- "act-moveCard": "movida __card__ desde __oldList__ a __list__",
- "act-removeBoardMember": "borrado __member__ de __board__",
- "act-restoredCard": "restaurada __card__ en __board__",
- "act-unjoinMember": "borrado __member__ de __card__",
+ "act-activity-notify": "[Wekan] Notificación de actividad",
+ "act-addAttachment": "ha adjuntado __attachment__ a __card__",
+ "act-addChecklist": "ha añadido la lista de verificación __checklist__ a __card__",
+ "act-addChecklistItem": "ha añadido __checklistItem__ a la lista de verificación __checklist__ en __card__",
+ "act-addComment": "ha comentado en __card__: __comment__",
+ "act-createBoard": "ha creado __board__",
+ "act-createCard": "ha añadido __card__ a __list__",
+ "act-createList": "ha añadido __list__ a __board__",
+ "act-addBoardMember": "ha añadido a __member__ a __board__",
+ "act-archivedBoard": "__board__ se ha enviado a la papelera de reciclaje",
+ "act-archivedCard": "__card__ se ha enviado a la papelera de reciclaje",
+ "act-archivedList": "__list__ se ha enviado a la papelera de reciclaje",
+ "act-archivedSwimlane": "__swimlane__ se ha enviado a la papelera de reciclaje",
+ "act-importBoard": "ha importado __board__",
+ "act-importCard": "ha importado __card__",
+ "act-importList": "ha importado __list__",
+ "act-joinMember": "ha añadido a __member__ a __card__",
+ "act-moveCard": "ha movido __card__ desde __oldList__ a __list__",
+ "act-removeBoardMember": "ha desvinculado a __member__ de __board__",
+ "act-restoredCard": "ha restaurado __card__ en __board__",
+ "act-unjoinMember": "ha desvinculado a __member__ de __card__",
"act-withBoardTitle": "[Wekan] __board__",
"act-withCardTitle": "[__board__] __card__",
"actions": "Acciones",
- "activities": "Activities",
+ "activities": "Actividades",
"activity": "Actividad",
- "activity-added": "añadido %s a %s",
- "activity-archived": "archivado %s",
- "activity-attached": "adjuntado %s a %s",
- "activity-created": "creado %s",
- "activity-excluded": "excluido %s de %s",
- "activity-imported": "imported %s into %s from %s",
- "activity-imported-board": "imported %s from %s",
- "activity-joined": "se ha unido %s",
- "activity-moved": "movido %s de %s a %s",
+ "activity-added": "ha añadido %s a %s",
+ "activity-archived": "%s se ha enviado a la papelera de reciclaje",
+ "activity-attached": "ha adjuntado %s a %s",
+ "activity-created": "ha creado %s",
+ "activity-excluded": "ha excluido %s de %s",
+ "activity-imported": "ha importado %s a %s desde %s",
+ "activity-imported-board": "ha importado %s desde %s",
+ "activity-joined": "se ha unido a %s",
+ "activity-moved": "ha movido %s de %s a %s",
"activity-on": "en %s",
- "activity-removed": "eliminado %s de %s",
- "activity-sent": "enviado %s a %s",
- "activity-unjoined": "unjoined %s",
- "activity-checklist-added": "añadida lista de tareas a %s",
- "activity-checklist-item-added": "added checklist item to '%s' in %s",
+ "activity-removed": "ha eliminado %s de %s",
+ "activity-sent": "ha enviado %s a %s",
+ "activity-unjoined": "se ha desvinculado de %s",
+ "activity-checklist-added": "ha añadido una lista de verificación a %s",
+ "activity-checklist-item-added": "ha añadido el elemento de la lista de verificación a '%s' en %s",
"add": "Añadir",
- "add-attachment": "Agregar Adjunto",
- "add-board": "Agregar Tablero",
- "add-card": "Agregar Tarjeta",
- "add-checklist": "Agregar Lista de Tareas",
- "add-checklist-item": "Agregar un ítem a la lista de tareas",
- "add-cover": "Añadir cubierta",
- "add-label": "Agregar Etiqueta",
- "add-list": "Agregar Lista",
- "add-members": "Añadir Miembros",
- "added": "Añadido",
+ "add-attachment": "Añadir adjunto",
+ "add-board": "Añadir tablero",
+ "add-card": "Añadir una tarjeta",
+ "add-swimlane": "Añadir un carril de flujo",
+ "add-checklist": "Añadir una lista de verificación",
+ "add-checklist-item": "Añadir un elemento a la lista de verificación",
+ "add-cover": "Añadir portada",
+ "add-label": "Añadir una etiqueta",
+ "add-list": "Añadir una lista",
+ "add-members": "Añadir miembros",
+ "added": "Añadida el",
"addMemberPopup-title": "Miembros",
"admin": "Administrador",
- "admin-desc": "Puedes ver y editar fichas, eliminar miembros, y cambiar los ajustes del tablero",
+ "admin-desc": "Puedes ver y editar tarjetas, eliminar miembros, y cambiar los ajustes del tablero",
+ "admin-announcement": "Aviso",
+ "admin-announcement-active": "Activar el aviso para todo el sistema",
+ "admin-announcement-title": "Aviso del administrador",
"all-boards": "Tableros",
- "and-n-other-card": "And __count__ other card",
- "and-n-other-card_plural": "And __count__ other cards",
+ "and-n-other-card": "y __count__ tarjeta más",
+ "and-n-other-card_plural": "y otras __count__ tarjetas",
"apply": "Aplicar",
- "app-is-offline": "Wekan está cargando, por favor espere. Actualizar la página generará pérdida de datos. Si Wekan no carga, por favor verifique que el servidor de Wekan no ha sido detenido.",
- "archive": "Guardar",
- "archive-all": "Guardar Todo",
- "archive-board": "Archive Board",
- "archive-card": "Archivo Tarjeta",
- "archive-list": "Archivar Lista",
- "archive-selection": "Archive selection",
- "archiveBoardPopup-title": "Archive Board?",
- "archived-items": "Items archivados",
- "archived-boards": "Tableros Archivados",
- "restore-board": "Restaurar Tablero",
- "no-archived-boards": "No hay Tableros Archivados",
- "archives": "Archives",
+ "app-is-offline": "Wekan se está cargando, por favor espere. Actualizar la página provocará la pérdida de datos. Si Wekan no se carga, por favor verifique que el servidor de Wekan no está detenido.",
+ "archive": "Enviar a la papelera de reciclaje",
+ "archive-all": "Enviar todo a la papelera de reciclaje",
+ "archive-board": "Enviar el tablero a la papelera de reciclaje",
+ "archive-card": "Enviar la tarjeta a la papelera de reciclaje",
+ "archive-list": "Enviar la lista a la papelera de reciclaje",
+ "archive-swimlane": "Enviar el carril de flujo a la papelera de reciclaje",
+ "archive-selection": "Enviar la selección a la papelera de reciclaje",
+ "archiveBoardPopup-title": "Enviar el tablero a la papelera de reciclaje",
+ "archived-items": "Papelera de reciclaje",
+ "archived-boards": "Tableros en la papelera de reciclaje",
+ "restore-board": "Restaurar el tablero",
+ "no-archived-boards": "No hay tableros en la papelera de reciclaje",
+ "archives": "Papelera de reciclaje",
"assign-member": "Asignar miembros",
"attached": "adjuntado",
"attachment": "Adjunto",
- "attachment-delete-pop": "El borrado de un archivo adjunto es permanente. No se puede deshacer.",
- "attachmentDeletePopup-title": "¿Borrar adjunto?",
+ "attachment-delete-pop": "La eliminación de un fichero adjunto es permanente. Esta acción no puede deshacerse.",
+ "attachmentDeletePopup-title": "¿Eliminar el adjunto?",
"attachments": "Adjuntos",
"auto-watch": "Suscribirse automáticamente a los tableros cuando son creados",
- "avatar-too-big": "El avatares muy grande (70KB máx.)",
+ "avatar-too-big": "El avatar es muy grande (70KB máx.)",
"back": "Atrás",
- "board-change-color": "Cambiar color",
- "board-nb-stars": "%s stars",
+ "board-change-color": "Cambiar el color",
+ "board-nb-stars": "%s destacados",
"board-not-found": "Tablero no encontrado",
- "board-private-info": "This board will be <strong>private</strong>.",
+ "board-private-info": "Este tablero será <strong>privado</strong>.",
"board-public-info": "Este tablero será <strong>público</strong>.",
- "boardChangeColorPopup-title": "Change Board Background",
- "boardChangeTitlePopup-title": "Renombrar tablero",
+ "boardChangeColorPopup-title": "Cambiar el fondo del tablero",
+ "boardChangeTitlePopup-title": "Renombrar el tablero",
"boardChangeVisibilityPopup-title": "Cambiar visibilidad",
- "boardChangeWatchPopup-title": "Cambiar Vigilancia",
- "boardMenuPopup-title": "Board Menu",
+ "boardChangeWatchPopup-title": "Cambiar vigilancia",
+ "boardMenuPopup-title": "Menú del tablero",
"boards": "Tableros",
- "bucket-example": "Like “Bucket List” for example",
+ "board-view": "Vista del tablero",
+ "board-view-swimlanes": "Carriles",
+ "board-view-lists": "Listas",
+ "bucket-example": "Como “Cosas por hacer” por ejemplo",
"cancel": "Cancelar",
- "card-archived": "Esta ficha está archivada.",
- "card-comments-title": "Esta ficha tiene %s comentarios.",
- "card-delete-notice": "El borrado es permanente. Perderás todas las acciones asociadas a esta ficha.",
- "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.",
- "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.",
- "card-due": "Motivo",
- "card-due-on": "Debido a",
- "card-edit-attachments": "Edit attachments",
- "card-edit-labels": "Edit labels",
- "card-edit-members": "Editar miembros",
- "card-labels-title": "Cambia las etiquetas de la ficha",
- "card-members-title": "Añadir o eliminar miembros del tablero desde la ficha.",
- "card-start": "Empezar",
- "card-start-on": "Empieza",
- "cardAttachmentsPopup-title": "Attach From",
- "cardDeletePopup-title": "¿Borrar ficha?",
- "cardDetailsActionsPopup-title": "Card Actions",
+ "card-archived": "Esta tarjeta se ha enviado a la papelera de reciclaje.",
+ "card-comments-title": "Esta tarjeta tiene %s comentarios.",
+ "card-delete-notice": "la eliminación es permanente. Perderás todas las acciones asociadas a esta tarjeta.",
+ "card-delete-pop": "Se eliminarán todas las acciones del historial de actividades y no se podrá volver a abrir la tarjeta. Esta acción no puede deshacerse.",
+ "card-delete-suggest-archive": "Puedes enviar una tarjeta a la papelera de reciclaje para eliminarla del tablero y conservar la actividad.",
+ "card-due": "Vence",
+ "card-due-on": "Vence el",
+ "card-spent": "Tiempo consumido",
+ "card-edit-attachments": "Editar los adjuntos",
+ "card-edit-labels": "Editar las etiquetas",
+ "card-edit-members": "Editar los miembros",
+ "card-labels-title": "Cambia las etiquetas de la tarjeta",
+ "card-members-title": "Añadir o eliminar miembros del tablero desde la tarjeta.",
+ "card-start": "Comienza",
+ "card-start-on": "Comienza el",
+ "cardAttachmentsPopup-title": "Adjuntar desde",
+ "cardDeletePopup-title": "¿Eliminar la tarjeta?",
+ "cardDetailsActionsPopup-title": "Acciones de la tarjeta",
"cardLabelsPopup-title": "Etiquetas",
"cardMembersPopup-title": "Miembros",
"cardMorePopup-title": "Más",
"cards": "Tarjetas",
- "change": "Change",
- "change-avatar": "Cambiar Avatar",
- "change-password": "Cambiar la clave",
- "change-permissions": "Cambiar permisos",
- "change-settings": "Cambiar Preferencias",
- "changeAvatarPopup-title": "Cambiar Avatar",
- "changeLanguagePopup-title": "Cambiar idioma",
- "changePasswordPopup-title": "Cambiar la clave",
- "changePermissionsPopup-title": "Cambiar permisos",
- "changeSettingsPopup-title": "Cambiar Preferencias",
- "checklists": "Lista de Tareas",
+ "cards-count": "Tarjetas",
+ "change": "Cambiar",
+ "change-avatar": "Cambiar el avatar",
+ "change-password": "Cambiar la contraseña",
+ "change-permissions": "Cambiar los permisos",
+ "change-settings": "Cambiar las preferencias",
+ "changeAvatarPopup-title": "Cambiar el avatar",
+ "changeLanguagePopup-title": "Cambiar el idioma",
+ "changePasswordPopup-title": "Cambiar la contraseña",
+ "changePermissionsPopup-title": "Cambiar los permisos",
+ "changeSettingsPopup-title": "Cambiar las preferencias",
+ "checklists": "Lista de verificación",
"click-to-star": "Haz clic para destacar este tablero.",
"click-to-unstar": "Haz clic para dejar de destacar este tablero.",
- "clipboard": "Clipboard or drag & drop",
+ "clipboard": "el portapapeles o con arrastrar y soltar",
"close": "Cerrar",
"close-board": "Cerrar el tablero",
- "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.",
- "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": "Comentario",
- "comment-placeholder": "Escribir Comentario",
- "comment-only": "Sólo comentario",
- "comment-only-desc": "Solo se puede comentar en tarjetas.",
- "computer": "Ordenador",
- "copy-card-link-to-clipboard": "Copiar enlace a la tarjeta al portapapeles",
- "copyCardPopup-title": "Copy Card",
+ "close-board-pop": "Podrás restaurar el tablero haciendo clic en el botón \"Papelera de reciclaje\" en la cabecera.",
+ "color-black": "negra",
+ "color-blue": "azul",
+ "color-green": "verde",
+ "color-lime": "lima",
+ "color-orange": "naranja",
+ "color-pink": "rosa",
+ "color-purple": "violeta",
+ "color-red": "roja",
+ "color-sky": "celeste",
+ "color-yellow": "amarilla",
+ "comment": "Comentar",
+ "comment-placeholder": "Escribir comentario",
+ "comment-only": "Sólo comentarios",
+ "comment-only-desc": "Solo puedes comentar en las tarjetas.",
+ "computer": "el ordenador",
+ "confirm-checklist-delete-dialog": "¿Seguro que desea eliminar la lista de verificación?",
+ "copy-card-link-to-clipboard": "Copiar el enlace de la tarjeta al portapapeles",
+ "copyCardPopup-title": "Copiar la tarjeta",
+ "copyChecklistToManyCardsPopup-title": "Copiar la plantilla de la lista de verificación en varias tarjetas",
+ "copyChecklistToManyCardsPopup-instructions": "Títulos y descripciones de las tarjetas de destino en formato JSON",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Título de la primera tarjeta\", \"description\":\"Descripción de la primera tarjeta\"}, {\"title\":\"Título de la segunda tarjeta\",\"description\":\"Descripción de la segunda tarjeta\"},{\"title\":\"Título de la última tarjeta\",\"description\":\"Descripción de la última tarjeta\"} ]",
"create": "Crear",
"createBoardPopup-title": "Crear tablero",
- "chooseBoardSourcePopup-title": "Importar tablero",
+ "chooseBoardSourcePopup-title": "Importar un tablero",
"createLabelPopup-title": "Crear etiqueta",
"current": "actual",
"date": "Fecha",
- "decline": "Decline",
+ "decline": "Declinar",
"default-avatar": "Avatar por defecto",
- "delete": "Borrar",
- "deleteLabelPopup-title": "Borrar etiqueta",
- "description": "Descripcion",
- "disambiguateMultiLabelPopup-title": "Disambiguate Label Action",
- "disambiguateMultiMemberPopup-title": "Disambiguate Member Action",
- "discard": "Discard",
- "done": "Done",
+ "delete": "Eliminar",
+ "deleteLabelPopup-title": "¿Eliminar la etiqueta?",
+ "description": "Descripción",
+ "disambiguateMultiLabelPopup-title": "Desambiguar la acción de etiqueta",
+ "disambiguateMultiMemberPopup-title": "Desambiguar la acción de miembro",
+ "discard": "Descartarla",
+ "done": "Hecho",
"download": "Descargar",
"edit": "Editar",
- "edit-avatar": "Cambiar Avatar",
- "edit-profile": "Edit Profile",
- "editCardStartDatePopup-title": "Cambiar fecha de inicio",
- "editCardDueDatePopup-title": "Cambiar fecha de motivo",
- "editLabelPopup-title": "Cambiar etiqueta",
- "editNotificationPopup-title": "Editar Notificación",
- "editProfilePopup-title": "Edit Profile",
+ "edit-avatar": "Cambiar el avatar",
+ "edit-profile": "Editar el perfil",
+ "edit-wip-limit": "Cambiar el límite del trabajo en proceso",
+ "soft-wip-limit": "Límite del trabajo en proceso flexible",
+ "editCardStartDatePopup-title": "Cambiar la fecha de comienzo",
+ "editCardDueDatePopup-title": "Cambiar la fecha de vencimiento",
+ "editCardSpentTimePopup-title": "Cambiar el tiempo consumido",
+ "editLabelPopup-title": "Cambiar la etiqueta",
+ "editNotificationPopup-title": "Editar las notificaciones",
+ "editProfilePopup-title": "Editar el perfil",
"email": "Correo electrónico",
- "email-enrollAccount-subject": "An account created for you on __siteName__",
- "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.",
- "email-fail": "Sending email failed",
- "email-invalid": "Invalid email",
- "email-invite": "Invite via Email",
- "email-invite-subject": "__inviter__ sent you an invitation",
- "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.",
- "email-resetPassword-subject": "Reset your password on __siteName__",
- "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.",
- "email-sent": "Email sent",
- "email-verifyEmail-subject": "Verify your email address on __siteName__",
- "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.",
- "error-board-doesNotExist": "This board does not exist",
- "error-board-notAdmin": "You need to be admin of this board to do that",
- "error-board-notAMember": "You need to be a member of this board to do that",
- "error-json-malformed": "Your text is not valid JSON",
- "error-json-schema": "Your JSON data does not include the proper information in the correct format",
- "error-list-doesNotExist": "This list does not exist",
- "error-user-doesNotExist": "This user does not exist",
+ "email-enrollAccount-subject": "Cuenta creada en __siteName__",
+ "email-enrollAccount-text": "Hola __user__,\n\nPara empezar a utilizar el servicio, simplemente haz clic en el siguiente enlace.\n\n__url__\n\nGracias.",
+ "email-fail": "Error al enviar el correo",
+ "email-fail-text": "Error al intentar enviar el correo",
+ "email-invalid": "Correo no válido",
+ "email-invite": "Invitar vía correo electrónico",
+ "email-invite-subject": "__inviter__ ha enviado una invitación",
+ "email-invite-text": "Estimado __user__,\n\n__inviter__ te invita a unirte al tablero '__board__' para colaborar.\n\nPor favor, haz clic en el siguiente enlace:\n\n__url__\n\nGracias.",
+ "email-resetPassword-subject": "Restablecer tu contraseña en __siteName__",
+ "email-resetPassword-text": "Hola __user__,\n\nPara restablecer tu contraseña, haz clic en el siguiente enlace.\n\n__url__\n\nGracias.",
+ "email-sent": "Correo enviado",
+ "email-verifyEmail-subject": "Verifica tu dirección de correo en __siteName__",
+ "email-verifyEmail-text": "Hola __user__,\n\nPara verificar tu cuenta de correo electrónico, haz clic en el siguiente enlace.\n\n__url__\n\nGracias.",
+ "enable-wip-limit": "Activar el límite del trabajo en proceso",
+ "error-board-doesNotExist": "El tablero no existe",
+ "error-board-notAdmin": "Es necesario ser administrador de este tablero para hacer eso",
+ "error-board-notAMember": "Es necesario ser miembro de este tablero para hacer eso",
+ "error-json-malformed": "El texto no es un JSON válido",
+ "error-json-schema": "Sus datos JSON no incluyen la información apropiada en el formato correcto",
+ "error-list-doesNotExist": "La lista no existe",
+ "error-user-doesNotExist": "El usuario no existe",
"error-user-notAllowSelf": "No puedes invitarte a ti mismo",
- "error-user-notCreated": "This user is not created",
+ "error-user-notCreated": "El usuario no ha sido creado",
"error-username-taken": "Este nombre de usuario ya está en uso",
- "error-email-taken": "Esta direccion de Email ya está en uso",
- "export-board": "Export board",
- "filter": "Filter",
- "filter-cards": "Fichas de filtro",
- "filter-clear": "Clear filter",
+ "error-email-taken": "Esta dirección de correo ya está en uso",
+ "export-board": "Exportar el tablero",
+ "filter": "Filtrar",
+ "filter-cards": "Filtrar tarjetas",
+ "filter-clear": "Limpiar el filtro",
"filter-no-label": "Sin etiqueta",
"filter-no-member": "Sin miembro",
- "filter-on": "Filtro activo",
- "filter-on-desc": "Estás filtrando fichas en este tablero. Haz clic aquí para editar el filtro.",
- "filter-to-selection": "Filter to selection",
- "fullname": "Nombre Completo",
+ "filter-on": "Filtro activado",
+ "filter-on-desc": "Estás filtrando tarjetas en este tablero. Haz clic aquí para editar el filtro.",
+ "filter-to-selection": "Filtrar la selección",
+ "fullname": "Nombre completo",
"header-logo-title": "Volver a tu página de tableros",
- "hide-system-messages": "Ocultar los mensajes del sistema",
+ "hide-system-messages": "Ocultar las notificaciones de actividad",
"headerBarCreateBoardPopup-title": "Crear tablero",
"home": "Inicio",
"import": "Importar",
- "import-board": "importar tablero",
- "import-board-c": "Importar tablero",
- "import-board-title-trello": "Importar tablero desde Trello",
- "import-board-title-wekan": "Importar tablero desde Wekan",
- "import-sandstorm-warning": "El tablero importado va a borrar todos los datos existentes en este tablero y reemplazarlos con los datos del tablero importado.",
+ "import-board": "importar un tablero",
+ "import-board-c": "Importar un tablero",
+ "import-board-title-trello": "Importar un tablero desde Trello",
+ "import-board-title-wekan": "Importar un tablero desde Wekan",
+ "import-sandstorm-warning": "El tablero importado eliminará todos los datos existentes en este tablero y los reemplazará con los datos del tablero importado.",
"from-trello": "Desde Trello",
"from-wekan": "Desde Wekan",
- "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text",
- "import-board-instruction-wekan": "En tu tablero Wekan, ve a 'Menu', luego 'Exportar tablero', y copia el texto en el archivo descargado.",
- "import-json-placeholder": "Paste your valid JSON data here",
+ "import-board-instruction-trello": "En tu tablero de Trello, ve a 'Menú', luego 'Más' > 'Imprimir y exportar' > 'Exportar JSON', y copia el texto resultante.",
+ "import-board-instruction-wekan": "En tu tablero de Wekan, ve a 'Menú del tablero', luego 'Exportar el tablero', y copia aquí el texto del fichero descargado.",
+ "import-json-placeholder": "Pega tus datos JSON válidos aquí",
"import-map-members": "Mapa de miembros",
- "import-members-map": "Your imported board has some members. Please map the members you want to import to Wekan users",
- "import-show-user-mapping": "Review members mapping",
- "import-user-select": "Pick the Wekan user you want to use as this member",
- "importMapMembersAddPopup-title": "Seleccionar un miembro de Wekan",
+ "import-members-map": "El tablero importado tiene algunos miembros. Por favor mapea los miembros que deseas importar a los usuarios de Wekan",
+ "import-show-user-mapping": "Revisión de la asignación de miembros",
+ "import-user-select": "Escoge el usuario de Wekan que deseas utilizar como miembro",
+ "importMapMembersAddPopup-title": "Selecciona un miembro de Wekan",
"info": "Versión",
"initials": "Iniciales",
- "invalid-date": "Fecha no Válida",
+ "invalid-date": "Fecha no válida",
+ "invalid-time": "Tiempo no válido",
+ "invalid-user": "Usuario no válido",
"joined": "se ha unido",
- "just-invited": "You are just invited to this board",
+ "just-invited": "Has sido invitado a este tablero",
"keyboard-shortcuts": "Atajos de teclado",
- "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.",
+ "label-create": "Crear una etiqueta",
+ "label-default": "etiqueta %s (por defecto)",
+ "label-delete-pop": "Esto eliminará esta etiqueta de todas las tarjetas y destruirá su historial. Esta acción no puede deshacerse.",
"labels": "Etiquetas",
- "language": "Idioma",
+ "language": "Cambiar el idioma",
"last-admin-desc": "No puedes cambiar roles porque debe haber al menos un administrador.",
- "leave-board": "Dejar el Tablero",
- "link-card": "Enlace a esta ficha",
- "list-archive-cards": "Archive all cards in this list",
- "list-archive-cards-pop": "Esto eliminara todas las fichas de esta lista del tablero. Para ver fichas archivadas y recuperarlas en el tablero, haz clic en \"Menu\" / \"Artículos Archivados\".",
- "list-move-cards": "Move all cards in this list",
- "list-select-cards": "Select all cards in this list",
+ "leave-board": "Abandonar el tablero",
+ "leave-board-pop": "¿Seguro que quieres abandonar __boardTitle__? Serás desvinculado de todas las tarjetas en este tablero.",
+ "leaveBoardPopup-title": "¿Abandonar el tablero?",
+ "link-card": "Enlazar a esta tarjeta",
+ "list-archive-cards": "Enviar todas las tarjetas de esta lista a la papelera de reciclaje",
+ "list-archive-cards-pop": "Esto eliminará todas las tarjetas de esta lista del tablero. Para ver las tarjetas en la papelera de reciclaje y devolverlas al tablero, haga clic en \"Menú\" > \"Papelera de reciclaje\".",
+ "list-move-cards": "Mover todas las tarjetas de esta lista",
+ "list-select-cards": "Seleccionar todas las tarjetas de esta lista",
"listActionPopup-title": "Acciones de la lista",
+ "swimlaneActionPopup-title": "Acciones del carril de flujo",
"listImportCardPopup-title": "Importar una tarjeta de Trello",
"listMorePopup-title": "Más",
- "link-list": "Enlace a esta lista",
- "list-delete-pop": "Todas las acciones serán borradas del feed de actividad y no podrá recuperar la lista. Esta acción no puede deshacerse.",
- "list-delete-suggest-archive": "Puede archivar una lista para quitarla del tablero y preservar la actividad",
+ "link-list": "Enlazar a esta lista",
+ "list-delete-pop": "Todas las acciones serán eliminadas del historial de actividades y no se podrá recuperar la lista. Esta acción no puede deshacerse.",
+ "list-delete-suggest-archive": "Puedes enviar una lista a la papelera de reciclaje para eliminarla del tablero y conservar la actividad.",
"lists": "Listas",
- "log-out": "Finalizar la sesion",
- "log-in": "Iniciar sesion",
- "loginPopup-title": "Iniciar sesion",
- "memberMenuPopup-title": "Preferencias de Miembro",
+ "swimlanes": "Carriles",
+ "log-out": "Finalizar la sesión",
+ "log-in": "Iniciar sesión",
+ "loginPopup-title": "Iniciar sesión",
+ "memberMenuPopup-title": "Mis preferencias",
"members": "Miembros",
- "menu": "Menu",
- "move-selection": "Mover selección",
- "moveCardPopup-title": "Move Card",
- "moveCardToBottom-title": "Mover al Final",
- "moveCardToTop-title": "Movel al Principio",
- "moveSelectionPopup-title": "Mover selección",
- "multi-selection": "Multi-Selección",
- "multi-selection-on": "Multi-Selección activada",
+ "menu": "Menú",
+ "move-selection": "Mover la selección",
+ "moveCardPopup-title": "Mover la tarjeta",
+ "moveCardToBottom-title": "Mover al final",
+ "moveCardToTop-title": "Mover al principio",
+ "moveSelectionPopup-title": "Mover la selección",
+ "multi-selection": "Selección múltiple",
+ "multi-selection-on": "Selección múltiple activada",
"muted": "Silenciado",
"muted-info": "No serás notificado de ningún cambio en este tablero",
"my-boards": "Mis tableros",
"name": "Nombre",
- "no-archived-cards": "No hay tarjetas archivadas.",
- "no-archived-lists": "No hay listas archivadas.",
+ "no-archived-cards": "No hay tarjetas en la papelera de reciclaje",
+ "no-archived-lists": "No hay listas en la papelera de reciclaje",
+ "no-archived-swimlanes": "No hay carriles de flujo en la papelera de reciclaje",
"no-results": "Sin resultados",
"normal": "Normal",
- "normal-desc": "Puedes ver y editar fichas. No puedes cambiar la configuración.",
- "not-accepted-yet": "Invitation not accepted yet",
+ "normal-desc": "Puedes ver y editar tarjetas. No puedes cambiar la configuración.",
+ "not-accepted-yet": "La invitación no ha sido aceptada aún",
"notify-participate": "Recibir actualizaciones de cualquier tarjeta en la que participas como creador o miembro",
"notify-watch": "Recibir actuaizaciones de cualquier tablero, lista o tarjeta que estés vigilando",
"optional": "opcional",
"or": "o",
- "page-maybe-private": "Esta página puede ser privada. Puedes verla por <a href='%s'>logging in</a>.",
+ "page-maybe-private": "Esta página puede ser privada. Es posible que puedas verla al <a href='%s'>iniciar sesión</a>.",
"page-not-found": "Página no encontrada.",
- "password": "Clave",
- "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)",
+ "password": "Contraseña",
+ "paste-or-dragdrop": "pegar o arrastrar y soltar un fichero de imagen (sólo imagen)",
"participating": "Participando",
"preview": "Previsualizar",
"previewAttachedImagePopup-title": "Previsualizar",
@@ -290,105 +317,131 @@
"private-desc": "Este tablero es privado. Sólo las personas añadidas al tablero pueden verlo y editarlo.",
"profile": "Perfil",
"public": "Público",
- "public-desc": "Este tablero es público. Es visible para cualquier persona con el enlace y se mostrará en los motores de búsqueda como Google. Sólo personas añadidas al tablero pueden editarlo.",
- "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": "Eliminar Etiqueta",
- "listDeletePopup-title": "Eliminar lista?",
- "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.",
+ "public-desc": "Este tablero es público. Es visible para cualquiera a través del enlace, y se mostrará en los buscadores como Google. Sólo las personas añadidas al tablero pueden editarlo.",
+ "quick-access-description": "Destaca un tablero para añadir un acceso directo en esta barra.",
+ "remove-cover": "Eliminar portada",
+ "remove-from-board": "Desvincular del tablero",
+ "remove-label": "Eliminar la etiqueta",
+ "listDeletePopup-title": "¿Eliminar la lista?",
+ "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. En ellas se mostrará una notificación.",
"removeMemberPopup-title": "¿Eliminar miembro?",
"rename": "Renombrar",
- "rename-board": "Renombrar tablero",
+ "rename-board": "Renombrar el tablero",
"restore": "Restaurar",
- "save": "Guardar",
+ "save": "Añadir",
"search": "Buscar",
- "select-color": "Selecciona un Color",
+ "search-cards": "Buscar entre los títulos y las descripciones de las tarjetas en este tablero.",
+ "search-example": "¿Texto a buscar?",
+ "select-color": "Selecciona un color",
+ "set-wip-limit-value": "Fija un límite para el número máximo de tareas en esta lista.",
+ "setWipLimitPopup-title": "Fijar el límite del trabajo en proceso",
"shortcut-assign-self": "Asignarte a ti mismo a la tarjeta actual",
"shortcut-autocomplete-emoji": "Autocompletar emoji",
"shortcut-autocomplete-members": "Autocompletar miembros",
"shortcut-clear-filters": "Limpiar todos los filtros",
- "shortcut-close-dialog": "Cerrar Diálogo",
+ "shortcut-close-dialog": "Cerrar el cuadro de diálogo",
"shortcut-filter-my-cards": "Filtrar mis tarjetas",
- "shortcut-show-shortcuts": "Bring up this shortcuts list",
- "shortcut-toggle-filterbar": "Toggle Filter Sidebar",
- "shortcut-toggle-sidebar": "Toggle Board Sidebar",
+ "shortcut-show-shortcuts": "Mostrar esta lista de atajos",
+ "shortcut-toggle-filterbar": "Conmutar la barra lateral del filtro",
+ "shortcut-toggle-sidebar": "Conmutar la barra lateral del tablero",
"show-cards-minimum-count": "Mostrar recuento de tarjetas si la lista contiene más de",
- "sidebar-open": "Abrir Barra Lateral",
- "sidebar-close": "Cerrar Barra Lateral",
- "signupPopup-title": "Crear una Cuenta",
+ "sidebar-open": "Abrir la barra lateral",
+ "sidebar-close": "Cerrar la barra lateral",
+ "signupPopup-title": "Crear una cuenta",
"star-board-title": "Haz clic para destacar este tablero. Se mostrará en la parte superior de tu lista de tableros.",
- "starred-boards": "Tableros Destacados",
+ "starred-boards": "Tableros destacados",
"starred-boards-description": "Los tableros destacados se mostrarán en la parte superior de tu lista de tableros.",
"subscribe": "Suscribirse",
"team": "Equipo",
"this-board": "este tablero",
- "this-card": "esta ficha",
+ "this-card": "esta tarjeta",
+ "spent-time-hours": "Tiempo consumido (horas)",
+ "overtime-hours": "Tiempo excesivo (horas)",
+ "overtime": "Tiempo excesivo",
+ "has-overtime-cards": "Hay tarjetas con el tiempo excedido",
+ "has-spenttime-cards": "Se ha excedido el tiempo de las tarjetas",
"time": "Hora",
"title": "Título",
- "tracking": "Seguimiento",
- "tracking-info": "Serás notificado de cualquier cambio en las tarjetas que estás envuelto como creador o miembro.",
- "unassign-member": "Desasignar miembro",
- "unsaved-description": "Tienes unas descripción no guardada.",
+ "tracking": "Siguiendo",
+ "tracking-info": "Serás notificado de cualquier cambio en las tarjetas en las que participas como creador o miembro.",
+ "unassign-member": "Desvincular al miembro",
+ "unsaved-description": "Tienes una descripción por añadir.",
"unwatch": "Dejar de vigilar",
"upload": "Cargar",
"upload-avatar": "Cargar un avatar",
"uploaded-avatar": "Avatar cargado",
- "username": "Nombre de Usuario",
- "view-it": "Verlo",
- "warn-list-archived": "warning: this card is in an archived list",
+ "username": "Nombre de usuario",
+ "view-it": "Verla",
+ "warn-list-archived": "advertencia: esta tarjeta está en una lista en la papelera de reciclaje",
"watch": "Vigilar",
"watching": "Vigilando",
"watching-info": "Serás notificado de cualquier cambio en este tablero",
- "welcome-board": "Tablero de Bienvenida",
- "welcome-list1": "Basicos",
+ "welcome-board": "Tablero de bienvenida",
+ "welcome-swimlane": "Hito 1",
+ "welcome-list1": "Básicos",
"welcome-list2": "Avanzados",
- "what-to-do": "What do you want to do?",
- "admin-panel": "Panel de Administrador",
+ "what-to-do": "¿Qué deseas hacer?",
+ "wipLimitErrorPopup-title": "El límite del trabajo en proceso no es válido.",
+ "wipLimitErrorPopup-dialog-pt1": "El número de tareas en esta lista es mayor que el límite del trabajo en proceso que has definido.",
+ "wipLimitErrorPopup-dialog-pt2": "Por favor, mueve algunas tareas fuera de esta lista, o fija un límite del trabajo en proceso más alto.",
+ "admin-panel": "Panel del administrador",
"settings": "Ajustes",
"people": "Personas",
"registration": "Registro",
"disable-self-registration": "Deshabilitar autoregistro",
"invite": "Invitar",
- "invite-people": "Invitar Personas",
+ "invite-people": "Invitar a personas",
"to-boards": "A el(los) tablero(s)",
- "email-addresses": "Direcciones de Correo Electrónico",
- "smtp-host-description": "Dirección del servidor SMTP para gestionar tus emails",
- "smtp-port-description": "Puerto usado por el servidor SMTP para mandar emails",
- "smtp-tls-description": "Habilitar soporte TLS para el servidor SMTP",
+ "email-addresses": "Direcciones de correo electrónico",
+ "smtp-host-description": "Dirección del servidor SMTP para gestionar tus correos",
+ "smtp-port-description": "Puerto usado por el servidor SMTP para mandar correos",
+ "smtp-tls-description": "Habilitar el soporte TLS para el servidor SMTP",
"smtp-host": "Servidor SMTP",
"smtp-port": "Puerto SMTP",
- "smtp-username": "Nombre de Usuario",
- "smtp-password": "Clave",
+ "smtp-username": "Nombre de usuario",
+ "smtp-password": "Contraseña",
"smtp-tls": "Soporte TLS",
- "send-from": "De",
+ "send-from": "Desde",
+ "send-smtp-test": "Enviarte un correo de prueba a ti mismo",
"invitation-code": "Código de Invitación",
- "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": "El Código de Invitación no existe",
+ "email-invite-register-subject": "__inviter__ te ha enviado una invitación",
+ "email-invite-register-text": "Estimado __user__,\n\n__inviter__ te invita a unirte a Wekan para colaborar.\n\nPor favor, haz clic en el siguiente enlace:\n__url__\n\nTu código de invitación es: __icode__\n\nGracias.",
+ "email-smtp-test-subject": "Prueba de correo SMTP desde Wekan",
+ "email-smtp-test-text": "El correo se ha enviado correctamente",
+ "error-invitation-code-not-exist": "El código de invitación no existe",
"error-notAuthorized": "No estás autorizado a ver esta página.",
"outgoing-webhooks": "Webhooks salientes",
"outgoingWebhooksPopup-title": "Webhooks salientes",
- "new-outgoing-webhook": "New Outgoing Webhook",
+ "new-outgoing-webhook": "Nuevo webhook saliente",
"no-name": "(Desconocido)",
- "Wekan_version": "Versión Wekan",
- "Node_version": "Versión Node",
- "OS_Arch": "Arquitectura SO",
- "OS_Cpus": "Número CPUs SO",
- "OS_Freemem": "Memoria libre SO",
- "OS_Loadavg": "Carga Media SO",
- "OS_Platform": "Plataforma SO",
- "OS_Release": "Release SO",
- "OS_Totalmem": "Memoria Total SO",
- "OS_Type": "Tipo SO",
- "OS_Uptime": "Tiempo activo SO",
+ "Wekan_version": "Versión de Wekan",
+ "Node_version": "Versión de Node",
+ "OS_Arch": "Arquitectura del sistema",
+ "OS_Cpus": "Número de CPUs del sistema",
+ "OS_Freemem": "Memoria libre del sistema",
+ "OS_Loadavg": "Carga media del sistema",
+ "OS_Platform": "Plataforma del sistema",
+ "OS_Release": "Publicación del sistema",
+ "OS_Totalmem": "Memoria Total del sistema",
+ "OS_Type": "Tipo de sistema",
+ "OS_Uptime": "Tiempo activo del sistema",
"hours": "horas",
"minutes": "minutos",
"seconds": "segundos",
"yes": "Sí",
"no": "No",
"accounts": "Cuentas",
- "accounts-allowEmailChange": "Permitir cambiar email"
+ "accounts-allowEmailChange": "Permitir cambiar el correo electrónico",
+ "accounts-allowUserNameChange": "Permitir el cambio del nombre de usuario",
+ "createdAt": "Creado en",
+ "verified": "Verificado",
+ "active": "Activo",
+ "card-received": "Recibido",
+ "card-received-on": "Recibido el",
+ "card-end": "Finalizado",
+ "card-end-on": "Finalizado el",
+ "editCardReceivedDatePopup-title": "Cambiar la fecha de recepción",
+ "editCardEndDatePopup-title": "Cambiar la fecha de finalización"
} \ No newline at end of file
diff --git a/i18n/eu.i18n.json b/i18n/eu.i18n.json
index edf7e09a..025fddfb 100644
--- a/i18n/eu.i18n.json
+++ b/i18n/eu.i18n.json
@@ -2,16 +2,17 @@
"accept": "Onartu",
"act-activity-notify": "[Wekan] Jarduera-jakinarazpena",
"act-addAttachment": "__attachment__ __card__ txartelera erantsita",
- "act-addChecklist": "added checklist __checklist__ to __card__",
- "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
+ "act-addChecklist": "gehituta checklist __checklist__ __card__ -ri",
+ "act-addChecklistItem": "gehituta __checklistItem__ checklist __checklist__ on __card__ -ri",
"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-archivedBoard": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
"act-importBoard": "__board__ inportatuta",
"act-importCard": "__card__ inportatuta",
"act-importList": "__list__ inportatuta",
@@ -26,7 +27,7 @@
"activities": "Jarduerak",
"activity": "Jarduera",
"activity-added": "%s %s(e)ra gehituta",
- "activity-archived": "%s artxibatu du",
+ "activity-archived": "%s moved to Recycle Bin",
"activity-attached": "%s %s(e)ra erantsita",
"activity-created": "%s sortuta",
"activity-excluded": "%s %s(e)tik kanpo utzita",
@@ -44,6 +45,7 @@
"add-attachment": "Gehitu eranskina",
"add-board": "Gehitu arbela",
"add-card": "Gehitu txartela",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Gehitu egiaztaketa zerrenda",
"add-checklist-item": "Gehitu elementu bat egiaztaketa zerrendara",
"add-cover": "Gehitu azala",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "Kideak",
"admin": "Kudeatzailea",
"admin-desc": "Txartelak ikusi eta editatu ditzake, kideak kendu, eta arbelaren ezarpenak aldatu.",
+ "admin-announcement": "Jakinarazpena",
+ "admin-announcement-active": "Gaitu Sistema-eremuko Jakinarazpena",
+ "admin-announcement-title": "Administrariaren jakinarazpena",
"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": "Wekan kargatzen ari da, itxaron mesedez. Orria freskatzeak datuen galera ekarriko luke. Wekan kargatzen ez bada, egiaztatu Wekan zerbitzaria gelditu ez dela.",
- "archive": "Artxibatu",
- "archive-all": "Artxibatu guztiak",
- "archive-board": "Artxibatu arbela",
- "archive-card": "Artxibatu txartela",
- "archive-list": "Artxibatu zerrenda",
- "archive-selection": "Artxibatu hautaketa",
- "archiveBoardPopup-title": "Artxibatu arbela?",
- "archived-items": "Artxibatutako elementuak",
- "archived-boards": "Artxibatu arbelak",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
"restore-board": "Berreskuratu arbela",
- "no-archived-boards": "Ez dago artxibatutako arbelik",
- "archives": "Artxiboak",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
"assign-member": "Esleitu kidea",
"attached": "erantsita",
"attachment": "Eranskina",
@@ -91,15 +97,19 @@
"boardChangeWatchPopup-title": "Aldatu ikuskatzea",
"boardMenuPopup-title": "Arbelaren menua",
"boards": "Arbelak",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Zerrendak",
"bucket-example": "Esaterako \"Pertz zerrenda\"",
"cancel": "Utzi",
- "card-archived": "Txartel hau artxibatuta dago.",
+ "card-archived": "This card is moved to Recycle Bin.",
"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-delete-suggest-archive": "You can move a card Recycle Bin to remove it from the board and preserve the activity.",
"card-due": "Epemuga",
"card-due-on": "Epemuga",
+ "card-spent": "Erabilitako denbora",
"card-edit-attachments": "Editatu eranskinak",
"card-edit-labels": "Editatu etiketak",
"card-edit-members": "Editatu kideak",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "Kideak",
"cardMorePopup-title": "Gehiago",
"cards": "Txartelak",
+ "cards-count": "Txartelak",
"change": "Aldatu",
"change-avatar": "Aldatu avatarra",
"change-password": "Aldatu pasahitza",
@@ -130,7 +141,7 @@
"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",
+ "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
"color-black": "beltza",
"color-blue": "urdina",
"color-green": "berdea",
@@ -146,8 +157,12 @@
"comment-only": "Iruzkinak besterik ez",
"comment-only-desc": "Iruzkinak txarteletan soilik egin ditzake",
"computer": "Ordenagailua",
+ "confirm-checklist-delete-dialog": "Ziur zaude kontrol-zerrenda ezabatu nahi duzula",
"copy-card-link-to-clipboard": "Kopiatu txartela arbelera",
- "copyCardPopup-title": "Copy Card",
+ "copyCardPopup-title": "Kopiatu txartela",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
"create": "Sortu",
"createBoardPopup-title": "Sortu arbela",
"chooseBoardSourcePopup-title": "Inportatu arbela",
@@ -167,8 +182,11 @@
"edit": "Editatu",
"edit-avatar": "Aldatu avatarra",
"edit-profile": "Editatu profila",
+ "edit-wip-limit": "WIP muga editatu",
+ "soft-wip-limit": "WIP muga malgua",
"editCardStartDatePopup-title": "Aldatu hasiera data",
"editCardDueDatePopup-title": "Aldatu epemuga data",
+ "editCardSpentTimePopup-title": "Aldatu erabilitako denbora",
"editLabelPopup-title": "Aldatu etiketa",
"editNotificationPopup-title": "Editatu jakinarazpena",
"editProfilePopup-title": "Editatu profila",
@@ -176,6 +194,7 @@
"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-fail-text": "Arazoa mezua bidaltzen saiatzen",
"email-invalid": "Baliogabeko e-posta",
"email-invite": "Gonbidatu e-posta bidez",
"email-invite-subject": "__inviter__ erabiltzaileak gonbidapen bat bidali dizu",
@@ -185,6 +204,7 @@
"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.",
+ "enable-wip-limit": "WIP muga gaitu",
"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",
@@ -229,6 +249,8 @@
"info": "Bertsioa",
"initials": "Inizialak",
"invalid-date": "Baliogabeko data",
+ "invalid-time": "Baliogabeko denbora",
+ "invalid-user": "Baliogabeko erabiltzailea",
"joined": "elkartu da",
"just-invited": "Arbel honetara gonbidatu berri zaituzte",
"keyboard-shortcuts": "Teklatu laster-bideak",
@@ -239,18 +261,22 @@
"language": "Hizkuntza",
"last-admin-desc": "Ezin duzu rola aldatu gutxienez kudeatzaile bat behar delako.",
"leave-board": "Utzi arbela",
+ "leave-board-pop": "Ziur zaude __boardTitle__ utzi nahi duzula? Arbel honetako txartel guztietatik ezabatua izango zara.",
+ "leaveBoardPopup-title": "Arbela utzi?",
"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-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
"list-move-cards": "Lekuz aldatu zerrendako txartel guztiak",
"list-select-cards": "Aukeratu zerrenda honetako txartel guztiak",
"listActionPopup-title": "Zerrendaren ekintzak",
+ "swimlaneActionPopup-title": "Swimlane Actions",
"listImportCardPopup-title": "Inportatu Trello txartel bat",
"listMorePopup-title": "Gehiago",
"link-list": "Lotura zerrenda honetara",
"list-delete-pop": "Ekintza guztiak ekintza jariotik kenduko dira eta ezin izango duzu zerrenda berreskuratu. Ez dago desegiterik.",
- "list-delete-suggest-archive": "Zerrenda bat artxibatu dezakezu arbeletik kendu nahi baduzu bere jarduera gordez.",
+ "list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve the activity.",
"lists": "Zerrendak",
+ "swimlanes": "Swimlanes",
"log-out": "Itxi saioa",
"log-in": "Hasi saioa",
"loginPopup-title": "Hasi saioa",
@@ -268,8 +294,9 @@
"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-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
"no-results": "Emaitzarik ez",
"normal": "Arrunta",
"normal-desc": "Txartelak ikusi eta editatu ditzake. Ezin ditu ezarpenak aldatu.",
@@ -305,7 +332,11 @@
"restore": "Berrezarri",
"save": "Gorde",
"search": "Bilatu",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text to search for?",
"select-color": "Aukeratu kolorea",
+ "set-wip-limit-value": "Zerrenda honetako atazen muga maximoa ezarri",
+ "setWipLimitPopup-title": "WIP muga ezarri",
"shortcut-assign-self": "Esleitu zure burua txartel honetara",
"shortcut-autocomplete-emoji": "Automatikoki osatu emojia",
"shortcut-autocomplete-members": "Automatikoki osatu kideak",
@@ -326,6 +357,11 @@
"team": "Taldea",
"this-board": "arbel hau",
"this-card": "txartel hau",
+ "spent-time-hours": "Erabilitako denbora (orduak)",
+ "overtime-hours": "Luzapena (orduak)",
+ "overtime": "Luzapena",
+ "has-overtime-cards": "Luzapen txartelak ditu",
+ "has-spenttime-cards": "Erabilitako denbora txartelak ditu",
"time": "Ordua",
"title": "Izenburua",
"tracking": "Jarraitzen",
@@ -338,14 +374,18 @@
"uploaded-avatar": "Avatar bat igo da",
"username": "Erabiltzaile-izena",
"view-it": "Ikusi",
- "warn-list-archived": "abisua: txartel hau artxibatutako zerrenda batean dago",
+ "warn-list-archived": "warning: this card is in an list at Recycle Bin",
"watch": "Ikuskatu",
"watching": "Ikuskatzen",
"watching-info": "Arbel honi egindako aldaketak jakinaraziko zaizkizu",
"welcome-board": "Ongi etorri arbela",
+ "welcome-swimlane": "Milestone 1",
"welcome-list1": "Oinarrizkoa",
"welcome-list2": "Aurreratua",
"what-to-do": "Zer egin nahi duzu?",
+ "wipLimitErrorPopup-title": "Baliogabeko WIP muga",
+ "wipLimitErrorPopup-dialog-pt1": "Zerrenda honetako atazen muga, WIP-en ezarritakoa baina handiagoa da",
+ "wipLimitErrorPopup-dialog-pt2": "Mugitu zenbait ataza zerrenda honetatik, edo WIP muga handiagoa ezarri.",
"admin-panel": "Kudeaketa panela",
"settings": "Ezarpenak",
"people": "Jendea",
@@ -364,14 +404,17 @@
"smtp-password": "Pasahitza",
"smtp-tls": "TLS euskarria",
"send-from": "Nork",
+ "send-smtp-test": "Bidali posta elektroniko mezu bat zure buruari",
"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.",
+ "email-smtp-test-subject": "Wekan-etik bidalitako test-mezua",
+ "email-smtp-test-text": "Arrakastaz bidali duzu posta elektroniko mezua",
"error-invitation-code-not-exist": "Gonbidapen kodea ez da existitzen",
"error-notAuthorized": "Ez duzu orri hau ikusteko baimenik.",
"outgoing-webhooks": "Irteerako Webhook-ak",
"outgoingWebhooksPopup-title": "Irteerako Webhook-ak",
- "new-outgoing-webhook": "New Outgoing Webhook",
+ "new-outgoing-webhook": "Irteera-webhook berria",
"no-name": "(Ezezaguna)",
"Wekan_version": "Wekan bertsioa",
"Node_version": "Nodo bertsioa",
@@ -390,5 +433,15 @@
"yes": "Bai",
"no": "Ez",
"accounts": "Kontuak",
- "accounts-allowEmailChange": "Baimendu e-mail aldaketa"
+ "accounts-allowEmailChange": "Baimendu e-mail aldaketa",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Noiz sortua",
+ "verified": "Egiaztatuta",
+ "active": "Gaituta",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
} \ No newline at end of file
diff --git a/i18n/fa.i18n.json b/i18n/fa.i18n.json
index c7c05a2b..cf9e062f 100644
--- a/i18n/fa.i18n.json
+++ b/i18n/fa.i18n.json
@@ -1,17 +1,18 @@
{
- "accept": "تایید",
- "act-activity-notify": "[wekan]اطلاع فعالیت",
+ "accept": "پذیرش",
+ "act-activity-notify": "[wekan] اطلاع فعالیت",
"act-addAttachment": "پیوست __attachment__ به __card__",
- "act-addChecklist": "added checklist __checklist__ to __card__",
- "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
- "act-addComment": "یادداشت بر __card__: __comment__",
- "act-createBoard": " __board__ ایجادشد",
- "act-createCard": " __card__ به __list__ اضافه شد",
+ "act-addChecklist": "سیاهه __checklist__ به __card__ افزوده شد",
+ "act-addChecklistItem": "__checklistItem__ به سیاهه __checklist__ در __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-archivedBoard": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
"act-importBoard": "__board__ وارد شده",
"act-importCard": "__card__ وارد شده",
"act-importList": "__list__ وارد شده",
@@ -26,7 +27,7 @@
"activities": "فعالیت ها",
"activity": "فعالیت",
"activity-added": "%s به %s اضافه شد",
- "activity-archived": "%s بایگانی شد",
+ "activity-archived": "%s moved to Recycle Bin",
"activity-attached": "%s به %s پیوست شد",
"activity-created": "%s ایجاد شد",
"activity-excluded": "%s از %s مستثنی گردید",
@@ -44,6 +45,7 @@
"add-attachment": "افزودن ضمیمه",
"add-board": "افزودن برد",
"add-card": "افزودن کارت",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "افزودن چک لیست",
"add-checklist-item": "افزودن مورد به سیاهه",
"add-cover": "جلد کردن",
@@ -54,27 +56,31 @@
"addMemberPopup-title": "اعضا",
"admin": "مدیر",
"admin-desc": "امکان دیدن و ویرایش کارتها،پاک کردن کاربران و تغییر تنظیمات برای تخته",
- "all-boards": "تمام بردها",
+ "admin-announcement": "اعلان",
+ "admin-announcement-active": "اعلان سراسری فعال",
+ "admin-announcement-title": "اعلان از سوی مدیر",
+ "all-boards": "تمام تخته‌ها",
"and-n-other-card": "و __count__ کارت دیگر",
"and-n-other-card_plural": "و __count__ کارت دیگر",
- "apply": "اجرا",
- "app-is-offline": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
- "archive": "بایگانی",
- "archive-all": "تمامی بایگانی ها",
- "archive-board": "بایگانی برد",
- "archive-card": "بایگانی کارت",
- "archive-list": "آرشیو لیست",
- "archive-selection": "بایگانی موارد انتخاب شده ها",
- "archiveBoardPopup-title": "آیا می خواهید بایگانی شود؟",
- "archived-items": "آیتم های بایگانی شده",
- "archived-boards": "Archived Boards",
- "restore-board": "Restore Board",
- "no-archived-boards": "No Archived Boards.",
- "archives": "بایگانی ها",
+ "apply": "اعمال",
+ "app-is-offline": "Wekan در حال بارگذاری است. لطفا صبر کنید. نوسازی صفحه، منجر به از دست رفتن داده‌ها می‌شود. اگر Wekan بارگذاری نشد، لطفا بررسی کنید که سرور Wekan متوقف نشده باشد.",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
+ "restore-board": "بازیابی تخته",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
"assign-member": "تعیین عضو",
- "attached": "ضمیمه",
- "attachment": "ضمائم",
- "attachment-delete-pop": "حذف پیوست دایمی خواهد بود، بدون بازگشت",
+ "attached": "ضمیمه شده",
+ "attachment": "ضمیمه",
+ "attachment-delete-pop": "حذف پیوست دایمی و بی بازگشت خواهد بود.",
"attachmentDeletePopup-title": "آیا می خواهید ضمیمه را حذف کنید؟",
"attachments": "ضمائم",
"auto-watch": "اضافه شدن خودکار دیده بانی تخته زمانی که ایجاد می شوند",
@@ -82,55 +88,60 @@
"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": "تغغیر وضعیت نمایش",
+ "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": "برای مثال چیزی شبیه \"لیست سبدها\" ",
+ "boards": "تخته‌ها",
+ "board-view": "نمایش تخته",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "فهرست‌ها",
+ "bucket-example": "برای مثال چیزی شبیه \"لیست سبدها\"",
"cancel": "انصراف",
- "card-archived": "این کارت بایگانی شده است.",
- "card-comments-title": "این کارت دارای %s نظر می باشد.",
- "card-delete-notice": "پاک کردن بطور کامل. شما تمامی اقدامات مربوطه را از دست خواهید داد.",
- "card-delete-pop": "همه اقدامات ازاین پردازه (خوراک) حذف خواهد شد و امکان بازگشا کردن کارت وجود نخواهد داشت. هیچ امکان بازگشتی!",
- "card-delete-suggest-archive": "شما می توانید یک کارت را با حفظ فعالیت های آن بایگانی کنید.",
+ "card-archived": "This card is moved to Recycle Bin.",
+ "card-comments-title": "این کارت دارای %s نظر است.",
+ "card-delete-notice": "حذف دائمی. تمامی موارد مرتبط با این کارت از بین خواهند رفت.",
+ "card-delete-pop": "همه اقدامات از این پردازه (خوراک) حذف خواهد شد و امکان بازگرداندن کارت وجود نخواهد داشت.",
+ "card-delete-suggest-archive": "You can move a card Recycle Bin to remove it from the board and preserve the activity.",
"card-due": "ناشی از",
"card-due-on": "مقتضی بر",
+ "card-spent": "زمان صرف شده",
"card-edit-attachments": "ویرایش ضمائم",
"card-edit-labels": "ویرایش برچسب",
"card-edit-members": "ویرایش اعضا",
"card-labels-title": "تغییر برچسب کارت",
"card-members-title": "افزودن یا حذف اعضا از کارت.",
"card-start": "شروع",
- "card-start-on": "آغاز بر",
+ "card-start-on": "شروع از",
"cardAttachmentsPopup-title": "ضمیمه از",
"cardDeletePopup-title": "آیا می خواهید کارت را حذف کنید؟",
"cardDetailsActionsPopup-title": "اعمال کارت",
"cardLabelsPopup-title": "برچسب ها",
"cardMembersPopup-title": "اعضا",
"cardMorePopup-title": "بیشتر",
- "cards": "کارت ها",
+ "cards": "کارت‌ها",
+ "cards-count": "کارت‌ها",
"change": "تغییر",
"change-avatar": "تغییر تصویر",
"change-password": "تغییر کلمه عبور",
- "change-permissions": "تغییر دسترسی ها",
+ "change-permissions": "تغییر دسترسی‌ها",
"change-settings": "تغییر تنظیمات",
"changeAvatarPopup-title": "تغییر تصویر",
"changeLanguagePopup-title": "تغییر زبان",
"changePasswordPopup-title": "تغییر کلمه عبور",
- "changePermissionsPopup-title": "تغییر دسترسی ها",
+ "changePermissionsPopup-title": "تغییر دسترسی‌ها",
"changeSettingsPopup-title": "تغییر تنظیمات",
- "checklists": "سیاهه ها",
+ "checklists": "سیاهه‌ها",
"click-to-star": "با کلیک کردن ستاره بدهید",
"click-to-unstar": "با کلیک کردن ستاره را کم کنید",
"clipboard": "ذخیره در حافظه ویا بردار-رهاکن",
"close": "بستن",
"close-board": "بستن برد",
- "close-board-pop": "شما می توانید با کلیک بر دکمه \"بایگانی\" از قسمت بالای خانه، تخته را بازآوری نمایید.",
+ "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
"color-black": "مشکی",
"color-blue": "آبی",
"color-green": "سبز",
@@ -142,15 +153,19 @@
"color-sky": "آبی آسمانی",
"color-yellow": "زرد",
"comment": "نظر",
- "comment-placeholder": "Write Comment",
- "comment-only": "صرفا یادداشت",
- "comment-only-desc": "صرفا یادداشت برروی کارت ها",
+ "comment-placeholder": "درج نظر",
+ "comment-only": "فقط نظر",
+ "comment-only-desc": "فقط می‌تواند روی کارت‌ها نظر دهد.",
"computer": "رایانه",
- "copy-card-link-to-clipboard": "Copy card link to clipboard",
- "copyCardPopup-title": "Copy Card",
+ "confirm-checklist-delete-dialog": "مطمئنید که می‌خواهید سیاهه را حذف کنید؟",
+ "copy-card-link-to-clipboard": "درج پیوند کارت در حافظه",
+ "copyCardPopup-title": "کپی کارت",
+ "copyChecklistToManyCardsPopup-title": "کپی قالب کارت به کارت‌های متعدد",
+ "copyChecklistToManyCardsPopup-instructions": "عنوان و توضیحات کارت مقصد در این قالب JSON",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
"create": "ایجاد",
"createBoardPopup-title": "ایجاد تخته",
- "chooseBoardSourcePopup-title": "Import board",
+ "chooseBoardSourcePopup-title": "بارگذاری تخته",
"createLabelPopup-title": "ایجاد برچسب",
"current": "جاری",
"date": "تاریخ",
@@ -167,17 +182,21 @@
"edit": "ویرایش",
"edit-avatar": "تغییر تصویر",
"edit-profile": "ویرایش پروفایل",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
"editCardStartDatePopup-title": "تغییر تاریخ آغاز",
"editCardDueDatePopup-title": "تغییر تاریخ بدلیل",
+ "editCardSpentTimePopup-title": "تغییر زمان صرف شده",
"editLabelPopup-title": "تغیر برچسب",
"editNotificationPopup-title": "اصلاح اعلان",
"editProfilePopup-title": "ویرایش پروفایل",
"email": "پست الکترونیک",
"email-enrollAccount-subject": "یک حساب کاربری برای شما در __siteName__ ایجاد شد",
- "email-enrollAccount-text": "سلام __user__ \nبرای شروع به استفاده از این سرویس برروی آدرس زیر کلیک نمایید،با تشکر \n__url__.",
- "email-fail": "عدم موفقیت در ارسال نامه الکترونیکی",
- "email-invalid": "پست الکترونیکی نادرست",
- "email-invite": "دعوت از طریق نامه الکترونیکی",
+ "email-enrollAccount-text": "سلام __user__ \nبرای شروع به استفاده از این سرویس برروی آدرس زیر کلیک کنید.\n__url__\nبا تشکر.",
+ "email-fail": "عدم موفقیت در فرستادن رایانامه",
+ "email-fail-text": "خطا در تلاش برای فرستادن رایانامه",
+ "email-invalid": "رایانامه نادرست",
+ "email-invite": "دعوت از طریق رایانامه",
"email-invite-subject": "__inviter__ برای شما دعوت نامه ارسال کرده است",
"email-invite-text": "__User__ عزیز\n __inviter__ شما را به عضویت تخته \"__board__\" برای همکاری دعوت کرده است.\nلطفا لینک زیر را دنبال کنید، باتشکر:\n__url__",
"email-resetPassword-subject": "تنظیم مجدد کلمه عبور در __siteName__",
@@ -185,6 +204,7 @@
"email-sent": "نامه الکترونیکی فرستاده شد",
"email-verifyEmail-subject": "تایید آدرس الکترونیکی شما در __siteName__",
"email-verifyEmail-text": "سلام __user__\nبه منظور تایید آدرس الکترونیکی حساب خود، آدرس زیر را دنبال نمایید، باتشکر:\n__url__.",
+ "enable-wip-limit": "Enable WIP Limit",
"error-board-doesNotExist": "تخته مورد نظر وجود ندارد",
"error-board-notAdmin": "شما جهت انجام آن باید مدیر تخته باشید",
"error-board-notAMember": "شما انجام آن ،اید عضو این تخته باشید.",
@@ -195,10 +215,10 @@
"error-user-notAllowSelf": "عدم امکان دعوت خود",
"error-user-notCreated": "این کاربر ایجاد نشده است",
"error-username-taken": "این نام کاربری استفاده شده است",
- "error-email-taken": "Email has already been taken",
+ "error-email-taken": "رایانامه توسط گیرنده دریافت شده است",
"export-board": "انتقال به بیرون تخته",
"filter": "صافی ـFilterـ",
- "filter-cards": "صافی ـFilterـ کارتها",
+ "filter-cards": "صافی ـFilterـ کارت‌ها",
"filter-clear": "حذف صافی ـFilterـ",
"filter-no-label": "بدون برچسب",
"filter-no-member": "بدون عضو",
@@ -211,13 +231,13 @@
"headerBarCreateBoardPopup-title": "ایجاد تخته",
"home": "خانه",
"import": "وارد کردن",
- "import-board": "import board",
- "import-board-c": "Import board",
- "import-board-title-trello": "وارد کردن تخته ها از Trello",
- "import-board-title-wekan": "Import board from Wekan",
+ "import-board": "وارد کردن تخته",
+ "import-board-c": "وارد کردن تخته",
+ "import-board-title-trello": "وارد کردن تخته از Trello",
+ "import-board-title-wekan": "وارد کردن تخته از Wekan",
"import-sandstorm-warning": "Imported board will delete all existing data on board and replace it with imported board.",
- "from-trello": "From Trello",
- "from-wekan": "From Wekan",
+ "from-trello": "از Trello",
+ "from-wekan": "از Wekan",
"import-board-instruction-trello": "در Trello-ی خود به 'Menu'، 'More'، 'Print'، 'Export to JSON رفته و متن نهایی را دراینجا وارد نمایید.",
"import-board-instruction-wekan": "In your Wekan board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.",
"import-json-placeholder": "اطلاعات Json معتبر خود را اینجا وارد کنید.",
@@ -226,31 +246,37 @@
"import-show-user-mapping": "بررسی نقشه کاربران",
"import-user-select": "کاربری از نرم افزار را که می خواهید بعنوان این عضو جایگزین شود را انتخاب کنید.",
"importMapMembersAddPopup-title": "انتخاب کاربر Wekan",
- "info": "Version",
+ "info": "نسخه",
"initials": "تخصیصات اولیه",
"invalid-date": "تاریخ نامعتبر",
+ "invalid-time": "زمان نامعتبر",
+ "invalid-user": "کاربر نامعتیر",
"joined": "متصل",
"just-invited": "هم اکنون، شما به این تخته دعوت شده اید.",
"keyboard-shortcuts": "میانبر کلیدها",
"label-create": "ایجاد برچسب",
"label-default": "%s برچسب(پیش فرض)",
- "label-delete-pop": "بدون برگشت. این حذف برچسب را از هر کارت پاک خواهد کردو تاریخچه آن را نیز ازبین می برد.",
+ "label-delete-pop": "این اقدام، برچسب را از همه کارت‌ها پاک خواهد کرد و تاریخچه آن را نیز از بین می‌برد.",
"labels": "برچسب ها",
"language": "زبان",
"last-admin-desc": "شما نمی توانید نقش ـroleـ را تغییر دهید چراکه باید حداقل یک مدیری وجود داشته باشد.",
"leave-board": "خروج از تخته",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "Leave Board ?",
"link-card": "ارجاع به این کارت",
- "list-archive-cards": "بایگانی تمامی کارتهای این لیست",
- "list-archive-cards-pop": "این اقدام، همه کارت های این لیست از تخته راحذف خواهد کرد. جهت مشاهده کارت های بایگانی و بازگرداندن آنها ، \"Menu\",\"Archived Item\" را کلیک کنید.",
+ "list-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
"list-move-cards": "انتقال تمام کارت های این لیست",
"list-select-cards": "انتخاب تمام کارت های این لیست",
"listActionPopup-title": "لیست اقدامات",
+ "swimlaneActionPopup-title": "Swimlane Actions",
"listImportCardPopup-title": "وارد کردن کارت Trello",
"listMorePopup-title": "بیشتر",
- "link-list": "Link to this list",
+ "link-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.",
+ "list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve the activity.",
"lists": "لیست ها",
+ "swimlanes": "Swimlanes",
"log-out": "خروج",
"log-in": "ورود",
"loginPopup-title": "ورود",
@@ -266,10 +292,11 @@
"multi-selection-on": "حالت چند انتخابی روشن است",
"muted": "بی صدا",
"muted-info": "شما هیچگاه از تغییرات این تخته مطلع نخواهید شد",
- "my-boards": "تخته های من",
+ "my-boards": "تخته‌های من",
"name": "نام",
- "no-archived-cards": "کارتی در بایگانی نیست",
- "no-archived-lists": "لیستی در بایگانی نیست",
+ "no-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
"no-results": "بدون نتیجه",
"normal": "عادی",
"normal-desc": "امکان نمایش و تنظیم کارت بدون امکان تغییر تنظیمات",
@@ -278,7 +305,7 @@
"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": "جهت چسباندن، یا برداشتن-رهاسازی فایل تصویر به آن (تصویر)",
@@ -294,8 +321,8 @@
"quick-access-description": "جهت افزودن یک تخته به اینجا،آنرا ستاره دار نمایید.",
"remove-cover": "حذف کاور",
"remove-from-board": "حذف از تخته",
- "remove-label": "Remove Label",
- "listDeletePopup-title": "Delete List ?",
+ "remove-label": "حذف برچسب",
+ "listDeletePopup-title": "حذف فهرست؟",
"remove-member": "حذف عضو",
"remove-member-from-card": "حذف از کارت",
"remove-member-pop": "آیا __name__ (__username__) را از __boardTitle__ حذف می کنید? کاربر از تمام کارت ها در این تخته حذف خواهد شد و آنها ازین اقدام مطلع خواهند شد.",
@@ -305,7 +332,11 @@
"restore": "بازیابی",
"save": "ذخیره",
"search": "جستجو",
- "select-color": "Select Color",
+ "search-cards": "جستجو در میان عناوین و توضیحات در این تخته",
+ "search-example": "متن مورد جستجو؟",
+ "select-color": "انتخاب رنگ",
+ "set-wip-limit-value": "تعیین بیشینه تعداد وظایف در این فهرست",
+ "setWipLimitPopup-title": "Set WIP Limit",
"shortcut-assign-self": "اختصاص خود به کارت فعلی",
"shortcut-autocomplete-emoji": "تکمیل خودکار شکلکها",
"shortcut-autocomplete-members": "تکمیل خودکار کاربرها",
@@ -326,6 +357,11 @@
"team": "تیم",
"this-board": "این تخته",
"this-card": "این کارت",
+ "spent-time-hours": "زمان صرف شده (ساعت)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "زمان",
"title": "عنوان",
"tracking": "پیگردی",
@@ -338,23 +374,27 @@
"uploaded-avatar": "تصویر ارسال شد",
"username": "نام کاربری",
"view-it": "مشاهده",
- "warn-list-archived": "هشدار: این کارت در یک لیست بایگانی شده است",
+ "warn-list-archived": "warning: this card is in an list at Recycle Bin",
"watch": "دیده بانی",
"watching": "درحال دیده بانی",
"watching-info": "شما از هر تغییری دراین تخته آگاه خواهید شد",
"welcome-board": "به این تخته خوش آمدید",
+ "welcome-swimlane": "Milestone 1",
"welcome-list1": "پایه ای ها",
"welcome-list2": "پیشرفته",
"what-to-do": "چه کاری می خواهید انجام دهید؟",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
"admin-panel": "پیشخوان مدیریتی",
"settings": "تنظمات",
"people": "افراد",
"registration": "ثبت نام",
- "disable-self-registration": "غیرفعالسازی خودثبت نامی",
+ "disable-self-registration": "‌غیرفعال‌سازی خودثبت‌نامی",
"invite": "دعوت",
"invite-people": "دعوت از افراد",
"to-boards": "به تخته(ها)",
- "email-addresses": "ادرس پست های الکترونیکی",
+ "email-addresses": "نشانی رایانامه",
"smtp-host-description": "آدرس سرور SMTP ای که پست الکترونیکی شما برروی آن است",
"smtp-port-description": "شماره درگاه ـPortـ ای که سرور SMTP شما جهت ارسال از آن استفاده می کند",
"smtp-tls-description": "پشتیبانی از TLS برای سرور SMTP",
@@ -364,17 +404,20 @@
"smtp-password": "کلمه عبور",
"smtp-tls": "پشتیبانی از SMTP",
"send-from": "از",
+ "send-smtp-test": "فرستادن رایانامه آزمایشی به خود",
"invitation-code": "کد دعوت نامه",
"email-invite-register-subject": "__inviter__ برای شما دعوت نامه ارسال کرده است",
"email-invite-register-text": "__User__ عزیز \nکاربر __inviter__ شما را به عضویت در Wekan برای همکاری دعوت کرده است.\nلطفا لینک زیر را دنبال کنید،\n __url__\nکد دعوت شما __icode__ می باشد.\n باتشکر",
+ "email-smtp-test-subject": "رایانامه SMTP آزمایشی از Wekan",
+ "email-smtp-test-text": "با موفقیت، یک رایانامه را فرستادید",
"error-invitation-code-not-exist": "چنین کد دعوتی یافت نشد",
- "error-notAuthorized": "You are not authorized to view this page.",
+ "error-notAuthorized": "شما مجاز به دیدن این صفحه نیستید.",
"outgoing-webhooks": "Outgoing Webhooks",
"outgoingWebhooksPopup-title": "Outgoing Webhooks",
"new-outgoing-webhook": "New Outgoing Webhook",
- "no-name": "(Unknown)",
- "Wekan_version": "Wekan version",
- "Node_version": "Node version",
+ "no-name": "(ناشناخته)",
+ "Wekan_version": "نسخه Wekan",
+ "Node_version": "نسخه Node ",
"OS_Arch": "OS Arch",
"OS_Cpus": "OS CPU Count",
"OS_Freemem": "OS Free Memory",
@@ -384,11 +427,21 @@
"OS_Totalmem": "OS Total Memory",
"OS_Type": "OS Type",
"OS_Uptime": "OS Uptime",
- "hours": "hours",
- "minutes": "minutes",
- "seconds": "seconds",
- "yes": "Yes",
- "no": "No",
- "accounts": "Accounts",
- "accounts-allowEmailChange": "Allow Email Change"
+ "hours": "ساعت",
+ "minutes": "دقیقه",
+ "seconds": "ثانیه",
+ "yes": "بله",
+ "no": "خیر",
+ "accounts": "حساب‌ها",
+ "accounts-allowEmailChange": "اجازه تغییر رایانامه",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "ساخته شده در",
+ "verified": "معتبر",
+ "active": "فعال",
+ "card-received": "رسیده",
+ "card-received-on": "رسیده در",
+ "card-end": "پایان",
+ "card-end-on": "پایان در",
+ "editCardReceivedDatePopup-title": "تغییر تاریخ رسید",
+ "editCardEndDatePopup-title": "تغییر تاریخ پایان"
} \ No newline at end of file
diff --git a/i18n/fi.i18n.json b/i18n/fi.i18n.json
index 0a834996..a68831dc 100644
--- a/i18n/fi.i18n.json
+++ b/i18n/fi.i18n.json
@@ -9,9 +9,10 @@
"act-createCard": "lisätty __card__ listalle __list__",
"act-createList": "lisätty __list__ taululle __board__",
"act-addBoardMember": "lisätty __member__ taululle __board__",
- "act-archivedBoard": "arkistoitu __board__",
- "act-archivedCard": "arkistoitu __card__",
- "act-archivedList": "arkistoitu __list__",
+ "act-archivedBoard": "__board__ siirretty roskakoriin",
+ "act-archivedCard": "__card__ siirretty roskakoriin",
+ "act-archivedList": "__list__ siirretty roskakoriin",
+ "act-archivedSwimlane": "__swimlane__ siirretty roskakoriin",
"act-importBoard": "tuotu __board__",
"act-importCard": "tuotu __card__",
"act-importList": "tuotu __list__",
@@ -26,7 +27,7 @@
"activities": "Toimet",
"activity": "Toiminta",
"activity-added": "lisätty %s kohteeseen %s",
- "activity-archived": "arkistoitu %s",
+ "activity-archived": "%s siirretty roskakoriin",
"activity-attached": "liitetty %s kohteeseen %s",
"activity-created": "luotu %s",
"activity-excluded": "poistettu %s kohteesta %s",
@@ -44,6 +45,7 @@
"add-attachment": "Lisää liite",
"add-board": "Lisää taulu",
"add-card": "Lisää kortti",
+ "add-swimlane": "Lisää Swimlane",
"add-checklist": "Lisää tarkistuslista",
"add-checklist-item": "Lisää kohta tarkistuslistaan",
"add-cover": "Lisää kansi",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "Jäsenet",
"admin": "Ylläpitäjä",
"admin-desc": "Voi nähfä ja muokata kortteja, poistaa jäseniä, ja muuttaa taulun asetuksia.",
+ "admin-announcement": "Ilmoitus",
+ "admin-announcement-active": "Aktiivinen järjestelmänlaajuinen ilmoitus",
+ "admin-announcement-title": "Ilmoitus ylläpitäjältä",
"all-boards": "Kaikki taulut",
"and-n-other-card": "Ja __count__ muu kortti",
"and-n-other-card_plural": "Ja __count__ muuta korttia",
"apply": "Käytä",
"app-is-offline": "Wekan latautuu, odota. Sivun uudelleenlataus aiheuttaa tietojen menettämisen. Jos Wekan ei lataudu, tarkista että Wekan palvelin ei ole pysähtynyt.",
- "archive": "Arkistoi",
- "archive-all": "Arkistoi kaikki",
- "archive-board": "Arkistoi taulu",
- "archive-card": "Arkistoi kortti",
- "archive-list": "Arkistoi lista",
- "archive-selection": "Arkistoi valinta",
- "archiveBoardPopup-title": "Arkistoi taulu?",
- "archived-items": "Arkistoidut kohteet",
- "archived-boards": "Arkistoidut taulut",
+ "archive": "Siirrä roskakoriin",
+ "archive-all": "Siirrä kaikki roskakoriin",
+ "archive-board": "Siirrä taulu roskakoriin",
+ "archive-card": "Siirrä kortti roskakoriin",
+ "archive-list": "Siirrä lista roskakoriin",
+ "archive-swimlane": "Siirrä Swimlane roskakoriin",
+ "archive-selection": "Siirrä valinta roskakoriin",
+ "archiveBoardPopup-title": "Siirrä taulu roskakoriin?",
+ "archived-items": "Roskakori",
+ "archived-boards": "Taulut roskakorissa",
"restore-board": "Palauta taulu",
- "no-archived-boards": "Ei arkistoituja tauluja.",
- "archives": "Arkistot",
+ "no-archived-boards": "Ei tauluja roskakorissa",
+ "archives": "Roskakori",
"assign-member": "Valitse jäsen",
"attached": "liitetty",
"attachment": "Liitetiedosto",
@@ -91,15 +97,19 @@
"boardChangeWatchPopup-title": "Muokkaa seuraamista",
"boardMenuPopup-title": "Taulu valikko",
"boards": "Taulut",
+ "board-view": "Taulu näkymä",
+ "board-view-swimlanes": "Swimlanet",
+ "board-view-lists": "Listat",
"bucket-example": "Kuten “Laatikko lista” esimerkiksi",
"cancel": "Peruuta",
- "card-archived": "Tämä kortti on arkistoitu.",
+ "card-archived": "Tämä kortti on siirretty roskakoriin.",
"card-comments-title": "Tässä kortissa on %s kommenttia.",
"card-delete-notice": "Poistaminen on lopullista. Menetät kaikki toimet jotka on liitetty tähän korttiin.",
"card-delete-pop": "Kaikki toimet poistetaan toimintasyötteestä ja et tule pystymään uudelleenavaamaan korttia. Tätä ei voi peruuttaa.",
- "card-delete-suggest-archive": "Voit arkistoida kortin poistaaksesi sen taululta ja säilyttääksesi toimet.",
+ "card-delete-suggest-archive": "Voit siirtää kortin roskakoriin poistaaksesi sen taululta ja säilyttääksesi toimintalokin.",
"card-due": "Erääntyy",
"card-due-on": "Erääntyy",
+ "card-spent": "Käytetty aika",
"card-edit-attachments": "Muokkaa liitetiedostoja",
"card-edit-labels": "Muokkaa tunnisteita",
"card-edit-members": "Muokkaa jäseniä",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "Jäsenet",
"cardMorePopup-title": "Lisää",
"cards": "Kortit",
+ "cards-count": "korttia",
"change": "Muokkaa",
"change-avatar": "Muokkaa profiilikuvaa",
"change-password": "Vaihda salasana",
@@ -130,7 +141,7 @@
"clipboard": "Leikepöytä tai raahaa ja pudota",
"close": "Sulje",
"close-board": "Sulje taulu",
- "close-board-pop": "Voit palauttaa taulun klikkaamalla “Arkistot” painiketta kotiotsikosta.",
+ "close-board-pop": "Voit palauttaa taulun klikkaamalla “Roskakori” painiketta taululistan yläpalkista.",
"color-black": "musta",
"color-blue": "sininen",
"color-green": "vihreä",
@@ -146,8 +157,12 @@
"comment-only": "Vain kommentointi",
"comment-only-desc": "Voi vain kommentoida kortteja",
"computer": "Tietokone",
+ "confirm-checklist-delete-dialog": "Haluatko varmasti poistaa tarkistuslistan",
"copy-card-link-to-clipboard": "Kopioi kortin linkki leikepöydälle",
"copyCardPopup-title": "Kopioi kortti",
+ "copyChecklistToManyCardsPopup-title": "Kopioi tarkistuslistan malli monille korteille",
+ "copyChecklistToManyCardsPopup-instructions": "Kohde korttien otsikot ja kuvaukset JSON muodossa",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Ensimmäisen kortin otsikko\", \"description\":\"Ensimmäisen kortin kuvaus\"}, {\"title\":\"Toisen kortin otsikko\",\"description\":\"Toisen kortin kuvaus\"},{\"title\":\"Viimeisen kortin otsikko\",\"description\":\"Viimeisen kortin kuvaus\"} ]",
"create": "Luo",
"createBoardPopup-title": "Luo taulu",
"chooseBoardSourcePopup-title": "Tuo taulu",
@@ -167,8 +182,11 @@
"edit": "Muokkaa",
"edit-avatar": "Muokkaa profiilikuvaa",
"edit-profile": "Muokkaa profiilia",
+ "edit-wip-limit": "Muokkaa WIP-rajaa",
+ "soft-wip-limit": "Pehmeä WIP raja",
"editCardStartDatePopup-title": "Muokkaa aloituspäivää",
"editCardDueDatePopup-title": "Muokkaa eräpäivää",
+ "editCardSpentTimePopup-title": "Muuta käytettyä aikaa",
"editLabelPopup-title": "Muokkaa tunnistetta",
"editNotificationPopup-title": "Muokkaa ilmoituksia",
"editProfilePopup-title": "Muokkaa profiilia",
@@ -176,6 +194,7 @@
"email-enrollAccount-subject": "An account created for you on __siteName__",
"email-enrollAccount-text": "Hei __user__,\n\nAlkaaksesi käyttämään palvelua, klikkaa allaolevaa linkkiä.\n\n__url__\n\nKiitos.",
"email-fail": "Sähköpostin lähettäminen epäonnistui",
+ "email-fail-text": "Virhe yrittäessä lähettää sähköpostia",
"email-invalid": "Virheellinen sähköposti",
"email-invite": "Kutsu sähköpostilla",
"email-invite-subject": "__inviter__ lähetti sinulle kutsun",
@@ -185,6 +204,7 @@
"email-sent": "Sähköposti lähetetty",
"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.",
+ "enable-wip-limit": "Ota käyttöön WIP-raja",
"error-board-doesNotExist": "Tämä taulu ei ole olemassa",
"error-board-notAdmin": "Tehdäksesi tämän sinun täytyy olla tämän taulun ylläpitäjä",
"error-board-notAMember": "Tehdäksesi tämän sinun täytyy olla tämän taulun jäsen",
@@ -229,6 +249,8 @@
"info": "Versio",
"initials": "Nimikirjaimet",
"invalid-date": "Virheellinen päivämäärä",
+ "invalid-time": "Virheellinen aika",
+ "invalid-user": "Virheellinen käyttäjä",
"joined": "liittyi",
"just-invited": "Sinut on juuri kutsuttu tälle taululle",
"keyboard-shortcuts": "Pikanäppäimet",
@@ -239,18 +261,22 @@
"language": "Kieli",
"last-admin-desc": "Et voi vaihtaa rooleja koska täytyy olla olemassa ainakin yksi ylläpitäjä.",
"leave-board": "Jää pois taululta",
+ "leave-board-pop": "Haluatko varmasti poistua taululta __boardTitle__? Sinut poistetaan kaikista tämän taulun korteista.",
+ "leaveBoardPopup-title": "Jää pois taululta ?",
"link-card": "Linkki tähän korttiin",
- "list-archive-cards": "Arkistoi kaikki kortit tässä listassa",
- "list-archive-cards-pop": "Tämä poistaa kaikki tämän listan kortit tältä taululta. Nähdäksesi arkistoidut kortit ja tuodaksesi ne takaisin taululle, klikkaa “Valikko” > “Arkistoidut kohteet”.",
+ "list-archive-cards": "Siirrä kaikki tämän listan kortit roskakoriin",
+ "list-archive-cards-pop": "Tämä poistaa kaikki tämän listan kortit taululta. Nähdäksesi roskakorissa olevat kortit ja tuodaksesi ne takaisin taululle, klikkaa “Valikko” > “Roskakori”.",
"list-move-cards": "Siirrä kaikki kortit tässä listassa",
"list-select-cards": "Valitse kaikki kortit tässä listassa",
"listActionPopup-title": "Listaa toimet",
+ "swimlaneActionPopup-title": "Swimlane toimet",
"listImportCardPopup-title": "Tuo Trello kortti",
"listMorePopup-title": "Lisää",
"link-list": "Linkki tähän listaan",
"list-delete-pop": "Kaikki toimet poistetaan toimintasyötteestä ja listan poistaminen on lopullista. Tätä ei pysty peruuttamaan.",
- "list-delete-suggest-archive": "Voit arkistoida listan jolloin sen voi palauttaa sisältöineen.",
+ "list-delete-suggest-archive": "Voit siirtää listan roskakoriin poistaaksesi sen taululta ja säilyttääksesi toimintalokin.",
"lists": "Listat",
+ "swimlanes": "Swimlanet",
"log-out": "Kirjaudu ulos",
"log-in": "Kirjaudu sisään",
"loginPopup-title": "Kirjaudu sisään",
@@ -268,8 +294,9 @@
"muted-info": "Et saa koskaan ilmoituksia tämän taulun muutoksista",
"my-boards": "Tauluni",
"name": "Nimi",
- "no-archived-cards": "Ei arkistoituja kortteja.",
- "no-archived-lists": "Ei arkistoituja listoja.",
+ "no-archived-cards": "Ei kortteja roskakorissa.",
+ "no-archived-lists": "Ei listoja roskakorissa.",
+ "no-archived-swimlanes": "Ei Swimlaneja roskakorissa.",
"no-results": "Ei tuloksia",
"normal": "Normaali",
"normal-desc": "Voi nähdä ja muokata kortteja. Ei voi muokata asetuksia.",
@@ -305,7 +332,11 @@
"restore": "Palauta",
"save": "Tallenna",
"search": "Etsi",
+ "search-cards": "Etsi korttien otsikoista ja kuvauksista tällä taululla",
+ "search-example": "Teksti jota etsitään?",
"select-color": "Valitse väri",
+ "set-wip-limit-value": "Aseta tämän listan tehtävien enimmäismäärä",
+ "setWipLimitPopup-title": "Aseta WIP-raja",
"shortcut-assign-self": "Valitse itsesi nykyiselle kortille",
"shortcut-autocomplete-emoji": "Automaattinen täydennys emojille",
"shortcut-autocomplete-members": "Automaattinen täydennys jäsenille",
@@ -326,6 +357,11 @@
"team": "Tiimi",
"this-board": "tämä taulu",
"this-card": "tämä kortti",
+ "spent-time-hours": "Käytetty aika (tuntia)",
+ "overtime-hours": "Ylityö (tuntia)",
+ "overtime": "Ylityö",
+ "has-overtime-cards": "Sisältää ylityö kortteja",
+ "has-spenttime-cards": "Sisältää käytetty aika kortteja",
"time": "Aika",
"title": "Otsikko",
"tracking": "Ilmoitukset",
@@ -336,16 +372,20 @@
"upload": "Lähetä",
"upload-avatar": "Lähetä profiilikuva",
"uploaded-avatar": "Profiilikuva lähetetty",
- "username": "Käyttäjänimi",
+ "username": "Käyttäjätunnus",
"view-it": "Näytä se",
- "warn-list-archived": "varoitus: tämä kortti on arkistoitujen listalla",
+ "warn-list-archived": "varoitus: tämä kortti on roskakorissa olevassa listassa",
"watch": "Seuraa",
"watching": "Seurataan",
"watching-info": "Sinulle ilmoitetaan tämän taulun muutoksista",
"welcome-board": "Tervetuloa taulu",
+ "welcome-swimlane": "Merkkipaalu 1",
"welcome-list1": "Perusasiat",
"welcome-list2": "Edistynyt",
"what-to-do": "Mitä haluat tehdä?",
+ "wipLimitErrorPopup-title": "Virheellinen WIP-raja",
+ "wipLimitErrorPopup-dialog-pt1": "Tässä listassa olevien tehtävien määrä on korkeampi kuin asettamasi WIP-raja.",
+ "wipLimitErrorPopup-dialog-pt2": "Siirrä joitain tehtäviä pois tästä listasta tai määritä korkeampi WIP-raja.",
"admin-panel": "Hallintapaneeli",
"settings": "Asetukset",
"people": "Ihmiset",
@@ -360,13 +400,16 @@
"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-username": "Käyttäjätunnus",
"smtp-password": "Salasana",
"smtp-tls": "TLS tuki",
"send-from": "Lähettäjä",
+ "send-smtp-test": "Lähetä testi sähköposti itsellesi",
"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.",
+ "email-smtp-test-subject": "SMTP testi sähköposti Wekanista",
+ "email-smtp-test-text": "Olet onnistuneesti lähettänyt sähköpostin",
"error-invitation-code-not-exist": "Kutsukoodi ei ole olemassa",
"error-notAuthorized": "Sinulla ei ole oikeutta tarkastella tätä sivua.",
"outgoing-webhooks": "Lähtevät Webkoukut",
@@ -390,5 +433,15 @@
"yes": "Kyllä",
"no": "Ei",
"accounts": "Tilit",
- "accounts-allowEmailChange": "Salli sähköpostiosoitteen muuttaminen"
+ "accounts-allowEmailChange": "Salli sähköpostiosoitteen muuttaminen",
+ "accounts-allowUserNameChange": "Salli käyttäjätunnuksen muuttaminen",
+ "createdAt": "Luotu",
+ "verified": "Varmistettu",
+ "active": "Aktiivinen",
+ "card-received": "Vastaanotettu",
+ "card-received-on": "Vastaanotettu",
+ "card-end": "Loppuu",
+ "card-end-on": "Loppuu",
+ "editCardReceivedDatePopup-title": "Vaihda vastaanottamispäivää",
+ "editCardEndDatePopup-title": "Vaihda loppumispäivää"
} \ No newline at end of file
diff --git a/i18n/fr.i18n.json b/i18n/fr.i18n.json
index 4f431961..23a11142 100644
--- a/i18n/fr.i18n.json
+++ b/i18n/fr.i18n.json
@@ -2,16 +2,17 @@
"accept": "Accepter",
"act-activity-notify": "[Wekan] Notification d'activité",
"act-addAttachment": "a joint __attachment__ à __card__",
- "act-addChecklist": "added checklist __checklist__ to __card__",
- "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
+ "act-addChecklist": "a ajouté la checklist __checklist__ à __card__",
+ "act-addChecklistItem": "a ajouté l'élément __checklistItem__ à la checklist __checklist__ de __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-archivedBoard": "__board__ a été déplacé vers la corbeille",
+ "act-archivedCard": "__card__ a été déplacée vers la corbeille",
+ "act-archivedList": "__list__ a été déplacée vers la corbeille",
+ "act-archivedSwimlane": "__swimlane__ a été déplacé vers la corbeille",
"act-importBoard": "a importé __board__",
"act-importCard": "a importé __card__",
"act-importList": "a importé __list__",
@@ -26,7 +27,7 @@
"activities": "Activités",
"activity": "Activité",
"activity-added": "a ajouté %s à %s",
- "activity-archived": "a archivé %s",
+ "activity-archived": "%s a été déplacé vers la corbeille",
"activity-attached": "a attaché %s à %s",
"activity-created": "a créé %s",
"activity-excluded": "a exclu %s de %s",
@@ -39,11 +40,12 @@
"activity-sent": "a envoyé %s vers %s",
"activity-unjoined": "a quitté %s",
"activity-checklist-added": "a ajouté une checklist à %s",
- "activity-checklist-item-added": "a ajouté une checklist à '%s' dans %s",
+ "activity-checklist-item-added": "a ajouté un élément à la checklist '%s' dans %s",
"add": "Ajouter",
"add-attachment": "Ajouter une pièce jointe",
"add-board": "Ajouter un tableau",
"add-card": "Ajouter une carte",
+ "add-swimlane": "Ajouter un couloir",
"add-checklist": "Ajouter une checklist",
"add-checklist-item": "Ajouter un élément à la checklist",
"add-cover": "Ajouter la couverture",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "Membres",
"admin": "Admin",
"admin-desc": "Peut voir et éditer les cartes, supprimer des membres et changer les paramètres du tableau.",
+ "admin-announcement": "Annonce",
+ "admin-announcement-active": "Annonce destinée à tous",
+ "admin-announcement-title": "Annonce de l'administrateur",
"all-boards": "Tous les tableaux",
"and-n-other-card": "Et __count__ autre carte",
"and-n-other-card_plural": "Et __count__ autres cartes",
"apply": "Appliquer",
- "app-is-offline": "Chargement en cours de Wekan. Veuillez patienter. Vous risquez de perdre des données si vous recharger la page. Si Wekan ne se charge pas, veuillez vérifier si le serveur Wekan est arrêté.",
- "archive": "Archiver",
- "archive-all": "Tout archiver",
- "archive-board": "Archiver le tableau",
- "archive-card": "Archiver la carte",
- "archive-list": "Archiver une liste",
- "archive-selection": "Archiver la selection",
- "archiveBoardPopup-title": "Archiver le tableau ?",
- "archived-items": "Éléments archivés",
- "archived-boards": "Tableaux archivés",
+ "app-is-offline": "Chargement en cours, veuillez patienter. Vous risquez de perdre des données si vous rechargez la page. Si le chargement échoue, veuillez vérifier l'état du serveur Wekan.",
+ "archive": "Déplacer vers la corbeille",
+ "archive-all": "Tout déplacer vers la corbeille",
+ "archive-board": "Déplacer le tableau vers la corbeille",
+ "archive-card": "Déplacer la carte vers la corbeille",
+ "archive-list": "Déplacer la liste vers la corbeille",
+ "archive-swimlane": "Déplacer le couloir vers la corbeille",
+ "archive-selection": "Déplacer la sélection vers la corbeille",
+ "archiveBoardPopup-title": "Déplacer le tableau vers la corbeille ?",
+ "archived-items": "Corbeille",
+ "archived-boards": "Tableaux dans la corbeille",
"restore-board": "Restaurer le tableau",
- "no-archived-boards": "Aucun tableau archivé",
- "archives": "Archives",
+ "no-archived-boards": "Aucun tableau dans la corbeille.",
+ "archives": "Corbeille",
"assign-member": "Affecter un membre",
"attached": "joint",
"attachment": "Pièce jointe",
@@ -91,15 +97,19 @@
"boardChangeWatchPopup-title": "Modifier le suivi",
"boardMenuPopup-title": "Menu du tableau",
"boards": "Tableaux",
+ "board-view": "Vue du tableau",
+ "board-view-swimlanes": "Couloirs",
+ "board-view-lists": "Listes",
"bucket-example": "Comme « todo list » par exemple",
"cancel": "Annuler",
- "card-archived": "Cette carte est archivée.",
+ "card-archived": "Cette carte est déplacée vers la corbeille.",
"card-comments-title": "Cette carte a %s commentaires.",
"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-delete-suggest-archive": "Vous pouvez déplacer une carte vers la corbeille afin de l'enlever du tableau tout en préservant l'activité.",
"card-due": "À échéance",
"card-due-on": "Échéance le",
+ "card-spent": "Temps passé",
"card-edit-attachments": "Modifier les pièces jointes",
"card-edit-labels": "Modifier les étiquettes",
"card-edit-members": "Modifier les membres",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "Membres",
"cardMorePopup-title": "Plus",
"cards": "Cartes",
+ "cards-count": "Cartes",
"change": "Modifier",
"change-avatar": "Modifier l'avatar",
"change-password": "Modifier le mot de passe",
@@ -130,7 +141,7 @@
"clipboard": "Presse-papier ou glisser-déposer",
"close": "Fermer",
"close-board": "Fermer le tableau",
- "close-board-pop": "Vous pouvez restaurer le tableau en cliquant sur le bouton « Archives » depuis le menu en entête.",
+ "close-board-pop": "Vous pourrez restaurer le tableau en cliquant le bouton « Corbeille » en entête.",
"color-black": "noir",
"color-blue": "bleu",
"color-green": "vert",
@@ -146,8 +157,12 @@
"comment-only": "Commentaire uniquement",
"comment-only-desc": "Ne peut que commenter des cartes.",
"computer": "Ordinateur",
+ "confirm-checklist-delete-dialog": "Êtes-vous sûr de vouloir supprimer la checklist",
"copy-card-link-to-clipboard": "Copier le lien vers la carte dans le presse-papier",
"copyCardPopup-title": "Copier la carte",
+ "copyChecklistToManyCardsPopup-title": "Copier le modèle de checklist vers plusieurs cartes",
+ "copyChecklistToManyCardsPopup-instructions": "Titres et descriptions des cartes de destination dans ce format JSON",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Titre de la première carte\", \"description\":\"Description de la première carte\"}, {\"title\":\"Titre de la seconde carte\",\"description\":\"Description de la seconde carte\"},{\"title\":\"Titre de la dernière carte\",\"description\":\"Description de la dernière carte\"} ]",
"create": "Créer",
"createBoardPopup-title": "Créer un tableau",
"chooseBoardSourcePopup-title": "Importer un tableau",
@@ -167,8 +182,11 @@
"edit": "Modifier",
"edit-avatar": "Modifier l'avatar",
"edit-profile": "Modifier le profil",
+ "edit-wip-limit": "Éditer la limite WIP",
+ "soft-wip-limit": "Limite WIP douce",
"editCardStartDatePopup-title": "Modifier la date de début",
"editCardDueDatePopup-title": "Modifier la date d'échéance",
+ "editCardSpentTimePopup-title": "Changer le temps passé",
"editLabelPopup-title": "Modifier l'étiquette",
"editNotificationPopup-title": "Modifier la notification",
"editProfilePopup-title": "Modifier le profil",
@@ -176,6 +194,7 @@
"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-fail-text": "Une erreur est survenue en tentant d'envoyer l'email",
"email-invalid": "Adresse email incorrecte.",
"email-invite": "Inviter par email",
"email-invite-subject": "__inviter__ vous a envoyé une invitation",
@@ -185,6 +204,7 @@
"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.",
+ "enable-wip-limit": "Activer la limite WIP",
"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",
@@ -229,6 +249,8 @@
"info": "Version",
"initials": "Initiales",
"invalid-date": "Date invalide",
+ "invalid-time": "Temps invalide",
+ "invalid-user": "Utilisateur invalide",
"joined": "a rejoint",
"just-invited": "Vous venez d'être invité à ce tableau",
"keyboard-shortcuts": "Raccourcis clavier",
@@ -239,18 +261,22 @@
"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",
+ "leave-board-pop": "Êtes-vous sur de vouloir quitter __boardTitle__ ? Vous ne serez plus associé aux cartes de ce tableau.",
+ "leaveBoardPopup-title": "Quitter le tableau",
"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-archive-cards": "Déplacer toutes les cartes de la liste vers la corbeille",
+ "list-archive-cards-pop": "Cela supprimera du tableau toutes les cartes de cette liste. Pour voir les cartes dans la corbeille et les renvoyer vers le tableau, cliquez sur « Menu » puis « Corbeille ».",
"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",
+ "swimlaneActionPopup-title": "Actions du couloir",
"listImportCardPopup-title": "Importer une carte Trello",
"listMorePopup-title": "Plus",
"link-list": "Lien vers cette liste",
"list-delete-pop": "Toutes les actions seront supprimées du fil d'activité et il ne sera plus possible de les récupérer. Cette action ne peut pas être annulée.",
- "list-delete-suggest-archive": "Vous pouvez archiver une liste pour la supprimer d'un tableau et conserver son activité.",
+ "list-delete-suggest-archive": "Vous pouvez déplacer une liste vers la corbeille pour l'enlever du tableau tout en conservant son activité.",
"lists": "Listes",
+ "swimlanes": "Couloirs",
"log-out": "Déconnexion",
"log-in": "Connexion",
"loginPopup-title": "Connexion",
@@ -268,8 +294,9 @@
"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-archived-cards": "Aucune carte dans la corbeille.",
+ "no-archived-lists": "Aucune liste dans la corbeille.",
+ "no-archived-swimlanes": "Aucun couloir dans la corbeille.",
"no-results": "Pas de résultats",
"normal": "Normal",
"normal-desc": "Peut voir et modifier les cartes. Ne peut pas changer les paramètres.",
@@ -305,7 +332,11 @@
"restore": "Restaurer",
"save": "Enregistrer",
"search": "Chercher",
+ "search-cards": "Rechercher parmi les titres et descriptions des cartes de ce tableau",
+ "search-example": "Texte à rechercher ?",
"select-color": "Sélectionner une couleur",
+ "set-wip-limit-value": "Définit une limite maximale au nombre de cartes de cette liste",
+ "setWipLimitPopup-title": "Définir la limite WIP",
"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",
@@ -326,6 +357,11 @@
"team": "Équipe",
"this-board": "ce tableau",
"this-card": "cette carte",
+ "spent-time-hours": "Temps passé (heures)",
+ "overtime-hours": "Temps supplémentaire (heures)",
+ "overtime": "Temps supplémentaire",
+ "has-overtime-cards": "A des cartes avec du temps supplémentaire",
+ "has-spenttime-cards": "A des cartes avec du temps passé",
"time": "Temps",
"title": "Titre",
"tracking": "Suivi",
@@ -338,14 +374,18 @@
"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",
+ "warn-list-archived": "Attention : cette carte est dans une liste se trouvant dans la corbeille",
"watch": "Suivre",
"watching": "Suivi",
"watching-info": "Vous serez notifié de toute modification dans ce tableau",
"welcome-board": "Tableau de bienvenue",
+ "welcome-swimlane": "Jalon 1",
"welcome-list1": "Basiques",
"welcome-list2": "Avancés",
"what-to-do": "Que voulez-vous faire ?",
+ "wipLimitErrorPopup-title": "Limite WIP invalide",
+ "wipLimitErrorPopup-dialog-pt1": "Le nombre de cartes de cette liste est supérieur à la limite WIP que vous avez définie.",
+ "wipLimitErrorPopup-dialog-pt2": "Veuillez enlever des cartes de cette liste, ou définir une limite WIP plus importante.",
"admin-panel": "Panneau d'administration",
"settings": "Paramètres",
"people": "Personne",
@@ -364,9 +404,12 @@
"smtp-password": "Mot de passe",
"smtp-tls": "Prise en charge de TLS",
"send-from": "De",
+ "send-smtp-test": "Envoyer un mail de test à vous-même",
"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.",
+ "email-smtp-test-subject": "Email de test SMTP de Wekan",
+ "email-smtp-test-text": "Vous avez envoyé un mail avec succès",
"error-invitation-code-not-exist": "Ce code d'invitation n'existe pas.",
"error-notAuthorized": "Vous n'êtes pas autorisé à accéder à cette page.",
"outgoing-webhooks": "Webhooks sortants",
@@ -390,5 +433,15 @@
"yes": "Oui",
"no": "Non",
"accounts": "Comptes",
- "accounts-allowEmailChange": "Autoriser le changement d'adresse mail"
+ "accounts-allowEmailChange": "Autoriser le changement d'adresse mail",
+ "accounts-allowUserNameChange": "Permettre la modification de l'identifiant",
+ "createdAt": "Créé le",
+ "verified": "Vérifié",
+ "active": "Actif",
+ "card-received": "Reçue",
+ "card-received-on": "Reçue le",
+ "card-end": "Fin",
+ "card-end-on": "Se termine le",
+ "editCardReceivedDatePopup-title": "Changer la date de réception",
+ "editCardEndDatePopup-title": "Changer la date de fin"
} \ No newline at end of file
diff --git a/i18n/gl.i18n.json b/i18n/gl.i18n.json
index 6b2dd9b6..faab1d9b 100644
--- a/i18n/gl.i18n.json
+++ b/i18n/gl.i18n.json
@@ -9,9 +9,10 @@
"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-archivedBoard": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
"act-importBoard": "imported __board__",
"act-importCard": "imported __card__",
"act-importList": "imported __list__",
@@ -26,7 +27,7 @@
"activities": "Actividades",
"activity": "Actividade",
"activity-added": "engadiuse %s a %s",
- "activity-archived": "arquivouse%s",
+ "activity-archived": "%s moved to Recycle Bin",
"activity-attached": "attached %s to %s",
"activity-created": "created %s",
"activity-excluded": "excluded %s from %s",
@@ -44,6 +45,7 @@
"add-attachment": "Engadir anexo",
"add-board": "Engadir taboleiro",
"add-card": "Engadir tarxeta",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Add Checklist",
"add-checklist-item": "Add an item to checklist",
"add-cover": "Add Cover",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "Membros",
"admin": "Admin",
"admin-desc": "Pode ver e editar tarxetas, retirar membros e cambiar a configuración do taboleiro.",
+ "admin-announcement": "Announcement",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Announcement from Administrator",
"all-boards": "Todos os taboleiros",
"and-n-other-card": "And __count__ other card",
"and-n-other-card_plural": "And __count__ other cards",
"apply": "Apply",
"app-is-offline": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
- "archive": "Arquivar",
- "archive-all": "Arquivar todo",
- "archive-board": "Arquivar taboleiro",
- "archive-card": "Arquivar tarxeta",
- "archive-list": "Arquivar lista",
- "archive-selection": "Arquivar selección",
- "archiveBoardPopup-title": "Arquivar taboleiro?",
- "archived-items": "Elementos arquivados",
- "archived-boards": "Taboleiros arquivados",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
"restore-board": "Restaurar taboleiro",
- "no-archived-boards": "Non hai taboleiros arquivados.",
- "archives": "Arquivos",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
"assign-member": "Assign member",
"attached": "attached",
"attachment": "Anexo",
@@ -91,15 +97,19 @@
"boardChangeWatchPopup-title": "Change Watch",
"boardMenuPopup-title": "Board Menu",
"boards": "Taboleiros",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Listas",
"bucket-example": "Like “Bucket List” for example",
"cancel": "Cancelar",
- "card-archived": "This card is archived.",
+ "card-archived": "This card is moved to Recycle Bin.",
"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-delete-suggest-archive": "You can move a card Recycle Bin to remove it from the board and preserve the activity.",
"card-due": "Due",
"card-due-on": "Due on",
+ "card-spent": "Spent Time",
"card-edit-attachments": "Editar anexos",
"card-edit-labels": "Editar etiquetas",
"card-edit-members": "Editar membros",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "Membros",
"cardMorePopup-title": "Máis",
"cards": "Tarxetas",
+ "cards-count": "Tarxetas",
"change": "Cambiar",
"change-avatar": "Cambiar o avatar",
"change-password": "Cambiar o contrasinal",
@@ -130,7 +141,7 @@
"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.",
+ "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
"color-black": "negro",
"color-blue": "azul",
"color-green": "verde",
@@ -146,8 +157,12 @@
"comment-only": "Comment only",
"comment-only-desc": "Can comment on cards only.",
"computer": "Computador",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
"copy-card-link-to-clipboard": "Copy card link to clipboard",
"copyCardPopup-title": "Copy Card",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
"create": "Crear",
"createBoardPopup-title": "Crear taboleiro",
"chooseBoardSourcePopup-title": "Importar taboleiro",
@@ -167,8 +182,11 @@
"edit": "Editar",
"edit-avatar": "Cambiar de avatar",
"edit-profile": "Editar o perfil",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
"editCardStartDatePopup-title": "Cambiar a data de inicio",
"editCardDueDatePopup-title": "Cambiar a data límite",
+ "editCardSpentTimePopup-title": "Change spent time",
"editLabelPopup-title": "Cambiar a etiqueta",
"editNotificationPopup-title": "Editar a notificación",
"editProfilePopup-title": "Editar o perfil",
@@ -176,6 +194,7 @@
"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-fail-text": "Error trying to send email",
"email-invalid": "Invalid email",
"email-invite": "Invite via Email",
"email-invite-subject": "__inviter__ sent you an invitation",
@@ -185,6 +204,7 @@
"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.",
+ "enable-wip-limit": "Enable WIP Limit",
"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",
@@ -229,6 +249,8 @@
"info": "Version",
"initials": "Iniciais",
"invalid-date": "A data é incorrecta",
+ "invalid-time": "Invalid time",
+ "invalid-user": "Invalid user",
"joined": "joined",
"just-invited": "You are just invited to this board",
"keyboard-shortcuts": "Keyboard shortcuts",
@@ -239,18 +261,22 @@
"language": "Idioma",
"last-admin-desc": "You can’t change roles because there must be at least one admin.",
"leave-board": "Saír do taboleiro",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "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-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
"list-move-cards": "Move all cards in this list",
"list-select-cards": "Select all cards in this list",
"listActionPopup-title": "List Actions",
+ "swimlaneActionPopup-title": "Swimlane Actions",
"listImportCardPopup-title": "Import a Trello card",
"listMorePopup-title": "Máis",
"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.",
+ "list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve the activity.",
"lists": "Listas",
+ "swimlanes": "Swimlanes",
"log-out": "Pechar a sesión",
"log-in": "Acceder",
"loginPopup-title": "Acceder",
@@ -268,8 +294,9 @@
"muted-info": "You will never be notified of any changes in this board",
"my-boards": "My Boards",
"name": "Nome",
- "no-archived-cards": "Non hai tarxetas arquivadas.",
- "no-archived-lists": "Non hai listas arquivadas",
+ "no-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
"no-results": "Non hai resultados",
"normal": "Normal",
"normal-desc": "Pode ver e editar tarxetas. Non pode cambiar a configuración.",
@@ -305,7 +332,11 @@
"restore": "Restore",
"save": "Save",
"search": "Search",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text to search for?",
"select-color": "Select Color",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
"shortcut-assign-self": "Assign yourself to current card",
"shortcut-autocomplete-emoji": "Autocomplete emoji",
"shortcut-autocomplete-members": "Autocomplete members",
@@ -326,6 +357,11 @@
"team": "Equipo",
"this-board": "este taboleiro",
"this-card": "esta tarxeta",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Hora",
"title": "Título",
"tracking": "Seguimento",
@@ -338,14 +374,18 @@
"uploaded-avatar": "Uploaded an avatar",
"username": "Nome de usuario",
"view-it": "Velo",
- "warn-list-archived": "aviso: esta tarxeta está nunha lista arquivada",
+ "warn-list-archived": "warning: this card is in an list at Recycle Bin",
"watch": "Vixiar",
"watching": "Vixiando",
"watching-info": "Recibirá unha notificación sobre calquera cambio que se produza neste taboleiro",
"welcome-board": "Taboleiro de benvida",
+ "welcome-swimlane": "Milestone 1",
"welcome-list1": "Fundamentos",
"welcome-list2": "Avanzado",
"what-to-do": "Que desexa facer?",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
"admin-panel": "Panel de administración",
"settings": "Configuración",
"people": "Persoas",
@@ -364,9 +404,12 @@
"smtp-password": "Contrasinal",
"smtp-tls": "TLS support",
"send-from": "De",
+ "send-smtp-test": "Send a test email to yourself",
"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.",
+ "email-smtp-test-subject": "SMTP Test Email From Wekan",
+ "email-smtp-test-text": "You have successfully sent an email",
"error-invitation-code-not-exist": "Invitation code doesn't exist",
"error-notAuthorized": "You are not authorized to view this page.",
"outgoing-webhooks": "Outgoing Webhooks",
@@ -390,5 +433,15 @@
"yes": "Yes",
"no": "No",
"accounts": "Accounts",
- "accounts-allowEmailChange": "Allow Email Change"
+ "accounts-allowEmailChange": "Allow Email Change",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Created at",
+ "verified": "Verified",
+ "active": "Active",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
} \ No newline at end of file
diff --git a/i18n/he.i18n.json b/i18n/he.i18n.json
index 17eb1ea1..b3c91549 100644
--- a/i18n/he.i18n.json
+++ b/i18n/he.i18n.json
@@ -2,16 +2,17 @@
"accept": "אישור",
"act-activity-notify": "[Wekan] הודעת פעילות",
"act-addAttachment": " __attachment__ צורף לכרטיס __card__",
- "act-addChecklist": "added checklist __checklist__ to __card__",
- "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
+ "act-addChecklist": "רשימת משימות __checklist__ נוספה ל __card__",
+ "act-addChecklistItem": " __checklistItem__ נוסף לרשימת משימות __checklist__ בכרטיס __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-archivedBoard": "__board__ הועבר לסל המחזור",
+ "act-archivedCard": "__card__ הועבר לסל המחזור",
+ "act-archivedList": "__list__ הועבר לסל המחזור",
+ "act-archivedSwimlane": "__swimlane__ הועבר לסל המחזור",
"act-importBoard": "הלוח __board__ יובא",
"act-importCard": "הכרטיס __card__ יובא",
"act-importList": "הרשימה __list__ יובאה",
@@ -26,7 +27,7 @@
"activities": "פעילויות",
"activity": "פעילות",
"activity-added": "%s נוסף ל%s",
- "activity-archived": "%s הועבר לארכיון",
+ "activity-archived": "%s הועבר לסל המחזור",
"activity-attached": "%s צורף ל%s",
"activity-created": "%s נוצר",
"activity-excluded": "%s לא נכלל ב%s",
@@ -44,6 +45,7 @@
"add-attachment": "הוספת קובץ מצורף",
"add-board": "הוספת לוח",
"add-card": "הוספת כרטיס",
+ "add-swimlane": "הוספת מסלול",
"add-checklist": "הוספת רשימת מטלות",
"add-checklist-item": "הוספת פריט לרשימת משימות",
"add-cover": "הוספת כיסוי",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "חברים",
"admin": "מנהל",
"admin-desc": "יש הרשאות לצפייה ולעריכת כרטיסים, להסרת חברים ולשינוי הגדרות לוח.",
+ "admin-announcement": "הכרזה",
+ "admin-announcement-active": "הכרזת מערכת פעילה",
+ "admin-announcement-title": "הכרזה ממנהל המערכת",
"all-boards": "כל הלוחות",
"and-n-other-card": "וכרטיס אחר",
"and-n-other-card_plural": "ו־__count__ כרטיסים אחרים",
"apply": "החלה",
"app-is-offline": "Wekan בטעינה, נא להמתין. רענון העמוד עשוי להוביל לאובדן מידע. אם הטעינה של Wekan נעצרה, נא לבדוק ששרת ה־Wekan לא נעצר.",
- "archive": "להעביר לארכיון",
- "archive-all": "להעביר הכול לארכיון",
- "archive-board": "להעביר לוח לארכיון",
- "archive-card": "להעביר כרטיס בארכיון",
- "archive-list": "שמירת רשימה בארכיון",
- "archive-selection": "להעביר בחירה לארכיון",
- "archiveBoardPopup-title": "להעביר לוח זה לארכיון?",
- "archived-items": "פריטים בארכיון",
- "archived-boards": "לוחות שנשמרו בארכיון",
+ "archive": "העברה לסל המחזור",
+ "archive-all": "להעביר הכול לסל המחזור",
+ "archive-board": "העברת הלוח לסל המחזור",
+ "archive-card": "העברת הכרטיס לסל המחזור",
+ "archive-list": "העברת הרשימה לסל המחזור",
+ "archive-swimlane": "העברת מסלול לסל המחזור",
+ "archive-selection": "העברת הבחירה לסל המחזור",
+ "archiveBoardPopup-title": "להעביר את הלוח לסל המחזור?",
+ "archived-items": "סל מחזור",
+ "archived-boards": "לוחות בסל המחזור",
"restore-board": "שחזור לוח",
- "no-archived-boards": "לא נשמרו לוחות בארכיון.",
- "archives": "ארכיונים",
+ "no-archived-boards": "אין לוחות בסל המחזור",
+ "archives": "סל מחזור",
"assign-member": "הקצאת חבר",
"attached": "מצורף",
"attachment": "קובץ מצורף",
@@ -91,15 +97,19 @@
"boardChangeWatchPopup-title": "שינוי הגדרת המעקב",
"boardMenuPopup-title": "תפריט לוח",
"boards": "לוחות",
+ "board-view": "תצוגת לוח",
+ "board-view-swimlanes": "מסלולים",
+ "board-view-lists": "רשימות",
"bucket-example": "כמו למשל „רשימת המשימות“",
"cancel": "ביטול",
- "card-archived": "כרטיס זה שמור בארכיון.",
+ "card-archived": "כרטיס זה הועבר לסל המחזור",
"card-comments-title": "לכרטיס זה %s תגובות.",
"card-delete-notice": "מחיקה היא סופית. כל הפעולות המשויכות לכרטיס זה תלכנה לאיוד.",
"card-delete-pop": "כל הפעולות יוסרו מלוח הפעילות ולא תהיה אפשרות לפתוח מחדש את הכרטיס. אין דרך חזרה.",
- "card-delete-suggest-archive": "ניתן להעביר לארכיון כרטיס כדי להסירו מהלוח ולשמר את הפעילות.",
+ "card-delete-suggest-archive": "ניתן להעביר כרטיס לסל המחזור כדי להסיר אותו מהלוח ולשמר את הפעילות.",
"card-due": "תאריך יעד",
"card-due-on": "תאריך יעד",
+ "card-spent": "זמן שהושקע",
"card-edit-attachments": "עריכת קבצים מצורפים",
"card-edit-labels": "עריכת תוויות",
"card-edit-members": "עריכת חברים",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "חברים",
"cardMorePopup-title": "עוד",
"cards": "כרטיסים",
+ "cards-count": "כרטיסים",
"change": "שינוי",
"change-avatar": "החלפת תמונת משתמש",
"change-password": "החלפת ססמה",
@@ -130,7 +141,7 @@
"clipboard": "לוח גזירים או גרירה ושחרור",
"close": "סגירה",
"close-board": "סגירת לוח",
- "close-board-pop": "ניתן לשחזר את הלוח בלחיצה על כפתור „ארכיונים“ מהכותרת העליונה.",
+ "close-board-pop": "תהיה לך אפשרות להסיר את הלוח על ידי לחיצה על הכפתור „סל מחזור” מכותרת הבית.",
"color-black": "שחור",
"color-blue": "כחול",
"color-green": "ירוק",
@@ -146,11 +157,15 @@
"comment-only": "הערה בלבד",
"comment-only-desc": "ניתן להעיר על כרטיסים בלבד.",
"computer": "מחשב",
- "copy-card-link-to-clipboard": "Copy card link to clipboard",
+ "confirm-checklist-delete-dialog": "האם אתה בטוח שברצונך למחוק את רשימת המשימות",
+ "copy-card-link-to-clipboard": "העתקת קישור הכרטיס ללוח הגזירים",
"copyCardPopup-title": "העתק כרטיס",
+ "copyChecklistToManyCardsPopup-title": "העתקת תבנית רשימת מטלות למגוון כרטיסים",
+ "copyChecklistToManyCardsPopup-instructions": "כותרות ותיאורים של כרטיסי יעד בתצורת JSON זו",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"כותרת כרטיס ראשון\", \"description\":\"תיאור כרטיס ראשון\"}, {\"title\":\"כותרת כרטיס שני\",\"description\":\"תיאור כרטיס שני\"},{\"title\":\"כותרת כרטיס אחרון\",\"description\":\"תיאור כרטיס אחרון\"} ]",
"create": "יצירה",
"createBoardPopup-title": "יצירת לוח",
- "chooseBoardSourcePopup-title": "יבוא לוח",
+ "chooseBoardSourcePopup-title": "ייבוא לוח",
"createLabelPopup-title": "יצירת תווית",
"current": "נוכחי",
"date": "תאריך",
@@ -167,8 +182,11 @@
"edit": "עריכה",
"edit-avatar": "החלפת תמונת משתמש",
"edit-profile": "עריכת פרופיל",
+ "edit-wip-limit": "עריכת מגבלת „בעבודה”",
+ "soft-wip-limit": "מגבלת „בעבודה” רכה",
"editCardStartDatePopup-title": "שינוי מועד התחלה",
"editCardDueDatePopup-title": "שינוי מועד סיום",
+ "editCardSpentTimePopup-title": "שינוי הזמן שהושקע",
"editLabelPopup-title": "שינוי תווית",
"editNotificationPopup-title": "שינוי דיווח",
"editProfilePopup-title": "עריכת פרופיל",
@@ -176,6 +194,7 @@
"email-enrollAccount-subject": "נוצר עבורך חשבון באתר __siteName__",
"email-enrollAccount-text": "__user__ שלום,\n\nכדי להתחיל להשתמש בשירות, יש ללחוץ על הקישור המופיע להלן.\n\n__url__\n\nתודה.",
"email-fail": "שליחת ההודעה בדוא״ל נכשלה",
+ "email-fail-text": "שגיאה בעת ניסיון לשליחת הודעת דוא״ל",
"email-invalid": "כתובת דוא״ל לא חוקית",
"email-invite": "הזמנה באמצעות דוא״ל",
"email-invite-subject": "נשלחה אליך הזמנה מאת __inviter__",
@@ -185,6 +204,7 @@
"email-sent": "הודעת הדוא״ל נשלחה",
"email-verifyEmail-subject": "אימות כתובת הדוא״ל שלך באתר __siteName__",
"email-verifyEmail-text": "__user__ שלום,\n\nלאימות כתובת הדוא״ל המשויכת לחשבונך, עליך פשוט ללחוץ על הקישור המופיע להלן.\n\n__url__\n\nתודה.",
+ "enable-wip-limit": "הפעלת מגבלת „בעבודה”",
"error-board-doesNotExist": "לוח זה אינו קיים",
"error-board-notAdmin": "צריכות להיות לך הרשאות ניהול על לוח זה כדי לעשות זאת",
"error-board-notAMember": "עליך לקבל חברות בלוח זה כדי לעשות זאת",
@@ -211,10 +231,10 @@
"headerBarCreateBoardPopup-title": "יצירת לוח",
"home": "בית",
"import": "יבוא",
- "import-board": "יבוא לוח",
+ "import-board": "ייבוא לוח",
"import-board-c": "יבוא לוח",
"import-board-title-trello": "ייבוא לוח מטרלו",
- "import-board-title-wekan": "יבוא לוח מ־Wekan",
+ "import-board-title-wekan": "ייבוא לוח מ־Wekan",
"import-sandstorm-warning": "הלוח שייובא ימחק את כל הנתונים הקיימים בלוח ויחליף אותם בלוח שייובא.",
"from-trello": "מ־Trello",
"from-wekan": "מ־Wekan",
@@ -229,6 +249,8 @@
"info": "גרסא",
"initials": "ראשי תיבות",
"invalid-date": "תאריך שגוי",
+ "invalid-time": "זמן שגוי",
+ "invalid-user": "משתמש שגוי",
"joined": "הצטרף",
"just-invited": "הוזמנת ללוח זה",
"keyboard-shortcuts": "קיצורי מקלדת",
@@ -239,18 +261,22 @@
"language": "שפה",
"last-admin-desc": "אין אפשרות לשנות תפקידים כיוון שחייב להיות מנהל אחד לפחות.",
"leave-board": "עזיבת הלוח",
+ "leave-board-pop": "לעזוב את __boardTitle__? שמך יוסר מכל הכרטיסים שבלוח זה.",
+ "leaveBoardPopup-title": "לעזוב לוח ?",
"link-card": "קישור לכרטיס זה",
- "list-archive-cards": "העברת כל הכרטיסים שברשימה זו לארכיון",
- "list-archive-cards-pop": "פעולה זו תסיר את כל הכרטיסים שברשימה הזו מהלוח. כדי לצפות בכרטיסים שבארכיון ולהחזיר אותם בחזרה ללוח, יש ללחוץ על „תפריט“ > „פריטים בארכיון“.",
+ "list-archive-cards": "להעביר את כל הכרטיסים לסל המחזור",
+ "list-archive-cards-pop": "פעולה זו תסיר את כל הכרטיסים שברשימה זו מהלוח. כדי לצפות בכרטיסים בסל המחזור ולהשיב אותם ללוח ניתן ללחוץ על „תפריט” > „סל מחזור”.",
"list-move-cards": "העברת כל הכרטיסים שברשימה זו",
"list-select-cards": "בחירת כל הכרטיסים שברשימה זו",
"listActionPopup-title": "פעולות רשימה",
+ "swimlaneActionPopup-title": "פעולות על מסלול",
"listImportCardPopup-title": "יבוא כרטיס מ־Trello",
"listMorePopup-title": "עוד",
"link-list": "קישור לרשימה זו",
"list-delete-pop": "כל הפעולות תוסרנה מרצף הפעילות ולא תהיה לך אפשרות לשחזר את הרשימה. אין ביטול.",
- "list-delete-suggest-archive": "ניתן לשמור רשימה בארכיון כדי להסיר אותה מהלוח ולשמור על הפעילות.",
+ "list-delete-suggest-archive": "ניתן להעביר רשימה לסל מחזור כדי להסיר אותה מהלוח ולשמר את הפעילות.",
"lists": "רשימות",
+ "swimlanes": "מסלולים",
"log-out": "יציאה",
"log-in": "כניסה",
"loginPopup-title": "כניסה",
@@ -268,8 +294,9 @@
"muted-info": "מעתה לא תתקבלנה אצלך התרעות על שינויים בלוח זה",
"my-boards": "הלוחות שלי",
"name": "שם",
- "no-archived-cards": "אין כרטיסים בארכיון.",
- "no-archived-lists": "אין רשימות בארכיון.",
+ "no-archived-cards": "אין כרטיסים בסל המחזור.",
+ "no-archived-lists": "אין רשימות בסל המחזור.",
+ "no-archived-swimlanes": "אין מסלולים בסל המחזור.",
"no-results": "אין תוצאות",
"normal": "רגיל",
"normal-desc": "הרשאה לצפות ולערוך כרטיסים. לא ניתן לשנות הגדרות.",
@@ -305,7 +332,11 @@
"restore": "שחזור",
"save": "שמירה",
"search": "חיפוש",
+ "search-cards": "חיפוש אחר כותרות ותיאורים של כרטיסים בלוח זה",
+ "search-example": "טקסט לחיפוש ?",
"select-color": "בחירת צבע",
+ "set-wip-limit-value": "הגדרת מגבלה למספר המרבי של משימות ברשימה זו",
+ "setWipLimitPopup-title": "הגדרת מגבלת „בעבודה”",
"shortcut-assign-self": "להקצות אותי לכרטיס הנוכחי",
"shortcut-autocomplete-emoji": "השלמה אוטומטית לאימוג׳י",
"shortcut-autocomplete-members": "השלמה אוטומטית של חברים",
@@ -326,6 +357,11 @@
"team": "צוות",
"this-board": "לוח זה",
"this-card": "כרטיס זה",
+ "spent-time-hours": "זמן שהושקע (שעות)",
+ "overtime-hours": "שעות נוספות",
+ "overtime": "שעות נוספות",
+ "has-overtime-cards": "יש כרטיסי שעות נוספות",
+ "has-spenttime-cards": "ניצל את כרטיסי הזמן שהושקע",
"time": "זמן",
"title": "כותרת",
"tracking": "מעקב",
@@ -338,14 +374,18 @@
"uploaded-avatar": "הועלתה תמונה משתמש",
"username": "שם משתמש",
"view-it": "הצגה",
- "warn-list-archived": "אזהרה: הכרטיס נמצא ברשימה שהועברה לארכיון",
+ "warn-list-archived": "אזהרה: כרטיס זה נמצא ברשימה בסל המחזור",
"watch": "לעקוב",
"watching": "במעקב",
"watching-info": "מעתה יגיעו אליך דיווחים על כל שינוי בלוח זה",
"welcome-board": "לוח קבלת פנים",
+ "welcome-swimlane": "ציון דרך 1",
"welcome-list1": "יסודות",
"welcome-list2": "מתקדם",
"what-to-do": "מה ברצונך לעשות?",
+ "wipLimitErrorPopup-title": "מגבלת „בעבודה” שגויה",
+ "wipLimitErrorPopup-dialog-pt1": "מספר המשימות ברשימה זו גדולה ממגבלת הפריטים „בעבודה” שהגדרת.",
+ "wipLimitErrorPopup-dialog-pt2": "נא להוציא חלק מהמשימות מרשימה זו או להגדיר מגבלת „בעבודה” גדולה יותר.",
"admin-panel": "חלונית ניהול המערכת",
"settings": "הגדרות",
"people": "אנשים",
@@ -364,16 +404,19 @@
"smtp-password": "ססמה",
"smtp-tls": "תמיכה ב־TLS",
"send-from": "מאת",
+ "send-smtp-test": "שליחת דוא״ל בדיקה לעצמך",
"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תודה.",
+ "email-smtp-test-subject": "הודעת בדיקה דרך SMTP מאת Wekan",
+ "email-smtp-test-text": "שלחת הודעת דוא״ל בהצלחה",
"error-invitation-code-not-exist": "קוד ההזמנה אינו קיים",
"error-notAuthorized": "אין לך הרשאה לצפות בעמוד זה.",
- "outgoing-webhooks": "Outgoing Webhooks",
- "outgoingWebhooksPopup-title": "Outgoing Webhooks",
- "new-outgoing-webhook": "New Outgoing Webhook",
+ "outgoing-webhooks": "קרסי רשת יוצאים",
+ "outgoingWebhooksPopup-title": "קרסי רשת יוצאים",
+ "new-outgoing-webhook": "קרסי רשת יוצאים חדשים",
"no-name": "(לא ידוע)",
- "Wekan_version": "גרסת wekan",
+ "Wekan_version": "גרסת Wekan",
"Node_version": "גרסת Node",
"OS_Arch": "ארכיטקטורת מערכת הפעלה",
"OS_Cpus": "מספר מעבדים",
@@ -390,5 +433,15 @@
"yes": "כן",
"no": "לא",
"accounts": "חשבונות",
- "accounts-allowEmailChange": "אפשר שינוי דוא\"ל"
+ "accounts-allowEmailChange": "אפשר שינוי דוא\"ל",
+ "accounts-allowUserNameChange": "לאפשר שינוי שם משתמש",
+ "createdAt": "נוצר ב",
+ "verified": "עבר אימות",
+ "active": "פעיל",
+ "card-received": "התקבל",
+ "card-received-on": "התקבל במועד",
+ "card-end": "סיום",
+ "card-end-on": "מועד הסיום",
+ "editCardReceivedDatePopup-title": "החלפת מועד הקבלה",
+ "editCardEndDatePopup-title": "החלפת מועד הסיום"
} \ No newline at end of file
diff --git a/i18n/hu.i18n.json b/i18n/hu.i18n.json
index 65bed443..94af52d1 100644
--- a/i18n/hu.i18n.json
+++ b/i18n/hu.i18n.json
@@ -1,394 +1,447 @@
{
- "accept": "Elfogad",
+ "accept": "Elfogadás",
"act-activity-notify": "[Wekan] Tevékenység értesítés",
- "act-addAttachment": "attached __attachment__ to __card__",
- "act-addChecklist": "added checklist __checklist__ to __card__",
- "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __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-addAttachment": "__attachment__ mellékletet csatolt a kártyához: __card__",
+ "act-addChecklist": "__checklist__ ellenőrzőlistát adott hozzá a kártyához: __card__",
+ "act-addChecklistItem": "__checklistItem__ elemet adott hozzá a(z) __checklist__ ellenőrzőlistához ezen a kártyán: __card__",
+ "act-addComment": "hozzászólt a(z) __card__ kártyán: __comment__",
+ "act-createBoard": "létrehozta a táblát: __board__",
+ "act-createCard": "__card__ kártyát adott hozzá a listához: __list__",
+ "act-createList": "__list__ listát adott hozzá a táblához: __board__",
+ "act-addBoardMember": "__member__ tagot hozzáadta a táblához: __board__",
+ "act-archivedBoard": "A __board__ tábla a lomtárba került.",
+ "act-archivedCard": "A __card__ kártya a lomtárba került.",
+ "act-archivedList": "A __list__ lista a lomtárba került.",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
+ "act-importBoard": "importálta a táblát: __board__",
+ "act-importCard": "importálta a kártyát: __card__",
+ "act-importList": "importálta a listát: __list__",
+ "act-joinMember": "__member__ tagot hozzáadta a kártyához: __card__",
+ "act-moveCard": "áthelyezte a(z) __card__ kártyát: __oldList__ → __list__",
+ "act-removeBoardMember": "eltávolította __member__ tagot a tábláról: __board__",
+ "act-restoredCard": "visszaállította a(z) __card__ kártyát ide: __board__",
+ "act-unjoinMember": "eltávolította __member__ tagot a kártyáról: __card__",
"act-withBoardTitle": "[Wekan] __board__",
"act-withCardTitle": "[__board__] __card__",
"actions": "Műveletek",
"activities": "Tevékenységek",
"activity": "Tevékenység",
- "activity-added": "added %s to %s",
- "activity-archived": "archiválva %s",
- "activity-attached": "attached %s to %s",
- "activity-created": "létrehozva %s",
- "activity-excluded": "excluded %s from %s",
- "activity-imported": "imported %s into %s from %s",
- "activity-imported-board": "imported %s from %s",
+ "activity-added": "%s hozzáadva ehhez: %s",
+ "activity-archived": "%s lomtárba helyezve",
+ "activity-attached": "%s mellékletet csatolt a kártyához: %s",
+ "activity-created": "%s létrehozva",
+ "activity-excluded": "%s kizárva innen: %s",
+ "activity-imported": "%s importálva ebbe: %s, innen: %s",
+ "activity-imported-board": "%s importálva innen: %s",
"activity-joined": "%s csatlakozott",
- "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-moved": "%s áthelyezve: %s → %s",
+ "activity-on": "ekkor: %s",
+ "activity-removed": "%s eltávolítva innen: %s",
+ "activity-sent": "%s elküldve ide: %s",
"activity-unjoined": "%s kilépett a csoportból",
- "activity-checklist-added": "added checklist to %s",
- "activity-checklist-item-added": "added checklist item to '%s' in %s",
- "add": "Hozzáad",
- "add-attachment": "Add Attachment",
- "add-board": "Add Board",
- "add-card": "Add Card",
- "add-checklist": "Add Checklist",
- "add-checklist-item": "Elem hozzáadása a feladatlistához",
- "add-cover": "Új borító",
- "add-label": "Add Label",
- "add-list": "Add List",
+ "activity-checklist-added": "ellenőrzőlista hozzáadva ehhez: %s",
+ "activity-checklist-item-added": "ellenőrzőlista elem hozzáadva ehhez: „%s”, ebben: %s",
+ "add": "Hozzáadás",
+ "add-attachment": "Melléklet hozzáadása",
+ "add-board": "Tábla hozzáadása",
+ "add-card": "Kártya hozzáadása",
+ "add-swimlane": "Add Swimlane",
+ "add-checklist": "Ellenőrzőlista hozzáadása",
+ "add-checklist-item": "Elem hozzáadása az ellenőrzőlistához",
+ "add-cover": "Borító hozzáadása",
+ "add-label": "Címke hozzáadása",
+ "add-list": "Lista hozzáadása",
"add-members": "Tagok hozzáadása",
"added": "Hozzáadva",
"addMemberPopup-title": "Tagok",
"admin": "Adminisztrátor",
- "admin-desc": "Lehet szerkeszteni a lapot, tagokat távolíthat el, és és a fórumon-beállításainak módosítása.",
+ "admin-desc": "Megtekintheti és szerkesztheti a kártyákat, eltávolíthat tagokat, valamint megváltoztathatja a tábla beállításait.",
+ "admin-announcement": "Bejelentés",
+ "admin-announcement-active": "Bekapcsolt rendszerszintű bejelentés",
+ "admin-announcement-title": "Bejelentés az adminisztrátortól",
"all-boards": "Összes tábla",
- "and-n-other-card": "And __count__ other card",
- "and-n-other-card_plural": "And __count__ other cards",
+ "and-n-other-card": "És __count__ egyéb kártya",
+ "and-n-other-card_plural": "És __count__ egyéb kártya",
"apply": "Alkalmaz",
- "app-is-offline": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
- "archive": "Archív",
- "archive-all": "Összes archivált",
- "archive-board": "Archívált tábla",
- "archive-card": "Archívált kártya",
- "archive-list": "Archive List",
- "archive-selection": "Archiváld a megjelölteket",
- "archiveBoardPopup-title": "Archiváljuk a táblát?",
- "archived-items": "Archivált elemek",
- "archived-boards": "Archived Boards",
- "restore-board": "Restore Board",
- "no-archived-boards": "No Archived Boards.",
- "archives": "Archívumok",
+ "app-is-offline": "A Wekan betöltés alatt van, kérem várjon. Az oldal újratöltése adatvesztést okoz. Ha a Wekan nem töltődik be, akkor ellenőrizze, hogy a Wekan kiszolgáló nem állt-e le.",
+ "archive": "Lomtárba",
+ "archive-all": "Összes lomtárba helyezése",
+ "archive-board": "Tábla lomtárba helyezése",
+ "archive-card": "Kártya lomtárba helyezése",
+ "archive-list": "Lista lomtárba helyezése",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Kijelölés lomtárba helyezése",
+ "archiveBoardPopup-title": "Lomtárba helyezi a táblát?",
+ "archived-items": "Lomtár",
+ "archived-boards": "Lomtárban lévő táblák",
+ "restore-board": "Tábla visszaállítása",
+ "no-archived-boards": "Nincs tábla a lomtárban.",
+ "archives": "Lomtár",
"assign-member": "Tag hozzárendelése",
"attached": "csatolva",
- "attachment": "Csatolmány",
- "attachment-delete-pop": "A csatolmány törlése végeleges. Nincs visszaállítás.",
- "attachmentDeletePopup-title": "Törli a csatolmányt?",
- "attachments": "Csatolmányok",
- "auto-watch": "Automatically watch boards when they are created",
- "avatar-too-big": "The avatar is too large (70KB max)",
+ "attachment": "Melléklet",
+ "attachment-delete-pop": "A melléklet törlése végeleges. Nincs visszaállítás.",
+ "attachmentDeletePopup-title": "Törli a mellékletet?",
+ "attachments": "Mellékletek",
+ "auto-watch": "Táblák automatikus megtekintése, amikor létrejönnek",
+ "avatar-too-big": "Az avatár túl nagy (legfeljebb 70 KB)",
"back": "Vissza",
- "board-change-color": "Szín módosítása",
- "board-nb-stars": "%s stars",
+ "board-change-color": "Szín megváltoztatása",
+ "board-nb-stars": "%s csillag",
"board-not-found": "A tábla nem található",
- "board-private-info": "Eza tábla legyen <strong>privát</strong>.",
- "board-public-info": "Ez a tábla legyen <strong>publikus</strong>.",
- "boardChangeColorPopup-title": "A tábla háttérszínének módosítása",
+ "board-private-info": "Ez a tábla legyen <strong>személyes</strong>.",
+ "board-public-info": "Ez a tábla legyen <strong>nyilvános</strong>.",
+ "boardChangeColorPopup-title": "Tábla hátterének megváltoztatása",
"boardChangeTitlePopup-title": "Tábla átnevezése",
- "boardChangeVisibilityPopup-title": "Láthatóság módosítása",
- "boardChangeWatchPopup-title": "Óra módosítása",
+ "boardChangeVisibilityPopup-title": "Láthatóság megváltoztatása",
+ "boardChangeWatchPopup-title": "Megfigyelés megváltoztatása",
"boardMenuPopup-title": "Tábla menü",
"boards": "Táblák",
- "bucket-example": "Like “Bucket List” for example",
- "cancel": "Mégsem",
- "card-archived": "Ez a kártya archivált.",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Listák",
+ "bucket-example": "Mint például „Bakancslista”",
+ "cancel": "Mégse",
+ "card-archived": "Ez a kártya a lomtárba került.",
"card-comments-title": "Ez a kártya %s hozzászólást tartalmaz.",
- "card-delete-notice": "A törlés végleges. Az összes eseményt elveszíti ami ehhez a kártyához tartozik.",
- "card-delete-pop": "Minden esemény eltávolításra kerül a tevékenység listájából és többé nem lehet újra nyitni ezt a kártyát. Nincs visszaállítási lehetőség.",
- "card-delete-suggest-archive": "Archiválhatod a kártyákat hogy eltávolítsd a tábláról és és megőrizheted az eseményt.",
- "card-due": "Eddig",
- "card-due-on": "Ebben az időpontban",
- "card-edit-attachments": "Csatolmányok szerkesztése",
- "card-edit-labels": "Cimkék szerkesztése",
+ "card-delete-notice": "A törlés végleges. Az összes műveletet elveszíti, amely ehhez a kártyához tartozik.",
+ "card-delete-pop": "Az összes művelet el lesz távolítva a tevékenységlistából, és nem lesz képes többé újra megnyitni a kártyát. Nincs visszaállítási lehetőség.",
+ "card-delete-suggest-archive": "You can move a card Recycle Bin to remove it from the board and preserve the activity.",
+ "card-due": "Esedékes",
+ "card-due-on": "Esedékes ekkor",
+ "card-spent": "Eltöltött idő",
+ "card-edit-attachments": "Mellékletek szerkesztése",
+ "card-edit-labels": "Címkék szerkesztése",
"card-edit-members": "Tagok szerkesztése",
- "card-labels-title": "A kártya cimkéjének módosítása",
- "card-members-title": "Adj hozzá vagy távolítsd el a tagokat a táblákról és a kártyáról",
- "card-start": "Start",
- "card-start-on": "Kezdődik",
+ "card-labels-title": "A kártya címkéinek megváltoztatása.",
+ "card-members-title": "A tábla tagjainak hozzáadása vagy eltávolítása a kártyáról.",
+ "card-start": "Kezdés",
+ "card-start-on": "Kezdés ekkor",
"cardAttachmentsPopup-title": "Innen csatolva",
- "cardDeletePopup-title": "Kártya törlése?",
- "cardDetailsActionsPopup-title": "Kártya események",
- "cardLabelsPopup-title": "Cimkék",
+ "cardDeletePopup-title": "Törli a kártyát?",
+ "cardDetailsActionsPopup-title": "Kártyaműveletek",
+ "cardLabelsPopup-title": "Címkék",
"cardMembersPopup-title": "Tagok",
"cardMorePopup-title": "Több",
"cards": "Kártyák",
- "change": "Módosít",
- "change-avatar": "Avatar módosítása",
- "change-password": "Jelszó módosítása",
- "change-permissions": "Hozzáférések módosítása",
- "change-settings": "Beállítások módosítása",
- "changeAvatarPopup-title": "Avatar módosítása",
- "changeLanguagePopup-title": "Nyelv módosítása",
- "changePasswordPopup-title": "Change Password",
- "changePermissionsPopup-title": "Hozzáférések módosítása",
- "changeSettingsPopup-title": "Beállítások módosítása",
- "checklists": "Ellenőrzőlista ",
- "click-to-star": "Kattints a csillagra és add a kiemeltekhez ezt a táblát.",
- "click-to-unstar": "Kattints a csillagra hogy eltávolítsd a kiemeltek közül.",
- "clipboard": "Vágólap vagy húzd és dobd",
- "close": "Bezár",
+ "cards-count": "Kártyák",
+ "change": "Változtatás",
+ "change-avatar": "Avatár megváltoztatása",
+ "change-password": "Jelszó megváltoztatása",
+ "change-permissions": "Jogosultságok megváltoztatása",
+ "change-settings": "Beállítások megváltoztatása",
+ "changeAvatarPopup-title": "Avatár megváltoztatása",
+ "changeLanguagePopup-title": "Nyelv megváltoztatása",
+ "changePasswordPopup-title": "Jelszó megváltoztatása",
+ "changePermissionsPopup-title": "Jogosultságok megváltoztatása",
+ "changeSettingsPopup-title": "Beállítások megváltoztatása",
+ "checklists": "Ellenőrzőlisták",
+ "click-to-star": "Kattintson a tábla csillagozásához.",
+ "click-to-unstar": "Kattintson a tábla csillagának eltávolításához.",
+ "clipboard": "Vágólap vagy fogd és vidd",
+ "close": "Bezárás",
"close-board": "Tábla bezárása",
- "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.",
+ "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
"color-black": "fekete",
"color-blue": "kék",
"color-green": "zöld",
- "color-lime": "lime",
+ "color-lime": "citrus",
"color-orange": "narancssárga",
"color-pink": "rózsaszín",
"color-purple": "lila",
"color-red": "piros",
- "color-sky": "világos kék",
+ "color-sky": "égszínkék",
"color-yellow": "sárga",
"comment": "Megjegyzés",
- "comment-placeholder": "Write Comment",
- "comment-only": "Comment only",
- "comment-only-desc": "Can comment on cards only.",
+ "comment-placeholder": "Megjegyzés írása",
+ "comment-only": "Csak megjegyzés",
+ "comment-only-desc": "Csak megjegyzést írhat a kártyákhoz.",
"computer": "Számítógép",
- "copy-card-link-to-clipboard": "Copy card link to clipboard",
- "copyCardPopup-title": "Copy Card",
- "create": "Létrehoz",
- "createBoardPopup-title": "Új tábla",
- "chooseBoardSourcePopup-title": "Import board",
- "createLabelPopup-title": "Új cimke",
- "current": "aktuális",
+ "confirm-checklist-delete-dialog": "Biztosan törölni szeretné az ellenőrzőlistát?",
+ "copy-card-link-to-clipboard": "Kártya hivatkozásának másolása a vágólapra",
+ "copyCardPopup-title": "Kártya másolása",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
+ "create": "Létrehozás",
+ "createBoardPopup-title": "Tábla létrehozása",
+ "chooseBoardSourcePopup-title": "Tábla importálása",
+ "createLabelPopup-title": "Címke létrehozása",
+ "current": "jelenlegi",
"date": "Dátum",
- "decline": "Elutasít",
- "default-avatar": "Alapértelmezett avatar",
- "delete": "Töröl",
- "deleteLabelPopup-title": "Cimke törlése?",
+ "decline": "Elutasítás",
+ "default-avatar": "Alapértelmezett avatár",
+ "delete": "Törlés",
+ "deleteLabelPopup-title": "Törli a címkét?",
"description": "Leírás",
- "disambiguateMultiLabelPopup-title": "Cimke értelmező esemény",
- "disambiguateMultiMemberPopup-title": "Tag értelmező esemény",
- "discard": "Elutasít",
+ "disambiguateMultiLabelPopup-title": "Címkeművelet egyértelműsítése",
+ "disambiguateMultiMemberPopup-title": "Tagművelet egyértelműsítése",
+ "discard": "Eldobás",
"done": "Kész",
"download": "Letöltés",
- "edit": "Szerkeszt",
- "edit-avatar": "Avatar módosítása",
+ "edit": "Szerkesztés",
+ "edit-avatar": "Avatár megváltoztatása",
"edit-profile": "Profil szerkesztése",
- "editCardStartDatePopup-title": "Kezdő dátum módosítása",
- "editCardDueDatePopup-title": "Lejárati dátum módosítása",
- "editLabelPopup-title": "Cimke módosítása",
+ "edit-wip-limit": "WIP korlát szerkesztése",
+ "soft-wip-limit": "Gyenge WIP korlát",
+ "editCardStartDatePopup-title": "Kezdődátum megváltoztatása",
+ "editCardDueDatePopup-title": "Esedékesség dátumának megváltoztatása",
+ "editCardSpentTimePopup-title": "Eltöltött idő megváltoztatása",
+ "editLabelPopup-title": "Címke megváltoztatása",
"editNotificationPopup-title": "Értesítés szerkesztése",
- "editProfilePopup-title": "Edit Profile",
- "email": "Email",
- "email-enrollAccount-subject": "A fiókodat létrehozták a __siteName__ oldalon",
- "email-enrollAccount-text": "Üdvözöljük __user__,\n\nA rendszer használatának megkezdéséhez Egyszerűen kattintson az alábbi linkre.\n\n__url__\n\nKöszönjük.",
- "email-fail": "Email küldése sikertelen",
- "email-invalid": "Nem megfelelő email cím",
- "email-invite": "Meghívás Emailben",
- "email-invite-subject": "__inviter__ küldött neked egy meghívót",
- "email-invite-text": "Üdvözöljük __user__,\n\n__inviter__ meghívott téged közreműködésre az alábbi táblába \"__board__\".\n\nKérjük kattints az alábbi linkre:\n\n__url__\n\nKöszönjük.",
- "email-resetPassword-subject": "Jelszó visszaállítása a __siteName__ oldalon",
- "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.",
- "email-sent": "Email elküldve",
- "email-verifyEmail-subject": "Igazold vissza az email címedet a __siteName__ oldalon",
- "email-verifyEmail-text": "Üdvözöljük __user__,\n\nAz Email címe ellenőrzéséhez kérjük kattintson az alábbi linkre.\n\n__url__\n\nKöszönjük.",
+ "editProfilePopup-title": "Profil szerkesztése",
+ "email": "E-mail",
+ "email-enrollAccount-subject": "Létrejött a profilja a következő oldalon: __siteName__",
+ "email-enrollAccount-text": "Kedves __user__!\n\nA szolgáltatás használatának megkezdéséhez egyszerűen kattintson a lenti hivatkozásra.\n\n__url__\n\nKöszönjük.",
+ "email-fail": "Az e-mail küldése nem sikerült",
+ "email-fail-text": "Hiba az e-mail küldésének kísérlete közben",
+ "email-invalid": "Érvénytelen e-mail",
+ "email-invite": "Meghívás e-mailben",
+ "email-invite-subject": "__inviter__ egy meghívást küldött Önnek",
+ "email-invite-text": "Kedves __user__!\n\n__inviter__ meghívta Önt, hogy csatlakozzon a(z) „__board__” táblán történő együttműködéshez.\n\nKattintson az alábbi hivatkozásra:\n\n__url__\n\nKöszönjük.",
+ "email-resetPassword-subject": "Jelszó visszaállítása ezen az oldalon: __siteName__",
+ "email-resetPassword-text": "Kedves __user__!\n\nA jelszava visszaállításához egyszerűen kattintson a lenti hivatkozásra.\n\n__url__\n\nKöszönjük.",
+ "email-sent": "E-mail elküldve",
+ "email-verifyEmail-subject": "Igazolja vissza az e-mail címét a következő oldalon: __siteName__",
+ "email-verifyEmail-text": "Kedves __user__!\n\nAz e-mail fiókjának visszaigazolásához egyszerűen kattintson a lenti hivatkozásra.\n\n__url__\n\nKöszönjük.",
+ "enable-wip-limit": "WIP korlát engedélyezése",
"error-board-doesNotExist": "Ez a tábla nem létezik",
- "error-board-notAdmin": "Adminisztrátor joggal kell rendelkezned hogy megtehesd ezen a táblán",
- "error-board-notAMember": "Az tábla tagjának kell lenned, hogy megtehesd",
- "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-board-notAdmin": "A tábla adminisztrátorának kell lennie, hogy ezt megtehesse",
+ "error-board-notAMember": "A tábla tagjának kell lennie, hogy ezt megtehesse",
+ "error-json-malformed": "A szöveg nem érvényes JSON",
+ "error-json-schema": "A JSON adatok nem a helyes formátumban tartalmazzák a megfelelő információkat",
"error-list-doesNotExist": "Ez a lista nem létezik",
"error-user-doesNotExist": "Ez a felhasználó nem létezik",
- "error-user-notAllowSelf": "You can not invite yourself",
- "error-user-notCreated": "Ez a felhasználó nem jött létre",
+ "error-user-notAllowSelf": "Nem hívhatja meg saját magát",
+ "error-user-notCreated": "Ez a felhasználó nincs létrehozva",
"error-username-taken": "Ez a felhasználónév már foglalt",
- "error-email-taken": "Email has already been taken",
+ "error-email-taken": "Az e-mail már foglalt",
"export-board": "Tábla exportálása",
"filter": "Szűrő",
"filter-cards": "Kártyák szűrése",
- "filter-clear": "Szürő törlése",
- "filter-no-label": "Nincs cimke",
- "filter-no-member": "Nincsenek tagok",
+ "filter-clear": "Szűrő törlése",
+ "filter-no-label": "Nincs címke",
+ "filter-no-member": "Nincs tag",
"filter-on": "Szűrő bekapcsolva",
- "filter-on-desc": "Éppen kártyákat szűrsz ezen a táblán. Kattints ide a szűrő szerkesztéséhez.",
- "filter-to-selection": "Szűrő beállítása a kijelölés szerint",
+ "filter-on-desc": "A kártyaszűrés be van kapcsolva ezen a táblán. Kattintson ide a szűrő szerkesztéséhez.",
+ "filter-to-selection": "Szűrés a kijelöléshez",
"fullname": "Teljes név",
- "header-logo-title": "Vissza a táblák oldaladra.",
+ "header-logo-title": "Vissza a táblák oldalára.",
"hide-system-messages": "Rendszerüzenetek elrejtése",
- "headerBarCreateBoardPopup-title": "Új tábla",
+ "headerBarCreateBoardPopup-title": "Tábla létrehozása",
"home": "Kezdőlap",
"import": "Importálás",
- "import-board": "import board",
- "import-board-c": "Import board",
- "import-board-title-trello": "Tábla importálása a Trello-ról",
- "import-board-title-wekan": "Import board from Wekan",
- "import-sandstorm-warning": "Imported board will delete all existing data on board and replace it with imported board.",
- "from-trello": "From Trello",
- "from-wekan": "From Wekan",
- "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.",
- "import-board-instruction-wekan": "In your Wekan board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.",
- "import-json-placeholder": "Paste your valid JSON data here",
- "import-map-members": "Tagok megjelenítése",
- "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": "Version",
+ "import-board": "tábla importálása",
+ "import-board-c": "Tábla importálása",
+ "import-board-title-trello": "Tábla importálása a Trello oldalról",
+ "import-board-title-wekan": "Tábla importálása a Wekan oldalról",
+ "import-sandstorm-warning": "Az importált tábla törölni fogja a táblán lévő összes meglévő adatot, és kicseréli az importált táblával.",
+ "from-trello": "A Trello oldalról",
+ "from-wekan": "A Wekan oldalról",
+ "import-board-instruction-trello": "A Trello tábláján menjen a „Menü”, majd a „Több”, „Nyomtatás és exportálás”, „JSON exportálása” menüpontokra, és másolja ki az eredményül kapott szöveget.",
+ "import-board-instruction-wekan": "A Wekan tábláján menjen a „Menü”, majd a „Tábla exportálás” menüpontra, és másolja ki a letöltött fájlban lévő szöveget.",
+ "import-json-placeholder": "Illessze be ide az érvényes JSON adatokat",
+ "import-map-members": "Tagok leképezése",
+ "import-members-map": "Az importált táblának van néhány tagja. Képezze le a tagokat, akiket importálni szeretne a Wekan felhasználókba.",
+ "import-show-user-mapping": "Tagok leképezésének vizsgálata",
+ "import-user-select": "Válassza ki a Wekan felhasználót, akit ezen tagként használni szeretne",
+ "importMapMembersAddPopup-title": "Wekan tag kiválasztása",
+ "info": "Verzió",
"initials": "Kezdőbetűk",
- "invalid-date": "Hibás dátum",
- "joined": "becsatlakozott",
- "just-invited": "Éppen most hívtak meg erre a táblára",
+ "invalid-date": "Érvénytelen dátum",
+ "invalid-time": "Érvénytelen idő",
+ "invalid-user": "Érvénytelen felhasználó",
+ "joined": "csatlakozott",
+ "just-invited": "Éppen most hívták meg erre a táblára",
"keyboard-shortcuts": "Gyorsbillentyűk",
- "label-create": "Új cimke",
- "label-default": "%s cimke (alapértelmezett)",
- "label-delete-pop": "Nincsen visszaállítás. Ez el fogja távolítani ezt a cimkét az összes kártyáról és törli az előzményeket.",
- "labels": "Cimkék",
+ "label-create": "Címke létrehozása",
+ "label-default": "%s címke (alapértelmezett)",
+ "label-delete-pop": "Nincs visszavonás. Ez el fogja távolítani ezt a címkét az összes kártyáról, és törli az előzményeit.",
+ "labels": "Címkék",
"language": "Nyelv",
- "last-admin-desc": "You can’t change roles because there must be at least one admin.",
+ "last-admin-desc": "Nem változtathatja meg a szerepeket, mert legalább egy adminisztrátora szükség van.",
"leave-board": "Tábla elhagyása",
- "link-card": "Kapcsolja ehhez a kártyához",
- "list-archive-cards": "Archiváld az összes kártyát ezen a listán.",
- "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": "Válaszd ki az összes kártyát ezen a listán",
- "listActionPopup-title": "Események megjelenítése",
+ "leave-board-pop": "Biztosan el szeretné hagyni ezt a táblát: __boardTitle__? El lesz távolítva a táblán lévő összes kártyáról.",
+ "leaveBoardPopup-title": "Elhagyja a táblát?",
+ "link-card": "Összekapcsolás ezzel a kártyával",
+ "list-archive-cards": "Az összes kártya lomtárba helyezése ezen a listán.",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
+ "list-move-cards": "A listán lévő összes kártya áthelyezése",
+ "list-select-cards": "A listán lévő összes kártya kiválasztása",
+ "listActionPopup-title": "Műveletek felsorolása",
+ "swimlaneActionPopup-title": "Swimlane Actions",
"listImportCardPopup-title": "Trello kártya importálása",
"listMorePopup-title": "Több",
- "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.",
+ "link-list": "Összekapcsolás ezzel a listával",
+ "list-delete-pop": "Az összes művelet el lesz távolítva a tevékenységlistából, és nem lesz lehetősége visszaállítani a listát. Nincs visszavonás.",
+ "list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve the activity.",
"lists": "Listák",
+ "swimlanes": "Swimlanes",
"log-out": "Kijelentkezés",
"log-in": "Bejelentkezés",
"loginPopup-title": "Bejelentkezés",
"memberMenuPopup-title": "Tagok beállításai",
"members": "Tagok",
"menu": "Menü",
- "move-selection": "Kijelöltek mozgatása",
- "moveCardPopup-title": "Kártya mozgatása",
- "moveCardToBottom-title": "Mozgatás az aljára",
- "moveCardToTop-title": "Mozgatás a tetejére",
- "moveSelectionPopup-title": "Kijelöltek mozgatása",
- "multi-selection": "Kijelöltek mozgatása",
+ "move-selection": "Kijelölés áthelyezése",
+ "moveCardPopup-title": "Kártya áthelyezése",
+ "moveCardToBottom-title": "Áthelyezés az aljára",
+ "moveCardToTop-title": "Áthelyezés a tetejére",
+ "moveSelectionPopup-title": "Kijelölés áthelyezése",
+ "multi-selection": "Többszörös kijelölés",
"multi-selection-on": "Többszörös kijelölés bekapcsolva",
- "muted": "Elnémítva",
- "muted-info": "Soha nem leszel értesítve ennek a táblának a módosításairól.",
+ "muted": "Némítva",
+ "muted-info": "Soha sem lesz értesítve a táblán lévő semmilyen változásról.",
"my-boards": "Saját tábláim",
"name": "Név",
- "no-archived-cards": "Nincsenek archivált kártyák.",
- "no-archived-lists": "Nincsenek archivált listák.",
- "no-results": "Nincs eredmény",
+ "no-archived-cards": "Nincs kártya a lomtárban.",
+ "no-archived-lists": "Nincs lista a lomtárban.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
+ "no-results": "Nincs találat",
"normal": "Normál",
- "normal-desc": "Megtekinthet és szerkeszthet kártyákat. Nem módosíthatja a beállításokat.",
- "not-accepted-yet": "A meghívást még nem fogadták el",
- "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": "Megtekintheti és szerkesztheti a kártyákat. Nem változtathatja meg a beállításokat.",
+ "not-accepted-yet": "A meghívás még nincs elfogadva",
+ "notify-participate": "Frissítések fogadása bármely kártyánál, amelynél létrehozóként vagy tagként vesz részt",
+ "notify-watch": "Frissítések fogadása bármely táblánál, listánál vagy kártyánál, amelyet megtekint",
"optional": "opcionális",
"or": "vagy",
- "page-maybe-private": "Ez az oldal privát. A megtekintéshez jelentkezz be itt: <a href='%s'>bejelentkezés</a>.",
+ "page-maybe-private": "Ez az oldal személyes lehet. Esetleg megtekintheti, ha <a href='%s'>bejelentkezik</a>.",
"page-not-found": "Az oldal nem található.",
"password": "Jelszó",
- "paste-or-dragdrop": "illeszd be, vagy húzd ide a kép fájlt (csak képeket)",
- "participating": "Résztvevő",
+ "paste-or-dragdrop": "illessze be, vagy fogd és vidd módon húzza ide a képfájlt (csak képeket)",
+ "participating": "Részvétel",
"preview": "Előnézet",
"previewAttachedImagePopup-title": "Előnézet",
"previewClipboardImagePopup-title": "Előnézet",
- "private": "Privát",
- "private-desc": "Ez a tábla privát. Csak a táblához hozzáadott emberek tekinthetik meg és szerkeszthetik.",
+ "private": "Személyes",
+ "private-desc": "Ez a tábla személyes. Csak a táblához hozzáadott emberek tekinthetik meg és szerkeszthetik.",
"profile": "Profil",
- "public": "Publikus",
- "public-desc": "Ez a tábla publikus. A link birtokában bárki megtekintheti és látszik a keresőkben mint a Google. Csak azok az emberek szerkeszthetik akiket hozzáadtak.",
- "quick-access-description": "Emeled ki a táblát hogy létrehozz egy parancsikont ezen a sávon.",
+ "public": "Nyilvános",
+ "public-desc": "Ez a tábla nyilvános. A hivatkozás birtokában bárki számára látható, és megjelenik az olyan keresőmotorokban, mint például a Google. Csak a táblához hozzáadott emberek szerkeszthetik.",
+ "quick-access-description": "Csillagozzon meg egy táblát egy gyors hivatkozás hozzáadásához ebbe a sávba.",
"remove-cover": "Borító eltávolítása",
"remove-from-board": "Eltávolítás a tábláról",
- "remove-label": "Remove Label",
- "listDeletePopup-title": "Delete List ?",
+ "remove-label": "Címke eltávolítása",
+ "listDeletePopup-title": "Törli a listát?",
"remove-member": "Tag eltávolítása",
"remove-member-from-card": "Eltávolítás a kártyáról",
- "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.",
+ "remove-member-pop": "Eltávolítja __name__ (__username__) felhasználót a tábláról: __boardTitle__? A tag el lesz távolítva a táblán lévő összes kártyáról. Értesítést fog kapni erről.",
"removeMemberPopup-title": "Eltávolítja a tagot?",
- "rename": "Átnevez",
+ "rename": "Átnevezés",
"rename-board": "Tábla átnevezése",
- "restore": "Visszaállít",
+ "restore": "Visszaállítás",
"save": "Mentés",
"search": "Keresés",
- "select-color": "Select Color",
- "shortcut-assign-self": "Add hozzá magad az aktuális kártyához",
- "shortcut-autocomplete-emoji": "Automatikus emoji kiegészítés",
- "shortcut-autocomplete-members": "Automatikus tag név kiegészítés",
+ "search-cards": "Keresés a táblán lévő kártyák címében illetve leírásában",
+ "search-example": "keresőkifejezés",
+ "select-color": "Szín kiválasztása",
+ "set-wip-limit-value": "Korlát beállítása a listán lévő feladatok legnagyobb számához",
+ "setWipLimitPopup-title": "WIP korlát beállítása",
+ "shortcut-assign-self": "Önmaga hozzárendelése a jelenlegi kártyához",
+ "shortcut-autocomplete-emoji": "Emodzsi automatikus kiegészítése",
+ "shortcut-autocomplete-members": "Tagok automatikus kiegészítése",
"shortcut-clear-filters": "Összes szűrő törlése",
- "shortcut-close-dialog": "Beszélgetés bezárása",
+ "shortcut-close-dialog": "Párbeszédablak bezárása",
"shortcut-filter-my-cards": "Kártyáim szűrése",
- "shortcut-show-shortcuts": "Hozd létre ezt a hivatkozási listát",
- "shortcut-toggle-filterbar": "Szűrő oldalsáv kényszerítése",
- "shortcut-toggle-sidebar": "Tábla oldalsáv kényszerítése",
- "show-cards-minimum-count": "Mutasd a kártyák számát ha a lista többet tartalmaz mint",
- "sidebar-open": "Oldalsáv megjelenítése",
- "sidebar-close": "Oldalsáv elrejtése",
+ "shortcut-show-shortcuts": "A hivatkozási lista előre hozása",
+ "shortcut-toggle-filterbar": "Szűrő oldalsáv ki- és bekapcsolása",
+ "shortcut-toggle-sidebar": "Tábla oldalsáv ki- és bekapcsolása",
+ "show-cards-minimum-count": "Kártyaszámok megjelenítése, ha a lista többet tartalmaz mint",
+ "sidebar-open": "Oldalsáv megnyitása",
+ "sidebar-close": "Oldalsáv bezárása",
"signupPopup-title": "Fiók létrehozása",
- "star-board-title": "Kattints a tábla kiemeléséhez. Megjelenik a táblák lista tetején.",
- "starred-boards": "Kiemelt táblák",
- "starred-boards-description": "A kiemelt táblák megjelennek a táblák lista tetején.",
+ "star-board-title": "Kattintson a tábla csillagozásához. Meg fog jelenni a táblalistája tetején.",
+ "starred-boards": "Csillagozott táblák",
+ "starred-boards-description": "A csillagozott táblák megjelennek a táblalistája tetején.",
"subscribe": "Feliratkozás",
"team": "Csapat",
"this-board": "ez a tábla",
"this-card": "ez a kártya",
+ "spent-time-hours": "Eltöltött idő (óra)",
+ "overtime-hours": "Túlóra (óra)",
+ "overtime": "Túlóra",
+ "has-overtime-cards": "Van túlórás kártyája",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Idő",
"title": "Cím",
"tracking": "Követés",
- "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
- "unassign-member": "Tag eltávolítása",
- "unsaved-description": "Van egy elmentetlen leírásod.",
- "unwatch": "Figyelés leállítása",
- "upload": "Feltölt",
- "upload-avatar": "Tölts fel egy avatart",
- "uploaded-avatar": "Feltöltött egy avatart",
+ "tracking-info": "Értesítve lesz az összes olyan kártya változásáról, amelyen létrehozóként vagy tagként vesz részt.",
+ "unassign-member": "Tag hozzárendelésének megszüntetése",
+ "unsaved-description": "Van egy mentetlen leírása.",
+ "unwatch": "Megfigyelés megszüntetése",
+ "upload": "Feltöltés",
+ "upload-avatar": "Egy avatár feltöltése",
+ "uploaded-avatar": "Egy avatár feltöltve",
"username": "Felhasználónév",
"view-it": "Megtekintés",
- "warn-list-archived": "figyelem: ez a kártya szerepel az egyik archiv listán",
- "watch": "Figyel",
- "watching": "Megfigyelt",
- "watching-info": "Értesítve leszel minden módosításról ebben a táblában.",
+ "warn-list-archived": "warning: this card is in an list at Recycle Bin",
+ "watch": "Megfigyelés",
+ "watching": "Megfigyelés",
+ "watching-info": "Értesítve lesz a táblán lévő összes változásról",
"welcome-board": "Üdvözlő tábla",
+ "welcome-swimlane": "Milestone 1",
"welcome-list1": "Alapok",
"welcome-list2": "Speciális",
- "what-to-do": "Mit akarsz csinálni?",
- "admin-panel": "Adminisztrációs felület",
+ "what-to-do": "Mit szeretne tenni?",
+ "wipLimitErrorPopup-title": "Érvénytelen WIP korlát",
+ "wipLimitErrorPopup-dialog-pt1": "A listán lévő feladatok száma magasabb a meghatározott WIP korlátnál.",
+ "wipLimitErrorPopup-dialog-pt2": "Helyezzen át néhány feladatot a listáról, vagy állítson be magasabb WIP korlátot.",
+ "admin-panel": "Adminisztrációs panel",
"settings": "Beállítások",
- "people": "Ember",
+ "people": "Emberek",
"registration": "Regisztráció",
- "disable-self-registration": "Egyéni regisztráció kikapcsolva",
+ "disable-self-registration": "Önregisztráció letiltása",
"invite": "Meghívás",
"invite-people": "Emberek meghívása",
- "to-boards": "Táblá(k)hoz",
- "email-addresses": "Email címek",
- "smtp-host-description": "A levelezésed SMTP szerverének IP címe.",
- "smtp-port-description": "Az SMTP szervered portja a kimenő levelekhez.",
- "smtp-tls-description": "Enable TLS support for SMTP server",
+ "to-boards": "Táblákhoz",
+ "email-addresses": "E-mail címek",
+ "smtp-host-description": "Az SMTP kiszolgáló címe, amely az e-maileket kezeli.",
+ "smtp-port-description": "Az SMTP kiszolgáló által használt port a kimenő e-mailekhez.",
+ "smtp-tls-description": "TLS támogatás engedélyezése az SMTP kiszolgálónál",
"smtp-host": "SMTP kiszolgáló",
"smtp-port": "SMTP port",
"smtp-username": "Felhasználónév",
"smtp-password": "Jelszó",
- "smtp-tls": "TLS support",
- "send-from": "Tól",
- "invitation-code": "Meghívó kód",
- "email-invite-register-subject": "__inviter__ küldött neked egy meghívót",
- "email-invite-register-text": "Kedves __user__,\n\n__inviter__ meghívott közreműködésre a Wekanba.\n\nKérlek kövesd az alábbi linket:\n__url__\n\nA meghívókódod: __icode__\n\nKöszönjük.",
- "error-invitation-code-not-exist": "A meghívó kódja nem érvényes",
- "error-notAuthorized": "You are not authorized to view this page.",
- "outgoing-webhooks": "Outgoing Webhooks",
- "outgoingWebhooksPopup-title": "Outgoing Webhooks",
- "new-outgoing-webhook": "New Outgoing Webhook",
- "no-name": "(Unknown)",
- "Wekan_version": "Wekan version",
- "Node_version": "Node version",
- "OS_Arch": "OS Arch",
- "OS_Cpus": "OS CPU Count",
- "OS_Freemem": "OS Free Memory",
- "OS_Loadavg": "OS Load Average",
- "OS_Platform": "OS Platform",
- "OS_Release": "OS Release",
- "OS_Totalmem": "OS Total Memory",
- "OS_Type": "OS Type",
- "OS_Uptime": "OS Uptime",
- "hours": "hours",
- "minutes": "minutes",
- "seconds": "seconds",
- "yes": "Yes",
- "no": "No",
- "accounts": "Accounts",
- "accounts-allowEmailChange": "Allow Email Change"
+ "smtp-tls": "TLS támogatás",
+ "send-from": "Feladó",
+ "send-smtp-test": "Teszt e-mail küldése magamnak",
+ "invitation-code": "Meghívási kód",
+ "email-invite-register-subject": "__inviter__ egy meghívás küldött Önnek",
+ "email-invite-register-text": "Kedves __user__!\n\n__inviter__ meghívta Önt közreműködésre a Wekan oldalra.\n\nKövesse a lenti hivatkozást:\n__url__\n\nÉs a meghívási kódja: __icode__\n\nKöszönjük.",
+ "email-smtp-test-subject": "SMTP teszt e-mail a Wekantól",
+ "email-smtp-test-text": "Sikeresen elküldött egy e-mailt",
+ "error-invitation-code-not-exist": "A meghívási kód nem létezik",
+ "error-notAuthorized": "Nincs jogosultsága az oldal megtekintéséhez.",
+ "outgoing-webhooks": "Kimenő webhurkok",
+ "outgoingWebhooksPopup-title": "Kimenő webhurkok",
+ "new-outgoing-webhook": "Új kimenő webhurok",
+ "no-name": "(Ismeretlen)",
+ "Wekan_version": "Wekan verzió",
+ "Node_version": "Node verzió",
+ "OS_Arch": "Operációs rendszer architektúrája",
+ "OS_Cpus": "Operációs rendszer CPU száma",
+ "OS_Freemem": "Operációs rendszer szabad memóriája",
+ "OS_Loadavg": "Operációs rendszer átlagos terhelése",
+ "OS_Platform": "Operációs rendszer platformja",
+ "OS_Release": "Operációs rendszer kiadása",
+ "OS_Totalmem": "Operációs rendszer összes memóriája",
+ "OS_Type": "Operációs rendszer típusa",
+ "OS_Uptime": "Operációs rendszer üzemideje",
+ "hours": "óra",
+ "minutes": "perc",
+ "seconds": "másodperc",
+ "yes": "Igen",
+ "no": "Nem",
+ "accounts": "Fiókok",
+ "accounts-allowEmailChange": "E-mail megváltoztatásának engedélyezése",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Létrehozva",
+ "verified": "Ellenőrizve",
+ "active": "Aktív",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
} \ No newline at end of file
diff --git a/i18n/hy.i18n.json b/i18n/hy.i18n.json
new file mode 100644
index 00000000..8c06d36d
--- /dev/null
+++ b/i18n/hy.i18n.json
@@ -0,0 +1,447 @@
+{
+ "accept": "Ընդունել",
+ "act-activity-notify": "[Wekan] Activity Notification",
+ "act-addAttachment": "attached __attachment__ to __card__",
+ "act-addChecklist": "added checklist __checklist__ to __card__",
+ "act-addChecklistItem": "ավելացրել է __checklistItem__ __checklist__ on __card__-ին",
+ "act-addComment": "մեկնաբանել է __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": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
+ "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": "%s moved to Recycle Bin",
+ "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",
+ "activity-checklist-item-added": "added checklist item to '%s' in %s",
+ "add": "Add",
+ "add-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
+ "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.",
+ "admin-announcement": "Announcement",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Announcement from Administrator",
+ "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": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
+ "restore-board": "Restore Board",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
+ "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",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Lists",
+ "bucket-example": "Like “Bucket List” for example",
+ "cancel": "Cancel",
+ "card-archived": "This card is moved to Recycle Bin.",
+ "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 move a card Recycle Bin to remove it from the board and preserve the activity.",
+ "card-due": "Due",
+ "card-due-on": "Due on",
+ "card-spent": "Spent Time",
+ "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",
+ "cards-count": "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 “Recycle Bin” 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",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+ "copy-card-link-to-clipboard": "Copy card link to clipboard",
+ "copyCardPopup-title": "Copy Card",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
+ "create": "Create",
+ "createBoardPopup-title": "Create Board",
+ "chooseBoardSourcePopup-title": "Import 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",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
+ "editCardStartDatePopup-title": "Change start date",
+ "editCardDueDatePopup-title": "Change due date",
+ "editCardSpentTimePopup-title": "Change spent time",
+ "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-fail-text": "Error trying to send email",
+ "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.",
+ "enable-wip-limit": "Enable WIP Limit",
+ "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",
+ "error-email-taken": "Email has already been 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 board",
+ "import-board-c": "Import board",
+ "import-board-title-trello": "Import board from Trello",
+ "import-board-title-wekan": "Import board from Wekan",
+ "import-sandstorm-warning": "Imported board will delete all existing data on board and replace it with imported board.",
+ "from-trello": "From Trello",
+ "from-wekan": "From Wekan",
+ "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.",
+ "import-board-instruction-wekan": "In your Wekan board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.",
+ "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": "Version",
+ "initials": "Initials",
+ "invalid-date": "Invalid date",
+ "invalid-time": "Invalid time",
+ "invalid-user": "Invalid user",
+ "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",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "Leave Board ?",
+ "link-card": "Link to this card",
+ "list-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
+ "list-move-cards": "Move all cards in this list",
+ "list-select-cards": "Select all cards in this list",
+ "listActionPopup-title": "List Actions",
+ "swimlaneActionPopup-title": "Swimlane 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 move a list to Recycle Bin to remove it from the board and preserve the activity.",
+ "lists": "Lists",
+ "swimlanes": "Swimlanes",
+ "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 cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
+ "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",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text to search for?",
+ "select-color": "Select Color",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
+ "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",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
+ "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 list at Recycle Bin",
+ "watch": "Watch",
+ "watching": "Watching",
+ "watching-info": "You will be notified of any change in this board",
+ "welcome-board": "Welcome Board",
+ "welcome-swimlane": "Milestone 1",
+ "welcome-list1": "Basics",
+ "welcome-list2": "Advanced",
+ "what-to-do": "What do you want to do?",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
+ "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",
+ "send-smtp-test": "Send a test email to yourself",
+ "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.",
+ "email-smtp-test-subject": "SMTP Test Email From Wekan",
+ "email-smtp-test-text": "You have successfully sent an email",
+ "error-invitation-code-not-exist": "Invitation code doesn't exist",
+ "error-notAuthorized": "You are not authorized to view this page.",
+ "outgoing-webhooks": "Outgoing Webhooks",
+ "outgoingWebhooksPopup-title": "Outgoing Webhooks",
+ "new-outgoing-webhook": "New Outgoing Webhook",
+ "no-name": "(Unknown)",
+ "Wekan_version": "Wekan version",
+ "Node_version": "Node version",
+ "OS_Arch": "OS Arch",
+ "OS_Cpus": "OS CPU Count",
+ "OS_Freemem": "OS Free Memory",
+ "OS_Loadavg": "OS Load Average",
+ "OS_Platform": "OS Platform",
+ "OS_Release": "OS Release",
+ "OS_Totalmem": "OS Total Memory",
+ "OS_Type": "OS Type",
+ "OS_Uptime": "OS Uptime",
+ "hours": "hours",
+ "minutes": "minutes",
+ "seconds": "seconds",
+ "yes": "Yes",
+ "no": "No",
+ "accounts": "Accounts",
+ "accounts-allowEmailChange": "Allow Email Change",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Created at",
+ "verified": "Verified",
+ "active": "Active",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
+} \ No newline at end of file
diff --git a/i18n/id.i18n.json b/i18n/id.i18n.json
index a8bb170f..2bc60852 100644
--- a/i18n/id.i18n.json
+++ b/i18n/id.i18n.json
@@ -9,9 +9,10 @@
"act-createCard": "Kartu__dilampirkan__ke__Daftar",
"act-createList": "Daftar__ditambahkan__ke__Panel",
"act-addBoardMember": "Partisipan__ditambahkan__ke__Kartu",
- "act-archivedBoard": "Arsip__Panel",
- "act-archivedCard": "Arsip__Kartu",
- "act-archivedList": "Arsip __Daftar__",
+ "act-archivedBoard": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
"act-importBoard": "Panel__diimpor",
"act-importCard": "Kartu__diimpor__",
"act-importList": "Daftar__diimpor__",
@@ -26,7 +27,7 @@
"activities": "Daftar Kegiatan",
"activity": "Kegiatan",
"activity-added": "ditambahkan %s ke %s",
- "activity-archived": "diarsipkan %s",
+ "activity-archived": "%s moved to Recycle Bin",
"activity-attached": "dilampirkan %s ke %s",
"activity-created": "dibuat %s",
"activity-excluded": "tidak termasuk %s dari %s",
@@ -44,6 +45,7 @@
"add-attachment": "Add Attachment",
"add-board": "Add Board",
"add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Add Checklist",
"add-checklist-item": "Tambahkan hal ke daftar periksa",
"add-cover": "Tambahkan Sampul",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "Daftar Anggota",
"admin": "Admin",
"admin-desc": "Bisa tampilkan dan sunting kartu, menghapus partisipan, dan merubah setting panel",
+ "admin-announcement": "Announcement",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Announcement from Administrator",
"all-boards": "Semua Panel",
"and-n-other-card": "Dan__menghitung__kartu lain",
"and-n-other-card_plural": "Dan__menghitung__kartu lain",
"apply": "Terapkan",
"app-is-offline": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
- "archive": "Arsip",
- "archive-all": "Arsipkan Semua",
- "archive-board": "Arsip Panel",
- "archive-card": "Arsip Kartu",
- "archive-list": "Archive List",
- "archive-selection": "Arsipkan yang dipilih",
- "archiveBoardPopup-title": "Arsip Panel?",
- "archived-items": "Arsip item",
- "archived-boards": "Archived Boards",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
"restore-board": "Restore Board",
- "no-archived-boards": "No Archived Boards.",
- "archives": "Daftar Arsip",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
"assign-member": "Tugaskan anggota",
"attached": "terlampir",
"attachment": "Lampiran",
@@ -91,15 +97,19 @@
"boardChangeWatchPopup-title": "Ubah Pengamatan",
"boardMenuPopup-title": "Menu Panel",
"boards": "Panel",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Daftar",
"bucket-example": "Contohnya seperti “Bucket List” ",
"cancel": "Batal",
- "card-archived": "Kartu ini diarsipkan",
+ "card-archived": "This card is moved to Recycle Bin.",
"card-comments-title": "Kartu ini punya %s komentar",
"card-delete-notice": "Menghapus sama dengan permanen. Anda akan kehilangan semua aksi yang terhubung ke kartu ini",
"card-delete-pop": "Semua aksi akan dihapus dari aktivitas dan anda tidak bisa lagi buka kartu ini",
- "card-delete-suggest-archive": "Anda bisa arsipkan kartu untuk menghapusnya dari panel dan mempertahankan aktivitas",
+ "card-delete-suggest-archive": "You can move a card Recycle Bin to remove it from the board and preserve the activity.",
"card-due": "Jatuh Tempo",
"card-due-on": "Jatuh Tempo pada",
+ "card-spent": "Spent Time",
"card-edit-attachments": "Sunting lampiran",
"card-edit-labels": "Sunting label",
"card-edit-members": "Sunting anggota",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "Daftar Anggota",
"cardMorePopup-title": "Lainnya",
"cards": "Daftar Kartu",
+ "cards-count": "Daftar Kartu",
"change": "Ubah",
"change-avatar": "Ubah Avatar",
"change-password": "Ubah Kata Sandi",
@@ -130,7 +141,7 @@
"clipboard": "Clipboard atau drag & drop",
"close": "Tutup",
"close-board": "Tutup Panel",
- "close-board-pop": "Anda bisa mengembalikan panel dengan klik tombol \"Arsip\" dari header beranda ",
+ "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
"color-black": "hitam",
"color-blue": "biru",
"color-green": "hijau",
@@ -146,8 +157,12 @@
"comment-only": "Hanya komentar",
"comment-only-desc": "Bisa komen hanya di kartu",
"computer": "Komputer",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
"copy-card-link-to-clipboard": "Copy card link to clipboard",
"copyCardPopup-title": "Copy Card",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
"create": "Buat",
"createBoardPopup-title": "Buat Panel",
"chooseBoardSourcePopup-title": "Import board",
@@ -167,8 +182,11 @@
"edit": "Sunting",
"edit-avatar": "Ubah Avatar",
"edit-profile": "Sunting Profil",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
"editCardStartDatePopup-title": "Ubah tanggal mulai",
"editCardDueDatePopup-title": "Ubah tanggal selesai",
+ "editCardSpentTimePopup-title": "Change spent time",
"editLabelPopup-title": "Ubah Label",
"editNotificationPopup-title": "Sunting Pemberitahuan",
"editProfilePopup-title": "Sunting Profil",
@@ -176,6 +194,7 @@
"email-enrollAccount-subject": "Sebuah akun dibuat untuk Anda pada __siteName__",
"email-enrollAccount-text": "Halo __user__,\n\nUntuk mulai menggunakan, silakan klik tautan berikut.\n\n__url__\n\nTerima kasih.",
"email-fail": "Surel gagal terkirim",
+ "email-fail-text": "Error trying to send email",
"email-invalid": "Surel tidak sah",
"email-invite": "Undang via Email",
"email-invite-subject": "__inviter__ sent you an invitation",
@@ -185,6 +204,7 @@
"email-sent": "Email terkirim",
"email-verifyEmail-subject": "Verifikasi surel Anda pada __siteName__",
"email-verifyEmail-text": "Halo __user__,\n\nUntuk memverifikasi surel Anda, silakan klik tautan berikut.\n\n__url__\n\nTerima kasih.",
+ "enable-wip-limit": "Enable WIP Limit",
"error-board-doesNotExist": "Panel ini tidak ada",
"error-board-notAdmin": "Anda harus admin dari panel ini untuk melakukan itu",
"error-board-notAMember": "Anda harus jadi member panel ini untuk melakukannya",
@@ -226,9 +246,11 @@
"import-show-user-mapping": "Review pemetaan partisipan",
"import-user-select": "Pilih nama pengguna yang Anda mau gunakan sebagai anggota ini",
"importMapMembersAddPopup-title": "Pilih anggota Wekan",
- "info": "Version",
+ "info": "Versi",
"initials": "Inisial",
"invalid-date": "Tanggal tidak sah",
+ "invalid-time": "Invalid time",
+ "invalid-user": "Invalid user",
"joined": "bergabung",
"just-invited": "Anda baru diundang di panel ini",
"keyboard-shortcuts": "Pintasan kibor",
@@ -239,18 +261,22 @@
"language": "Bahasa",
"last-admin-desc": "Anda tidak dapat mengubah aturan karena harus ada minimal seorang Admin.",
"leave-board": "Tingalkan Panel",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "Leave Board ?",
"link-card": "Link ke kartu ini",
- "list-archive-cards": "Arsipkan semua kartu ke daftar ini",
- "list-archive-cards-pop": "Ini akan menghapus semua kartu di daftar inidari panel. Untuk menampilkan arsip kartu dan membawa mereka kembali ke panel, klik \"Menu\" > \"Arsip item\"",
+ "list-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
"list-move-cards": "Pindah semua kartu ke daftar ini",
"list-select-cards": "Pilih semua kartu di daftar ini",
"listActionPopup-title": "Daftar Tindakan",
+ "swimlaneActionPopup-title": "Swimlane Actions",
"listImportCardPopup-title": "Impor dari Kartu Trello",
"listMorePopup-title": "Lainnya",
"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.",
+ "list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve the activity.",
"lists": "Daftar",
+ "swimlanes": "Swimlanes",
"log-out": "Keluar",
"log-in": "Masuk",
"loginPopup-title": "Masuk",
@@ -268,8 +294,9 @@
"muted-info": "Anda tidak akan pernah dinotifikasi semua perubahan di panel ini",
"my-boards": "Panel saya",
"name": "Nama",
- "no-archived-cards": "Tidak ada arsip kartu",
- "no-archived-lists": "Tidak ada daftar arsip.",
+ "no-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
"no-results": "Tidak ada hasil",
"normal": "Normal",
"normal-desc": "Bisa tampilkan dan edit kartu. Tidak bisa ubah setting",
@@ -305,7 +332,11 @@
"restore": "Pulihkan",
"save": "Simpan",
"search": "Cari",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text to search for?",
"select-color": "Select Color",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
"shortcut-assign-self": "Masukkan diri anda sendiri ke kartu ini",
"shortcut-autocomplete-emoji": "Autocomplete emoji",
"shortcut-autocomplete-members": "Autocomplete partisipan",
@@ -326,6 +357,11 @@
"team": "Tim",
"this-board": "Panel ini",
"this-card": "Kartu ini",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Waktu",
"title": "Judul",
"tracking": "Pelacakan",
@@ -338,14 +374,18 @@
"uploaded-avatar": "Avatar diunggah",
"username": "Nama Pengguna",
"view-it": "Lihat",
- "warn-list-archived": "Perhatian: Kartu ini dalam arsip daftar",
+ "warn-list-archived": "warning: this card is in an list at Recycle Bin",
"watch": "Amati",
"watching": "Mengamati",
"watching-info": "Anda akan diberitahu semua perubahan di panel ini",
"welcome-board": "Panel Selamat Datang",
+ "welcome-swimlane": "Milestone 1",
"welcome-list1": "Tingkat dasar",
"welcome-list2": "Tingkat lanjut",
"what-to-do": "Apa yang mau Anda lakukan?",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
"admin-panel": "Panel Admin",
"settings": "Setelan",
"people": "Orang-orang",
@@ -364,9 +404,12 @@
"smtp-password": "Kata Sandi",
"smtp-tls": "Dukungan TLS",
"send-from": "Dari",
+ "send-smtp-test": "Send a test email to yourself",
"invitation-code": "Kode Undangan",
"email-invite-register-subject": "__inviter__ mengirim undangan ke Anda",
"email-invite-register-text": "Halo __user__,\n\n__inviter__ mengundang Anda untuk berkolaborasi menggunakan Wekan.\n\nMohon ikuti tautan berikut:\n__url__\n\nDan kode undangan Anda adalah: __icode__\n\nTerima kasih.",
+ "email-smtp-test-subject": "SMTP Test Email From Wekan",
+ "email-smtp-test-text": "You have successfully sent an email",
"error-invitation-code-not-exist": "Kode undangan tidak ada",
"error-notAuthorized": "You are not authorized to view this page.",
"outgoing-webhooks": "Outgoing Webhooks",
@@ -390,5 +433,15 @@
"yes": "Yes",
"no": "No",
"accounts": "Accounts",
- "accounts-allowEmailChange": "Allow Email Change"
+ "accounts-allowEmailChange": "Allow Email Change",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Created at",
+ "verified": "Verified",
+ "active": "Active",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
} \ No newline at end of file
diff --git a/i18n/ig.i18n.json b/i18n/ig.i18n.json
new file mode 100644
index 00000000..f7746d5c
--- /dev/null
+++ b/i18n/ig.i18n.json
@@ -0,0 +1,447 @@
+{
+ "accept": "Kwere",
+ "act-activity-notify": "[Wekan] Activity Notification",
+ "act-addAttachment": "attached __attachment__ to __card__",
+ "act-addChecklist": "added checklist __checklist__ to __card__",
+ "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __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": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
+ "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": "%s moved to Recycle Bin",
+ "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": "na %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-checklist-item-added": "added checklist item to '%s' in %s",
+ "add": "Tinye",
+ "add-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
+ "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": "Tinye ndị otu ọhụrụ",
+ "added": "Etinyere ",
+ "addMemberPopup-title": "Ndị otu",
+ "admin": "Admin",
+ "admin-desc": "Can view and edit cards, remove members, and change settings for the board.",
+ "admin-announcement": "Announcement",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Announcement from Administrator",
+ "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": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
+ "restore-board": "Restore Board",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
+ "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",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Lists",
+ "bucket-example": "Like “Bucket List” for example",
+ "cancel": "Cancel",
+ "card-archived": "This card is moved to Recycle Bin.",
+ "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 move a card Recycle Bin to remove it from the board and preserve the activity.",
+ "card-due": "Due",
+ "card-due-on": "Due on",
+ "card-spent": "Spent Time",
+ "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": "Bido",
+ "card-start-on": "Starts on",
+ "cardAttachmentsPopup-title": "Attach From",
+ "cardDeletePopup-title": "Delete Card?",
+ "cardDetailsActionsPopup-title": "Card Actions",
+ "cardLabelsPopup-title": "Aha",
+ "cardMembersPopup-title": "Ndị otu",
+ "cardMorePopup-title": "More",
+ "cards": "Cards",
+ "cards-count": "Cards",
+ "change": "Gbanwe",
+ "change-avatar": "Change Avatar",
+ "change-password": "Change Password",
+ "change-permissions": "Change permissions",
+ "change-settings": "Change Settings",
+ "changeAvatarPopup-title": "Change Avatar",
+ "changeLanguagePopup-title": "Họrọ asụsụ ọzọ",
+ "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 “Recycle Bin” 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",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+ "copy-card-link-to-clipboard": "Copy card link to clipboard",
+ "copyCardPopup-title": "Copy Card",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
+ "create": "Create",
+ "createBoardPopup-title": "Create Board",
+ "chooseBoardSourcePopup-title": "Import 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",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
+ "editCardStartDatePopup-title": "Change start date",
+ "editCardDueDatePopup-title": "Change due date",
+ "editCardSpentTimePopup-title": "Change spent time",
+ "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-fail-text": "Error trying to send email",
+ "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.",
+ "enable-wip-limit": "Enable WIP Limit",
+ "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",
+ "error-email-taken": "Email has already been 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 board",
+ "import-board-c": "Import board",
+ "import-board-title-trello": "Import board from Trello",
+ "import-board-title-wekan": "Import board from Wekan",
+ "import-sandstorm-warning": "Imported board will delete all existing data on board and replace it with imported board.",
+ "from-trello": "From Trello",
+ "from-wekan": "From Wekan",
+ "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.",
+ "import-board-instruction-wekan": "In your Wekan board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.",
+ "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": "Version",
+ "initials": "Initials",
+ "invalid-date": "Invalid date",
+ "invalid-time": "Invalid time",
+ "invalid-user": "Invalid user",
+ "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": "Aha",
+ "language": "Language",
+ "last-admin-desc": "You can’t change roles because there must be at least one admin.",
+ "leave-board": "Leave Board",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "Leave Board ?",
+ "link-card": "Link to this card",
+ "list-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
+ "list-move-cards": "Move all cards in this list",
+ "list-select-cards": "Select all cards in this list",
+ "listActionPopup-title": "List Actions",
+ "swimlaneActionPopup-title": "Swimlane 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 move a list to Recycle Bin to remove it from the board and preserve the activity.",
+ "lists": "Lists",
+ "swimlanes": "Swimlanes",
+ "log-out": "Log Out",
+ "log-in": "Log In",
+ "loginPopup-title": "Log In",
+ "memberMenuPopup-title": "Member Settings",
+ "members": "Ndị otu",
+ "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 cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
+ "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": "Banye aha ọzọ",
+ "rename-board": "Rename Board",
+ "restore": "Restore",
+ "save": "Save",
+ "search": "Search",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text to search for?",
+ "select-color": "Select Color",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
+ "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",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
+ "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": "Hụ ya",
+ "warn-list-archived": "warning: this card is in an list at Recycle Bin",
+ "watch": "Hụ",
+ "watching": "Watching",
+ "watching-info": "You will be notified of any change in this board",
+ "welcome-board": "Welcome Board",
+ "welcome-swimlane": "Milestone 1",
+ "welcome-list1": "Basics",
+ "welcome-list2": "Advanced",
+ "what-to-do": "What do you want to do?",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
+ "admin-panel": "Admin Panel",
+ "settings": "Settings",
+ "people": "Ndị mmadụ",
+ "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",
+ "send-smtp-test": "Send a test email to yourself",
+ "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.",
+ "email-smtp-test-subject": "SMTP Test Email From Wekan",
+ "email-smtp-test-text": "You have successfully sent an email",
+ "error-invitation-code-not-exist": "Invitation code doesn't exist",
+ "error-notAuthorized": "You are not authorized to view this page.",
+ "outgoing-webhooks": "Outgoing Webhooks",
+ "outgoingWebhooksPopup-title": "Outgoing Webhooks",
+ "new-outgoing-webhook": "New Outgoing Webhook",
+ "no-name": "(Unknown)",
+ "Wekan_version": "Wekan version",
+ "Node_version": "Node version",
+ "OS_Arch": "OS Arch",
+ "OS_Cpus": "OS CPU Count",
+ "OS_Freemem": "OS Free Memory",
+ "OS_Loadavg": "OS Load Average",
+ "OS_Platform": "OS Platform",
+ "OS_Release": "OS Release",
+ "OS_Totalmem": "OS Total Memory",
+ "OS_Type": "OS Type",
+ "OS_Uptime": "OS Uptime",
+ "hours": "elekere",
+ "minutes": "nkeji",
+ "seconds": "seconds",
+ "yes": "Ee",
+ "no": "Mba",
+ "accounts": "Accounts",
+ "accounts-allowEmailChange": "Allow Email Change",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Ekere na",
+ "verified": "Verified",
+ "active": "Active",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
+} \ No newline at end of file
diff --git a/i18n/it.i18n.json b/i18n/it.i18n.json
index 72963a0f..36879924 100644
--- a/i18n/it.i18n.json
+++ b/i18n/it.i18n.json
@@ -2,16 +2,17 @@
"accept": "Accetta",
"act-activity-notify": "[Wekan] Notifiche attività",
"act-addAttachment": "ha allegato __attachment__ a __card__",
- "act-addChecklist": "added checklist __checklist__ to __card__",
- "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
+ "act-addChecklist": "aggiunta checklist __checklist__ a __card__",
+ "act-addChecklistItem": "aggiunto __checklistItem__ alla checklist __checklist__ su __card__",
"act-addComment": "ha commentato su __card__: __comment__",
"act-createBoard": "ha creato __board__",
"act-createCard": "ha aggiunto __card__ a __list__",
"act-createList": "ha aggiunto __list__ a __board__",
"act-addBoardMember": "ha aggiunto __member__ a __board__",
- "act-archivedBoard": "ha archiviato __board__",
- "act-archivedCard": "ha archiviato __card__",
- "act-archivedList": "ha archiviato __list__",
+ "act-archivedBoard": "__board__ spostata nel cestino",
+ "act-archivedCard": "__card__ spostata nel cestino",
+ "act-archivedList": "__list__ spostata nel cestino",
+ "act-archivedSwimlane": "__swimlane__ spostata nel cestino",
"act-importBoard": "ha importato __board__",
"act-importCard": "ha importato __card__",
"act-importList": "ha importato __list__",
@@ -26,7 +27,7 @@
"activities": "Attività",
"activity": "Attività",
"activity-added": "ha aggiunto %s a %s",
- "activity-archived": "archiviato %s",
+ "activity-archived": "%s spostato nel cestino",
"activity-attached": "allegato %s a %s",
"activity-created": "creato %s",
"activity-excluded": "escluso %s da %s",
@@ -44,6 +45,7 @@
"add-attachment": "Aggiungi Allegato",
"add-board": "Aggiungi Bacheca",
"add-card": "Aggiungi Scheda",
+ "add-swimlane": "Aggiungi Corsia",
"add-checklist": "Aggiungi Checklist",
"add-checklist-item": "Aggiungi un elemento alla checklist",
"add-cover": "Aggiungi copertina",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "Membri",
"admin": "Amministratore",
"admin-desc": "Può vedere e modificare schede, rimuovere membri e modificare le impostazioni della bacheca.",
+ "admin-announcement": "Annunci",
+ "admin-announcement-active": "Attiva annunci di sistema",
+ "admin-announcement-title": "Annunci dall'Amministratore",
"all-boards": "Tutte le bacheche",
"and-n-other-card": "E __count__ altra scheda",
"and-n-other-card_plural": "E __count__ altre schede",
"apply": "Applica",
"app-is-offline": "Wekan è in caricamento, attendi per favore. Ricaricare la pagina causerà una perdita di dati. Se Wekan non si carica, controlla per favore che non ci siano problemi al server.",
- "archive": "Archivia",
- "archive-all": "Archivia tutto",
- "archive-board": "Archivia bacheca",
- "archive-card": "Archivia scheda",
- "archive-list": "Archivia Lista",
- "archive-selection": "Archivia selezione",
- "archiveBoardPopup-title": "Archivia Bacheca?",
- "archived-items": "Elementi archiviati",
- "archived-boards": "Bacheche Archiviate",
+ "archive": "Sposta nel cestino",
+ "archive-all": "Sposta tutto nel cestino",
+ "archive-board": "Sposta la bacheca nel cestino",
+ "archive-card": "Sposta la scheda nel cestino",
+ "archive-list": "Sposta la lista nel cestino",
+ "archive-swimlane": "Sposta la corsia nel cestino",
+ "archive-selection": "Sposta la selezione nel cestino",
+ "archiveBoardPopup-title": "Sposta la bacheca nel cestino",
+ "archived-items": "Cestino",
+ "archived-boards": "Bacheche cestinate",
"restore-board": "Ripristina Bacheca",
- "no-archived-boards": "Nessuna Bacheca Archiviata.",
- "archives": "Archivi",
+ "no-archived-boards": "Nessuna bacheca nel cestino",
+ "archives": "Cestino",
"assign-member": "Aggiungi membro",
"attached": "allegato",
"attachment": "Allegato",
@@ -91,15 +97,19 @@
"boardChangeWatchPopup-title": "Cambia faccia",
"boardMenuPopup-title": "Menu bacheca",
"boards": "Bacheche",
+ "board-view": "Visualizza bacheca",
+ "board-view-swimlanes": "Corsie",
+ "board-view-lists": "Liste",
"bucket-example": "Per esempio come \"una lista di cose da fare\"",
"cancel": "Cancella",
- "card-archived": "Questa scheda è archiviata.",
+ "card-archived": "Questa scheda è stata spostata nel cestino.",
"card-comments-title": "Questa scheda ha %s commenti.",
"card-delete-notice": "L'eliminazione è permanente. Tutte le azioni associate a questa scheda andranno perse.",
"card-delete-pop": "Tutte le azioni saranno rimosse dal flusso attività e non sarai in grado di riaprire la scheda. Non potrai tornare indietro.",
- "card-delete-suggest-archive": "Puoi archiviare una scheda per rimuoverla dalla bacheca e preservare la sua attività.",
+ "card-delete-suggest-archive": "Puoi cestinare una scheda per rimuoverla dalla bacheca e preservare la sua attività.",
"card-due": "Scadenza",
"card-due-on": "Scade",
+ "card-spent": "Tempo trascorso",
"card-edit-attachments": "Modifica allegati",
"card-edit-labels": "Modifica etichette",
"card-edit-members": "Modifica membri",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "Membri",
"cardMorePopup-title": "Altro",
"cards": "Schede",
+ "cards-count": "Schede",
"change": "Cambia",
"change-avatar": "Cambia avatar",
"change-password": "Cambia password",
@@ -130,7 +141,7 @@
"clipboard": "Clipboard o drag & drop",
"close": "Chiudi",
"close-board": "Chiudi bacheca",
- "close-board-pop": "Sarai in grado di ripristinare la bacheca cliccando il tasto \"Archivi\" dall'intestazione della pagina principale.",
+ "close-board-pop": "Sarai in grado di ripristinare la bacheca cliccando il tasto \"Cestino\" dall'intestazione della pagina principale.",
"color-black": "nero",
"color-blue": "blu",
"color-green": "verde",
@@ -146,8 +157,12 @@
"comment-only": "Solo commenti",
"comment-only-desc": "Puoi commentare solo le schede.",
"computer": "Computer",
+ "confirm-checklist-delete-dialog": "Sei sicuro di voler cancellare questa checklist?",
"copy-card-link-to-clipboard": "Copia link della scheda sulla clipboard",
- "copyCardPopup-title": "Copy Card",
+ "copyCardPopup-title": "Copia Scheda",
+ "copyChecklistToManyCardsPopup-title": "Copia template checklist su più schede",
+ "copyChecklistToManyCardsPopup-instructions": "Titolo e la descrizione della scheda di destinazione in questo formato JSON",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Titolo prima scheda\", \"description\":\"Descrizione prima scheda\"}, {\"title\":\"Titolo seconda scheda\",\"description\":\"Descrizione seconda scheda\"},{\"title\":\"Titolo ultima scheda\",\"description\":\"Descrizione ultima scheda\"} ]",
"create": "Crea",
"createBoardPopup-title": "Crea bacheca",
"chooseBoardSourcePopup-title": "Importa bacheca",
@@ -167,8 +182,11 @@
"edit": "Modifica",
"edit-avatar": "Cambia avatar",
"edit-profile": "Modifica profilo",
+ "edit-wip-limit": "Modifica limite di work in progress",
+ "soft-wip-limit": "Limite Work in progress soft",
"editCardStartDatePopup-title": "Cambia data di inizio",
"editCardDueDatePopup-title": "Cambia data di scadenza",
+ "editCardSpentTimePopup-title": "Cambia tempo trascorso",
"editLabelPopup-title": "Cambia etichetta",
"editNotificationPopup-title": "Modifica notifiche",
"editProfilePopup-title": "Modifica profilo",
@@ -176,6 +194,7 @@
"email-enrollAccount-subject": "Creato un account per te su __siteName__",
"email-enrollAccount-text": "Ciao __user__,\n\nPer iniziare ad usare il servizio, clicca sul link seguente:\n\n__url__\n\nGrazie.",
"email-fail": "Invio email fallito",
+ "email-fail-text": "Errore nel tentativo di invio email",
"email-invalid": "Email non valida",
"email-invite": "Invita via email",
"email-invite-subject": "__inviter__ ti ha inviato un invito",
@@ -185,6 +204,7 @@
"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.",
+ "enable-wip-limit": "Abilita limite di work in progress",
"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",
@@ -229,6 +249,8 @@
"info": "Versione",
"initials": "Iniziali",
"invalid-date": "Data non valida",
+ "invalid-time": "Tempo non valido",
+ "invalid-user": "User non valido",
"joined": "si è unito a",
"just-invited": "Sei stato appena invitato a questa bacheca",
"keyboard-shortcuts": "Scorciatoie da tastiera",
@@ -239,18 +261,22 @@
"language": "Lingua",
"last-admin-desc": "Non puoi cambiare i ruoli perché deve esserci almeno un admin.",
"leave-board": "Abbandona bacheca",
+ "leave-board-pop": "Sei sicuro di voler abbandonare __boardTitle__? Sarai rimosso da tutte le schede in questa bacheca.",
+ "leaveBoardPopup-title": "Abbandona Bacheca?",
"link-card": "Link a questa scheda",
- "list-archive-cards": "Archivia tutte le schede in questa lista",
- "list-archive-cards-pop": "Questo rimuoverà dalla bacheca tutte le schede in questa lista. Per vedere le schede archiviate e portarle indietro alla bacheca, clicca “Menu” > “Elementi archiviati”",
+ "list-archive-cards": "Cestina tutte le schede in questa lista",
+ "list-archive-cards-pop": "Questo rimuoverà dalla bacheca tutte le schede in questa lista. Per vedere le schede cestinate e portarle indietro alla bacheca, clicca “Menu” > “Elementi cestinati”",
"list-move-cards": "Sposta tutte le schede in questa lista",
"list-select-cards": "Selezione tutte le schede in questa lista",
"listActionPopup-title": "Azioni disponibili",
+ "swimlaneActionPopup-title": "Azioni corsia",
"listImportCardPopup-title": "Importa una scheda di Trello",
"listMorePopup-title": "Altro",
"link-list": "Link a questa lista",
"list-delete-pop": "Tutte le azioni saranno rimosse dal flusso attività e non sarai in grado di recuperare la lista. Non potrai tornare indietro.",
- "list-delete-suggest-archive": "Puoi archiviare una lista per rimuoverla dalla bacheca e preservarne l'attività.",
+ "list-delete-suggest-archive": "Puoi cestinare una scheda per rimuoverla dalla bacheca e preservare la sua attività.",
"lists": "Liste",
+ "swimlanes": "Corsie",
"log-out": "Log Out",
"log-in": "Log In",
"loginPopup-title": "Log In",
@@ -268,8 +294,9 @@
"muted-info": "Non sarai mai notificato delle modifiche in questa bacheca",
"my-boards": "Le mie bacheche",
"name": "Nome",
- "no-archived-cards": "Nessuna scheda archiviata.",
- "no-archived-lists": "Nessuna lista archiviata.",
+ "no-archived-cards": "Nessuna scheda nel cestino",
+ "no-archived-lists": "Nessuna lista nel cestino",
+ "no-archived-swimlanes": "Nessuna corsia nel cestino",
"no-results": "Nessun risultato",
"normal": "Normale",
"normal-desc": "Può visionare e modificare le schede. Non può cambiare le impostazioni.",
@@ -305,7 +332,11 @@
"restore": "Ripristina",
"save": "Salva",
"search": "Cerca",
+ "search-cards": "Ricerca per titolo e descrizione scheda su questa bacheca",
+ "search-example": "Testo da ricercare?",
"select-color": "Seleziona Colore",
+ "set-wip-limit-value": "Seleziona un limite per il massimo numero di attività in questa lista",
+ "setWipLimitPopup-title": "Imposta limite di work in progress",
"shortcut-assign-self": "Aggiungi te stesso alla scheda corrente",
"shortcut-autocomplete-emoji": "Autocompletamento emoji",
"shortcut-autocomplete-members": "Autocompletamento membri",
@@ -326,6 +357,11 @@
"team": "Team",
"this-board": "questa bacheca",
"this-card": "questa scheda",
+ "spent-time-hours": "Tempo trascorso (ore)",
+ "overtime-hours": "Overtime (ore)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Ci sono scheda scadute",
+ "has-spenttime-cards": "Ci sono scheda con tempo impiegato",
"time": "Ora",
"title": "Titolo",
"tracking": "Monitoraggio",
@@ -338,14 +374,18 @@
"uploaded-avatar": "Avatar caricato",
"username": "Username",
"view-it": "Vedi",
- "warn-list-archived": "attenzione: questa scheda è in una lista archiviata",
+ "warn-list-archived": "attenzione: questa scheda è in una lista cestinata",
"watch": "Segui",
"watching": "Stai seguendo",
"watching-info": "Sarai notificato per tutte le modifiche in questa bacheca",
"welcome-board": "Bacheca di benvenuto",
+ "welcome-swimlane": "Pietra miliare 1",
"welcome-list1": "Basi",
"welcome-list2": "Avanzate",
"what-to-do": "Cosa vuoi fare?",
+ "wipLimitErrorPopup-title": "Limite work in progress non valido. ",
+ "wipLimitErrorPopup-dialog-pt1": "Il numero di compiti in questa lista è maggiore del limite di work in progress che hai definito in precedenza. ",
+ "wipLimitErrorPopup-dialog-pt2": "Per favore, sposta alcuni dei compiti fuori da questa lista, oppure imposta un limite di work in progress più alto. ",
"admin-panel": "Pannello dell'Amministratore",
"settings": "Impostazioni",
"people": "Persone",
@@ -364,31 +404,44 @@
"smtp-password": "Password",
"smtp-tls": "Supporto TLS",
"send-from": "Da",
+ "send-smtp-test": "Invia un'email di test a te stesso",
"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.",
+ "email-smtp-test-subject": "Test invio email SMTP per Wekan",
+ "email-smtp-test-text": "Hai inviato un'email con successo",
"error-invitation-code-not-exist": "Il codice d'invito non esiste",
"error-notAuthorized": "Non sei autorizzato ad accedere a questa pagina.",
"outgoing-webhooks": "Server esterni",
"outgoingWebhooksPopup-title": "Server esterni",
- "new-outgoing-webhook": "New Outgoing Webhook",
- "no-name": "(Unknown)",
+ "new-outgoing-webhook": "Nuovo webhook in uscita",
+ "no-name": "(Sconosciuto)",
"Wekan_version": "Versione di Wekan",
- "Node_version": "Node version",
- "OS_Arch": "OS Arch",
- "OS_Cpus": "OS CPU Count",
- "OS_Freemem": "OS Free Memory",
- "OS_Loadavg": "OS Load Average",
- "OS_Platform": "OS Platform",
- "OS_Release": "OS Release",
- "OS_Totalmem": "OS Total Memory",
- "OS_Type": "OS Type",
- "OS_Uptime": "OS Uptime",
+ "Node_version": "Versione di Node",
+ "OS_Arch": "Architettura del sistema operativo",
+ "OS_Cpus": "Conteggio della CPU del sistema operativo",
+ "OS_Freemem": "Memoria libera del sistema operativo ",
+ "OS_Loadavg": "Carico medio del sistema operativo ",
+ "OS_Platform": "Piattaforma del sistema operativo",
+ "OS_Release": "Versione di rilascio del sistema operativo",
+ "OS_Totalmem": "Memoria totale del sistema operativo ",
+ "OS_Type": "Tipo di sistema operativo ",
+ "OS_Uptime": "Tempo di attività del sistema operativo. ",
"hours": "ore",
"minutes": "minuti",
"seconds": "secondi",
"yes": "Sì",
"no": "No",
"accounts": "Profili",
- "accounts-allowEmailChange": "Permetti modifica dell'email"
+ "accounts-allowEmailChange": "Permetti modifica dell'email",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "creato alle",
+ "verified": "Verificato",
+ "active": "Attivo",
+ "card-received": "Ricevuta",
+ "card-received-on": "Ricevuta il",
+ "card-end": "Fine",
+ "card-end-on": "Termina il",
+ "editCardReceivedDatePopup-title": "Cambia data ricezione",
+ "editCardEndDatePopup-title": "Cambia data finale"
} \ No newline at end of file
diff --git a/i18n/ja.i18n.json b/i18n/ja.i18n.json
index f5c38263..c55be771 100644
--- a/i18n/ja.i18n.json
+++ b/i18n/ja.i18n.json
@@ -9,9 +9,10 @@
"act-createCard": "__list__ に __card__ を追加しました",
"act-createList": "__board__ に __list__ を追加しました",
"act-addBoardMember": "__board__ に __member__ を追加しました",
- "act-archivedBoard": "__board__ をアーカイブしました",
- "act-archivedCard": "__card__ をアーカイブしました",
- "act-archivedList": "__list__ をアーカイブしました",
+ "act-archivedBoard": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
"act-importBoard": "__board__ をインポートしました",
"act-importCard": "__card__ をインポートしました",
"act-importList": "__list__ をインポートしました",
@@ -26,7 +27,7 @@
"activities": "アクティビティ",
"activity": "アクティビティ",
"activity-added": "%s を %s に追加しました",
- "activity-archived": "%s をアーカイブしました",
+ "activity-archived": "%s moved to Recycle Bin",
"activity-attached": "%s を %s に添付しました",
"activity-created": "%s を作成しました",
"activity-excluded": "%s を %s から除外しました",
@@ -44,6 +45,7 @@
"add-attachment": "添付ファイルを追加",
"add-board": "ボードを追加",
"add-card": "カードを追加",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "チェックリストを追加",
"add-checklist-item": "チェックリストに項目を追加",
"add-cover": "カバーの追加",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "メンバー",
"admin": "管理",
"admin-desc": "カードの閲覧と編集、メンバーの削除、ボードの設定変更が可能",
+ "admin-announcement": "Announcement",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Announcement from Administrator",
"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-card": "カードをアーカイブ",
- "archive-list": "このリストをアーカイブ",
- "archive-selection": "選択したものをアーカイブ",
- "archiveBoardPopup-title": "ボードをアーカイブしますか?",
- "archived-items": "アーカイブされたアイテム",
- "archived-boards": "アーカイブ済のボード",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
"restore-board": "ボードをリストア",
- "no-archived-boards": "アーカイブされたボードはありません",
- "archives": "アーカイブ",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
"assign-member": "メンバーの割当",
"attached": "添付されました",
"attachment": "添付ファイル",
@@ -91,15 +97,19 @@
"boardChangeWatchPopup-title": "ウォッチの変更",
"boardMenuPopup-title": "ボードメニュー",
"boards": "ボード",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "リスト",
"bucket-example": "Like “Bucket List” for example",
"cancel": "キャンセル",
- "card-archived": "カードはアーカイブされました。",
+ "card-archived": "This card is moved to Recycle Bin.",
"card-comments-title": "%s 件のコメントがあります。",
"card-delete-notice": "削除は取り消しできません。このカードに関係するすべてのアクションがなくなります。",
"card-delete-pop": "すべての内容がアクティビティから削除されます。この削除は元に戻すことができません。",
- "card-delete-suggest-archive": "アーカイブを使えば、内容を保存したままボード上からリストを表示しないようにできます。",
+ "card-delete-suggest-archive": "You can move a card Recycle Bin to remove it from the board and preserve the activity.",
"card-due": "期限",
"card-due-on": "期限日",
+ "card-spent": "Spent Time",
"card-edit-attachments": "添付ファイルの編集",
"card-edit-labels": "ラベルの編集",
"card-edit-members": "メンバーの編集",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "メンバー",
"cardMorePopup-title": "さらに見る",
"cards": "カード",
+ "cards-count": "カード",
"change": "変更",
"change-avatar": "アバターの変更",
"change-password": "パスワードの変更",
@@ -130,7 +141,7 @@
"clipboard": "クリップボードもしくはドラッグ&ドロップ",
"close": "閉じる",
"close-board": "ボードを閉じる",
- "close-board-pop": "ホームメニューの'アーカイブ'から、ボードを復元することができます。",
+ "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
"color-black": "黒",
"color-blue": "青",
"color-green": "緑",
@@ -146,8 +157,12 @@
"comment-only": "コメントのみ",
"comment-only-desc": "カードにのみコメント可能",
"computer": "コンピューター",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
"copy-card-link-to-clipboard": "カードへのリンクをクリップボードにコピー",
- "copyCardPopup-title": "Copy Card",
+ "copyCardPopup-title": "カードをコピー",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
"create": "作成",
"createBoardPopup-title": "ボードの作成",
"chooseBoardSourcePopup-title": "ボードをインポート",
@@ -167,8 +182,11 @@
"edit": "編集",
"edit-avatar": "アバターの変更",
"edit-profile": "プロフィールの編集",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
"editCardStartDatePopup-title": "開始日の変更",
"editCardDueDatePopup-title": "期限の変更",
+ "editCardSpentTimePopup-title": "Change spent time",
"editLabelPopup-title": "ラベルの変更",
"editNotificationPopup-title": "通知の変更",
"editProfilePopup-title": "プロフィールの編集",
@@ -176,6 +194,7 @@
"email-enrollAccount-subject": "__siteName__であなたのアカウントが作成されました",
"email-enrollAccount-text": "こんにちは、__user__さん。\n\nサービスを開始するには、以下をクリックしてください。\n\n__url__\n\nよろしくお願いします。",
"email-fail": "メールの送信に失敗しました",
+ "email-fail-text": "Error trying to send email",
"email-invalid": "無効なメールアドレス",
"email-invite": "メールで招待",
"email-invite-subject": "__inviter__があなたを招待しています",
@@ -185,6 +204,7 @@
"email-sent": "メールを送信しました",
"email-verifyEmail-subject": "あなたの __siteName__ のメールアドレスを確認する",
"email-verifyEmail-text": "こんにちは、__user__さん。\n\nメールアドレスを認証するために、以下のリンクをクリックしてください。\n\n__url__\n\nよろしくお願いします。",
+ "enable-wip-limit": "Enable WIP Limit",
"error-board-doesNotExist": "ボードがありません",
"error-board-notAdmin": "操作にはボードの管理者権限が必要です",
"error-board-notAMember": "操作にはボードメンバーである必要があります",
@@ -229,6 +249,8 @@
"info": "バージョン",
"initials": "初期状態",
"invalid-date": "無効な日付",
+ "invalid-time": "Invalid time",
+ "invalid-user": "Invalid user",
"joined": "参加しました",
"just-invited": "このボードのメンバーに招待されています",
"keyboard-shortcuts": "キーボード・ショートカット",
@@ -239,18 +261,22 @@
"language": "言語",
"last-admin-desc": "最低でも1人以上の管理者が必要なためロールを変更できません。",
"leave-board": "ボードから退出する",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "ボードから退出しますか?",
"link-card": "このカードへのリンク",
- "list-archive-cards": "リストの全カードをアーカイブする",
- "list-archive-cards-pop": "ボードのこのリスト内のすべてのカードを取り除きます。アーカイブされたカードの確認やそれをボードに戻すには、メニューをクリックし、\"アーカイブされたアイテム\"をクリックしてください。",
+ "list-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
"list-move-cards": "リストの全カードを移動する",
"list-select-cards": "リストの全カードを選択",
"listActionPopup-title": "操作一覧",
+ "swimlaneActionPopup-title": "Swimlane Actions",
"listImportCardPopup-title": "Trelloのカードをインポート",
"listMorePopup-title": "さらに見る",
"link-list": "このリストへのリンク",
"list-delete-pop": "すべての内容がアクティビティから削除されます。この削除は元に戻すことができません。",
- "list-delete-suggest-archive": "アーカイブを使えば、内容を保存したままボード上にリストを表示しないようにできます。",
+ "list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve the activity.",
"lists": "リスト",
+ "swimlanes": "Swimlanes",
"log-out": "ログアウト",
"log-in": "ログイン",
"loginPopup-title": "ログイン",
@@ -268,8 +294,9 @@
"muted-info": "このボードの変更は通知されません",
"my-boards": "自分のボード",
"name": "名前",
- "no-archived-cards": "アーカイブされたボードはありません",
- "no-archived-lists": "アーカイブされたリストはありません",
+ "no-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
"no-results": "該当するものはありません",
"normal": "通常",
"normal-desc": "カードの閲覧と編集が可能。設定変更不可。",
@@ -305,7 +332,11 @@
"restore": "復元",
"save": "保存",
"search": "検索",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text to search for?",
"select-color": "色を選択",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
"shortcut-assign-self": "自分をこのカードに割り当てる",
"shortcut-autocomplete-emoji": "絵文字の補完",
"shortcut-autocomplete-members": "メンバーの補完",
@@ -326,6 +357,11 @@
"team": "チーム",
"this-board": "このボード",
"this-card": "このカード",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "時間",
"title": "タイトル",
"tracking": "トラッキング",
@@ -338,14 +374,18 @@
"uploaded-avatar": "アップロードされたアバター",
"username": "ユーザー名",
"view-it": "見る",
- "warn-list-archived": "警告:このカードはアーカイブされたリストにあります",
+ "warn-list-archived": "warning: this card is in an list at Recycle Bin",
"watch": "ウォッチ",
"watching": "ウォッチしています",
"watching-info": "このボードの変更が通知されます",
"welcome-board": "ウェルカムボード",
+ "welcome-swimlane": "Milestone 1",
"welcome-list1": "基本",
"welcome-list2": "高度",
"what-to-do": "何をしたいですか?",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
"admin-panel": "管理パネル",
"settings": "設定",
"people": "メンバー",
@@ -364,9 +404,12 @@
"smtp-password": "パスワード",
"smtp-tls": "TLSサポート",
"send-from": "送信元",
+ "send-smtp-test": "Send a test email to yourself",
"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よろしくお願いします。",
+ "email-smtp-test-subject": "SMTP Test Email From Wekan",
+ "email-smtp-test-text": "You have successfully sent an email",
"error-invitation-code-not-exist": "招待コードが存在しません",
"error-notAuthorized": "このページを参照する権限がありません。",
"outgoing-webhooks": "Outgoing Webhooks",
@@ -390,5 +433,15 @@
"yes": "はい",
"no": "いいえ",
"accounts": "アカウント",
- "accounts-allowEmailChange": "メールアドレスの変更を許可"
+ "accounts-allowEmailChange": "メールアドレスの変更を許可",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Created at",
+ "verified": "Verified",
+ "active": "Active",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
} \ No newline at end of file
diff --git a/i18n/ko.i18n.json b/i18n/ko.i18n.json
index 1842be0a..35d2b447 100644
--- a/i18n/ko.i18n.json
+++ b/i18n/ko.i18n.json
@@ -9,9 +9,10 @@
"act-createCard": "__list__에 __card__ 추가",
"act-createList": "__board__에 __list__ 추가",
"act-addBoardMember": "__board__에 __member__ 추가",
- "act-archivedBoard": "보관 된 __board__",
- "act-archivedCard": "보관 된 __card__",
- "act-archivedList": "보관 된 __list__",
+ "act-archivedBoard": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
"act-importBoard": "가져온 __board__",
"act-importCard": "가져온 __card__",
"act-importList": "가져온 __list__",
@@ -26,7 +27,7 @@
"activities": "활동 내역",
"activity": "활동 상태",
"activity-added": "%s를 %s에 추가함",
- "activity-archived": "%s 저장됨",
+ "activity-archived": "%s moved to Recycle Bin",
"activity-attached": "%s를 %s에 첨부함",
"activity-created": "%s 생성됨",
"activity-excluded": "%s를 %s에서 제외함",
@@ -44,6 +45,7 @@
"add-attachment": "첨부파일 추가",
"add-board": "보드 추가",
"add-card": "카드 추가",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "체크리스트 추가",
"add-checklist-item": "체크리스트에 항목 추가",
"add-cover": "커버 추가",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "멤버",
"admin": "관리자",
"admin-desc": "카드를 보거나 수정하고, 멤버를 삭제하고, 보드에 대한 설정을 수정할 수 있습니다.",
+ "admin-announcement": "Announcement",
+ "admin-announcement-active": "시스템에 공지사항을 표시합니다",
+ "admin-announcement-title": "관리자 공지사항 메시지",
"all-boards": "전체 보드",
"and-n-other-card": "__count__ 개의 다른 카드",
"and-n-other-card_plural": "__count__ 개의 다른 카드들",
"apply": "적용",
- "app-is-offline": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
- "archive": "보관",
- "archive-all": "모두 보관",
- "archive-board": "보드 저장소 보관",
- "archive-card": "카드 저장소 보관",
- "archive-list": "리스트 저장소 보관",
- "archive-selection": "저장소 선택",
- "archiveBoardPopup-title": "보드를 저장소에 보관하시겠습니까?",
- "archived-items": "보관된 아이템",
- "archived-boards": "저장소 보관된 보드들",
+ "app-is-offline": "Wekan 로딩 중 입니다. 잠시 기다려주세요. 페이지를 새로고침 하시면 데이터가 손실될 수 있습니다. Wekan 을 불러오는데 실패한다면 서버가 중지되지 않았는지 확인 바랍니다.",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
"restore-board": "보드 복구",
- "no-archived-boards": "보관된 보드가 없습니다.",
- "archives": "저장소",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
"assign-member": "멤버 지정",
"attached": "첨부됨",
"attachment": "첨부 파일",
@@ -91,15 +97,19 @@
"boardChangeWatchPopup-title": "감시상태 변경",
"boardMenuPopup-title": "보드 메뉴",
"boards": "보드",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "목록들",
"bucket-example": "예: “프로젝트 이름“ 입력",
"cancel": "취소",
- "card-archived": "이 카드를 보관합니다.",
+ "card-archived": "This card is moved to Recycle Bin.",
"card-comments-title": "이 카드에 %s 코멘트가 있습니다.",
"card-delete-notice": "영구 삭제입니다. 이 카드와 관련된 모든 작업들을 잃게됩니다.",
"card-delete-pop": "모든 작업이 활동 내역에서 제거되며 카드를 다시 열 수 없습니다. 복구가 안되니 주의하시기 바랍니다.",
- "card-delete-suggest-archive": "카드를 보관하여 보드에서 제거하고 내용을 저장소에 보관 할 수 있습니다.",
+ "card-delete-suggest-archive": "You can move a card Recycle Bin to remove it from the board and preserve the activity.",
"card-due": "종료일",
"card-due-on": "종료일",
+ "card-spent": "Spent Time",
"card-edit-attachments": "첨부 파일 수정",
"card-edit-labels": "라벨 수정",
"card-edit-members": "멤버 수정",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "멤버",
"cardMorePopup-title": "더보기",
"cards": "카드",
+ "cards-count": "카드",
"change": "변경",
"change-avatar": "아바타 변경",
"change-password": "암호 변경",
@@ -130,7 +141,7 @@
"clipboard": "클립보드 또는 드래그 앤 드롭",
"close": "닫기",
"close-board": "보드 닫기",
- "close-board-pop": "홈 화면에서 \"저장소\" 버튼을 클릭하여 보드를 복원 할 수 있습니다.",
+ "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
"color-black": "블랙",
"color-blue": "블루",
"color-green": "그린",
@@ -146,11 +157,15 @@
"comment-only": "댓글만 입력 가능",
"comment-only-desc": "카드에 댓글만 달수 있습니다.",
"computer": "내 컴퓨터",
- "copy-card-link-to-clipboard": "Copy card link to clipboard",
- "copyCardPopup-title": "Copy Card",
+ "confirm-checklist-delete-dialog": "정말 이 체크리스트를 삭제할까요?",
+ "copy-card-link-to-clipboard": "클립보드에 카드의 링크가 복사되었습니다.",
+ "copyCardPopup-title": "카드 복사",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
"create": "생성",
"createBoardPopup-title": "보드 생성",
- "chooseBoardSourcePopup-title": "Import board",
+ "chooseBoardSourcePopup-title": "보드 가져오기",
"createLabelPopup-title": "라벨 생성",
"current": "경향",
"date": "날짜",
@@ -167,8 +182,11 @@
"edit": "수정",
"edit-avatar": "아바타 변경",
"edit-profile": "프로필 변경",
+ "edit-wip-limit": "WIP 제한 변경",
+ "soft-wip-limit": "원만한 WIP 제한",
"editCardStartDatePopup-title": "시작일 변경",
"editCardDueDatePopup-title": "종료일 변경",
+ "editCardSpentTimePopup-title": "Change spent time",
"editLabelPopup-title": "라벨 변경",
"editNotificationPopup-title": "알림 수정",
"editProfilePopup-title": "프로필 변경",
@@ -176,15 +194,17 @@
"email-enrollAccount-subject": "__siteName__에 계정 생성이 완료되었습니다.",
"email-enrollAccount-text": "안녕하세요. __user__님,\n\n시작하려면 아래링크를 클릭해 주세요.\n\n__url__\n\n감사합니다.",
"email-fail": "이메일 전송 실패",
+ "email-fail-text": "Error trying to send email",
"email-invalid": "잘못된 이메일 주소",
"email-invite": "이메일로 초대",
"email-invite-subject": "__inviter__님이 당신을 초대하였습니다.",
- "email-invite-text": "__user__님,\n\n__inviter__님은 협업을 위해 \"__board__\"보드에 가입하도록 초대합니다.\n\n아래 링크를 따라주십시오.\n\n__url__\n\n감사합니다.",
+ "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감사합니다.",
+ "enable-wip-limit": "WIP 제한 활성화",
"error-board-doesNotExist": "보드가 없습니다.",
"error-board-notAdmin": "이 작업은 보드의 관리자만 실행할 수 있습니다.",
"error-board-notAMember": "이 작업은 보드의 멤버만 실행할 수 있습니다.",
@@ -211,10 +231,10 @@
"headerBarCreateBoardPopup-title": "보드 생성",
"home": "홈",
"import": "가져오기",
- "import-board": "import board",
- "import-board-c": "Import board",
+ "import-board": "보드 가져오기",
+ "import-board-c": "보드 가져오기",
"import-board-title-trello": "Trello에서 보드 가져오기",
- "import-board-title-wekan": "Import board from Wekan",
+ "import-board-title-wekan": "Wekan에서 보드 가져오기",
"import-sandstorm-warning": "Imported board will delete all existing data on board and replace it with imported board.",
"from-trello": "From Trello",
"from-wekan": "From Wekan",
@@ -228,7 +248,9 @@
"importMapMembersAddPopup-title": "Wekan 멤버 선택",
"info": "Version",
"initials": "이니셜",
- "invalid-date": "잘못된 날짜",
+ "invalid-date": "적절하지 않은 날짜",
+ "invalid-time": "적절하지 않은 시각",
+ "invalid-user": "적절하지 않은 사용자",
"joined": "참가함",
"just-invited": "보드에 방금 초대되었습니다.",
"keyboard-shortcuts": "키보드 단축키",
@@ -239,18 +261,22 @@
"language": "언어",
"last-admin-desc": "적어도 하나의 관리자가 필요하기에 이 역할을 변경할 수 없습니다.",
"leave-board": "보드 멤버에서 나가기",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "Leave Board ?",
"link-card": "카드에대한 링크",
- "list-archive-cards": "목록에 있는 모든 카드를 저장소에 보관",
- "list-archive-cards-pop": "보드의 목록에서 모든 카드를 삭제합니다. 보관된 카드를 보거나 그것들을 보드로 되돌릴려면, \"메뉴\" > \"보관된 아이템\"을 클릭합니다.",
+ "list-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
"list-move-cards": "목록에 있는 모든 카드를 이동",
"list-select-cards": "목록에 있는 모든 카드를 선택",
"listActionPopup-title": "동작 목록",
+ "swimlaneActionPopup-title": "Swimlane Actions",
"listImportCardPopup-title": "Trello 카드 가져 오기",
"listMorePopup-title": "더보기",
"link-list": "이 리스트에 링크",
"list-delete-pop": "모든 작업이 활동내역에서 제거되며 리스트를 복구 할 수 없습니다. 실행 취소는 불가능 합니다.",
- "list-delete-suggest-archive": "리스트를 보관하여 보드에서 삭제하고 활동내역을 보존 할 수 있습니다.",
+ "list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve the activity.",
"lists": "목록들",
+ "swimlanes": "Swimlanes",
"log-out": "로그아웃",
"log-in": "로그인",
"loginPopup-title": "로그인",
@@ -268,8 +294,9 @@
"muted-info": "보드의 변경된 사항들의 알림을 받지 않습니다.",
"my-boards": "내 보드",
"name": "이름",
- "no-archived-cards": "보관된 카드가 없습니다.",
- "no-archived-lists": "보관된 목록이 없습니다.",
+ "no-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
"no-results": "결과 값 없음",
"normal": "표준",
"normal-desc": "카드를 보거나 수정할 수 있습니다. 설정값은 변경할 수 없습니다.",
@@ -305,7 +332,11 @@
"restore": "복구",
"save": "저장",
"search": "검색",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text to search for?",
"select-color": "색 선택",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
"shortcut-assign-self": "현재 카드에 자신을 지정하세요.",
"shortcut-autocomplete-emoji": "이모티콘 자동완성",
"shortcut-autocomplete-members": "멤버 자동완성",
@@ -326,6 +357,11 @@
"team": "팀",
"this-board": "보드",
"this-card": "카드",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "시간",
"title": "제목",
"tracking": "추적",
@@ -338,14 +374,18 @@
"uploaded-avatar": "업로드한 아바타",
"username": "아이디",
"view-it": "보기",
- "warn-list-archived": "경고: 이 카드는 저장소 목록에 있습니다.",
+ "warn-list-archived": "warning: this card is in an list at Recycle Bin",
"watch": "감시",
"watching": "감시 중",
"watching-info": "\"이 보드의 변경사항을 알림으로 받습니다.",
"welcome-board": "보드예제",
+ "welcome-swimlane": "Milestone 1",
"welcome-list1": "신규",
"welcome-list2": "진행",
"what-to-do": "무엇을 하고 싶으신가요?",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
"admin-panel": "관리자 패널",
"settings": "설정",
"people": "사람",
@@ -364,9 +404,12 @@
"smtp-password": "암호",
"smtp-tls": "TLS 지원",
"send-from": "보낸 사람",
+ "send-smtp-test": "Send a test email to yourself",
"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감사합니다.",
+ "email-invite-register-text": "\"__user__ 님, \n\n__inviter__ 님이 Wekan 보드에 협업을 위하여 당신을 초대합니다.\n\n아래 링크를 클릭해주세요 : \n__url__\n\n그리고 초대 코드는 __icode__ 입니다.\n\n감사합니다.",
+ "email-smtp-test-subject": "SMTP 테스트 이메일이 발송되었습니다.",
+ "email-smtp-test-text": "테스트 메일을 성공적으로 발송하였습니다.",
"error-invitation-code-not-exist": "초대 코드가 존재하지 않습니다.",
"error-notAuthorized": "이 페이지를 볼 수있는 권한이 없습니다.",
"outgoing-webhooks": "Outgoing Webhooks",
@@ -390,5 +433,15 @@
"yes": "Yes",
"no": "No",
"accounts": "Accounts",
- "accounts-allowEmailChange": "Allow Email Change"
+ "accounts-allowEmailChange": "Allow Email Change",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Created at",
+ "verified": "Verified",
+ "active": "Active",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
} \ No newline at end of file
diff --git a/i18n/lv.i18n.json b/i18n/lv.i18n.json
new file mode 100644
index 00000000..82bfa1cc
--- /dev/null
+++ b/i18n/lv.i18n.json
@@ -0,0 +1,447 @@
+{
+ "accept": "Piekrist",
+ "act-activity-notify": "[Wekan] Aktivitātes paziņojums",
+ "act-addAttachment": "pievienots __attachment__ to __card__",
+ "act-addChecklist": "pievienots checklist __checklist__ to __card__",
+ "act-addChecklistItem": "pievienots __checklistItem__ to checklist __checklist__ on __card__",
+ "act-addComment": "komentēja __card__: __comment__",
+ "act-createBoard": "izveidoja __board__",
+ "act-createCard": "pievienoja __card__ to __list__",
+ "act-createList": "pievienoja __list__ to __board__",
+ "act-addBoardMember": "pievienoja __member__ to __board__",
+ "act-archivedBoard": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
+ "act-importBoard": "importēja __board__",
+ "act-importCard": "importēja __card__",
+ "act-importList": "importēja __list__",
+ "act-joinMember": "pievienoja __member__ to __card__",
+ "act-moveCard": "pārvietoja __card__ from __oldList__ to __list__",
+ "act-removeBoardMember": "noņēma __member__ from __board__",
+ "act-restoredCard": "atjaunoja __card__ to __board__",
+ "act-unjoinMember": "noņēma __member__ from __card__",
+ "act-withBoardTitle": "[Wekan] __board__",
+ "act-withCardTitle": "[__board__] __card__",
+ "actions": "Darbības",
+ "activities": "Aktivitātes",
+ "activity": "Aktivitāte",
+ "activity-added": "pievienoja %s pie %s",
+ "activity-archived": "%s moved to Recycle Bin",
+ "activity-attached": "pievienoja %s pie %s",
+ "activity-created": "izveidoja%s",
+ "activity-excluded": "izslēdza%s no%s",
+ "activity-imported": "importēja %s iekšā%s no%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-checklist-item-added": "added checklist item to '%s' in %s",
+ "add": "Add",
+ "add-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
+ "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.",
+ "admin-announcement": "Announcement",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Announcement from Administrator",
+ "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": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
+ "restore-board": "Restore Board",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
+ "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",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Lists",
+ "bucket-example": "Like “Bucket List” for example",
+ "cancel": "Cancel",
+ "card-archived": "This card is moved to Recycle Bin.",
+ "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 move a card Recycle Bin to remove it from the board and preserve the activity.",
+ "card-due": "Due",
+ "card-due-on": "Due on",
+ "card-spent": "Spent Time",
+ "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",
+ "cards-count": "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 “Recycle Bin” 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",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+ "copy-card-link-to-clipboard": "Copy card link to clipboard",
+ "copyCardPopup-title": "Copy Card",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
+ "create": "Create",
+ "createBoardPopup-title": "Create Board",
+ "chooseBoardSourcePopup-title": "Import 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",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
+ "editCardStartDatePopup-title": "Change start date",
+ "editCardDueDatePopup-title": "Change due date",
+ "editCardSpentTimePopup-title": "Change spent time",
+ "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-fail-text": "Error trying to send email",
+ "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.",
+ "enable-wip-limit": "Enable WIP Limit",
+ "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",
+ "error-email-taken": "Email has already been 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 board",
+ "import-board-c": "Import board",
+ "import-board-title-trello": "Import board from Trello",
+ "import-board-title-wekan": "Import board from Wekan",
+ "import-sandstorm-warning": "Imported board will delete all existing data on board and replace it with imported board.",
+ "from-trello": "From Trello",
+ "from-wekan": "From Wekan",
+ "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.",
+ "import-board-instruction-wekan": "In your Wekan board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.",
+ "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": "Version",
+ "initials": "Initials",
+ "invalid-date": "Invalid date",
+ "invalid-time": "Invalid time",
+ "invalid-user": "Invalid user",
+ "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",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "Leave Board ?",
+ "link-card": "Link to this card",
+ "list-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
+ "list-move-cards": "Move all cards in this list",
+ "list-select-cards": "Select all cards in this list",
+ "listActionPopup-title": "List Actions",
+ "swimlaneActionPopup-title": "Swimlane 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 move a list to Recycle Bin to remove it from the board and preserve the activity.",
+ "lists": "Lists",
+ "swimlanes": "Swimlanes",
+ "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 cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
+ "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",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text to search for?",
+ "select-color": "Select Color",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
+ "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",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
+ "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 list at Recycle Bin",
+ "watch": "Watch",
+ "watching": "Watching",
+ "watching-info": "You will be notified of any change in this board",
+ "welcome-board": "Welcome Board",
+ "welcome-swimlane": "Milestone 1",
+ "welcome-list1": "Basics",
+ "welcome-list2": "Advanced",
+ "what-to-do": "What do you want to do?",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
+ "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",
+ "send-smtp-test": "Send a test email to yourself",
+ "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.",
+ "email-smtp-test-subject": "SMTP Test Email From Wekan",
+ "email-smtp-test-text": "You have successfully sent an email",
+ "error-invitation-code-not-exist": "Invitation code doesn't exist",
+ "error-notAuthorized": "You are not authorized to view this page.",
+ "outgoing-webhooks": "Outgoing Webhooks",
+ "outgoingWebhooksPopup-title": "Outgoing Webhooks",
+ "new-outgoing-webhook": "New Outgoing Webhook",
+ "no-name": "(Unknown)",
+ "Wekan_version": "Wekan version",
+ "Node_version": "Node version",
+ "OS_Arch": "OS Arch",
+ "OS_Cpus": "OS CPU Count",
+ "OS_Freemem": "OS Free Memory",
+ "OS_Loadavg": "OS Load Average",
+ "OS_Platform": "OS Platform",
+ "OS_Release": "OS Release",
+ "OS_Totalmem": "OS Total Memory",
+ "OS_Type": "OS Type",
+ "OS_Uptime": "OS Uptime",
+ "hours": "hours",
+ "minutes": "minutes",
+ "seconds": "seconds",
+ "yes": "Yes",
+ "no": "No",
+ "accounts": "Accounts",
+ "accounts-allowEmailChange": "Allow Email Change",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Created at",
+ "verified": "Verified",
+ "active": "Active",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
+} \ No newline at end of file
diff --git a/i18n/mn.i18n.json b/i18n/mn.i18n.json
new file mode 100644
index 00000000..13e96ed6
--- /dev/null
+++ b/i18n/mn.i18n.json
@@ -0,0 +1,447 @@
+{
+ "accept": "Зөвшөөрөх",
+ "act-activity-notify": "[Wekan] Activity Notification",
+ "act-addAttachment": "_attachment__ хавсралтыг __card__-д хавсаргав",
+ "act-addChecklist": "added checklist __checklist__ to __card__",
+ "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __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": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
+ "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": "%s moved to Recycle Bin",
+ "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",
+ "activity-checklist-item-added": "added checklist item to '%s' in %s",
+ "add": "Нэмэх",
+ "add-attachment": "Хавсралт нэмэх",
+ "add-board": "Самбар нэмэх",
+ "add-card": "Карт нэмэх",
+ "add-swimlane": "Add Swimlane",
+ "add-checklist": "Чеклист нэмэх",
+ "add-checklist-item": "Add an item to checklist",
+ "add-cover": "Add Cover",
+ "add-label": "Шошго нэмэх",
+ "add-list": "Жагсаалт нэмэх",
+ "add-members": "Гишүүд нэмэх",
+ "added": "Нэмсэн",
+ "addMemberPopup-title": "Гишүүд",
+ "admin": "Админ",
+ "admin-desc": "Can view and edit cards, remove members, and change settings for the board.",
+ "admin-announcement": "Announcement",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Announcement from Administrator",
+ "all-boards": "Бүх самбарууд",
+ "and-n-other-card": "And __count__ other card",
+ "and-n-other-card_plural": "And __count__ other cards",
+ "apply": "Apply",
+ "app-is-offline": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
+ "restore-board": "Restore Board",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
+ "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",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Lists",
+ "bucket-example": "Like “Bucket List” for example",
+ "cancel": "Cancel",
+ "card-archived": "This card is moved to Recycle Bin.",
+ "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 move a card Recycle Bin to remove it from the board and preserve the activity.",
+ "card-due": "Due",
+ "card-due-on": "Due on",
+ "card-spent": "Spent Time",
+ "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": "Гишүүд",
+ "cardMorePopup-title": "More",
+ "cards": "Cards",
+ "cards-count": "Cards",
+ "change": "Change",
+ "change-avatar": "Аватар өөрчлөх",
+ "change-password": "Нууц үг солих",
+ "change-permissions": "Change permissions",
+ "change-settings": "Тохиргоо өөрчлөх",
+ "changeAvatarPopup-title": "Аватар өөрчлөх",
+ "changeLanguagePopup-title": "Хэл солих",
+ "changePasswordPopup-title": "Нууц үг солих",
+ "changePermissionsPopup-title": "Change Permissions",
+ "changeSettingsPopup-title": "Тохиргоо өөрчлөх",
+ "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 “Recycle Bin” 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",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+ "copy-card-link-to-clipboard": "Copy card link to clipboard",
+ "copyCardPopup-title": "Copy Card",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
+ "create": "Үүсгэх",
+ "createBoardPopup-title": "Самбар үүсгэх",
+ "chooseBoardSourcePopup-title": "Import board",
+ "createLabelPopup-title": "Шошго үүсгэх",
+ "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": "Аватар өөрчлөх",
+ "edit-profile": "Бүртгэл засварлах",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
+ "editCardStartDatePopup-title": "Change start date",
+ "editCardDueDatePopup-title": "Change due date",
+ "editCardSpentTimePopup-title": "Change spent time",
+ "editLabelPopup-title": "Change Label",
+ "editNotificationPopup-title": "Мэдэгдэл тохируулах",
+ "editProfilePopup-title": "Бүртгэл засварлах",
+ "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-fail-text": "Error trying to send email",
+ "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.",
+ "enable-wip-limit": "Enable WIP Limit",
+ "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",
+ "error-email-taken": "Email has already been 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": "Самбар үүсгэх",
+ "home": "Home",
+ "import": "Import",
+ "import-board": "import board",
+ "import-board-c": "Import board",
+ "import-board-title-trello": "Import board from Trello",
+ "import-board-title-wekan": "Import board from Wekan",
+ "import-sandstorm-warning": "Imported board will delete all existing data on board and replace it with imported board.",
+ "from-trello": "From Trello",
+ "from-wekan": "From Wekan",
+ "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.",
+ "import-board-instruction-wekan": "In your Wekan board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.",
+ "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": "Version",
+ "initials": "Initials",
+ "invalid-date": "Invalid date",
+ "invalid-time": "Invalid time",
+ "invalid-user": "Invalid user",
+ "joined": "joined",
+ "just-invited": "You are just invited to this board",
+ "keyboard-shortcuts": "Keyboard shortcuts",
+ "label-create": "Шошго үүсгэх",
+ "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",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "Leave Board ?",
+ "link-card": "Link to this card",
+ "list-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
+ "list-move-cards": "Move all cards in this list",
+ "list-select-cards": "Select all cards in this list",
+ "listActionPopup-title": "List Actions",
+ "swimlaneActionPopup-title": "Swimlane 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 move a list to Recycle Bin to remove it from the board and preserve the activity.",
+ "lists": "Lists",
+ "swimlanes": "Swimlanes",
+ "log-out": "Гарах",
+ "log-in": "Log In",
+ "loginPopup-title": "Log In",
+ "memberMenuPopup-title": "Гишүүний тохиргоо",
+ "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": "Миний самбарууд",
+ "name": "Name",
+ "no-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
+ "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",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text to search for?",
+ "select-color": "Select Color",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
+ "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": "Хэрэглэгч үүсгэх",
+ "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",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
+ "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 list at Recycle Bin",
+ "watch": "Watch",
+ "watching": "Watching",
+ "watching-info": "You will be notified of any change in this board",
+ "welcome-board": "Welcome Board",
+ "welcome-swimlane": "Milestone 1",
+ "welcome-list1": "Basics",
+ "welcome-list2": "Advanced",
+ "what-to-do": "What do you want to do?",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
+ "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",
+ "send-smtp-test": "Send a test email to yourself",
+ "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.",
+ "email-smtp-test-subject": "SMTP Test Email From Wekan",
+ "email-smtp-test-text": "You have successfully sent an email",
+ "error-invitation-code-not-exist": "Invitation code doesn't exist",
+ "error-notAuthorized": "You are not authorized to view this page.",
+ "outgoing-webhooks": "Outgoing Webhooks",
+ "outgoingWebhooksPopup-title": "Outgoing Webhooks",
+ "new-outgoing-webhook": "New Outgoing Webhook",
+ "no-name": "(Unknown)",
+ "Wekan_version": "Wekan version",
+ "Node_version": "Node version",
+ "OS_Arch": "OS Arch",
+ "OS_Cpus": "OS CPU Count",
+ "OS_Freemem": "OS Free Memory",
+ "OS_Loadavg": "OS Load Average",
+ "OS_Platform": "OS Platform",
+ "OS_Release": "OS Release",
+ "OS_Totalmem": "OS Total Memory",
+ "OS_Type": "OS Type",
+ "OS_Uptime": "OS Uptime",
+ "hours": "hours",
+ "minutes": "minutes",
+ "seconds": "seconds",
+ "yes": "Yes",
+ "no": "No",
+ "accounts": "Accounts",
+ "accounts-allowEmailChange": "Allow Email Change",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Created at",
+ "verified": "Verified",
+ "active": "Active",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
+} \ No newline at end of file
diff --git a/i18n/nb.i18n.json b/i18n/nb.i18n.json
index e8cbed4d..3b30ada9 100644
--- a/i18n/nb.i18n.json
+++ b/i18n/nb.i18n.json
@@ -9,9 +9,10 @@
"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-archivedBoard": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
"act-importBoard": "importerte __board__",
"act-importCard": "importerte __card__",
"act-importList": "importerte __list__",
@@ -26,7 +27,7 @@
"activities": "Aktiviteter",
"activity": "Aktivitet",
"activity-added": "la %s til %s",
- "activity-archived": "arkiverte %s",
+ "activity-archived": "%s moved to Recycle Bin",
"activity-attached": "la %s til %s",
"activity-created": "opprettet %s",
"activity-excluded": "ekskluderte %s fra %s",
@@ -44,6 +45,7 @@
"add-attachment": "Add Attachment",
"add-board": "Add Board",
"add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Add Checklist",
"add-checklist-item": "Nytt punkt på sjekklisten",
"add-cover": "Nytt omslag",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "Medlemmer",
"admin": "Admin",
"admin-desc": "Kan se og redigere kort, fjerne medlemmer, og endre innstillingene for tavlen.",
+ "admin-announcement": "Announcement",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Announcement from Administrator",
"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": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
- "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",
- "archived-boards": "Archived Boards",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
"restore-board": "Restore Board",
- "no-archived-boards": "No Archived Boards.",
- "archives": "Arkiv",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
"assign-member": "Tildel medlem",
"attached": "la ved",
"attachment": "Vedlegg",
@@ -91,15 +97,19 @@
"boardChangeWatchPopup-title": "Endre overvåkning",
"boardMenuPopup-title": "Tavlemeny",
"boards": "Tavler",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Lists",
"bucket-example": "Som \"Bucket List\" for eksempel",
"cancel": "Avbryt",
- "card-archived": "Dette kortet er arkivert.",
+ "card-archived": "This card is moved to Recycle Bin.",
"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-delete-suggest-archive": "You can move a card Recycle Bin to remove it from the board and preserve the activity.",
"card-due": "Frist",
"card-due-on": "Frist til",
+ "card-spent": "Spent Time",
"card-edit-attachments": "Rediger vedlegg",
"card-edit-labels": "Rediger etiketter",
"card-edit-members": "Endre medlemmer",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "Medlemmer",
"cardMorePopup-title": "Mer",
"cards": "Kort",
+ "cards-count": "Kort",
"change": "Endre",
"change-avatar": "Endre avatar",
"change-password": "Endre passord",
@@ -130,7 +141,7 @@
"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.",
+ "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
"color-black": "black",
"color-blue": "blue",
"color-green": "green",
@@ -146,8 +157,12 @@
"comment-only": "Comment only",
"comment-only-desc": "Can comment on cards only.",
"computer": "Computer",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
"copy-card-link-to-clipboard": "Copy card link to clipboard",
"copyCardPopup-title": "Copy Card",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
"create": "Create",
"createBoardPopup-title": "Create Board",
"chooseBoardSourcePopup-title": "Import board",
@@ -167,8 +182,11 @@
"edit": "Edit",
"edit-avatar": "Endre avatar",
"edit-profile": "Edit Profile",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
"editCardStartDatePopup-title": "Change start date",
"editCardDueDatePopup-title": "Change due date",
+ "editCardSpentTimePopup-title": "Change spent time",
"editLabelPopup-title": "Change Label",
"editNotificationPopup-title": "Edit Notification",
"editProfilePopup-title": "Edit Profile",
@@ -176,6 +194,7 @@
"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-fail-text": "Error trying to send email",
"email-invalid": "Invalid email",
"email-invite": "Invite via Email",
"email-invite-subject": "__inviter__ sent you an invitation",
@@ -185,6 +204,7 @@
"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.",
+ "enable-wip-limit": "Enable WIP Limit",
"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",
@@ -229,6 +249,8 @@
"info": "Version",
"initials": "Initials",
"invalid-date": "Invalid date",
+ "invalid-time": "Invalid time",
+ "invalid-user": "Invalid user",
"joined": "joined",
"just-invited": "You are just invited to this board",
"keyboard-shortcuts": "Keyboard shortcuts",
@@ -239,18 +261,22 @@
"language": "Language",
"last-admin-desc": "You can’t change roles because there must be at least one admin.",
"leave-board": "Leave Board",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "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-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
"list-move-cards": "Move all cards in this list",
"list-select-cards": "Select all cards in this list",
"listActionPopup-title": "List Actions",
+ "swimlaneActionPopup-title": "Swimlane 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.",
+ "list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve the activity.",
"lists": "Lists",
+ "swimlanes": "Swimlanes",
"log-out": "Log Out",
"log-in": "Log In",
"loginPopup-title": "Log In",
@@ -268,8 +294,9 @@
"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-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
"no-results": "No results",
"normal": "Normal",
"normal-desc": "Can view and edit cards. Can't change settings.",
@@ -305,7 +332,11 @@
"restore": "Restore",
"save": "Save",
"search": "Search",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text to search for?",
"select-color": "Select Color",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
"shortcut-assign-self": "Assign yourself to current card",
"shortcut-autocomplete-emoji": "Autocomplete emoji",
"shortcut-autocomplete-members": "Autocomplete members",
@@ -326,6 +357,11 @@
"team": "Team",
"this-board": "this board",
"this-card": "this card",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"tracking": "Tracking",
@@ -338,14 +374,18 @@
"uploaded-avatar": "Uploaded an avatar",
"username": "Username",
"view-it": "View it",
- "warn-list-archived": "warning: this card is in an archived list",
+ "warn-list-archived": "warning: this card is in an list at Recycle Bin",
"watch": "Watch",
"watching": "Watching",
"watching-info": "You will be notified of any change in this board",
"welcome-board": "Welcome Board",
+ "welcome-swimlane": "Milestone 1",
"welcome-list1": "Basics",
"welcome-list2": "Advanced",
"what-to-do": "What do you want to do?",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
"admin-panel": "Admin Panel",
"settings": "Settings",
"people": "People",
@@ -364,9 +404,12 @@
"smtp-password": "Password",
"smtp-tls": "TLS support",
"send-from": "From",
+ "send-smtp-test": "Send a test email to yourself",
"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.",
+ "email-smtp-test-subject": "SMTP Test Email From Wekan",
+ "email-smtp-test-text": "You have successfully sent an email",
"error-invitation-code-not-exist": "Invitation code doesn't exist",
"error-notAuthorized": "You are not authorized to view this page.",
"outgoing-webhooks": "Outgoing Webhooks",
@@ -390,5 +433,15 @@
"yes": "Yes",
"no": "No",
"accounts": "Accounts",
- "accounts-allowEmailChange": "Allow Email Change"
+ "accounts-allowEmailChange": "Allow Email Change",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Created at",
+ "verified": "Verified",
+ "active": "Active",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
} \ No newline at end of file
diff --git a/i18n/nl.i18n.json b/i18n/nl.i18n.json
index 6cbcca6b..0696409d 100644
--- a/i18n/nl.i18n.json
+++ b/i18n/nl.i18n.json
@@ -2,31 +2,32 @@
"accept": "Accepteren",
"act-activity-notify": "[Wekan] Activiteit Notificatie",
"act-addAttachment": "__attachment__ als bijlage toegevoegd aan __card__",
- "act-addChecklist": "added checklist __checklist__ to __card__",
- "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
+ "act-addChecklist": "__checklist__ toegevoegd aan __card__",
+ "act-addChecklistItem": "__checklistItem__ aan checklist toegevoegd aan __checklist__ op __card__",
"act-addComment": "gereageerd op __card__:__comment__",
- "act-createBoard": "aangemaakte__bord__",
- "act-createCard": "toegevoegd__kaart__aan__lijst__",
- "act-createList": "toegevoegd__lijst__aan_bord__",
- "act-addBoardMember": "__member__to__board__ toegevoegd",
- "act-archivedBoard": "gearchiveerd __board__",
- "act-archivedCard": "gearchiveerd __card__",
- "act-archivedList": "gearchiveerd __list__",
+ "act-createBoard": "aangemaakte __bord__",
+ "act-createCard": "toegevoegd __kaart__ aan __lijst__",
+ "act-createList": "toegevoegd __lijst__ aan __bord__",
+ "act-addBoardMember": "__member__ aan __board__ toegevoegd",
+ "act-archivedBoard": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
"act-importBoard": " __board__ geïmporteerd",
- "act-importCard": "__card__ geimporteerd",
- "act-importList": "__list__ geimporteerd",
- "act-joinMember": "toegevoegd __member__to__card__",
- "act-moveCard": "verplaatst __card__from__oldList__to__list__",
- "act-removeBoardMember": "verwijderd __member__from__board__",
- "act-restoredCard": "hersteld __card__to__board__",
- "act-unjoinMember": "verwijderd __member__from__card__",
+ "act-importCard": "__card__ geïmporteerd",
+ "act-importList": "__list__ geïmporteerd",
+ "act-joinMember": "__member__ aan __card__ toegevoegd",
+ "act-moveCard": "verplaatst __card__ van __oldList__ naar __list__",
+ "act-removeBoardMember": "verwijderd __member__ van __board__",
+ "act-restoredCard": "hersteld __card__ naar __board__",
+ "act-unjoinMember": "verwijderd __member__ van __card__",
"act-withBoardTitle": "[Wekan] __board__",
"act-withCardTitle": "[__board__] __card__",
"actions": "Acties",
"activities": "Activiteiten",
"activity": "Activiteit",
"activity-added": "%s toegevoegd aan %s",
- "activity-archived": "%s gearchiveerd",
+ "activity-archived": "%s moved to Recycle Bin",
"activity-attached": "%s bijgevoegd aan %s",
"activity-created": "%s aangemaakt",
"activity-excluded": "%s uitgesloten van %s",
@@ -44,6 +45,7 @@
"add-attachment": "Voeg Bijlage Toe",
"add-board": "Voeg Bord Toe",
"add-card": "Voeg Kaart Toe",
+ "add-swimlane": "Swimlane Toevoegen",
"add-checklist": "Voeg Checklist Toe",
"add-checklist-item": "Voeg item toe aan checklist",
"add-cover": "Voeg Cover Toe",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "Leden",
"admin": "Administrator",
"admin-desc": "Kan kaarten bekijken en wijzigen, leden verwijderen, en instellingen voor het bord aanpassen.",
+ "admin-announcement": "Melding",
+ "admin-announcement-active": "Systeem melding",
+ "admin-announcement-title": "Melding van de administrator",
"all-boards": "Alle borden",
"and-n-other-card": "En nog __count__ ander",
"and-n-other-card_plural": "En __count__ andere kaarten",
"apply": "Aanmelden",
"app-is-offline": "Wekan is aan het laden, wacht alstublieft. Het verversen van de pagina zorgt voor verlies van gegevens. Als Wekan niet laadt, check of de Wekan server is gestopt.",
- "archive": "Archiveren",
- "archive-all": "Alles Archiveren",
- "archive-board": "Archiveer Bor",
- "archive-card": "Archiveer Kaart",
- "archive-list": "Archiveer Lijst",
- "archive-selection": "Archiveer Selectie",
- "archiveBoardPopup-title": "Archiveer Bord?",
- "archived-items": "Gearchiveerde Items",
- "archived-boards": "Gearchiveerde Borden",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
"restore-board": "Herstel Bord",
- "no-archived-boards": "Geen Gearchiveerde Borden.",
- "archives": "Archieven",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
"assign-member": "Wijs lid aan",
"attached": "bijgevoegd",
"attachment": "Bijlage",
@@ -91,15 +97,19 @@
"boardChangeWatchPopup-title": "Verander naar 'Watch'",
"boardMenuPopup-title": "Bord menu",
"boards": "Borden",
+ "board-view": "Bord overzicht",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Lijsten",
"bucket-example": "Zoals \"Bucket List\" bijvoorbeeld",
"cancel": "Annuleren",
- "card-archived": "Deze kaart is gearchiveerd.",
+ "card-archived": "This card is moved to Recycle Bin.",
"card-comments-title": "Deze kaart heeft %s reactie.",
"card-delete-notice": "Verwijdering is permanent. Als je dit doet, verlies je alle informatie die op deze kaart is opgeslagen.",
"card-delete-pop": "Alle acties worden verwijderd van de activiteiten feed, en er zal geen mogelijkheid zijn om de kaart opnieuw te openen. Deze actie kan je niet ongedaan maken.",
- "card-delete-suggest-archive": "Om de kaart van het bord af te halen, zonder daarbij activiteiten te missen in de activiteiten feed, kan je klikken op \"archiveren\".",
+ "card-delete-suggest-archive": "You can move a card Recycle Bin to remove it from the board and preserve the activity.",
"card-due": "Deadline: ",
"card-due-on": "Deadline: ",
+ "card-spent": "gespendeerde tijd",
"card-edit-attachments": "Wijzig bijlagen",
"card-edit-labels": "Wijzig labels",
"card-edit-members": "Wijzig leden",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "Leden",
"cardMorePopup-title": "Meer",
"cards": "Kaarten",
+ "cards-count": "Kaarten",
"change": "Wijzig",
"change-avatar": "Wijzig avatar",
"change-password": "Wijzig wachtwoord",
@@ -130,7 +141,7 @@
"clipboard": "Vanuit clipboard of sleep het bestand hierheen",
"close": "Sluiten",
"close-board": "Sluit bord",
- "close-board-pop": "Je kan het bord weer herstellen door op het \"Archief\" knop te drukken vanuit de voorpagina.",
+ "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
"color-black": "zwart",
"color-blue": "blauw",
"color-green": "groen",
@@ -146,8 +157,12 @@
"comment-only": "Alleen reageren",
"comment-only-desc": "Kan alleen op kaarten reageren.",
"computer": "Computer",
+ "confirm-checklist-delete-dialog": "Weet u zeker dat u de checklist wilt verwijderen",
"copy-card-link-to-clipboard": "Kopieer kaart link naar klembord",
- "copyCardPopup-title": "Copy Card",
+ "copyCardPopup-title": "Kopieer kaart",
+ "copyChecklistToManyCardsPopup-title": "Checklist sjabloon kopiëren naar meerdere kaarten",
+ "copyChecklistToManyCardsPopup-instructions": "Doel kaart titels en omschrijvingen in dit JSON formaat",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Titel eerste kaart\", \"description\":\"Omschrijving eerste kaart\"}, {\"title\":\"Titel tweede kaart\",\"description\":\"Omschrijving tweede kaart\"},{\"title\":\"Titel laatste kaart\",\"description\":\"Omschrijving laatste kaart\"} ]",
"create": "Aanmaken",
"createBoardPopup-title": "Bord aanmaken",
"chooseBoardSourcePopup-title": "Importeer bord",
@@ -167,8 +182,11 @@
"edit": "Wijzig",
"edit-avatar": "Wijzig avatar",
"edit-profile": "Wijzig profiel",
+ "edit-wip-limit": "Verander WIP limiet",
+ "soft-wip-limit": "Zachte WIP limiet",
"editCardStartDatePopup-title": "Wijzig start datum",
"editCardDueDatePopup-title": "Wijzig deadline",
+ "editCardSpentTimePopup-title": "Verander gespendeerde tijd",
"editLabelPopup-title": "Wijzig label",
"editNotificationPopup-title": "Wijzig notificatie",
"editProfilePopup-title": "Wijzig profiel",
@@ -176,6 +194,7 @@
"email-enrollAccount-subject": "Er is een account voor je aangemaakt op __siteName__",
"email-enrollAccount-text": "Hallo __user__,\n\nOm gebruik te maken van de online dienst, kan je op de volgende link klikken.\n\n__url__\n\nBedankt.",
"email-fail": "E-mail verzenden is mislukt",
+ "email-fail-text": "Fout tijdens het verzenden van de email",
"email-invalid": "Ongeldige e-mail",
"email-invite": "Nodig uit via e-mail",
"email-invite-subject": "__inviter__ heeft je een uitnodiging gestuurd",
@@ -185,6 +204,7 @@
"email-sent": "E-mail is verzonden",
"email-verifyEmail-subject": "Verifieer je e-mailadres op __siteName__",
"email-verifyEmail-text": "Hallo __user__,\n\nOm je e-mail te verifiëren vragen we je om op de link hieronder te drukken.\n\n__url__\n\nBedankt.",
+ "enable-wip-limit": "Activeer WIP limiet",
"error-board-doesNotExist": "Dit bord bestaat niet.",
"error-board-notAdmin": "Je moet een administrator zijn van dit bord om dat te doen.",
"error-board-notAMember": "Je moet een lid zijn van dit bord om dat te doen.",
@@ -229,6 +249,8 @@
"info": "Versie",
"initials": "Initialen",
"invalid-date": "Ongeldige datum",
+ "invalid-time": "Ongeldige tijd",
+ "invalid-user": "Ongeldige gebruiker",
"joined": "doet nu mee met",
"just-invited": "Je bent zojuist uitgenodigd om mee toen doen met dit bord",
"keyboard-shortcuts": "Toetsenbord snelkoppelingen",
@@ -239,23 +261,27 @@
"language": "Taal",
"last-admin-desc": "Je kan de permissies niet veranderen omdat er maar een administrator is.",
"leave-board": "Verlaat bord",
+ "leave-board-pop": "Weet u zeker dat u __boardTitle__ wilt verlaten? U wordt verwijderd van alle kaarten binnen dit bord",
+ "leaveBoardPopup-title": "Bord verlaten?",
"link-card": "Link naar deze kaart",
- "list-archive-cards": "Achiveer alle kaarten in deze lijst",
- "list-archive-cards-pop": "Deze actie zal alle kaarten in deze lijst archiveren. Om de gearchiveerde kaarten te bekijken, klik \"Menu\" > \"Gearchiveerde Items\"",
+ "list-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
"list-move-cards": "Verplaats alle kaarten in deze lijst",
"list-select-cards": "Selecteer alle kaarten in deze lijst",
"listActionPopup-title": "Lijst acties",
+ "swimlaneActionPopup-title": "Swimlane handelingen",
"listImportCardPopup-title": "Importeer een Trello kaart",
"listMorePopup-title": "Meer",
"link-list": "Link naar deze lijst",
"list-delete-pop": "Alle acties zullen verwijderd worden van de activiteiten feed, en je zult deze niet meer kunnen herstellen. Je kan deze actie niet ongedaan maken.",
- "list-delete-suggest-archive": "Je het beste een lijst archiveren om het zo van het bord af te halen, maar toch de activiteit te bewaren op de feed.",
+ "list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve the activity.",
"lists": "Lijsten",
+ "swimlanes": "Swimlanes",
"log-out": "Uitloggen",
"log-in": "Inloggen",
"loginPopup-title": "Inloggen",
"memberMenuPopup-title": "Instellingen van leden",
- "members": "Lede",
+ "members": "Leden",
"menu": "Menu",
"move-selection": "Verplaats selectie",
"moveCardPopup-title": "Verplaats kaart",
@@ -268,8 +294,9 @@
"muted-info": "Je zal nooit meer geïnformeerd worden bij veranderingen in dit bord.",
"my-boards": "Mijn Borden",
"name": "Naam",
- "no-archived-cards": "Geen gearchiveerde kaarten.",
- "no-archived-lists": "Geen gearchiveerde lijsten.",
+ "no-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
"no-results": "Geen resultaten",
"normal": "Normaal",
"normal-desc": "Kan de kaarten zien en wijzigen. Kan de instellingen niet wijzigen.",
@@ -305,7 +332,11 @@
"restore": "Herstel",
"save": "Opslaan",
"search": "Zoek",
+ "search-cards": "Zoeken in kaart titels en omschrijvingen op dit bord",
+ "search-example": "Tekst om naar te zoeken?",
"select-color": "Selecteer kleur",
+ "set-wip-limit-value": "Zet een limiet voor het maximaal aantal taken in deze lijst",
+ "setWipLimitPopup-title": "Zet een WIP limiet",
"shortcut-assign-self": "Wijs jezelf toe aan huidige kaart",
"shortcut-autocomplete-emoji": "Emojis automatisch aanvullen",
"shortcut-autocomplete-members": "Leden automatisch aanvullen",
@@ -326,6 +357,11 @@
"team": "Team",
"this-board": "dit bord",
"this-card": "deze kaart",
+ "spent-time-hours": "Gespendeerde tijd (in uren)",
+ "overtime-hours": "Overwerk (in uren)",
+ "overtime": "Overwerk",
+ "has-overtime-cards": "Heeft kaarten met overwerk",
+ "has-spenttime-cards": "Heeft tijd besteed aan kaarten",
"time": "Tijd",
"title": "Titel",
"tracking": "Volgen",
@@ -338,14 +374,18 @@
"uploaded-avatar": "Avatar is geüpload",
"username": "Gebruikersnaam",
"view-it": "Bekijk het",
- "warn-list-archived": "Waarschuwing: deze kaart is gearchiveerd",
+ "warn-list-archived": "warning: this card is in an list at Recycle Bin",
"watch": "Bekijk",
"watching": "Bekijken",
"watching-info": "Je zal op de hoogte worden gesteld als er een verandering gebeurt op dit bord.",
"welcome-board": "Welkom Bord",
+ "welcome-swimlane": "Mijlpaal 1",
"welcome-list1": "Basis",
"welcome-list2": "Geadvanceerd",
"what-to-do": "Wat wil je doen?",
+ "wipLimitErrorPopup-title": "Ongeldige WIP limiet",
+ "wipLimitErrorPopup-dialog-pt1": "Het aantal taken in deze lijst is groter dan de gedefinieerde WIP limiet ",
+ "wipLimitErrorPopup-dialog-pt2": "Verwijder een aantal taken uit deze lijst, of zet de WIP limiet hoger",
"admin-panel": "Administrator paneel",
"settings": "Instellingen",
"people": "Mensen",
@@ -364,14 +404,17 @@
"smtp-password": "Wachtwoord",
"smtp-tls": "TLS ondersteuning",
"send-from": "Van",
+ "send-smtp-test": "Verzend een email naar uzelf",
"invitation-code": "Uitnodigings code",
"email-invite-register-subject": "__inviter__ heeft je een uitnodiging gestuurd",
"email-invite-register-text": "Beste __user__,\n\n__inviter__ heeft je uitgenodigd voor Wekan om samen te werken.\n\nKlik op de volgende link:\n__url__\n\nEn je uitnodigingscode is __icode__\n\nBedankt.",
+ "email-smtp-test-subject": "SMTP Test email van Wekan",
+ "email-smtp-test-text": "U heeft met succes een email verzonden",
"error-invitation-code-not-exist": "Uitnodigings code bestaat niet",
"error-notAuthorized": "Je bent niet toegestaan om deze pagina te bekijken.",
"outgoing-webhooks": "Uitgaande Webhooks",
"outgoingWebhooksPopup-title": "Uitgaande Webhooks",
- "new-outgoing-webhook": "New Outgoing Webhook",
+ "new-outgoing-webhook": "Nieuwe webhook",
"no-name": "(Onbekend)",
"Wekan_version": "Wekan versie",
"Node_version": "Node versie",
@@ -390,5 +433,15 @@
"yes": "Ja",
"no": "Nee",
"accounts": "Accounts",
- "accounts-allowEmailChange": "Sta E-mailadres wijzigingen toe"
+ "accounts-allowEmailChange": "Sta E-mailadres wijzigingen toe",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Gemaakt op",
+ "verified": "Geverifieerd",
+ "active": "Actief",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
} \ No newline at end of file
diff --git a/i18n/pl.i18n.json b/i18n/pl.i18n.json
index 024382ff..99c7ae3c 100644
--- a/i18n/pl.i18n.json
+++ b/i18n/pl.i18n.json
@@ -1,17 +1,18 @@
{
"accept": "Akceptuj",
- "act-activity-notify": "[Wekan] Activity Notification",
- "act-addAttachment": "attached __attachment__ to __card__",
- "act-addChecklist": "added checklist __checklist__ to __card__",
- "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
+ "act-activity-notify": "[Wekan] Powiadomienia - aktywności",
+ "act-addAttachment": "załączono __attachement__ do __karty__",
+ "act-addChecklist": "dodano listę zadań __checklist__ to __card__",
+ "act-addChecklistItem": "dodano __checklistItem__ do listy zadań __checklist__ na karcie __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-archivedBoard": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
"act-importBoard": "imported __board__",
"act-importCard": "imported __card__",
"act-importList": "imported __list__",
@@ -26,7 +27,7 @@
"activities": "Aktywności",
"activity": "Aktywność",
"activity-added": "dodano %s z %s",
- "activity-archived": "zarchiwizowano %s",
+ "activity-archived": "%s przeniesiono do Kosza",
"activity-attached": "załączono %s z %s",
"activity-created": "utworzono %s",
"activity-excluded": "wyłączono %s z %s",
@@ -41,36 +42,41 @@
"activity-checklist-added": "added checklist to %s",
"activity-checklist-item-added": "added checklist item to '%s' in %s",
"add": "Dodaj",
- "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-attachment": "Dodaj załącznik",
+ "add-board": "Dodaj tablicę",
+ "add-card": "Dodaj kartę",
+ "add-swimlane": "Add Swimlane",
+ "add-checklist": "Dodaj listę kontrolną",
+ "add-checklist-item": "Dodaj element do listy kontrolnej",
"add-cover": "Dodaj okładkę",
- "add-label": "Add Label",
- "add-list": "Add List",
- "add-members": "Dodaj członka",
+ "add-label": "Dodaj etykietę",
+ "add-list": "Dodaj listę",
+ "add-members": "Dodaj członków",
"added": "Dodano",
"addMemberPopup-title": "Członkowie",
"admin": "Admin",
"admin-desc": "Może widzieć i edytować karty, usuwać członków oraz zmieniać ustawienia tablicy.",
+ "admin-announcement": "Ogłoszenie",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Ogłoszenie od Administratora",
"all-boards": "Wszystkie tablice",
"and-n-other-card": "And __count__ other card",
"and-n-other-card_plural": "And __count__ other cards",
- "apply": "Apply",
+ "apply": "Zastosuj",
"app-is-offline": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
- "archive": "Zarchiwizuj",
- "archive-all": "Zarchiwizuj wszystkie",
- "archive-board": "Zarchiwizuj tablicę",
- "archive-card": "Zarchiwizuj kartę",
- "archive-list": "Archive List",
- "archive-selection": "Zarchiwizuj zaznaczone",
- "archiveBoardPopup-title": "Zarchiwizować tablicę?",
- "archived-items": "Archived Items",
- "archived-boards": "Archived Boards",
- "restore-board": "Restore Board",
- "no-archived-boards": "No Archived Boards.",
- "archives": "Zarchiwizowane",
+ "archive": "Przenieś do Kosza",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
+ "restore-board": "Przywróć tablicę",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
"assign-member": "Dodaj członka",
"attached": "załączono",
"attachment": "Załącznik",
@@ -78,7 +84,7 @@
"attachmentDeletePopup-title": "Usunąć załącznik?",
"attachments": "Załączniki",
"auto-watch": "Automatically watch boards when they are created",
- "avatar-too-big": "The avatar is too large (70KB max)",
+ "avatar-too-big": "Awatar jest za duży (maksymalnie 70Kb)",
"back": "Wstecz",
"board-change-color": "Zmień kolor",
"board-nb-stars": "%s odznaczeń",
@@ -91,15 +97,19 @@
"boardChangeWatchPopup-title": "Change Watch",
"boardMenuPopup-title": "Menu tablicy",
"boards": "Tablice",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Listy",
"bucket-example": "Like “Bucket List” for example",
"cancel": "Anuluj",
- "card-archived": "Ta karta jest zarchiwizowana.",
+ "card-archived": "This card is moved to Recycle Bin.",
"card-comments-title": "Ta karta ma %s komentarzy.",
"card-delete-notice": "Usunięcie jest trwałe. Stracisz wszystkie akcje powiązane z tą kartą.",
"card-delete-pop": "Wszystkie akcje będą usunięte z widoku aktywności, nie można będzie ponownie otworzyć karty. Usunięcie jest nieodwracalne.",
- "card-delete-suggest-archive": "Możesz zarchiwizować kartę w celu usunięcia jej z tablicy oraz zachowania jej aktywności.",
+ "card-delete-suggest-archive": "You can move a card Recycle Bin to remove it from the board and preserve the activity.",
"card-due": "Due",
"card-due-on": "Due on",
+ "card-spent": "Spent Time",
"card-edit-attachments": "Edytuj załączniki",
"card-edit-labels": "Edytuj etykiety",
"card-edit-members": "Edytuj członków",
@@ -114,23 +124,24 @@
"cardMembersPopup-title": "Członkowie",
"cardMorePopup-title": "Więcej",
"cards": "Karty",
+ "cards-count": "Karty",
"change": "Zmień",
"change-avatar": "Zmień Avatar",
"change-password": "Zmień hasło",
"change-permissions": "Zmień uprawnienia",
- "change-settings": "Change Settings",
+ "change-settings": "Zmień ustawienia",
"changeAvatarPopup-title": "Zmień Avatar",
"changeLanguagePopup-title": "Zmień język",
"changePasswordPopup-title": "Zmień hasło",
"changePermissionsPopup-title": "Zmień uprawnienia",
- "changeSettingsPopup-title": "Change Settings",
+ "changeSettingsPopup-title": "Zmień ustawienia",
"checklists": "Checklists",
"click-to-star": "Kliknij by odznaczyć tę tablicę.",
"click-to-unstar": "Kliknij by usunąć odznaczenie tej tablicy.",
"clipboard": "Schowek lub przeciągnij & upuść",
"close": "Zamknij",
"close-board": "Zamknij tablicę",
- "close-board-pop": "Możesz przywrócić tablicę klikając przycisk \"Zarchiwizowane\" z głównej belki.",
+ "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
"color-black": "czarny",
"color-blue": "niebieski",
"color-green": "zielony",
@@ -142,18 +153,22 @@
"color-sky": "błękitny",
"color-yellow": "żółty",
"comment": "Komentarz",
- "comment-placeholder": "Write Comment",
+ "comment-placeholder": "Dodaj komentarz",
"comment-only": "Comment only",
"comment-only-desc": "Can comment on cards only.",
"computer": "Komputer",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
"copy-card-link-to-clipboard": "Copy card link to clipboard",
- "copyCardPopup-title": "Copy Card",
+ "copyCardPopup-title": "Skopiuj kartę",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
"create": "Utwórz",
"createBoardPopup-title": "Utwórz tablicę",
- "chooseBoardSourcePopup-title": "Import board",
+ "chooseBoardSourcePopup-title": "Import tablicy",
"createLabelPopup-title": "Utwórz etykietę",
"current": "obecny",
- "date": "Date",
+ "date": "Data",
"decline": "Odrzuć",
"default-avatar": "Domyślny avatar",
"delete": "Usuń",
@@ -167,8 +182,11 @@
"edit": "Edytuj",
"edit-avatar": "Zmień Avatar",
"edit-profile": "Edytuj profil",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
"editCardStartDatePopup-title": "Change start date",
"editCardDueDatePopup-title": "Change due date",
+ "editCardSpentTimePopup-title": "Change spent time",
"editLabelPopup-title": "Zmień etykietę",
"editNotificationPopup-title": "Edit Notification",
"editProfilePopup-title": "Edytuj profil",
@@ -176,6 +194,7 @@
"email-enrollAccount-subject": "Konto zostało utworzone na __siteName__",
"email-enrollAccount-text": "Witaj __user__,\nAby zacząć korzystać z serwisu, kliknij w link poniżej.\n__url__\nDzięki.",
"email-fail": "Wysyłanie emaila nie powiodło się.",
+ "email-fail-text": "Error trying to send email",
"email-invalid": "Nieprawidłowy email",
"email-invite": "Zaproś przez email",
"email-invite-subject": "__inviter__ wysłał Ci zaproszenie",
@@ -185,6 +204,7 @@
"email-sent": "Email wysłany",
"email-verifyEmail-subject": "Zweryfikuj swój adres email na __siteName__",
"email-verifyEmail-text": "Witaj __user__,\nAby zweryfikować adres email, kliknij w link poniżej.\n__url__\nDzięki.",
+ "enable-wip-limit": "Enable WIP Limit",
"error-board-doesNotExist": "Ta tablica nie istnieje",
"error-board-notAdmin": "Musisz być administratorem tej tablicy żeby to zrobić",
"error-board-notAMember": "Musisz być członkiem tej tablicy żeby to zrobić",
@@ -192,32 +212,32 @@
"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": "You can not invite yourself",
+ "error-user-notAllowSelf": "Nie możesz zaprosić samego siebie",
"error-user-notCreated": "Ten użytkownik nie został stworzony",
- "error-username-taken": "This username is already taken",
+ "error-username-taken": "Ta nazwa jest już zajęta",
"error-email-taken": "Email has already been taken",
"export-board": "Eksportuj tablicę",
"filter": "Filtr",
"filter-cards": "Odfiltruj karty",
"filter-clear": "Usuń filter",
- "filter-no-label": "No label",
+ "filter-no-label": "Brak etykiety",
"filter-no-member": "No member",
"filter-on": "Filtr jest włączony",
"filter-on-desc": "Filtrujesz karty na tej tablicy. Kliknij tutaj by edytować filtr.",
"filter-to-selection": "Odfiltruj zaznaczenie",
"fullname": "Full Name",
"header-logo-title": "Wróć do swojej strony z tablicami.",
- "hide-system-messages": "Hide system messages",
+ "hide-system-messages": "Ukryj wiadomości systemowe",
"headerBarCreateBoardPopup-title": "Utwórz tablicę",
"home": "Strona główna",
"import": "Importu",
- "import-board": "import board",
- "import-board-c": "Import board",
+ "import-board": "importuj tablice",
+ "import-board-c": "Import tablicy",
"import-board-title-trello": "Import board from Trello",
- "import-board-title-wekan": "Import board from Wekan",
+ "import-board-title-wekan": "Importuj tablice z Wekan",
"import-sandstorm-warning": "Imported board will delete all existing data on board and replace it with imported board.",
- "from-trello": "From Trello",
- "from-wekan": "From Wekan",
+ "from-trello": "Z Trello",
+ "from-wekan": "Z Wekan",
"import-board-instruction-trello": "W twojej tablicy na Trello, idź do 'Menu', następnie 'More', 'Print and Export', 'Export JSON' i skopiuj wynik",
"import-board-instruction-wekan": "In your Wekan board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.",
"import-json-placeholder": "Wklej twój JSON tutaj",
@@ -226,9 +246,11 @@
"import-show-user-mapping": "Przejrzyj wybranych członków",
"import-user-select": "Pick the Wekan user you want to use as this member",
"importMapMembersAddPopup-title": "Select Wekan member",
- "info": "Version",
+ "info": "Wersja",
"initials": "Initials",
- "invalid-date": "Invalid date",
+ "invalid-date": "Błędna data",
+ "invalid-time": "Błędny czas",
+ "invalid-user": "Zła nazwa użytkownika",
"joined": "dołączył",
"just-invited": "Właśnie zostałeś zaproszony do tej tablicy",
"keyboard-shortcuts": "Skróty klawiaturowe",
@@ -239,18 +261,22 @@
"language": "Język",
"last-admin-desc": "You can’t change roles because there must be at least one admin.",
"leave-board": "Opuść tablicę",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "Leave Board ?",
"link-card": "Link do tej karty",
- "list-archive-cards": "Zarchiwizuj wszystkie karty z tej listy",
- "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view archived cards and bring them back to the board, click “Menu” > “Archived Items”.",
+ "list-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
"list-move-cards": "Przenieś wszystkie karty z tej listy",
"list-select-cards": "Zaznacz wszystkie karty z tej listy",
"listActionPopup-title": "Lista akcji",
+ "swimlaneActionPopup-title": "Swimlane Actions",
"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.",
+ "list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve the activity.",
"lists": "Listy",
+ "swimlanes": "Swimlanes",
"log-out": "Wyloguj",
"log-in": "Zaloguj",
"loginPopup-title": "Zaloguj",
@@ -264,12 +290,13 @@
"moveSelectionPopup-title": "Przenieś zaznaczone",
"multi-selection": "Wielokrotne zaznaczenie",
"multi-selection-on": "Wielokrotne zaznaczenie jest włączone",
- "muted": "Muted",
- "muted-info": "You will never be notified of any changes in this board",
+ "muted": "Wyciszona",
+ "muted-info": "Nie zostaniesz powiadomiony o zmianach w tablicy",
"my-boards": "Moje tablice",
"name": "Nazwa",
- "no-archived-cards": "Brak zarchiwizowanych kart.",
- "no-archived-lists": "Brak zarchiwizowanych list.",
+ "no-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
"no-results": "Brak wyników",
"normal": "Normal",
"normal-desc": "Może widzieć i edytować karty. Nie może zmieniać ustawiań.",
@@ -294,8 +321,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": "Remove Label",
- "listDeletePopup-title": "Delete List ?",
+ "remove-label": "Usuń etykietę",
+ "listDeletePopup-title": "Usunąć 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.",
@@ -305,7 +332,11 @@
"restore": "Przywróć",
"save": "Zapisz",
"search": "Wyszukaj",
- "select-color": "Select Color",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text to search for?",
+ "select-color": "Wybierz kolor",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
"shortcut-assign-self": "Przypisz siebie do obecnej karty",
"shortcut-autocomplete-emoji": "Autocomplete emoji",
"shortcut-autocomplete-members": "Autocomplete members",
@@ -326,6 +357,11 @@
"team": "Zespół",
"this-board": "ta tablica",
"this-card": "ta karta",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Tytuł",
"tracking": "Tracking",
@@ -338,43 +374,50 @@
"uploaded-avatar": "Wysłany avatar",
"username": "Nazwa użytkownika",
"view-it": "Zobacz",
- "warn-list-archived": "ostrzeżenie: ta karta jest na zarchiwizowanej liście",
- "watch": "Watch",
- "watching": "Watching",
+ "warn-list-archived": "warning: this card is in an list at Recycle Bin",
+ "watch": "Obserwuj",
+ "watching": "Obserwujesz",
"watching-info": "You will be notified of any change in this board",
"welcome-board": "Welcome Board",
- "welcome-list1": "Basics",
- "welcome-list2": "Advanced",
+ "welcome-swimlane": "Milestone 1",
+ "welcome-list1": "Podstawy",
+ "welcome-list2": "Zaawansowane",
"what-to-do": "Co chcesz zrobić?",
- "admin-panel": "Admin Panel",
- "settings": "Settings",
- "people": "People",
- "registration": "Registration",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
+ "admin-panel": "Panel administracyjny",
+ "settings": "Ustawienia",
+ "people": "Osoby",
+ "registration": "Rejestracja",
"disable-self-registration": "Disable Self-Registration",
- "invite": "Invite",
- "invite-people": "Invite People",
+ "invite": "Zaproś",
+ "invite-people": "Zaproś osoby",
"to-boards": "To board(s)",
- "email-addresses": "Email Addresses",
+ "email-addresses": "Adres e-mail",
"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-host": "Serwer SMTP",
+ "smtp-port": "Port SMTP",
"smtp-username": "Nazwa użytkownika",
"smtp-password": "Hasło",
"smtp-tls": "TLS support",
- "send-from": "From",
- "invitation-code": "Invitation Code",
+ "send-from": "Od",
+ "send-smtp-test": "Wyślij wiadomość testową do siebie",
+ "invitation-code": "Kod z zaproszenia",
"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.",
+ "email-smtp-test-subject": "SMTP Test Email From Wekan",
+ "email-smtp-test-text": "You have successfully sent an email",
"error-invitation-code-not-exist": "Invitation code doesn't exist",
"error-notAuthorized": "You are not authorized to view this page.",
"outgoing-webhooks": "Outgoing Webhooks",
"outgoingWebhooksPopup-title": "Outgoing Webhooks",
"new-outgoing-webhook": "New Outgoing Webhook",
- "no-name": "(Unknown)",
- "Wekan_version": "Wekan version",
- "Node_version": "Node version",
+ "no-name": "(nieznany)",
+ "Wekan_version": "Wersja Wekan",
+ "Node_version": "Wersja Node",
"OS_Arch": "OS Arch",
"OS_Cpus": "OS CPU Count",
"OS_Freemem": "OS Free Memory",
@@ -384,11 +427,21 @@
"OS_Totalmem": "OS Total Memory",
"OS_Type": "OS Type",
"OS_Uptime": "OS Uptime",
- "hours": "hours",
- "minutes": "minutes",
- "seconds": "seconds",
- "yes": "Yes",
- "no": "No",
- "accounts": "Accounts",
- "accounts-allowEmailChange": "Allow Email Change"
+ "hours": "godzin",
+ "minutes": "minut",
+ "seconds": "sekund",
+ "yes": "Tak",
+ "no": "Nie",
+ "accounts": "Konto",
+ "accounts-allowEmailChange": "Zezwól na zmianę adresu email",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Stworzono o",
+ "verified": "Zweryfikowane",
+ "active": "Aktywny",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
} \ No newline at end of file
diff --git a/i18n/pt-BR.i18n.json b/i18n/pt-BR.i18n.json
index 1ea99b76..613ae44b 100644
--- a/i18n/pt-BR.i18n.json
+++ b/i18n/pt-BR.i18n.json
@@ -2,16 +2,17 @@
"accept": "Aceitar",
"act-activity-notify": "[Wekan] Notificação de Atividade",
"act-addAttachment": "anexo __attachment__ de __card__",
- "act-addChecklist": "added checklist __checklist__ to __card__",
+ "act-addChecklist": "added checklist __checklist__ no __card__",
"act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
"act-addComment": "comentou em __card__: __comment__",
"act-createBoard": "criou __board__",
"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-archivedBoard": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
"act-importBoard": "__board__ importado",
"act-importCard": "__card__ importado",
"act-importList": "__list__ importada",
@@ -26,7 +27,7 @@
"activities": "Atividades",
"activity": "Atividade",
"activity-added": "adicionou %s a %s",
- "activity-archived": "arquivou %s",
+ "activity-archived": "%s moved to Recycle Bin",
"activity-attached": "anexou %s a %s",
"activity-created": "criou %s",
"activity-excluded": "excluiu %s de %s",
@@ -42,8 +43,9 @@
"activity-checklist-item-added": "adicionado o item de checklist para '%s' em %s",
"add": "Novo",
"add-attachment": "Adicionar Anexos",
- "add-board": "Adiconar Quadro",
+ "add-board": "Adicionar Quadro",
"add-card": "Adicionar Cartão",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Adicionar Checklist",
"add-checklist-item": "Adicionar um item à lista de verificação",
"add-cover": "Adicionar Capa",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "Membros",
"admin": "Administrador",
"admin-desc": "Pode ver e editar cartões, remover membros e alterar configurações do quadro.",
+ "admin-announcement": "Anúncio",
+ "admin-announcement-active": "Anúncio ativo em todo o sistema",
+ "admin-announcement-title": "Anúncio do Administrador",
"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": "Aplicar",
"app-is-offline": "O Wekan está carregando, por favor espere. Recarregar a página irá causar perda de dado. Se o Wekan não carregar por favor verifique se o servidor Wekan não está parado.",
- "archive": "Arquivar",
- "archive-all": "Arquivar Tudo",
- "archive-board": "Arquivar Quadro",
- "archive-card": "Arquivar Cartão",
- "archive-list": "Lista de Arquivos",
- "archive-selection": "Arquivar seleção",
- "archiveBoardPopup-title": "Arquivar Quadro?",
- "archived-items": "Itens Arquivados",
- "archived-boards": "Quadros Arquivados",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
"restore-board": "Restaurar Quadro",
- "no-archived-boards": "Nenhum Quadro Arquivado",
- "archives": "Arquivos",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
"assign-member": "Atribuir Membro",
"attached": "anexado",
"attachment": "Anexo",
@@ -91,15 +97,19 @@
"boardChangeWatchPopup-title": "Alterar observação",
"boardMenuPopup-title": "Menu do Quadro",
"boards": "Quadros",
+ "board-view": "Visão de quadro",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Listas",
"bucket-example": "\"Bucket List\", por exemplo",
"cancel": "Cancelar",
- "card-archived": "Este cartão está arquivado.",
+ "card-archived": "This card is moved to Recycle Bin.",
"card-comments-title": "Este cartão possui %s comentários.",
"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-delete-suggest-archive": "You can move a card Recycle Bin to remove it from the board and preserve the activity.",
"card-due": "Data fim",
"card-due-on": "Finaliza em",
+ "card-spent": "Tempo Gasto",
"card-edit-attachments": "Editar anexos",
"card-edit-labels": "Editar etiquetas",
"card-edit-members": "Editar membros",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "Membros",
"cardMorePopup-title": "Mais",
"cards": "Cartões",
+ "cards-count": "Cartões",
"change": "Alterar",
"change-avatar": "Alterar Avatar",
"change-password": "Alterar Senha",
@@ -130,7 +141,7 @@
"clipboard": "Área de Transferência ou arraste e solte",
"close": "Fechar",
"close-board": "Fechar Quadro",
- "close-board-pop": "Você estará habilitado para restaurar o quadro clicando no botão \"Arquivos\" à partir da barra de início.",
+ "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
"color-black": "preto",
"color-blue": "azul",
"color-green": "verde",
@@ -146,8 +157,12 @@
"comment-only": "Somente comentários",
"comment-only-desc": "Pode comentar apenas em cartões.",
"computer": "Computador",
+ "confirm-checklist-delete-dialog": "Tem a certeza de que pretende eliminar lista de verificação",
"copy-card-link-to-clipboard": "Copiar link do cartão para a área de transferência",
- "copyCardPopup-title": "Copy Card",
+ "copyCardPopup-title": "Copiar o cartão",
+ "copyChecklistToManyCardsPopup-title": "Copiar modelo de checklist para vários cartões",
+ "copyChecklistToManyCardsPopup-instructions": "Títulos e descrições do cartão de destino neste formato JSON",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Título do primeiro cartão\", \"description\":\"Descrição do primeiro cartão\"}, {\"title\":\"Título do segundo cartão\",\"description\":\"Descrição do segundo cartão\"},{\"title\":\"Título do último cartão\",\"description\":\"Descrição do último cartão\"} ]",
"create": "Criar",
"createBoardPopup-title": "Criar Quadro",
"chooseBoardSourcePopup-title": "Importar quadro",
@@ -167,8 +182,11 @@
"edit": "Editar",
"edit-avatar": "Alterar Avatar",
"edit-profile": "Editar Perfil",
+ "edit-wip-limit": "Editar Limite WIP",
+ "soft-wip-limit": "Limite de WIP",
"editCardStartDatePopup-title": "Altera data de início",
"editCardDueDatePopup-title": "Altera data fim",
+ "editCardSpentTimePopup-title": "Editar tempo gasto",
"editLabelPopup-title": "Alterar Etiqueta",
"editNotificationPopup-title": "Editar Notificações",
"editProfilePopup-title": "Editar Perfil",
@@ -176,6 +194,7 @@
"email-enrollAccount-subject": "Uma conta foi criada para você em __siteName__",
"email-enrollAccount-text": "Olá __user__\npara iniciar utilizando o serviço basta clicar no link abaixo.\n__url__\nMuito Obrigado.",
"email-fail": "Falhou ao enviar email",
+ "email-fail-text": "Erro ao tentar enviar e-mail",
"email-invalid": "Email inválido",
"email-invite": "Convite via Email",
"email-invite-subject": "__inviter__ lhe enviou um convite",
@@ -185,6 +204,7 @@
"email-sent": "Email enviado",
"email-verifyEmail-subject": "Verifique seu endereço de email em __siteName__",
"email-verifyEmail-text": "Olá __user__\nPara verificar sua conta de email, clique no link abaixo.\n__url__\nObrigado.",
+ "enable-wip-limit": "Ativar Limite WIP",
"error-board-doesNotExist": "Este quadro não existe",
"error-board-notAdmin": "Você precisa ser administrador desse quadro para fazer isto",
"error-board-notAMember": "Você precisa ser um membro desse quadro para fazer isto",
@@ -229,6 +249,8 @@
"info": "Versão",
"initials": "Iniciais",
"invalid-date": "Data inválida",
+ "invalid-time": "Hora inválida",
+ "invalid-user": "Usuário inválido",
"joined": "juntou-se",
"just-invited": "Você já foi convidado para este quadro",
"keyboard-shortcuts": "Atalhos do teclado",
@@ -239,18 +261,22 @@
"language": "Idioma",
"last-admin-desc": "Você não pode alterar funções porque deve existir pelo menos um administrador.",
"leave-board": "Sair do Quadro",
+ "leave-board-pop": "Tem a certeza de que pretende sair de __boardTitle__? Você será removido de todos os cartões neste quadro.",
+ "leaveBoardPopup-title": "Sair do Quadro ?",
"link-card": "Vincular a este cartão",
- "list-archive-cards": "Arquivar todos os cartões nesta lista",
- "list-archive-cards-pop": "Isto removerá todos os cartões desta lista do quadro. Para visualizar os cartões arquivados e trazê-los de volta para o quadro, clique em “Menu” > “Itens Arquivados”.",
+ "list-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
"list-move-cards": "Mover todos os cartões desta lista",
"list-select-cards": "Selecionar todos os cartões nesta lista",
"listActionPopup-title": "Listar Ações",
+ "swimlaneActionPopup-title": "Swimlane Actions",
"listImportCardPopup-title": "Importe um cartão do Trello",
"listMorePopup-title": "Mais",
"link-list": "Vincular a esta lista",
"list-delete-pop": "Todas as ações serão removidas da lista de atividades e você não poderá recuperar a lista. Não há como desfazer.",
- "list-delete-suggest-archive": "Você pode arquivar uma lista para removê-la do quadro e preservar as atividades.",
+ "list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve the activity.",
"lists": "Listas",
+ "swimlanes": "Swimlanes",
"log-out": "Sair",
"log-in": "Entrar",
"loginPopup-title": "Entrar",
@@ -268,8 +294,9 @@
"muted-info": "Você nunca receberá qualquer notificação desse board",
"my-boards": "Meus Quadros",
"name": "Nome",
- "no-archived-cards": "Nenhum cartão arquivado",
- "no-archived-lists": "Sem listas arquivadas",
+ "no-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
"no-results": "Nenhum resultado.",
"normal": "Normal",
"normal-desc": "Pode ver e editar cartões. Não pode alterar configurações.",
@@ -305,7 +332,11 @@
"restore": "Restaurar",
"save": "Salvar",
"search": "Buscar",
+ "search-cards": "Pesquisa em títulos e descrições de cartões neste quadro",
+ "search-example": "Texto para procurar",
"select-color": "Selecionar Cor",
+ "set-wip-limit-value": "Defina um limite máximo para o número de tarefas nesta lista",
+ "setWipLimitPopup-title": "Definir Limite WIP",
"shortcut-assign-self": "Atribuir a si o cartão atual",
"shortcut-autocomplete-emoji": "Autocompletar emoji",
"shortcut-autocomplete-members": "Preenchimento automático de membros",
@@ -326,6 +357,11 @@
"team": "Equipe",
"this-board": "este quadro",
"this-card": "este cartão",
+ "spent-time-hours": "Tempo gasto (Horas)",
+ "overtime-hours": "Tempo extras (Horas)",
+ "overtime": "Tempo extras",
+ "has-overtime-cards": "Tem cartões de horas extras",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Tempo",
"title": "Título",
"tracking": "Tracking",
@@ -338,14 +374,18 @@
"uploaded-avatar": "Avatar carregado",
"username": "Nome de usuário",
"view-it": "Visualizar",
- "warn-list-archived": "aviso: este cartão está em uma lista arquivada",
+ "warn-list-archived": "warning: this card is in an list at Recycle Bin",
"watch": "Observar",
"watching": "Observando",
"watching-info": "Você será notificado em qualquer alteração desse board",
"welcome-board": "Board de Boas Vindas",
+ "welcome-swimlane": "Milestone 1",
"welcome-list1": "Básico",
"welcome-list2": "Avançado",
"what-to-do": "O que você gostaria de fazer?",
+ "wipLimitErrorPopup-title": "Limite WIP Inválido",
+ "wipLimitErrorPopup-dialog-pt1": "O número de tarefas nesta lista excede o limite WIP definido.",
+ "wipLimitErrorPopup-dialog-pt2": "Por favor, mova algumas tarefas para fora desta lista, ou defina um limite WIP mais elevado.",
"admin-panel": "Painel Administrativo",
"settings": "Configurações",
"people": "Pessoas",
@@ -364,15 +404,18 @@
"smtp-password": "Senha",
"smtp-tls": "Suporte TLS",
"send-from": "De",
+ "send-smtp-test": "Enviar um email de teste para você mesmo",
"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.",
+ "email-smtp-test-subject": "Email Teste SMTP de Wekan",
+ "email-smtp-test-text": "Você enviou um email com sucesso",
"error-invitation-code-not-exist": "O código do convite não existe",
"error-notAuthorized": "Você não está autorizado à ver esta página.",
"outgoing-webhooks": "Webhook de saída",
"outgoingWebhooksPopup-title": "Webhook de saída",
- "new-outgoing-webhook": "New Outgoing Webhook",
- "no-name": "(Unknown)",
+ "new-outgoing-webhook": "Novo Webhook de saída",
+ "no-name": "(Desconhecido)",
"Wekan_version": "Versão do Wekan",
"Node_version": "Versão do Node",
"OS_Arch": "Arquitetura do SO",
@@ -390,5 +433,15 @@
"yes": "Sim",
"no": "Não",
"accounts": "Contas",
- "accounts-allowEmailChange": "Permitir Mudança de Email"
+ "accounts-allowEmailChange": "Permitir Mudança de Email",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Criado em",
+ "verified": "Verificado",
+ "active": "Ativo",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
} \ No newline at end of file
diff --git a/i18n/pt.i18n.json b/i18n/pt.i18n.json
new file mode 100644
index 00000000..b78bbca8
--- /dev/null
+++ b/i18n/pt.i18n.json
@@ -0,0 +1,447 @@
+{
+ "accept": "Aceitar",
+ "act-activity-notify": "[Wekan] Activity Notification",
+ "act-addAttachment": "attached __attachment__ to __card__",
+ "act-addChecklist": "added checklist __checklist__ to __card__",
+ "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __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": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
+ "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": "%s moved to Recycle Bin",
+ "activity-attached": "attached %s to %s",
+ "activity-created": "Criado %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",
+ "activity-checklist-item-added": "added checklist item to '%s' in %s",
+ "add": "Adicionar",
+ "add-attachment": "Add Attachment",
+ "add-board": "Add Board",
+ "add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
+ "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": "Membros",
+ "admin": "Admin",
+ "admin-desc": "Can view and edit cards, remove members, and change settings for the board.",
+ "admin-announcement": "Announcement",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Announcement from Administrator",
+ "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": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
+ "restore-board": "Restore Board",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
+ "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": "Renomear Quadro",
+ "boardChangeVisibilityPopup-title": "Change Visibility",
+ "boardChangeWatchPopup-title": "Change Watch",
+ "boardMenuPopup-title": "Board Menu",
+ "boards": "Boards",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Lists",
+ "bucket-example": "Like “Bucket List” for example",
+ "cancel": "Cancel",
+ "card-archived": "This card is moved to Recycle Bin.",
+ "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 move a card Recycle Bin to remove it from the board and preserve the activity.",
+ "card-due": "Due",
+ "card-due-on": "Due on",
+ "card-spent": "Spent Time",
+ "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": "Etiquetas",
+ "cardMembersPopup-title": "Membros",
+ "cardMorePopup-title": "Mais",
+ "cards": "Cartões",
+ "cards-count": "Cartões",
+ "change": "Alterar",
+ "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 “Recycle Bin” 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": "Comentário",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "Can comment on cards only.",
+ "computer": "Computador",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
+ "copy-card-link-to-clipboard": "Copy card link to clipboard",
+ "copyCardPopup-title": "Copy Card",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
+ "create": "Create",
+ "createBoardPopup-title": "Create Board",
+ "chooseBoardSourcePopup-title": "Import 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",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
+ "editCardStartDatePopup-title": "Change start date",
+ "editCardDueDatePopup-title": "Change due date",
+ "editCardSpentTimePopup-title": "Change spent time",
+ "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-fail-text": "Error trying to send email",
+ "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.",
+ "enable-wip-limit": "Enable WIP Limit",
+ "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",
+ "error-email-taken": "Email has already been 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 board",
+ "import-board-c": "Import board",
+ "import-board-title-trello": "Import board from Trello",
+ "import-board-title-wekan": "Import board from Wekan",
+ "import-sandstorm-warning": "Imported board will delete all existing data on board and replace it with imported board.",
+ "from-trello": "From Trello",
+ "from-wekan": "From Wekan",
+ "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.",
+ "import-board-instruction-wekan": "In your Wekan board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.",
+ "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": "Version",
+ "initials": "Initials",
+ "invalid-date": "Invalid date",
+ "invalid-time": "Invalid time",
+ "invalid-user": "Invalid user",
+ "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": "Etiquetas",
+ "language": "Language",
+ "last-admin-desc": "You can’t change roles because there must be at least one admin.",
+ "leave-board": "Leave Board",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "Leave Board ?",
+ "link-card": "Link to this card",
+ "list-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
+ "list-move-cards": "Move all cards in this list",
+ "list-select-cards": "Select all cards in this list",
+ "listActionPopup-title": "List Actions",
+ "swimlaneActionPopup-title": "Swimlane Actions",
+ "listImportCardPopup-title": "Import a Trello card",
+ "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 move a list to Recycle Bin to remove it from the board and preserve the activity.",
+ "lists": "Lists",
+ "swimlanes": "Swimlanes",
+ "log-out": "Log Out",
+ "log-in": "Log In",
+ "loginPopup-title": "Log In",
+ "memberMenuPopup-title": "Member Settings",
+ "members": "Membros",
+ "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": "Nome",
+ "no-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
+ "no-results": "Nenhum resultado",
+ "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": "Remover Membro?",
+ "rename": "Renomear",
+ "rename-board": "Renomear Quadro",
+ "restore": "Restore",
+ "save": "Save",
+ "search": "Search",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text to search for?",
+ "select-color": "Select Color",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
+ "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",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
+ "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 list at Recycle Bin",
+ "watch": "Watch",
+ "watching": "Watching",
+ "watching-info": "You will be notified of any change in this board",
+ "welcome-board": "Welcome Board",
+ "welcome-swimlane": "Milestone 1",
+ "welcome-list1": "Basics",
+ "welcome-list2": "Advanced",
+ "what-to-do": "What do you want to do?",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
+ "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",
+ "send-smtp-test": "Send a test email to yourself",
+ "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.",
+ "email-smtp-test-subject": "SMTP Test Email From Wekan",
+ "email-smtp-test-text": "You have successfully sent an email",
+ "error-invitation-code-not-exist": "Invitation code doesn't exist",
+ "error-notAuthorized": "You are not authorized to view this page.",
+ "outgoing-webhooks": "Outgoing Webhooks",
+ "outgoingWebhooksPopup-title": "Outgoing Webhooks",
+ "new-outgoing-webhook": "New Outgoing Webhook",
+ "no-name": "(Unknown)",
+ "Wekan_version": "Wekan version",
+ "Node_version": "Node version",
+ "OS_Arch": "OS Arch",
+ "OS_Cpus": "OS CPU Count",
+ "OS_Freemem": "OS Free Memory",
+ "OS_Loadavg": "OS Load Average",
+ "OS_Platform": "OS Platform",
+ "OS_Release": "OS Release",
+ "OS_Totalmem": "OS Total Memory",
+ "OS_Type": "OS Type",
+ "OS_Uptime": "OS Uptime",
+ "hours": "hours",
+ "minutes": "minutes",
+ "seconds": "seconds",
+ "yes": "Yes",
+ "no": "Não",
+ "accounts": "Contas",
+ "accounts-allowEmailChange": "Allow Email Change",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Created at",
+ "verified": "Verificado",
+ "active": "Ativo",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
+} \ No newline at end of file
diff --git a/i18n/ro.i18n.json b/i18n/ro.i18n.json
index 926d63dc..014ad3d4 100644
--- a/i18n/ro.i18n.json
+++ b/i18n/ro.i18n.json
@@ -9,9 +9,10 @@
"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-archivedBoard": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
"act-importBoard": "imported __board__",
"act-importCard": "imported __card__",
"act-importList": "imported __list__",
@@ -26,7 +27,7 @@
"activities": "Activities",
"activity": "Activity",
"activity-added": "added %s to %s",
- "activity-archived": "archived %s",
+ "activity-archived": "%s moved to Recycle Bin",
"activity-attached": "attached %s to %s",
"activity-created": "created %s",
"activity-excluded": "excluded %s from %s",
@@ -44,6 +45,7 @@
"add-attachment": "Add Attachment",
"add-board": "Add Board",
"add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Add Checklist",
"add-checklist-item": "Add an item to checklist",
"add-cover": "Add Cover",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "Members",
"admin": "Admin",
"admin-desc": "Can view and edit cards, remove members, and change settings for the board.",
+ "admin-announcement": "Announcement",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Announcement from Administrator",
"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": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
- "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",
- "archived-boards": "Archived Boards",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
"restore-board": "Restore Board",
- "no-archived-boards": "No Archived Boards.",
- "archives": "Arhive",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
"assign-member": "Assign member",
"attached": "attached",
"attachment": "Ataşament",
@@ -91,15 +97,19 @@
"boardChangeWatchPopup-title": "Change Watch",
"boardMenuPopup-title": "Board Menu",
"boards": "Boards",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Liste",
"bucket-example": "Like “Bucket List” for example",
"cancel": "Cancel",
- "card-archived": "This card is archived.",
+ "card-archived": "This card is moved to Recycle Bin.",
"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-delete-suggest-archive": "You can move a card Recycle Bin to remove it from the board and preserve the activity.",
"card-due": "Due",
"card-due-on": "Due on",
+ "card-spent": "Spent Time",
"card-edit-attachments": "Edit attachments",
"card-edit-labels": "Edit labels",
"card-edit-members": "Edit members",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "Members",
"cardMorePopup-title": "More",
"cards": "Cards",
+ "cards-count": "Cards",
"change": "Change",
"change-avatar": "Change Avatar",
"change-password": "Change Password",
@@ -130,7 +141,7 @@
"clipboard": "Clipboard or drag & drop",
"close": "Închide",
"close-board": "Close Board",
- "close-board-pop": "You will be able to restore the board by clicking the “Archives” button from the home header.",
+ "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
"color-black": "black",
"color-blue": "blue",
"color-green": "green",
@@ -146,8 +157,12 @@
"comment-only": "Comment only",
"comment-only-desc": "Can comment on cards only.",
"computer": "Computer",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
"copy-card-link-to-clipboard": "Copy card link to clipboard",
"copyCardPopup-title": "Copy Card",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
"create": "Create",
"createBoardPopup-title": "Create Board",
"chooseBoardSourcePopup-title": "Import board",
@@ -167,8 +182,11 @@
"edit": "Edit",
"edit-avatar": "Change Avatar",
"edit-profile": "Edit Profile",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
"editCardStartDatePopup-title": "Change start date",
"editCardDueDatePopup-title": "Change due date",
+ "editCardSpentTimePopup-title": "Change spent time",
"editLabelPopup-title": "Change Label",
"editNotificationPopup-title": "Edit Notification",
"editProfilePopup-title": "Edit Profile",
@@ -176,6 +194,7 @@
"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-fail-text": "Error trying to send email",
"email-invalid": "Invalid email",
"email-invite": "Invite via Email",
"email-invite-subject": "__inviter__ sent you an invitation",
@@ -185,6 +204,7 @@
"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.",
+ "enable-wip-limit": "Enable WIP Limit",
"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",
@@ -229,6 +249,8 @@
"info": "Version",
"initials": "Iniţiale",
"invalid-date": "Invalid date",
+ "invalid-time": "Invalid time",
+ "invalid-user": "Invalid user",
"joined": "joined",
"just-invited": "You are just invited to this board",
"keyboard-shortcuts": "Keyboard shortcuts",
@@ -239,18 +261,22 @@
"language": "Language",
"last-admin-desc": "You can’t change roles because there must be at least one admin.",
"leave-board": "Leave Board",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "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-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
"list-move-cards": "Move all cards in this list",
"list-select-cards": "Select all cards in this list",
"listActionPopup-title": "List Actions",
+ "swimlaneActionPopup-title": "Swimlane 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.",
+ "list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve the activity.",
"lists": "Liste",
+ "swimlanes": "Swimlanes",
"log-out": "Log Out",
"log-in": "Log In",
"loginPopup-title": "Log In",
@@ -268,8 +294,9 @@
"muted-info": "You will never be notified of any changes in this board",
"my-boards": "My Boards",
"name": "Nume",
- "no-archived-cards": "No archived cards.",
- "no-archived-lists": "No archived lists.",
+ "no-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
"no-results": "No results",
"normal": "Normal",
"normal-desc": "Can view and edit cards. Can't change settings.",
@@ -305,7 +332,11 @@
"restore": "Restore",
"save": "Salvează",
"search": "Caută",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text to search for?",
"select-color": "Select Color",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
"shortcut-assign-self": "Assign yourself to current card",
"shortcut-autocomplete-emoji": "Autocomplete emoji",
"shortcut-autocomplete-members": "Autocomplete members",
@@ -326,6 +357,11 @@
"team": "Team",
"this-board": "this board",
"this-card": "this card",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Titlu",
"tracking": "Tracking",
@@ -338,14 +374,18 @@
"uploaded-avatar": "Uploaded an avatar",
"username": "Username",
"view-it": "View it",
- "warn-list-archived": "warning: this card is in an archived list",
+ "warn-list-archived": "warning: this card is in an list at Recycle Bin",
"watch": "Watch",
"watching": "Watching",
"watching-info": "You will be notified of any change in this board",
"welcome-board": "Welcome Board",
+ "welcome-swimlane": "Milestone 1",
"welcome-list1": "Basics",
"welcome-list2": "Advanced",
"what-to-do": "Ce ai vrea sa faci?",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
"admin-panel": "Admin Panel",
"settings": "Settings",
"people": "People",
@@ -364,9 +404,12 @@
"smtp-password": "Parolă",
"smtp-tls": "TLS support",
"send-from": "From",
+ "send-smtp-test": "Send a test email to yourself",
"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.",
+ "email-smtp-test-subject": "SMTP Test Email From Wekan",
+ "email-smtp-test-text": "You have successfully sent an email",
"error-invitation-code-not-exist": "Invitation code doesn't exist",
"error-notAuthorized": "You are not authorized to view this page.",
"outgoing-webhooks": "Outgoing Webhooks",
@@ -390,5 +433,15 @@
"yes": "Yes",
"no": "No",
"accounts": "Accounts",
- "accounts-allowEmailChange": "Allow Email Change"
+ "accounts-allowEmailChange": "Allow Email Change",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Created at",
+ "verified": "Verified",
+ "active": "Active",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
} \ No newline at end of file
diff --git a/i18n/ru.i18n.json b/i18n/ru.i18n.json
index 5b26f7c2..447e8f0d 100644
--- a/i18n/ru.i18n.json
+++ b/i18n/ru.i18n.json
@@ -1,21 +1,22 @@
{
"accept": "Принять",
- "act-activity-notify": "[Wekan] Уведомления о активности",
+ "act-activity-notify": "[Wekan] Уведомление о действиях участников",
"act-addAttachment": "вложено __attachment__ в __card__",
- "act-addChecklist": "added checklist __checklist__ to __card__",
- "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
+ "act-addChecklist": "добавил контрольный список __checklist__ в __card__",
+ "act-addChecklistItem": "добавил __checklistItem__ в контрольный список __checklist__ в __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-createBoard": "создал __board__",
+ "act-createCard": "добавил __card__ в __list__",
+ "act-createList": "добавил __list__ для __board__",
+ "act-addBoardMember": "добавил __member__ в __board__",
+ "act-archivedBoard": "Доска __board__ перемещена в Корзину",
+ "act-archivedCard": "Карточка __card__ перемещена в Корзину",
+ "act-archivedList": "Список __list__ перемещён в Корзину",
+ "act-archivedSwimlane": "Дорожка __swimlane__ перемещена в Корзину",
+ "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__",
@@ -23,55 +24,60 @@
"act-withBoardTitle": "[Wekan] __board__",
"act-withCardTitle": "[__board__] __card__",
"actions": "Действия",
- "activities": "История действия",
- "activity": "Активность",
+ "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-moved": "переместил %s из %s на %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-removed": "удалил %s из %s",
+ "activity-sent": "отправил %s в %s",
"activity-unjoined": "вышел из %s",
- "activity-checklist-added": "добавлен список в %s",
- "activity-checklist-item-added": "добавлен пункт списка в '%s' в %s",
+ "activity-checklist-added": "добавил контрольный список в %s",
+ "activity-checklist-item-added": "добавил пункт контрольного списка в '%s' в карточке %s",
"add": "Создать",
"add-attachment": "Добавить вложение",
"add-board": "Добавить доску",
"add-card": "Добавить карту",
- "add-checklist": "Добавить список",
- "add-checklist-item": "Добавить елемент в список",
+ "add-swimlane": "Добавить дорожку",
+ "add-checklist": "Добавить контрольный список",
+ "add-checklist-item": "Добавить пункт в контрольный список",
"add-cover": "Прикрепить",
"add-label": "Добавить метку",
"add-list": "Добавить простой список",
- "add-members": "Добавить пользователя",
+ "add-members": "Добавить участника",
"added": "Добавлено",
"addMemberPopup-title": "Участники",
"admin": "Администратор",
"admin-desc": "Может просматривать и редактировать карточки, удалять участников и управлять настройками доски.",
+ "admin-announcement": "Объявление",
+ "admin-announcement-active": "Действующее общесистемное объявление",
+ "admin-announcement-title": "Объявление от Администратора",
"all-boards": "Все доски",
"and-n-other-card": "И __count__ другая карточка",
"and-n-other-card_plural": "И __count__ другие карточки",
"apply": "Применить",
"app-is-offline": "Wekan загружается, пожалуйста подождите. Обновление страницы может привести к потере данных. Если Wekan не загрузился, пожалуйста проверьте что связь с сервером доступна.",
- "archive": "Архивировать",
- "archive-all": "Архивировать все",
- "archive-board": "Архивировать доску",
- "archive-card": "Архивировать карточку",
- "archive-list": "Архивировать список",
- "archive-selection": "Архивировать выбранное",
- "archiveBoardPopup-title": "Заархивировать доску?",
- "archived-items": "Объекты в архиве",
- "archived-boards": "Архивировать доску",
+ "archive": "Переместить в Корзину",
+ "archive-all": "Переместить всё в Корзину",
+ "archive-board": "Переместить Доску в Корзину",
+ "archive-card": "Переместить Карточку в Корзину",
+ "archive-list": "Переместить Список в Корзину",
+ "archive-swimlane": "Переместить Дорожку в Корзину",
+ "archive-selection": "Переместить выбранное в Корзину",
+ "archiveBoardPopup-title": "Переместить Доску в Корзину?",
+ "archived-items": "Корзина",
+ "archived-boards": "Доски находящиеся в Корзине",
"restore-board": "Востановить доску",
- "no-archived-boards": "Нет архивных досок.",
- "archives": "Архивы",
- "assign-member": "Пригласить пользователя",
+ "no-archived-boards": "В Корзине нет никаких Досок",
+ "archives": "Корзина",
+ "assign-member": "Назначить участника",
"attached": "прикреплено",
"attachment": "Вложение",
"attachment-delete-pop": "Если удалить вложение, его нельзя будет восстановить.",
@@ -91,22 +97,26 @@
"boardChangeWatchPopup-title": "Изменить Отслеживание",
"boardMenuPopup-title": "Меню доски",
"boards": "Доски",
+ "board-view": "Вид доски",
+ "board-view-swimlanes": "Дорожки",
+ "board-view-lists": "Списки",
"bucket-example": "Например “Список дел”",
"cancel": "Отмена",
- "card-archived": "Эта карточка помещена в архив.",
+ "card-archived": "Эта карточка перемещена в Корзину",
"card-comments-title": "Комментарии (%s)",
"card-delete-notice": "Это действие невозможно будет отменить. Все изменения, которые вы вносили в карточку будут потеряны.",
- "card-delete-pop": "Все действия будут удалены из ленты активности и вы не сможете заново открыть карточку. Действие необратимо",
- "card-delete-suggest-archive": "Вы можете заархивировать карточку, чтобы удалить ее с доски и сохранить активность .",
- "card-due": "До",
- "card-due-on": "Завершить до",
+ "card-delete-pop": "Все действия будут удалены из ленты активности участников и вы не сможете заново открыть карточку. Действие необратимо",
+ "card-delete-suggest-archive": "Вы можете переместить карточку в Корзину, чтобы удалить ее с доски и сохранить активность .",
+ "card-due": "Выполнить к",
+ "card-due-on": "Выполнить до",
+ "card-spent": "Затраченное время",
"card-edit-attachments": "Изменить вложения",
"card-edit-labels": "Изменить метку",
- "card-edit-members": "Изменить пользователей",
- "card-labels-title": "Редактировать метки.",
- "card-members-title": "Добавить или удалить участника.",
- "card-start": "Начать",
- "card-start-on": "Начнется с",
+ "card-edit-members": "Изменить участников",
+ "card-labels-title": "Изменить метки для этой карточки.",
+ "card-members-title": "Добавить или удалить с карточки участников доски.",
+ "card-start": "Дата начала",
+ "card-start-on": "Начнётся с",
"cardAttachmentsPopup-title": "Прикрепить из",
"cardDeletePopup-title": "Удалить карточку?",
"cardDetailsActionsPopup-title": "Действия в карточке",
@@ -114,40 +124,45 @@
"cardMembersPopup-title": "Участники",
"cardMorePopup-title": "Поделиться",
"cards": "Карточки",
+ "cards-count": "Карточки",
"change": "Изменить",
"change-avatar": "Изменить аватар",
"change-password": "Изменить пароль",
"change-permissions": "Изменить права доступа",
- "change-settings": "Изменить Настройки",
+ "change-settings": "Изменить настройки",
"changeAvatarPopup-title": "Изменить аватар",
"changeLanguagePopup-title": "Сменить язык",
"changePasswordPopup-title": "Изменить пароль",
"changePermissionsPopup-title": "Изменить настройки доступа",
"changeSettingsPopup-title": "Изменить Настройки",
- "checklists": "Список",
+ "checklists": "Контрольные списки",
"click-to-star": "Добавить в «Избранное»",
"click-to-unstar": "Удалить из «Избранного»",
"clipboard": "Буфер обмена или drag & drop",
"close": "Закрыть",
"close-board": "Закрыть доску",
- "close-board-pop": "Вы можете восстановить доску, нажав “Архивы” в заголовке.",
+ "close-board-pop": "Вы можете восстановить доску, нажав “Корзина” в заголовке.",
"color-black": "черный",
"color-blue": "синий",
"color-green": "зеленый",
"color-lime": "лимоновый",
- "color-orange": "оранджевый",
- "color-pink": "зорозвый",
+ "color-orange": "оранжевый",
+ "color-pink": "розовый",
"color-purple": "фиолетовый",
"color-red": "красный",
"color-sky": "голубой",
"color-yellow": "желтый",
- "comment": "Добавить коментарий",
+ "comment": "Добавить комментарий",
"comment-placeholder": "Написать комментарий",
"comment-only": "Только комментирование",
"comment-only-desc": "Может комментировать только карточки.",
"computer": "Загрузить с компьютера",
- "copy-card-link-to-clipboard": "Copy card link to clipboard",
- "copyCardPopup-title": "Copy Card",
+ "confirm-checklist-delete-dialog": "Вы уверены, что хотите удалить контрольный список?",
+ "copy-card-link-to-clipboard": "Копировать ссылку на карточку в буфер обмена",
+ "copyCardPopup-title": "Копировать карточку",
+ "copyChecklistToManyCardsPopup-title": "Копировать шаблон контрольного списка в несколько карточек",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
"create": "Создать",
"createBoardPopup-title": "Создать доску",
"chooseBoardSourcePopup-title": "Импортировать доску",
@@ -160,34 +175,39 @@
"deleteLabelPopup-title": "Удалить метку?",
"description": "Описание",
"disambiguateMultiLabelPopup-title": "Разрешить конфликт меток",
- "disambiguateMultiMemberPopup-title": "Разрешить конфликт пользователей",
+ "disambiguateMultiMemberPopup-title": "Разрешить конфликт участников",
"discard": "Отказать",
"done": "Готово",
"download": "Скачать",
"edit": "Редактировать",
"edit-avatar": "Изменить аватар",
- "edit-profile": "Изменить Профиль",
- "editCardStartDatePopup-title": "Сменить дату начала",
- "editCardDueDatePopup-title": "Изменить дату до",
- "editLabelPopup-title": "Редактирование метки",
+ "edit-profile": "Изменить профиль",
+ "edit-wip-limit": " Изменить лимит на кол-во задач",
+ "soft-wip-limit": "Мягкий лимит на кол-во задач",
+ "editCardStartDatePopup-title": "Изменить дату начала",
+ "editCardDueDatePopup-title": "Изменить дату выполнения",
+ "editCardSpentTimePopup-title": "Изменить затраченное время",
+ "editLabelPopup-title": "Изменить метки",
"editNotificationPopup-title": "Редактировать уведомления",
- "editProfilePopup-title": "Изменить профиль",
+ "editProfilePopup-title": "Редактировать профиль",
"email": "Эл.почта",
"email-enrollAccount-subject": "Аккаунт создан для вас здесь __url__",
"email-enrollAccount-text": "Привет __user__,\n\nДля того, чтобы начать использовать сервис, просто нажми на ссылку ниже.\n\n__url__\n\nСпасибо.",
"email-fail": "Отправка письма на EMail не удалась",
+ "email-fail-text": "Ошибка при попытке отправить письмо",
"email-invalid": "Неверный адрес электронной почти",
"email-invite": "Пригласить по электронной почте",
"email-invite-subject": "__inviter__ прислал вам приглашение",
- "email-invite-text": "Дорогой __user__,\n\n__inviter__ пригласил вас присоединиться к доске \"__board__\" для сотрудничества.\n\nПожайлуйста проследуйте по ссылке ниже:\n\n__url__\n\nСпасибо.",
+ "email-invite-text": "Дорогой __user__,\n\n__inviter__ пригласил вас присоединиться к доске \"__board__\" для сотрудничества.\n\nПожалуйста проследуйте по ссылке ниже:\n\n__url__\n\nСпасибо.",
"email-resetPassword-subject": "Перейдите по ссылке, чтобы сбросить пароль __url__",
"email-resetPassword-text": "Привет __user__,\n\nДля сброса пароля перейдите по ссылке ниже.\n\n__url__\n\nThanks.",
"email-sent": "Письмо отправлено",
"email-verifyEmail-subject": "Подтвердите вашу эл.почту перейдя по ссылке __url__",
"email-verifyEmail-text": "Привет __user__,\n\nДля подтверждения вашей электронной почты перейдите по ссылке ниже.\n\n__url__\n\nСпасибо.",
+ "enable-wip-limit": "Включить лимит на кол-во задач",
"error-board-doesNotExist": "Доска не найдена",
"error-board-notAdmin": "Вы должны обладать правами администратора этой доски, чтобы сделать это",
- "error-board-notAMember": "Вы должны быть пользователем доски, чтобы сделать это",
+ "error-board-notAMember": "Вы должны быть участником доски, чтобы сделать это",
"error-json-malformed": "Ваше текст не является правильным JSON",
"error-json-schema": "Содержимое вашего JSON не содержит информацию в корректном формате",
"error-list-doesNotExist": "Список не найден",
@@ -195,13 +215,13 @@
"error-user-notAllowSelf": "Вы не можете пригласить себя",
"error-user-notCreated": "Пользователь не создан",
"error-username-taken": "Это имя пользователя уже занято",
- "error-email-taken": "Email has already been taken",
+ "error-email-taken": "Этот адрес уже занят",
"export-board": "Экспортировать доску",
"filter": "Фильтр",
"filter-cards": "Фильтр карточек",
"filter-clear": "Очистить фильтр",
"filter-no-label": "Нет метки",
- "filter-no-member": "Нет пользователей",
+ "filter-no-member": "Нет участников",
"filter-on": "Включен фильтр",
"filter-on-desc": "Показываются карточки, соответствующие настройкам фильтра. Нажмите для редактирования.",
"filter-to-selection": "Filter to selection",
@@ -214,47 +234,53 @@
"import-board": "импортировать доску",
"import-board-c": "Импортировать доску",
"import-board-title-trello": "Импортировать доску из Trello",
- "import-board-title-wekan": "Импортировать доску с Wekan",
- "import-sandstorm-warning": "Импортированная доска удалит все существующие данные на доске и заменит ее доской.",
+ "import-board-title-wekan": "Импортировать доску из Wekan",
+ "import-sandstorm-warning": "Импортированная доска удалит все существующие данные на текущей доске и заменит её импортированной доской.",
"from-trello": "Из Trello",
- "from-wekan": "Их Wekan",
+ "from-wekan": "Из Wekan",
"import-board-instruction-trello": "На вашей Trello доске нажмите “Menu” - “More” - “Print and export - “Export JSON” и скопируйте полученный текст",
- "import-board-instruction-wekan": "На вашей Wekan доске, перейдите в “Меню”, далее “Экспортировать доску” и скопируйте текст из файла",
+ "import-board-instruction-wekan": "На вашей Wekan доске, перейдите в “Меню”, далее “Экспортировать доску” и скопируйте текст из скачаного файла",
"import-json-placeholder": "Вставьте JSON сюда",
- "import-map-members": "Карта пользователей",
- "import-members-map": "Вы ипортировали доску с пользователями. Пожалуйста, составьте карту пользователей, которых вы хотите импортировать в Wekan пользователей",
- "import-show-user-mapping": "Проверить карту пользователей",
- "import-user-select": "Выберите Wekan-пользователя, которого вы хотите использовать в качестве пользователя",
- "importMapMembersAddPopup-title": "Выбрать Wekan пользователя",
+ "import-map-members": "Составить карту участников",
+ "import-members-map": "Вы импортировали доску с участниками. Пожалуйста, составьте карту участников, которых вы хотите импортировать в качестве пользователей Wekan",
+ "import-show-user-mapping": "Проверить карту участников",
+ "import-user-select": "Выберите пользователя Wekan, которого вы хотите использовать в качестве участника",
+ "importMapMembersAddPopup-title": "Выбрать участника Wekan",
"info": "Версия",
"initials": "Инициалы",
"invalid-date": "Неверная дата",
+ "invalid-time": "Некорректное время",
+ "invalid-user": "Неверный пользователь",
"joined": "вступил",
- "just-invited": "Вы только пригласили на эту доску",
+ "just-invited": "Вас только что пригласили на эту доску",
"keyboard-shortcuts": "Сочетания клавиш",
"label-create": "Создать метку",
"label-default": "%sметка (по умолчанию)",
- "label-delete-pop": "Это действие невозможно будет отменить. Метка будет удалена во всех карточках.",
+ "label-delete-pop": "Это действие невозможно будет отменить. Эта метка будут удалена во всех карточках. Также будет удалена вся история этой метки.",
"labels": "Метки",
"language": "Язык",
"last-admin-desc": "Вы не можете изменять роли, для этого требуются права администратора.",
"leave-board": "Покинуть доску",
+ "leave-board-pop": "Вы уверенны, что хотите покинуть __boardTitle__? Вы будете удалены из всех карточек на этой доске.",
+ "leaveBoardPopup-title": "Покинуть доску?",
"link-card": "Доступна по ссылке",
- "list-archive-cards": "Архивировать все карточки в этом списке",
- "list-archive-cards-pop": "Это действие переместит все карточки в архив и они перестанут быть видимым на доске. Для просмотра карточек в архиве нажмите “Меню” > “Объекты в архиве”.",
+ "list-archive-cards": "Переместить все карточки в этом списке в Корзину",
+ "list-archive-cards-pop": "Это действие переместит все карточки в Корзину и они перестанут быть видимым на доске. Для просмотра карточек в Корзине и их восстановления нажмите “Меню” > “Корзина”.",
"list-move-cards": "Переместить все карточки в этом списке",
"list-select-cards": "Выбрать все карточки в этом списке",
"listActionPopup-title": "Список действий",
+ "swimlaneActionPopup-title": "Действия с дорожкой",
"listImportCardPopup-title": "Импортировать Trello карточку",
"listMorePopup-title": "Поделиться",
"link-list": "Ссылка на список",
- "list-delete-pop": "Все действия будут удалены из ленты активности и вы не сможете заново открыть список. Действие необратимо.",
- "list-delete-suggest-archive": "Вы можете заархивировать список, чтобы удалить его с доски и сохранить активность.",
+ "list-delete-pop": "Все действия будут удалены из ленты активности участников и вы не сможете восстановить список. Данное действие необратимо.",
+ "list-delete-suggest-archive": "Вы можете переместить карточку в Корзину, чтобы удалить ее с доски и сохранить активность .",
"lists": "Списки",
+ "swimlanes": "Дорожки",
"log-out": "Выйти",
"log-in": "Войти",
"loginPopup-title": "Войти",
- "memberMenuPopup-title": "Настройки пользователя",
+ "memberMenuPopup-title": "Настройки участника",
"members": "Участники",
"menu": "Меню",
"move-selection": "Переместить выделение",
@@ -265,11 +291,12 @@
"multi-selection": "Выбрать несколько",
"multi-selection-on": "Выбрать несколько из",
"muted": "Заглушен",
- "muted-info": "Вы НИКОГДА не будете уведомлены об любых изменениях в этой доске.",
+ "muted-info": "Вы НИКОГДА не будете уведомлены ни о каких изменениях в этой доске.",
"my-boards": "Мои доски",
"name": "Имя",
- "no-archived-cards": "Нет карточек в архиве.",
- "no-archived-lists": "Нет списков в архиве.",
+ "no-archived-cards": "В Корзине нет никаких Карточек",
+ "no-archived-lists": "В Корзине нет никаких Списков",
+ "no-archived-swimlanes": "В Корзине нет никаких Дорожек",
"no-results": "Ничего не найдено",
"normal": "Обычный",
"normal-desc": "Может редактировать карточки. Не может управлять настройками.",
@@ -281,8 +308,8 @@
"page-maybe-private": "Возможно, эта страница скрыта от незарегистрированных пользователей. Попробуйте <a href='%s'>войти на сайт</a>.",
"page-not-found": "Страница не найдена.",
"password": "Пароль",
- "paste-or-dragdrop": "вставьте, или перетащите файл с изображением сюда (только графический фай)",
- "participating": "Участнвую",
+ "paste-or-dragdrop": "вставьте, или перетащите файл с изображением сюда (только графический файл)",
+ "participating": "Участвую",
"preview": "Предпросмотр",
"previewAttachedImagePopup-title": "Предпросмотр",
"previewClipboardImagePopup-title": "Предпросмотр",
@@ -298,17 +325,21 @@
"listDeletePopup-title": "Удалить список?",
"remove-member": "Удалить участника",
"remove-member-from-card": "Удалить из карточки",
- "remove-member-pop": "Удалить участника __name__ (__username__) из доски __boardTitle__? Участник будет удален из всех карточек. Также он получит уведомление о совершаемом действии.",
+ "remove-member-pop": "Удалить участника __name__ (__username__) из доски __boardTitle__? Участник будет удален из всех карточек на этой доске. Также он получит уведомление о совершаемом действии.",
"removeMemberPopup-title": "Удалить участника?",
"rename": "Переименовать",
"rename-board": "Переименовать доску",
"restore": "Восстановить",
"save": "Сохранить",
"search": "Поиск",
+ "search-cards": "Искать в названиях и описаниях карточек на этой доске",
+ "search-example": "Искать текст?",
"select-color": "Выбрать цвет",
+ "set-wip-limit-value": "Устанавливает ограничение на максимальное количество задач в этом списке",
+ "setWipLimitPopup-title": "Задать лимит на кол-во задач",
"shortcut-assign-self": "Связать себя с текущей карточкой",
"shortcut-autocomplete-emoji": "Автозаполнение emoji",
- "shortcut-autocomplete-members": "Автозаполнение пользователей",
+ "shortcut-autocomplete-members": "Автозаполнение участников",
"shortcut-clear-filters": "Сбросить все фильтры",
"shortcut-close-dialog": "Закрыть диалог",
"shortcut-filter-my-cards": "Показать мои карточки",
@@ -326,31 +357,40 @@
"team": "Участники",
"this-board": "эту доску",
"this-card": "текущая карточка",
+ "spent-time-hours": "Затраченное время (в часах)",
+ "overtime-hours": "Переработка (в часах)",
+ "overtime": "Переработка",
+ "has-overtime-cards": "Имеются карточки с переработкой",
+ "has-spenttime-cards": "Имеются карточки с учетом затраченного времени",
"time": "Время",
"title": "Название",
"tracking": "Отслеживание",
- "tracking-info": "Вы будете уведомлены об любых изменениях в досках где вы создатель или пользователь.",
- "unassign-member": "Отменить назначение пользователя",
+ "tracking-info": "Вы будете уведомлены о любых изменениях в тех карточках, в которых вы являетесь создателем или участником.",
+ "unassign-member": "Отменить назначение участника",
"unsaved-description": "У вас есть несохраненное описание.",
"unwatch": "Перестать следить",
- "upload": "Загрзуить",
+ "upload": "Загрузить",
"upload-avatar": "Загрузить аватар",
"uploaded-avatar": "Загруженный аватар",
"username": "Имя пользователя",
"view-it": "Просмотреть",
- "warn-list-archived": "Внимание: Данная карточка находится в списке архива",
+ "warn-list-archived": "Внимание: Данная карточка находится в списке, который перемещен в Корзину",
"watch": "Следить",
"watching": "Отслеживается",
"watching-info": "Вы будете уведомлены об любых изменениях в этой доске.",
"welcome-board": "Приветственная Доска",
+ "welcome-swimlane": "Этап 1",
"welcome-list1": "Основы",
"welcome-list2": "Расширенно",
"what-to-do": "Что вы хотите сделать?",
+ "wipLimitErrorPopup-title": "Некорректный лимит на кол-во задач",
+ "wipLimitErrorPopup-dialog-pt1": "Количество задач в этом списке превышает установленный вами лимит",
+ "wipLimitErrorPopup-dialog-pt2": "Пожалуйста, перенесите некоторые задачи из этого списка или увеличьте лимит на кол-во задач",
"admin-panel": "Административная Панель",
"settings": "Настройки",
"people": "Люди",
"registration": "Регистрация",
- "disable-self-registration": "Отключить \"Само-Регистрацию\"",
+ "disable-self-registration": "Отключить самостоятельную регистрацию",
"invite": "Пригласить",
"invite-people": "Пригласить людей",
"to-boards": "В Доску(и)",
@@ -364,15 +404,18 @@
"smtp-password": "Пароль",
"smtp-tls": "поддержка TLS",
"send-from": "От",
+ "send-smtp-test": "Отправьте тестовое письмо себе",
"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Спасибо.",
+ "email-smtp-test-subject": "SMTP Тестовое письмо от Wekan",
+ "email-smtp-test-text": "Вы успешно отправили письмо",
"error-invitation-code-not-exist": "Код приглашения не существует",
"error-notAuthorized": "У вас нет доступа на просмотр этой страницы.",
"outgoing-webhooks": "Исходящие Веб-хуки",
"outgoingWebhooksPopup-title": "Исходящие Веб-хуки",
- "new-outgoing-webhook": "New Outgoing Webhook",
- "no-name": "(Unknown)",
+ "new-outgoing-webhook": "Новый исходящий Веб-хук",
+ "no-name": "(Неизвестный)",
"Wekan_version": "Версия Wekan",
"Node_version": "Версия NodeJS",
"OS_Arch": "Архитектура",
@@ -387,8 +430,18 @@
"hours": "часы",
"minutes": "минуты",
"seconds": "секунды",
- "yes": "Yes",
- "no": "No",
- "accounts": "Accounts",
- "accounts-allowEmailChange": "Allow Email Change"
+ "yes": "Да",
+ "no": "Нет",
+ "accounts": "Учетные записи",
+ "accounts-allowEmailChange": "Разрешить изменение электронной почты",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Создано на",
+ "verified": "Проверено",
+ "active": "Действующий",
+ "card-received": "Получено",
+ "card-received-on": "Получено с",
+ "card-end": "Дата окончания",
+ "card-end-on": "Завершится до",
+ "editCardReceivedDatePopup-title": "Изменить дату получения",
+ "editCardEndDatePopup-title": "Изменить дату завершения"
} \ No newline at end of file
diff --git a/i18n/sr.i18n.json b/i18n/sr.i18n.json
index 01b83edb..14475751 100644
--- a/i18n/sr.i18n.json
+++ b/i18n/sr.i18n.json
@@ -9,9 +9,10 @@
"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-archivedBoard": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
"act-importBoard": "imported __board__",
"act-importCard": "imported __card__",
"act-importList": "imported __list__",
@@ -26,7 +27,7 @@
"activities": "Aktivnosti",
"activity": "Aktivnost",
"activity-added": "dodao %s u %s",
- "activity-archived": "arhivirao %s",
+ "activity-archived": "%s moved to Recycle Bin",
"activity-attached": "prikačio %s u %s",
"activity-created": "kreirao %s",
"activity-excluded": "izuzmi %s iz %s",
@@ -44,6 +45,7 @@
"add-attachment": "Add Attachment",
"add-board": "Add Board",
"add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Add Checklist",
"add-checklist-item": "Dodaj novu stavku u listu",
"add-cover": "Dodaj zaglavlje",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "Članovi",
"admin": "Administrator",
"admin-desc": "Može da pregleda i menja kartice, uklanja članove i menja podešavanja table",
+ "admin-announcement": "Announcement",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Announcement from Administrator",
"all-boards": "Sve table",
"and-n-other-card": "And __count__ other card",
"and-n-other-card_plural": "And __count__ other cards",
"apply": "Primeni",
"app-is-offline": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
- "archive": "Arhiviraj",
- "archive-all": "Arhiviraj sve",
- "archive-board": "Arhiviraj tablu",
- "archive-card": "Arhiviraj karticu",
- "archive-list": "Archive List",
- "archive-selection": "Arhiviraj izabrano",
- "archiveBoardPopup-title": "Da arhiviram tablu ?",
- "archived-items": "Arhivirane stavke",
- "archived-boards": "Archived Boards",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
"restore-board": "Restore Board",
- "no-archived-boards": "No Archived Boards.",
- "archives": "Arhive",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
"assign-member": "Dodeli člana",
"attached": "Prikačeno",
"attachment": "Prikačeni dokument",
@@ -91,15 +97,19 @@
"boardChangeWatchPopup-title": "Change Watch",
"boardMenuPopup-title": "Meni table",
"boards": "Table",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Lists",
"bucket-example": "Na primer \"Lista zadataka\"",
"cancel": "Otkaži",
- "card-archived": "Ova kartica je arhivirana",
+ "card-archived": "This card is moved to Recycle Bin.",
"card-comments-title": "Ova kartica ima %s komentar.",
"card-delete-notice": "Brisanje je trajno. Izgubićeš sve akcije povezane sa ovom karticom.",
"card-delete-pop": "Sve akcije će biti uklonjene sa liste aktivnosti i kartica neće moći biti ponovo otvorena. Nema vraćanja unazad.",
- "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.",
+ "card-delete-suggest-archive": "You can move a card Recycle Bin to remove it from the board and preserve the activity.",
"card-due": "Krajnji datum",
"card-due-on": "Završava se",
+ "card-spent": "Spent Time",
"card-edit-attachments": "Uredi priloge",
"card-edit-labels": "Uredi natpise",
"card-edit-members": "Uredi članove",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "Članovi",
"cardMorePopup-title": "More",
"cards": "Cards",
+ "cards-count": "Cards",
"change": "Change",
"change-avatar": "Change Avatar",
"change-password": "Change Password",
@@ -130,7 +141,7 @@
"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.",
+ "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
"color-black": "black",
"color-blue": "blue",
"color-green": "green",
@@ -146,8 +157,12 @@
"comment-only": "Comment only",
"comment-only-desc": "Can comment on cards only.",
"computer": "Computer",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
"copy-card-link-to-clipboard": "Copy card link to clipboard",
"copyCardPopup-title": "Copy Card",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
"create": "Create",
"createBoardPopup-title": "Create Board",
"chooseBoardSourcePopup-title": "Import board",
@@ -167,8 +182,11 @@
"edit": "Edit",
"edit-avatar": "Change Avatar",
"edit-profile": "Edit Profile",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
"editCardStartDatePopup-title": "Izmeni početni datum",
"editCardDueDatePopup-title": "Izmeni krajnji datum",
+ "editCardSpentTimePopup-title": "Change spent time",
"editLabelPopup-title": "Change Label",
"editNotificationPopup-title": "Izmeni notifikaciju",
"editProfilePopup-title": "Edit Profile",
@@ -176,6 +194,7 @@
"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-fail-text": "Error trying to send email",
"email-invalid": "Invalid email",
"email-invite": "Invite via Email",
"email-invite-subject": "__inviter__ sent you an invitation",
@@ -185,6 +204,7 @@
"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.",
+ "enable-wip-limit": "Enable WIP Limit",
"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",
@@ -229,6 +249,8 @@
"info": "Version",
"initials": "Initials",
"invalid-date": "Neispravan datum",
+ "invalid-time": "Invalid time",
+ "invalid-user": "Invalid user",
"joined": "joined",
"just-invited": "You are just invited to this board",
"keyboard-shortcuts": "Keyboard shortcuts",
@@ -239,18 +261,22 @@
"language": "Language",
"last-admin-desc": "You can’t change roles because there must be at least one admin.",
"leave-board": "Leave Board",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "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-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
"list-move-cards": "Move all cards in this list",
"list-select-cards": "Select all cards in this list",
"listActionPopup-title": "List Actions",
+ "swimlaneActionPopup-title": "Swimlane 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.",
+ "list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve the activity.",
"lists": "Lists",
+ "swimlanes": "Swimlanes",
"log-out": "Log Out",
"log-in": "Log In",
"loginPopup-title": "Log In",
@@ -268,8 +294,9 @@
"muted-info": "Nećete biti obavešteni o promenama u ovoj tabli",
"my-boards": "My Boards",
"name": "Name",
- "no-archived-cards": "No archived cards.",
- "no-archived-lists": "No archived lists.",
+ "no-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
"no-results": "Nema rezultata",
"normal": "Normalno",
"normal-desc": "Can view and edit cards. Can't change settings.",
@@ -305,7 +332,11 @@
"restore": "Oporavi",
"save": "Snimi",
"search": "Pretraga",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text to search for?",
"select-color": "Select Color",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
"shortcut-assign-self": "Pridruži sebe trenutnoj kartici",
"shortcut-autocomplete-emoji": "Autocomplete emoji",
"shortcut-autocomplete-members": "Sam popuni članove",
@@ -326,6 +357,11 @@
"team": "Tim",
"this-board": "ova tabla",
"this-card": "ova kartica",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Vreme",
"title": "Naslov",
"tracking": "Praćenje",
@@ -338,14 +374,18 @@
"uploaded-avatar": "Uploaded an avatar",
"username": "Korisničko ime",
"view-it": "Pregledaj je",
- "warn-list-archived": "upozorenje: ova kartica je u arhiviranoj listi",
+ "warn-list-archived": "warning: this card is in an list at Recycle Bin",
"watch": "Posmatraj",
"watching": "Posmatranje",
"watching-info": "Bićete obavešteni o promenama u ovoj tabli",
"welcome-board": "Tabla dobrodošlice",
+ "welcome-swimlane": "Milestone 1",
"welcome-list1": "Osnove",
"welcome-list2": "Napredno",
"what-to-do": "Šta želiš da uradiš ?",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
"admin-panel": "Admin Panel",
"settings": "Settings",
"people": "People",
@@ -364,9 +404,12 @@
"smtp-password": "Lozinka",
"smtp-tls": "TLS support",
"send-from": "From",
+ "send-smtp-test": "Send a test email to yourself",
"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.",
+ "email-smtp-test-subject": "SMTP Test Email From Wekan",
+ "email-smtp-test-text": "You have successfully sent an email",
"error-invitation-code-not-exist": "Invitation code doesn't exist",
"error-notAuthorized": "You are not authorized to view this page.",
"outgoing-webhooks": "Outgoing Webhooks",
@@ -390,5 +433,15 @@
"yes": "Yes",
"no": "No",
"accounts": "Accounts",
- "accounts-allowEmailChange": "Allow Email Change"
+ "accounts-allowEmailChange": "Allow Email Change",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Created at",
+ "verified": "Verified",
+ "active": "Active",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
} \ No newline at end of file
diff --git a/i18n/sv.i18n.json b/i18n/sv.i18n.json
index 180e6f58..4cc2d987 100644
--- a/i18n/sv.i18n.json
+++ b/i18n/sv.i18n.json
@@ -2,16 +2,17 @@
"accept": "Acceptera",
"act-activity-notify": "[Wekan] Aktivitetsavisering",
"act-addAttachment": "bifogade __attachment__ to __card__",
- "act-addChecklist": "added checklist __checklist__ to __card__",
- "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
+ "act-addChecklist": "lade till checklist __checklist__ till __card__",
+ "act-addChecklistItem": "lade till __checklistItem__ till checklistan __checklist__ on __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-archivedBoard": "__board__ flyttad till papperskorgen",
+ "act-archivedCard": "__card__ flyttad till papperskorgen",
+ "act-archivedList": "__list__ flyttad till papperskorgen",
+ "act-archivedSwimlane": "__swimlane__ flyttad till papperskorgen",
"act-importBoard": "importerade __board__",
"act-importCard": "importerade __card__",
"act-importList": "importerade __list__",
@@ -26,7 +27,7 @@
"activities": "Aktiviteter",
"activity": "Aktivitet",
"activity-added": "Lade %s till %s",
- "activity-archived": "arkiverade %s",
+ "activity-archived": "%s flyttad till papperskorgen",
"activity-attached": "bifogade %s to %s",
"activity-created": "skapade %s",
"activity-excluded": "exkluderade %s från %s",
@@ -44,6 +45,7 @@
"add-attachment": "Lägg till bilaga",
"add-board": "Lägg till anslagstavla",
"add-card": "Lägg till kort",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Lägg till checklista",
"add-checklist-item": "Lägg till ett objekt till kontrollista",
"add-cover": "Lägg till omslag",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "Medlemmar",
"admin": "Adminstratör",
"admin-desc": "Kan visa och redigera kort, ta bort medlemmar och ändra inställningarna för anslagstavlan.",
+ "admin-announcement": "Meddelande",
+ "admin-announcement-active": "Aktivt system-brett meddelande",
+ "admin-announcement-title": "Meddelande från administratör",
"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": "Wekan laddar, vänta. Uppdatering av sidan kommer att leda till förlust av data. Om Wekan inte laddas, kontrollera att Wekan-servern inte har stoppats.",
- "archive": "Arkivera",
- "archive-all": "Arkivera",
- "archive-board": "Arkiverad anslagstavla",
- "archive-card": "Arkivera kort",
- "archive-list": "Arkivera lista",
- "archive-selection": "Arkivera val",
- "archiveBoardPopup-title": "Arkivera anslagstavla?",
- "archived-items": "Arkivera objekt",
- "archived-boards": "Arkiverade anslagstavlor",
+ "archive": "Flytta till papperskorgen",
+ "archive-all": "Flytta alla till papperskorgen",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Papperskorgen",
+ "archived-boards": "Boards in Recycle Bin",
"restore-board": "Återställ anslagstavla",
- "no-archived-boards": "Ingen arkiverad anslagstavla",
- "archives": "Arkiv",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Papperskorgen",
"assign-member": "Tilldela medlem",
"attached": "bifogad",
"attachment": "Bilaga",
@@ -91,15 +97,19 @@
"boardChangeWatchPopup-title": "Ändra bevaka",
"boardMenuPopup-title": "Anslagstavla meny",
"boards": "Anslagstavlor",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Listor",
"bucket-example": "Gilla \"att-göra-innan-jag-dör-lista\" till exempel",
"cancel": "Avbryt",
- "card-archived": "Detta kort är arkiverat.",
+ "card-archived": "Detta kort flyttas till papperskorgen.",
"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-delete-suggest-archive": "You can move a card Recycle Bin to remove it from the board and preserve the activity.",
"card-due": "Förfaller",
"card-due-on": "Förfaller på",
+ "card-spent": "Spenderad tid",
"card-edit-attachments": "Redigera bilaga",
"card-edit-labels": "Redigera etiketter",
"card-edit-members": "Redigera medlemmar",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "Medlemmar",
"cardMorePopup-title": "Mera",
"cards": "Kort",
+ "cards-count": "Kort",
"change": "Ändra",
"change-avatar": "Ändra avatar",
"change-password": "Ändra lösenord",
@@ -130,7 +141,7 @@
"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.",
+ "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
"color-black": "svart",
"color-blue": "blå",
"color-green": "grön",
@@ -146,8 +157,12 @@
"comment-only": "Kommentera endast",
"comment-only-desc": "Kan endast kommentera kort.",
"computer": "Dator",
+ "confirm-checklist-delete-dialog": "Är du säker på att du vill ta bort checklista",
"copy-card-link-to-clipboard": "Kopiera kortlänk till urklipp",
"copyCardPopup-title": "Kopiera kort",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
"create": "Skapa",
"createBoardPopup-title": "Skapa anslagstavla",
"chooseBoardSourcePopup-title": "Importera anslagstavla",
@@ -167,8 +182,11 @@
"edit": "Redigera",
"edit-avatar": "Ändra avatar",
"edit-profile": "Redigera profil",
+ "edit-wip-limit": "Redigera WIP-gränsen",
+ "soft-wip-limit": "Mjuk WIP-gräns",
"editCardStartDatePopup-title": "Ändra startdatum",
"editCardDueDatePopup-title": "Ändra förfallodatum",
+ "editCardSpentTimePopup-title": "Ändra spenderad tid",
"editLabelPopup-title": "Ändra etikett",
"editNotificationPopup-title": "Redigera avisering",
"editProfilePopup-title": "Redigera profil",
@@ -176,6 +194,7 @@
"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-fail-text": "Ett fel vid försök att skicka e-post",
"email-invalid": "Ogiltig e-post",
"email-invite": "Bjud in via e-post",
"email-invite-subject": "__inviter__ skickade dig en inbjudan",
@@ -185,6 +204,7 @@
"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.",
+ "enable-wip-limit": "Aktivera WIP-gräns",
"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",
@@ -229,6 +249,8 @@
"info": "Version",
"initials": "Initialer ",
"invalid-date": "Ogiltigt datum",
+ "invalid-time": "Ogiltig tid",
+ "invalid-user": "Ogiltig användare",
"joined": "gick med",
"just-invited": "Du blev nyss inbjuden till denna anslagstavla",
"keyboard-shortcuts": "Tangentbordsgenvägar",
@@ -239,18 +261,22 @@
"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",
+ "leave-board-pop": "Är du säker på att du vill lämna __boardTitle__? Du kommer att tas bort från alla kort på den här anslagstavlan.",
+ "leaveBoardPopup-title": "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-archive-cards": "Flytta alla kort i den här listan till papperskorgen",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
"list-move-cards": "Flytta alla kort i denna lista",
"list-select-cards": "Välj alla kort i denna lista",
"listActionPopup-title": "Liståtgärder",
+ "swimlaneActionPopup-title": "Swimlane Actions",
"listImportCardPopup-title": "Importera ett Trello kort",
"listMorePopup-title": "Mera",
"link-list": "Länk till den här listan",
"list-delete-pop": "Alla åtgärder kommer att tas bort från aktivitetsmatningen och du kommer inte att kunna återställa listan. Det går inte att ångra.",
- "list-delete-suggest-archive": "Du kan arkivera en lista för att ta bort den från anslagstavlan och bevara aktiviteten.",
+ "list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve the activity.",
"lists": "Listor",
+ "swimlanes": "Swimlanes",
"log-out": "Logga ut",
"log-in": "Logga in",
"loginPopup-title": "Logga in",
@@ -268,8 +294,9 @@
"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-archived-cards": "Inga kort i papperskorgen.",
+ "no-archived-lists": "Inga listor i papperskorgen.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
"no-results": "Inga reslutat",
"normal": "Normal",
"normal-desc": "Kan se och redigera kort. Kan inte ändra inställningar.",
@@ -305,7 +332,11 @@
"restore": "Återställ",
"save": "Spara",
"search": "Sök",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text att söka efter?",
"select-color": "Välj färg",
+ "set-wip-limit-value": "Ange en gräns för det maximala antalet uppgifter i den här listan",
+ "setWipLimitPopup-title": "Ställ in WIP-gräns",
"shortcut-assign-self": "Tilldela dig nuvarande kort",
"shortcut-autocomplete-emoji": "Komplettera automatiskt emoji",
"shortcut-autocomplete-members": "Komplettera automatiskt medlemmar",
@@ -326,6 +357,11 @@
"team": "Grupp",
"this-board": "denna anslagstavla",
"this-card": "detta kort",
+ "spent-time-hours": "Spenderad tid (timmar)",
+ "overtime-hours": "Övertid (timmar)",
+ "overtime": "Övertid",
+ "has-overtime-cards": "Har övertidskort",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Tid",
"title": "Titel",
"tracking": "Spårning",
@@ -338,14 +374,18 @@
"uploaded-avatar": "Laddade upp en avatar",
"username": "Änvandarnamn",
"view-it": "Visa det",
- "warn-list-archived": "varning: detta kort är en arkiverad lista",
+ "warn-list-archived": "warning: this card is in an list at Recycle Bin",
"watch": "Bevaka",
"watching": "Bevakar",
"watching-info": "Du kommer att meddelas om alla ändringar på denna anslagstavla",
"welcome-board": "Välkomstanslagstavla",
+ "welcome-swimlane": "Milstolpe 1",
"welcome-list1": "Grunderna",
"welcome-list2": "Avancerad",
"what-to-do": "Vad vill du göra?",
+ "wipLimitErrorPopup-title": "Ogiltig WIP-gräns",
+ "wipLimitErrorPopup-dialog-pt1": "Antalet uppgifter i den här listan är högre än WIP-gränsen du har definierat.",
+ "wipLimitErrorPopup-dialog-pt2": "Flytta några uppgifter ur listan, eller ställ in en högre WIP-gräns.",
"admin-panel": "Administratörspanel ",
"settings": "Inställningar",
"people": "Personer",
@@ -364,9 +404,12 @@
"smtp-password": "Lösenord",
"smtp-tls": "TLS-stöd",
"send-from": "Från",
+ "send-smtp-test": "Skicka ett prov e-postmeddelande till dig själv",
"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.",
+ "email-smtp-test-subject": "SMTP-prov e-post från Wekan",
+ "email-smtp-test-text": "Du har skickat ett e-postmeddelande",
"error-invitation-code-not-exist": "Inbjudningskod finns inte",
"error-notAuthorized": "Du är inte behörig att se den här sidan.",
"outgoing-webhooks": "Outgoing Webhooks",
@@ -390,5 +433,15 @@
"yes": "Ja",
"no": "Nej",
"accounts": "Konton",
- "accounts-allowEmailChange": "Tillåt e-poständring"
+ "accounts-allowEmailChange": "Tillåt e-poständring",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Skapad vid",
+ "verified": "Verifierad",
+ "active": "Aktiv",
+ "card-received": "Mottagen",
+ "card-received-on": "Received on",
+ "card-end": "Slut",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Ändra mottagningsdatum",
+ "editCardEndDatePopup-title": "Ändra slutdatum"
} \ No newline at end of file
diff --git a/i18n/ta.i18n.json b/i18n/ta.i18n.json
index a1f81080..d4cf4d88 100644
--- a/i18n/ta.i18n.json
+++ b/i18n/ta.i18n.json
@@ -9,9 +9,10 @@
"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-archivedBoard": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
"act-importBoard": "imported __board__",
"act-importCard": "imported __card__",
"act-importList": "imported __list__",
@@ -26,7 +27,7 @@
"activities": "Activities",
"activity": "Activity",
"activity-added": "added %s to %s",
- "activity-archived": "archived %s",
+ "activity-archived": "%s moved to Recycle Bin",
"activity-attached": "attached %s to %s",
"activity-created": "created %s",
"activity-excluded": "excluded %s from %s",
@@ -44,6 +45,7 @@
"add-attachment": "Add Attachment",
"add-board": "Add Board",
"add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Add Checklist",
"add-checklist-item": "Add an item to checklist",
"add-cover": "Add Cover",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "Members",
"admin": "Admin",
"admin-desc": "Can view and edit cards, remove members, and change settings for the board.",
+ "admin-announcement": "Announcement",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Announcement from Administrator",
"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": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
- "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",
- "archived-boards": "Archived Boards",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
"restore-board": "Restore Board",
- "no-archived-boards": "No Archived Boards.",
- "archives": "Archives",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
"assign-member": "Assign member",
"attached": "attached",
"attachment": "Attachment",
@@ -91,15 +97,19 @@
"boardChangeWatchPopup-title": "Change Watch",
"boardMenuPopup-title": "Board Menu",
"boards": "Boards",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Lists",
"bucket-example": "Like “Bucket List” for example",
"cancel": "Cancel",
- "card-archived": "This card is archived.",
+ "card-archived": "This card is moved to Recycle Bin.",
"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-delete-suggest-archive": "You can move a card Recycle Bin to remove it from the board and preserve the activity.",
"card-due": "Due",
"card-due-on": "Due on",
+ "card-spent": "Spent Time",
"card-edit-attachments": "Edit attachments",
"card-edit-labels": "Edit labels",
"card-edit-members": "Edit members",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "Members",
"cardMorePopup-title": "More",
"cards": "Cards",
+ "cards-count": "Cards",
"change": "Change",
"change-avatar": "Change Avatar",
"change-password": "Change Password",
@@ -130,7 +141,7 @@
"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.",
+ "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
"color-black": "black",
"color-blue": "blue",
"color-green": "green",
@@ -146,8 +157,12 @@
"comment-only": "Comment only",
"comment-only-desc": "Can comment on cards only.",
"computer": "Computer",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
"copy-card-link-to-clipboard": "Copy card link to clipboard",
"copyCardPopup-title": "Copy Card",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
"create": "Create",
"createBoardPopup-title": "Create Board",
"chooseBoardSourcePopup-title": "Import board",
@@ -167,8 +182,11 @@
"edit": "Edit",
"edit-avatar": "Change Avatar",
"edit-profile": "Edit Profile",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
"editCardStartDatePopup-title": "Change start date",
"editCardDueDatePopup-title": "Change due date",
+ "editCardSpentTimePopup-title": "Change spent time",
"editLabelPopup-title": "Change Label",
"editNotificationPopup-title": "Edit Notification",
"editProfilePopup-title": "Edit Profile",
@@ -176,6 +194,7 @@
"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-fail-text": "Error trying to send email",
"email-invalid": "Invalid email",
"email-invite": "Invite via Email",
"email-invite-subject": "__inviter__ sent you an invitation",
@@ -185,6 +204,7 @@
"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.",
+ "enable-wip-limit": "Enable WIP Limit",
"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",
@@ -229,6 +249,8 @@
"info": "Version",
"initials": "Initials",
"invalid-date": "Invalid date",
+ "invalid-time": "Invalid time",
+ "invalid-user": "Invalid user",
"joined": "joined",
"just-invited": "You are just invited to this board",
"keyboard-shortcuts": "Keyboard shortcuts",
@@ -239,18 +261,22 @@
"language": "Language",
"last-admin-desc": "You can’t change roles because there must be at least one admin.",
"leave-board": "Leave Board",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "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-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
"list-move-cards": "Move all cards in this list",
"list-select-cards": "Select all cards in this list",
"listActionPopup-title": "List Actions",
+ "swimlaneActionPopup-title": "Swimlane 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.",
+ "list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve the activity.",
"lists": "Lists",
+ "swimlanes": "Swimlanes",
"log-out": "Log Out",
"log-in": "Log In",
"loginPopup-title": "Log In",
@@ -268,8 +294,9 @@
"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-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
"no-results": "No results",
"normal": "Normal",
"normal-desc": "Can view and edit cards. Can't change settings.",
@@ -305,7 +332,11 @@
"restore": "Restore",
"save": "Save",
"search": "Search",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text to search for?",
"select-color": "Select Color",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
"shortcut-assign-self": "Assign yourself to current card",
"shortcut-autocomplete-emoji": "Autocomplete emoji",
"shortcut-autocomplete-members": "Autocomplete members",
@@ -326,6 +357,11 @@
"team": "Team",
"this-board": "this board",
"this-card": "this card",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"tracking": "Tracking",
@@ -338,14 +374,18 @@
"uploaded-avatar": "Uploaded an avatar",
"username": "Username",
"view-it": "View it",
- "warn-list-archived": "warning: this card is in an archived list",
+ "warn-list-archived": "warning: this card is in an list at Recycle Bin",
"watch": "Watch",
"watching": "Watching",
"watching-info": "You will be notified of any change in this board",
"welcome-board": "Welcome Board",
+ "welcome-swimlane": "Milestone 1",
"welcome-list1": "Basics",
"welcome-list2": "Advanced",
"what-to-do": "What do you want to do?",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
"admin-panel": "Admin Panel",
"settings": "Settings",
"people": "People",
@@ -364,9 +404,12 @@
"smtp-password": "Password",
"smtp-tls": "TLS support",
"send-from": "From",
+ "send-smtp-test": "Send a test email to yourself",
"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.",
+ "email-smtp-test-subject": "SMTP Test Email From Wekan",
+ "email-smtp-test-text": "You have successfully sent an email",
"error-invitation-code-not-exist": "Invitation code doesn't exist",
"error-notAuthorized": "You are not authorized to view this page.",
"outgoing-webhooks": "Outgoing Webhooks",
@@ -390,5 +433,15 @@
"yes": "Yes",
"no": "No",
"accounts": "Accounts",
- "accounts-allowEmailChange": "Allow Email Change"
+ "accounts-allowEmailChange": "Allow Email Change",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Created at",
+ "verified": "Verified",
+ "active": "Active",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
} \ No newline at end of file
diff --git a/i18n/th.i18n.json b/i18n/th.i18n.json
index a5cee692..7cae51e4 100644
--- a/i18n/th.i18n.json
+++ b/i18n/th.i18n.json
@@ -9,9 +9,10 @@
"act-createCard": "เพิ่ม __card__ ไปยัง __list__",
"act-createList": "เพิ่ม __list__ ไปยัง __board__",
"act-addBoardMember": "เพิ่ม __member__ ไปยัง __board__",
- "act-archivedBoard": "เก็บ __board__ ไว้",
- "act-archivedCard": "เก็บ __card__ ไว้",
- "act-archivedList": "เก็บ __list__ ไว้",
+ "act-archivedBoard": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
"act-importBoard": "นำเข้า __board__",
"act-importCard": "นำเข้า __card__",
"act-importList": "นำเข้า __list__",
@@ -26,7 +27,7 @@
"activities": "กิจกรรม",
"activity": "กิจกรรม",
"activity-added": "เพิ่ม %s ไปยัง %s",
- "activity-archived": "เก็บ %s ไว้",
+ "activity-archived": "%s moved to Recycle Bin",
"activity-attached": "แนบ %s ไปยัง %s",
"activity-created": "สร้าง %s",
"activity-excluded": "ยกเว้น %s จาก %s",
@@ -44,6 +45,7 @@
"add-attachment": "Add Attachment",
"add-board": "Add Board",
"add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Add Checklist",
"add-checklist-item": "เพิ่มรายการตรวจสอบ",
"add-cover": "เพิ่มหน้าปก",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "สมาชิก",
"admin": "ผู้ดูแลระบบ",
"admin-desc": "สามารถดูและแก้ไขการ์ด ลบสมาชิก และเปลี่ยนการตั้งค่าบอร์ดได้",
+ "admin-announcement": "Announcement",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Announcement from Administrator",
"all-boards": "บอร์ดทั้งหมด",
"and-n-other-card": "และการ์ดอื่น __count__",
"and-n-other-card_plural": "และการ์ดอื่น ๆ __count__",
"apply": "นำมาใช้",
"app-is-offline": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
- "archive": "เอกสารที่เก็บไว้",
- "archive-all": "เอกสารที่เก็บไว้ทั้งหมด",
- "archive-board": "เอกสารบอร์ดที่เก็บไว้",
- "archive-card": "เอกสารการ์ดที่เก็บไว้",
- "archive-list": "Archive List",
- "archive-selection": "คัดเลือกเอกสาร",
- "archiveBoardPopup-title": "เก็บบอร์ดนี้หรือไม่",
- "archived-items": "เก็บไว้ถาวร",
- "archived-boards": "Archived Boards",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
"restore-board": "Restore Board",
- "no-archived-boards": "No Archived Boards.",
- "archives": "เอกสารสำคัญ",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
"assign-member": "กำหนดสมาชิก",
"attached": "แนบมาด้วย",
"attachment": "สิ่งที่แนบมา",
@@ -91,15 +97,19 @@
"boardChangeWatchPopup-title": "เปลี่ยนการเฝ้าดู",
"boardMenuPopup-title": "เมนูบอร์ด",
"boards": "บอร์ด",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "รายการ",
"bucket-example": "ตัวอย่างเช่น “ระบบที่ต้องทำ”",
"cancel": "ยกเลิก",
- "card-archived": "การ์ดนี้ถูกเก็บไว้",
+ "card-archived": "This card is moved to Recycle Bin.",
"card-comments-title": "การ์ดนี้มี %s ความเห็น.",
"card-delete-notice": "เป็นการลบถาวร คุณจะสูญเสียข้อมูลที่เกี่ยวข้องกับการ์ดนี้ทั้งหมด",
"card-delete-pop": "การดำเนินการทั้งหมดจะถูกลบจาก feed กิจกรรมและคุณไม่สามารถเปิดได้อีกครั้งหรือยกเลิกการทำ",
- "card-delete-suggest-archive": "คุณสามารถเก็บการ์ดที่จะเอาออกจากบอร์ดนี้และยังคงเก็บกิจกรรม",
+ "card-delete-suggest-archive": "You can move a card Recycle Bin to remove it from the board and preserve the activity.",
"card-due": "ครบกำหนด",
"card-due-on": "ครบกำหนดเมื่อ",
+ "card-spent": "Spent Time",
"card-edit-attachments": "แก้ไขสิ่งที่แนบมา",
"card-edit-labels": "แก้ไขป้ายกำกับ",
"card-edit-members": "แก้ไขสมาชิก",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "สมาชิก",
"cardMorePopup-title": "เพิ่มเติม",
"cards": "การ์ด",
+ "cards-count": "การ์ด",
"change": "เปลี่ยน",
"change-avatar": "เปลี่ยนภาพ",
"change-password": "เปลี่ยนรหัสผ่าน",
@@ -130,7 +141,7 @@
"clipboard": "Clipboard หรือลากและวาง",
"close": "ปิด",
"close-board": "ปิดบอร์ด",
- "close-board-pop": "คุณสามารถเรียกคืนบอร์ดนี้ด้วยการคลิกปุ่ม “เอกสารสำคัญ” เมนูหน้าแรก",
+ "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
"color-black": "ดำ",
"color-blue": "น้ำเงิน",
"color-green": "เขียว",
@@ -146,8 +157,12 @@
"comment-only": "Comment only",
"comment-only-desc": "Can comment on cards only.",
"computer": "คอมพิวเตอร์",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
"copy-card-link-to-clipboard": "Copy card link to clipboard",
"copyCardPopup-title": "Copy Card",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
"create": "สร้าง",
"createBoardPopup-title": "สร้างบอร์ด",
"chooseBoardSourcePopup-title": "Import board",
@@ -167,8 +182,11 @@
"edit": "แก้ไข",
"edit-avatar": "เปลี่ยนภาพ",
"edit-profile": "แก้ไขโปรไฟล์",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
"editCardStartDatePopup-title": "เปลี่ยนวันเริ่มต้น",
"editCardDueDatePopup-title": "เปลี่ยนวันครบกำหนด",
+ "editCardSpentTimePopup-title": "Change spent time",
"editLabelPopup-title": "เปลี่ยนป้ายกำกับ",
"editNotificationPopup-title": "แก้ไขการแจ้งเตือน",
"editProfilePopup-title": "แก้ไขโปรไฟล์",
@@ -176,6 +194,7 @@
"email-enrollAccount-subject": "บัญชีคุณถูกสร้างใน __siteName__",
"email-enrollAccount-text": "สวัสดี __user__,\n\nเริ่มใช้บริการง่าย ๆ , ด้วยการคลิกลิงค์ด้านล่าง.\n\n__url__\n\n ขอบคุณค่ะ",
"email-fail": "การส่งอีเมล์ล้มเหลว",
+ "email-fail-text": "Error trying to send email",
"email-invalid": "อีเมล์ไม่ถูกต้อง",
"email-invite": "เชิญผ่านทางอีเมล์",
"email-invite-subject": "__inviter__ ส่งคำเชิญให้คุณ",
@@ -185,6 +204,7 @@
"email-sent": "ส่งอีเมล์",
"email-verifyEmail-subject": "ยืนยันที่อยู่อีเม์ของคุณบน __siteName__",
"email-verifyEmail-text": "สวัสดี __user__,\n\nตรวจสอบบัญชีอีเมล์ของคุณ ง่าย ๆ ตามลิงค์ด้านล่าง \n\n__url__\n\n ขอบคุณค่ะ",
+ "enable-wip-limit": "Enable WIP Limit",
"error-board-doesNotExist": "บอร์ดนี้ไม่มีอยู่แล้ว",
"error-board-notAdmin": "คุณจะต้องเป็นผู้ดูแลระบบถึงจะทำสิ่งเหล่านี้ได้",
"error-board-notAMember": "คุณต้องเป็นสมาชิกของบอร์ดนี้ถึงจะทำได้",
@@ -229,6 +249,8 @@
"info": "Version",
"initials": "ชื่อย่อ",
"invalid-date": "วันที่ไม่ถูกต้อง",
+ "invalid-time": "Invalid time",
+ "invalid-user": "Invalid user",
"joined": "เข้าร่วม",
"just-invited": "คุณพึ่งได้รับเชิญบอร์ดนี้",
"keyboard-shortcuts": "แป้นพิมพ์ลัด",
@@ -239,18 +261,22 @@
"language": "ภาษา",
"last-admin-desc": "คุณไม่สามารถเปลี่ยนบทบาทเพราะต้องมีผู้ดูแลระบบหนึ่งคนเป็นอย่างน้อย",
"leave-board": "ทิ้งบอร์ด",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "Leave Board ?",
"link-card": "เชื่อมโยงไปยังการ์ดใบนี้",
- "list-archive-cards": "เก็บการ์ดทั้งหมดไว้ในรายการนี้",
- "list-archive-cards-pop": "ลบการ์ดทั้งหมดในบอร์ด มันจะถูกนำไปเก็บไว้ที่เอกสารสำคัญ สามารถนำกลับมาใหม่ได้ด้วยการคลิก “เมนูบอร์ด” > “เก็บไว้ถาวร”.",
+ "list-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
"list-move-cards": "ย้ายการ์ดทั้งหมดในรายการนี้",
"list-select-cards": "เลือกการ์ดทั้งหมดในรายการนี้",
"listActionPopup-title": "รายการการดำเนิน",
+ "swimlaneActionPopup-title": "Swimlane Actions",
"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.",
+ "list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve the activity.",
"lists": "รายการ",
+ "swimlanes": "Swimlanes",
"log-out": "ออกจากระบบ",
"log-in": "เข้าสู่ระบบ",
"loginPopup-title": "เข้าสู่ระบบ",
@@ -268,8 +294,9 @@
"muted-info": "คุณจะไม่ได้รับแจ้งการเปลี่ยนแปลงใด ๆ ในบอร์ดนี้",
"my-boards": "บอร์ดของฉัน",
"name": "ชื่อ",
- "no-archived-cards": "ไม่มีการ์ดที่ถูกเก็บ",
- "no-archived-lists": "ไม่มีรายการที่ถูกเก็บ",
+ "no-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
"no-results": "ไม่มีข้อมูล",
"normal": "ธรรมดา",
"normal-desc": "สามารถดูและแก้ไขการ์ดได้ แต่ไม่สามารถเปลี่ยนการตั้งค่าได้",
@@ -305,7 +332,11 @@
"restore": "กู้คืน",
"save": "บันทึก",
"search": "ค้นหา",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text to search for?",
"select-color": "Select Color",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
"shortcut-assign-self": "กำหนดตัวเองให้การ์ดนี้",
"shortcut-autocomplete-emoji": "เติม emoji อัตโนมัติ",
"shortcut-autocomplete-members": "เติมสมาชิกอัตโนมัติ",
@@ -326,6 +357,11 @@
"team": "ทีม",
"this-board": "บอร์ดนี้",
"this-card": "การ์ดนี้",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "เวลา",
"title": "หัวข้อ",
"tracking": "ติดตาม",
@@ -338,14 +374,18 @@
"uploaded-avatar": "ภาพอัพโหลดแล้ว",
"username": "ชื่อผู้ใช้งาน",
"view-it": "ดู",
- "warn-list-archived": "คำเตือน: การ์ดใบนี้อยู่ในรายชื่อที่เก็บไว้",
+ "warn-list-archived": "warning: this card is in an list at Recycle Bin",
"watch": "เฝ้าดู",
"watching": "เฝ้าดู",
"watching-info": "คุณจะได้รับแจ้งหากมีการเปลี่ยนแปลงใด ๆ ในบอร์ดนี้",
"welcome-board": "ยินดีต้อนรับสู่บอร์ด",
+ "welcome-swimlane": "Milestone 1",
"welcome-list1": "พื้นฐาน",
"welcome-list2": "ก้าวหน้า",
"what-to-do": "ต้องการทำอะไร",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
"admin-panel": "Admin Panel",
"settings": "Settings",
"people": "People",
@@ -364,9 +404,12 @@
"smtp-password": "รหัสผ่าน",
"smtp-tls": "TLS support",
"send-from": "From",
+ "send-smtp-test": "Send a test email to yourself",
"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.",
+ "email-smtp-test-subject": "SMTP Test Email From Wekan",
+ "email-smtp-test-text": "You have successfully sent an email",
"error-invitation-code-not-exist": "Invitation code doesn't exist",
"error-notAuthorized": "You are not authorized to view this page.",
"outgoing-webhooks": "Outgoing Webhooks",
@@ -390,5 +433,15 @@
"yes": "Yes",
"no": "No",
"accounts": "Accounts",
- "accounts-allowEmailChange": "Allow Email Change"
+ "accounts-allowEmailChange": "Allow Email Change",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Created at",
+ "verified": "Verified",
+ "active": "Active",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
} \ No newline at end of file
diff --git a/i18n/tr.i18n.json b/i18n/tr.i18n.json
index e64510b5..7f9cfd3d 100644
--- a/i18n/tr.i18n.json
+++ b/i18n/tr.i18n.json
@@ -2,19 +2,20 @@
"accept": "Kabul Et",
"act-activity-notify": "[Wekan] Etkinlik Bildirimi",
"act-addAttachment": "__card__ kartına __attachment__ dosyasını ekledi",
- "act-addChecklist": "added checklist __checklist__ to __card__",
- "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
+ "act-addChecklist": "__card__ kartında __checklist__ yapılacak listesini ekledi",
+ "act-addChecklistItem": "__checklistItem__ öğesini __card__ kartındaki __checklist__ yapılacak listesine ekledi",
"act-addComment": "__card__ kartına bir yorum bıraktı: __comment__",
"act-createBoard": "__board__ panosunu oluşturdu",
- "act-createCard": "__card__ kartını ___list__ listesine ekledi.",
+ "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-archivedBoard": "__board__ Geri Dönüşüm Kutusu'na taşındı",
+ "act-archivedCard": "__card__ Geri Dönüşüm Kutusu'na taşındı",
+ "act-archivedList": "__list__ Geri Dönüşüm Kutusu'na taşındı",
+ "act-archivedSwimlane": "__swimlane__ Geri Dönüşüm Kutusu'na taşındı",
+ "act-importBoard": "__board__ panosunu içe aktardı",
+ "act-importCard": "__card__ kartını içe aktardı",
+ "act-importList": "__list__ listesini içe 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ı",
@@ -26,7 +27,7 @@
"activities": "Etkinlikler",
"activity": "Etkinlik",
"activity-added": "%s içine %s ekledi",
- "activity-archived": "%s öğesini arşivledi",
+ "activity-archived": "%s Geri Dönüşüm Kutusu'na taşındı",
"activity-attached": "%s içine %s ekledi",
"activity-created": "%s öğesini oluşturdu",
"activity-excluded": "%s içinden %s çıkarttı",
@@ -44,6 +45,7 @@
"add-attachment": "Ek Ekle",
"add-board": "Pano Ekle",
"add-card": "Kart Ekle",
+ "add-swimlane": "Kulvar Ekle",
"add-checklist": "Yapılacak Listesi Ekle",
"add-checklist-item": "Yapılacak listesine yeni bir öğe ekle",
"add-cover": "Kapak resmi ekle",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "Üyeler",
"admin": "Yönetici",
"admin-desc": "Kartları görüntüleyebilir ve düzenleyebilir, üyeleri çıkarabilir ve pano ayarlarını değiştirebilir.",
+ "admin-announcement": "Duyuru",
+ "admin-announcement-active": "Tüm Sistemde Etkin Duyuru",
+ "admin-announcement-title": "Yöneticiden Duyuru",
"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": "Wekan yükleniyor, lütfen bekleyin. Sayfayı yenilemek veri kaybına sebep olabilir. Eğer Wekan yüklenmezse, lütfen Wekan sunucusunun çalıştığından emin olun.",
- "archive": "Arşivle",
- "archive-all": "Tümünü Arşivle",
- "archive-board": "Panoyu Arşivle",
- "archive-card": "Kartı Arşivle",
- "archive-list": "Listeyi Arşivle",
- "archive-selection": "Seçimi arşivle",
- "archiveBoardPopup-title": "Pano arşivlensin mi?",
- "archived-items": "Arşivlenmiş Öğeler",
- "archived-boards": "Arşivlenmiş Panolar",
+ "archive": "Geri Dönüşüm Kutusu'na taşı",
+ "archive-all": "Tümünü Geri Dönüşüm Kutusu'na taşı",
+ "archive-board": "Panoyu Geri Dönüşüm Kutusu'na taşı",
+ "archive-card": "Kartı Geri Dönüşüm Kutusu'na taşı",
+ "archive-list": "Listeyi Geri Dönüşüm Kutusu'na taşı",
+ "archive-swimlane": "Kulvarı Geri Dönüşüm Kutusu'na taşı",
+ "archive-selection": "Seçimi Geri Dönüşüm Kutusu'na taşı",
+ "archiveBoardPopup-title": "Panoyu Geri Dönüşüm Kutusu'na taşı",
+ "archived-items": "Geri Dönüşüm Kutusu",
+ "archived-boards": "Geri Dönüşüm Kutusu'ndaki panolar",
"restore-board": "Panoyu Geri Getir",
- "no-archived-boards": "Arşivlenmiş Pano Yok.",
- "archives": "Arşiv",
+ "no-archived-boards": "Geri Dönüşüm Kutusu'nda pano yok.",
+ "archives": "Geri Dönüşüm Kutusu",
"assign-member": "Üye ata",
"attached": "dosya(sı) eklendi",
"attachment": "Ek Dosya",
@@ -86,20 +92,24 @@
"board-private-info": "Bu pano <strong>gizli</strong> olacak.",
"board-public-info": "Bu pano <strong>genel</strong>e açılacaktır.",
"boardChangeColorPopup-title": "Pano arkaplan rengini değiştir",
- "boardChangeTitlePopup-title": "Pano Adı Değiştirme",
+ "boardChangeTitlePopup-title": "Panonun Adını Değiştir",
"boardChangeVisibilityPopup-title": "Görünebilirliği Değiştir",
"boardChangeWatchPopup-title": "İzleme Durumunu Değiştir",
"boardMenuPopup-title": "Pano menüsü",
"boards": "Panolar",
+ "board-view": "Pano Görünümü",
+ "board-view-swimlanes": "Kulvarlar",
+ "board-view-lists": "Listeler",
"bucket-example": "Örn: \"Marketten Alacaklarım\"",
"cancel": "İptal",
- "card-archived": "Bu kart arşivlendi.",
+ "card-archived": "Bu kart Geri Dönüşüm Kutusu'na taşındı",
"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": "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-delete-suggest-archive": "Kartları Geri Dönüşüm Kutusu'na taşıyarak panodan kaldırabilir ve içindeki aktiviteleri saklayabilirsiniz.",
"card-due": "Bitiş",
"card-due-on": "Bitiş tarihi:",
+ "card-spent": "Harcanan Zaman",
"card-edit-attachments": "Ek dosyasını düzenle",
"card-edit-labels": "Etiketleri düzenle",
"card-edit-members": "Üyeleri düzenle",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "Üyeler",
"cardMorePopup-title": "Daha",
"cards": "Kartlar",
+ "cards-count": "Kartlar",
"change": "Değiştir",
"change-avatar": "Avatar Değiştir",
"change-password": "Parola Değiştir",
@@ -130,7 +141,7 @@
"clipboard": "Yapıştır veya sürükleyip bırak",
"close": "Kapat",
"close-board": "Panoyu kapat",
- "close-board-pop": "Arşivlenen panoyu ana sayfada yer alan başlıktaki menüden \"Arşivler\" düğmesini tıklayarak geri getirebilirsiniz.",
+ "close-board-pop": "Silinen panoyu geri getirmek için menüden \"Geri Dönüşüm Kutusu\"'na tıklayabilirsiniz.",
"color-black": "siyah",
"color-blue": "mavi",
"color-green": "yeşil",
@@ -146,8 +157,12 @@
"comment-only": "Sadece yorum",
"comment-only-desc": "Sadece kartlara yorum yazabilir.",
"computer": "Bilgisayar",
+ "confirm-checklist-delete-dialog": "Yapılacak listesini silmek istediğinize emin misiniz",
"copy-card-link-to-clipboard": "Kartın linkini kopyala",
"copyCardPopup-title": "Kartı Kopyala",
+ "copyChecklistToManyCardsPopup-title": "Yapılacaklar Listesi şemasını birden çok karta kopyala",
+ "copyChecklistToManyCardsPopup-instructions": "Hedef Kart Başlıkları ve Açıklamaları bu JSON formatında",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"İlk kart başlığı\", \"description\":\"İlk kart açıklaması\"}, {\"title\":\"İkinci kart başlığı\",\"description\":\"İkinci kart açıklaması\"},{\"title\":\"Son kart başlığı\",\"description\":\"Son kart açıklaması\"} ]",
"create": "Oluştur",
"createBoardPopup-title": "Pano Oluşturma",
"chooseBoardSourcePopup-title": "Panoyu içe aktar",
@@ -167,8 +182,11 @@
"edit": "Düzenle",
"edit-avatar": "Avatar Değiştir",
"edit-profile": "Profili Düzenle",
+ "edit-wip-limit": "Devam Eden İş Sınırını Düzenle",
+ "soft-wip-limit": "Zayıf Devam Eden İş Sınırı",
"editCardStartDatePopup-title": "Başlangıç tarihini değiştir",
"editCardDueDatePopup-title": "Bitiş tarihini değiştir",
+ "editCardSpentTimePopup-title": "Harcanan zamanı değiştir",
"editLabelPopup-title": "Etiket Değiştir",
"editNotificationPopup-title": "Bildirimi değiştir",
"editProfilePopup-title": "Profili Düzenle",
@@ -176,6 +194,7 @@
"email-enrollAccount-subject": "Hesabınız __siteName__ üzerinde 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-fail-text": "E-Posta gönderilme çalışırken hata oluştu",
"email-invalid": "Geçersiz e-posta",
"email-invite": "E-posta ile davet et",
"email-invite-subject": "__inviter__ size bir davetiye gönderdi",
@@ -185,6 +204,7 @@
"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.",
+ "enable-wip-limit": "Devam Eden İş Sınırını Aç",
"error-board-doesNotExist": "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 panoya üye olmalısın.",
@@ -229,6 +249,8 @@
"info": "Sürüm",
"initials": "İlk Harfleri",
"invalid-date": "Geçersiz tarih",
+ "invalid-time": "Geçersiz zaman",
+ "invalid-user": "Geçersiz kullanıcı",
"joined": "katıldı",
"just-invited": "Bu panoya şimdi davet edildin.",
"keyboard-shortcuts": "Klavye kısayolları",
@@ -239,18 +261,22 @@
"language": "Dil",
"last-admin-desc": "En az bir yönetici olması gerektiğinden rolleri değiştiremezsiniz.",
"leave-board": "Panodan ayrıl",
+ "leave-board-pop": "__boardTitle__ panosundan ayrılmak istediğinize emin misiniz? Panodaki tüm kartlardan kaldırılacaksınız.",
+ "leaveBoardPopup-title": "Panodan ayrılmak istediğinize emin misiniz?",
"link-card": "Bu kartın bağlantısı",
- "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-archive-cards": "Listedeki tüm kartları Geri Dönüşüm Kutusu'na gönder",
+ "list-archive-cards-pop": "Bu işlem listedeki tüm kartları kaldıracak. Silinmiş kartları görüntülemek ve geri yüklemek için menüden Geri Dönüşüm Kutusu'na tıklayabilirsiniz.",
"list-move-cards": "Listedeki tüm kartları taşı",
"list-select-cards": "Listedeki tüm kartları seç",
"listActionPopup-title": "Liste İşlemleri",
+ "swimlaneActionPopup-title": "Kulvar İşlemleri",
"listImportCardPopup-title": "Bir Trello kartını içeri aktar",
"listMorePopup-title": "Daha",
"link-list": "Listeye doğrudan bağlantı",
"list-delete-pop": "Etkinlik akışınızdaki tüm eylemler geri kurtarılamaz şekilde kaldırılacak. Bu işlem geri alınamaz.",
- "list-delete-suggest-archive": "Bir listeyi etkinliklerini koruyarak panodan kaldırmak için arşivleyebilirsiniz.",
+ "list-delete-suggest-archive": "Bir listeyi Dönüşüm Kutusuna atarak panodan kaldırabilir, ancak eylemleri koruyarak saklayabilirsiniz. ",
"lists": "Listeler",
+ "swimlanes": "Kulvarlar",
"log-out": "Oturum Kapat",
"log-in": "Oturum Aç",
"loginPopup-title": "Oturum Aç",
@@ -268,8 +294,9 @@
"muted-info": "Bu panodaki hiçbir değişiklik hakkında bildirim almayacaksınız",
"my-boards": "Panolarım",
"name": "Adı",
- "no-archived-cards": "Arşivlenmiş kart bulunamadı.",
- "no-archived-lists": "Arşivlenmiş liste bulunamadı.",
+ "no-archived-cards": "Dönüşüm Kutusunda hiç kart yok.",
+ "no-archived-lists": "Dönüşüm Kutusunda hiç liste yok.",
+ "no-archived-swimlanes": "Dönüşüm Kutusunda hiç kulvar yok.",
"no-results": "Sonuç yok",
"normal": "Normal",
"normal-desc": "Kartları görüntüleyebilir ve düzenleyebilir. Ayarları değiştiremez.",
@@ -305,7 +332,11 @@
"restore": "Geri Getir",
"save": "Kaydet",
"search": "Arama",
+ "search-cards": "Bu tahta da ki kart başlıkları ve açıklamalarında arama yap",
+ "search-example": "Aranılacak metin?",
"select-color": "Renk Seç",
+ "set-wip-limit-value": "Bu listedeki en fazla öğe sayısı için bir sınır belirleyin",
+ "setWipLimitPopup-title": "Devam Eden İş Sınırı Belirle",
"shortcut-assign-self": "Kendini karta ata",
"shortcut-autocomplete-emoji": "Emojileri otomatik tamamla",
"shortcut-autocomplete-members": "Üye isimlerini otomatik tamamla",
@@ -326,6 +357,11 @@
"team": "Takım",
"this-board": "bu panoyu",
"this-card": "bu kart",
+ "spent-time-hours": "Harcanan zaman (saat)",
+ "overtime-hours": "Aşılan süre (saat)",
+ "overtime": "Aşılan süre",
+ "has-overtime-cards": "Süresi aşılmış kartlar",
+ "has-spenttime-cards": "Zaman geçirilmiş kartlar",
"time": "Zaman",
"title": "Başlık",
"tracking": "Takip",
@@ -338,14 +374,18 @@
"uploaded-avatar": "Avatar yüklendi",
"username": "Kullanıcı adı",
"view-it": "Görüntüle",
- "warn-list-archived": "dikkat: bu kart arşivlenmiş bir liste içinde",
+ "warn-list-archived": "uyarı: bu kart Dönüşüm Kutusundaki bir listede var",
"watch": "Takip Et",
"watching": "Takip Ediliyor",
"watching-info": "Bu pano hakkındaki tüm değişiklikler hakkında bildirim alacaksınız",
"welcome-board": "Hoş Geldiniz Panosu",
+ "welcome-swimlane": "Kilometre taşı",
"welcome-list1": "Temel",
"welcome-list2": "Gelişmiş",
"what-to-do": "Ne yapmak istiyorsunuz?",
+ "wipLimitErrorPopup-title": "Geçersiz Devam Eden İş Sınırı",
+ "wipLimitErrorPopup-dialog-pt1": "Bu listedeki iş sayısı belirlediğiniz sınırdan daha fazla.",
+ "wipLimitErrorPopup-dialog-pt2": "Lütfen bazı işleri bu listeden başka listeye taşıyın ya da devam eden iş sınırını yükseltin.",
"admin-panel": "Yönetici Paneli",
"settings": "Ayarlar",
"people": "Kullanıcılar",
@@ -364,9 +404,12 @@
"smtp-password": "Parola",
"smtp-tls": "TLS desteği",
"send-from": "Gönderen",
+ "send-smtp-test": "Kendinize deneme E-Postası gönderin",
"invitation-code": "Davetiye kodu",
"email-invite-register-subject": "__inviter__ size bir davetiye gönderdi",
"email-invite-register-text": "Sevgili __user__,\n\n__inviter__ sizi beraber ç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.",
+ "email-smtp-test-subject": "Wekan' dan SMTP E-Postası",
+ "email-smtp-test-text": "E-Posta başarıyla gönderildi",
"error-invitation-code-not-exist": "Davetiye kodu bulunamadı",
"error-notAuthorized": "Bu sayfayı görmek için yetkiniz yok.",
"outgoing-webhooks": "Dışarı giden bağlantılar",
@@ -376,19 +419,29 @@
"Wekan_version": "Wekan sürümü",
"Node_version": "Node sürümü",
"OS_Arch": "İşletim Sistemi Mimarisi",
- "OS_Cpus": "İS İşlemci Sayısı",
- "OS_Freemem": "İŞ Kullanılmayan Bellek",
- "OS_Loadavg": "İŞ Ortalama Yük",
- "OS_Platform": "İŞ Platformu",
+ "OS_Cpus": "İşletim Sistemi İşlemci Sayısı",
+ "OS_Freemem": "İşletim Sistemi Kullanılmayan Bellek",
+ "OS_Loadavg": "İşletim Sistemi Ortalama Yük",
+ "OS_Platform": "İşletim Sistemi Platformu",
"OS_Release": "İşletim Sistemi Sürümü",
- "OS_Totalmem": "İŞ Toplam Belleği",
- "OS_Type": "İŞ Tipi",
- "OS_Uptime": "İŞ Toplam Açık Kalınan Süre",
+ "OS_Totalmem": "İşletim Sistemi Toplam Belleği",
+ "OS_Type": "İşletim Sistemi Tipi",
+ "OS_Uptime": "İşletim Sistemi Toplam Açık Kalınan Süre",
"hours": "saat",
"minutes": "dakika",
"seconds": "saniye",
"yes": "Evet",
"no": "Hayır",
"accounts": "Hesaplar",
- "accounts-allowEmailChange": "E-posta Değiştirmeye İzin Ver"
+ "accounts-allowEmailChange": "E-posta Değiştirmeye İzin Ver",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Oluşturulma tarihi",
+ "verified": "Doğrulanmış",
+ "active": "Aktif",
+ "card-received": "Giriş",
+ "card-received-on": "Giriş zamanı",
+ "card-end": "Bitiş",
+ "card-end-on": "Bitiş zamanı",
+ "editCardReceivedDatePopup-title": "Giriş tarihini değiştir",
+ "editCardEndDatePopup-title": "Bitiş tarihini değiştir"
} \ No newline at end of file
diff --git a/i18n/uk.i18n.json b/i18n/uk.i18n.json
index 0da6ce1f..599ebf91 100644
--- a/i18n/uk.i18n.json
+++ b/i18n/uk.i18n.json
@@ -9,9 +9,10 @@
"act-createCard": "__card__ карта додана до __list__ листа",
"act-createList": "added __list__ to __board__",
"act-addBoardMember": "added __member__ to __board__",
- "act-archivedBoard": "archived __board__",
- "act-archivedCard": "__card__ заархівована",
- "act-archivedList": "archived __list__",
+ "act-archivedBoard": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
"act-importBoard": "imported __board__",
"act-importCard": "__card__ заімпортована",
"act-importList": "imported __list__",
@@ -26,7 +27,7 @@
"activities": "Діяльність",
"activity": "Активність",
"activity-added": "added %s to %s",
- "activity-archived": "archived %s",
+ "activity-archived": "%s moved to Recycle Bin",
"activity-attached": "attached %s to %s",
"activity-created": "created %s",
"activity-excluded": "excluded %s from %s",
@@ -44,6 +45,7 @@
"add-attachment": "Add Attachment",
"add-board": "Add Board",
"add-card": "Add Card",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Add Checklist",
"add-checklist-item": "Додати елемент в список",
"add-cover": "Додати обкладинку",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "Користувачі",
"admin": "Адмін",
"admin-desc": "Може переглядати і редагувати картки, відаляти учасників та змінювати налаштування для дошки.",
+ "admin-announcement": "Announcement",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Announcement from Administrator",
"all-boards": "Всі дошки",
"and-n-other-card": "та __count__ інших карток",
"and-n-other-card_plural": "та __count__ інших карток",
"apply": "Прийняти",
"app-is-offline": "Wekan is loading, please wait. Refreshing the page will cause data loss. If Wekan does not load, please check that Wekan server has not stopped.",
- "archive": "Архів",
- "archive-all": "Архівувати всі",
- "archive-board": "Архівувати Дошку",
- "archive-card": "Архівувати Картку",
- "archive-list": "Archive List",
- "archive-selection": "Архівувати виділення",
- "archiveBoardPopup-title": "Архівувати Дошку?",
- "archived-items": "Архівовані елементи",
- "archived-boards": "Archived Boards",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
"restore-board": "Restore Board",
- "no-archived-boards": "No Archived Boards.",
- "archives": "Archives",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
"assign-member": "Assign member",
"attached": "доданно",
"attachment": "Додаток",
@@ -91,15 +97,19 @@
"boardChangeWatchPopup-title": "Change Watch",
"boardMenuPopup-title": "Board Menu",
"boards": "Дошки",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Lists",
"bucket-example": "Like “Bucket List” for example",
"cancel": "Відміна",
- "card-archived": "This card is archived.",
+ "card-archived": "This card is moved to Recycle Bin.",
"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-delete-suggest-archive": "You can move a card Recycle Bin to remove it from the board and preserve the activity.",
"card-due": "Due",
"card-due-on": "Due on",
+ "card-spent": "Spent Time",
"card-edit-attachments": "Edit attachments",
"card-edit-labels": "Edit labels",
"card-edit-members": "Edit members",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "Користувачі",
"cardMorePopup-title": "More",
"cards": "Cards",
+ "cards-count": "Cards",
"change": "Change",
"change-avatar": "Change Avatar",
"change-password": "Change Password",
@@ -130,7 +141,7 @@
"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.",
+ "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
"color-black": "black",
"color-blue": "blue",
"color-green": "green",
@@ -146,8 +157,12 @@
"comment-only": "Comment only",
"comment-only-desc": "Can comment on cards only.",
"computer": "Computer",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
"copy-card-link-to-clipboard": "Copy card link to clipboard",
"copyCardPopup-title": "Copy Card",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
"create": "Create",
"createBoardPopup-title": "Create Board",
"chooseBoardSourcePopup-title": "Import board",
@@ -167,8 +182,11 @@
"edit": "Edit",
"edit-avatar": "Change Avatar",
"edit-profile": "Edit Profile",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
"editCardStartDatePopup-title": "Change start date",
"editCardDueDatePopup-title": "Change due date",
+ "editCardSpentTimePopup-title": "Change spent time",
"editLabelPopup-title": "Change Label",
"editNotificationPopup-title": "Edit Notification",
"editProfilePopup-title": "Edit Profile",
@@ -176,6 +194,7 @@
"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-fail-text": "Error trying to send email",
"email-invalid": "Invalid email",
"email-invite": "Invite via Email",
"email-invite-subject": "__inviter__ sent you an invitation",
@@ -185,6 +204,7 @@
"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.",
+ "enable-wip-limit": "Enable WIP Limit",
"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",
@@ -229,6 +249,8 @@
"info": "Version",
"initials": "Initials",
"invalid-date": "Invalid date",
+ "invalid-time": "Invalid time",
+ "invalid-user": "Invalid user",
"joined": "joined",
"just-invited": "You are just invited to this board",
"keyboard-shortcuts": "Keyboard shortcuts",
@@ -239,18 +261,22 @@
"language": "Language",
"last-admin-desc": "You can’t change roles because there must be at least one admin.",
"leave-board": "Leave Board",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "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-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
"list-move-cards": "Move all cards in this list",
"list-select-cards": "Select all cards in this list",
"listActionPopup-title": "List Actions",
+ "swimlaneActionPopup-title": "Swimlane 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.",
+ "list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve the activity.",
"lists": "Lists",
+ "swimlanes": "Swimlanes",
"log-out": "Log Out",
"log-in": "Log In",
"loginPopup-title": "Log In",
@@ -268,8 +294,9 @@
"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-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
"no-results": "No results",
"normal": "Normal",
"normal-desc": "Can view and edit cards. Can't change settings.",
@@ -305,7 +332,11 @@
"restore": "Restore",
"save": "Save",
"search": "Search",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text to search for?",
"select-color": "Select Color",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
"shortcut-assign-self": "Assign yourself to current card",
"shortcut-autocomplete-emoji": "Autocomplete emoji",
"shortcut-autocomplete-members": "Autocomplete members",
@@ -326,6 +357,11 @@
"team": "Team",
"this-board": "this board",
"this-card": "this card",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"tracking": "Tracking",
@@ -338,14 +374,18 @@
"uploaded-avatar": "Uploaded an avatar",
"username": "Username",
"view-it": "View it",
- "warn-list-archived": "warning: this card is in an archived list",
+ "warn-list-archived": "warning: this card is in an list at Recycle Bin",
"watch": "Watch",
"watching": "Watching",
"watching-info": "You will be notified of any change in this board",
"welcome-board": "Welcome Board",
+ "welcome-swimlane": "Milestone 1",
"welcome-list1": "Basics",
"welcome-list2": "Advanced",
"what-to-do": "What do you want to do?",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
"admin-panel": "Admin Panel",
"settings": "Settings",
"people": "People",
@@ -364,9 +404,12 @@
"smtp-password": "Password",
"smtp-tls": "TLS support",
"send-from": "From",
+ "send-smtp-test": "Send a test email to yourself",
"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.",
+ "email-smtp-test-subject": "SMTP Test Email From Wekan",
+ "email-smtp-test-text": "You have successfully sent an email",
"error-invitation-code-not-exist": "Invitation code doesn't exist",
"error-notAuthorized": "You are not authorized to view this page.",
"outgoing-webhooks": "Outgoing Webhooks",
@@ -390,5 +433,15 @@
"yes": "Yes",
"no": "No",
"accounts": "Accounts",
- "accounts-allowEmailChange": "Allow Email Change"
+ "accounts-allowEmailChange": "Allow Email Change",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Created at",
+ "verified": "Verified",
+ "active": "Active",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
} \ No newline at end of file
diff --git a/i18n/vi.i18n.json b/i18n/vi.i18n.json
index 93248d56..73fc1bcb 100644
--- a/i18n/vi.i18n.json
+++ b/i18n/vi.i18n.json
@@ -9,9 +9,10 @@
"act-createCard": "đã thêm __card__ vào __list__",
"act-createList": "đã thêm __list__ vào __board__",
"act-addBoardMember": "đã thêm __member__ vào __board__",
- "act-archivedBoard": "đã lưu bảng __board__",
- "act-archivedCard": "đã lưu thẻ __card__",
- "act-archivedList": "đã lưu danh sách __list__",
+ "act-archivedBoard": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
"act-importBoard": "đã nạp bảng __board__",
"act-importCard": "đã nạp thẻ __card__",
"act-importList": "đã nạp danh sách __list__",
@@ -26,7 +27,7 @@
"activities": "Hoạt Động",
"activity": "Hoạt Động",
"activity-added": "đã thêm %s vào %s",
- "activity-archived": "đã lưu %s",
+ "activity-archived": "%s moved to Recycle Bin",
"activity-attached": "đã đính kèm %s vào %s",
"activity-created": "đã tạo %s",
"activity-excluded": "đã loại bỏ %s khỏi %s",
@@ -44,6 +45,7 @@
"add-attachment": "Thêm Bản Đính Kèm",
"add-board": "Thêm Bảng",
"add-card": "Thêm Thẻ",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "Thêm Danh Sách Kiểm Tra",
"add-checklist-item": "Thêm Một Mục Vào Danh Sách Kiểm Tra",
"add-cover": "Thêm Bìa",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "Thành Viên",
"admin": "Quản Trị Viên",
"admin-desc": "Có thể xem và chỉnh sửa những thẻ, xóa thành viên và thay đổi cài đặt cho bảng.",
+ "admin-announcement": "Announcement",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Announcement from Administrator",
"all-boards": "Tất cả các bảng",
"and-n-other-card": "Và __count__ thẻ khác",
"and-n-other-card_plural": "Và __count__ thẻ khác",
"apply": "Ứng Dụng",
"app-is-offline": "Wekan đang tải, vui lòng đợi. Tải lại trang có thể làm mất dữ liệu. Nếu Wekan không thể tải được, Vui lòng kiểm tra lại Wekan server.",
- "archive": "Lưu Trữ",
- "archive-all": "Lưu Trữ Tất Cả",
- "archive-board": "Lưu Trữ Bảng",
- "archive-card": "Lưu Trữ Thẻ",
- "archive-list": "Lưu Trữ Danh Sách",
- "archive-selection": "Lưu trữ lựa chọn",
- "archiveBoardPopup-title": "Lưu Trữ Bảng Không?",
- "archived-items": "Các Mục Đã Lưu Trữ",
- "archived-boards": "Các Bảng Đã Lưu Trữ",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
"restore-board": "Khôi Phục Bảng",
- "no-archived-boards": "Không Có Bảng Lưu Trữ.",
- "archives": "Lưu Trữ",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
"assign-member": "Chỉ định thành viên",
"attached": "đã đính kèm",
"attachment": "Phần đính kèm",
@@ -91,15 +97,19 @@
"boardChangeWatchPopup-title": "Đổi cách xem",
"boardMenuPopup-title": "Board Menu",
"boards": "Bảng",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "Lists",
"bucket-example": "Like “Bucket List” for example",
"cancel": "Hủy",
- "card-archived": "Thẻ này đã được lưu.",
+ "card-archived": "This card is moved to Recycle Bin.",
"card-comments-title": "Thẻ này có %s bình luận.",
"card-delete-notice": "Hành động xóa là không thể khôi phục. Bạn sẽ mất hết các hoạt động liên quan đến thẻ này.",
"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-delete-suggest-archive": "You can move a card Recycle Bin to remove it from the board and preserve the activity.",
"card-due": "Due",
"card-due-on": "Due on",
+ "card-spent": "Spent Time",
"card-edit-attachments": "Edit attachments",
"card-edit-labels": "Edit labels",
"card-edit-members": "Edit members",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "Thành Viên",
"cardMorePopup-title": "More",
"cards": "Cards",
+ "cards-count": "Cards",
"change": "Change",
"change-avatar": "Change Avatar",
"change-password": "Change Password",
@@ -130,7 +141,7 @@
"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.",
+ "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
"color-black": "black",
"color-blue": "blue",
"color-green": "green",
@@ -146,8 +157,12 @@
"comment-only": "Comment only",
"comment-only-desc": "Can comment on cards only.",
"computer": "Computer",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
"copy-card-link-to-clipboard": "Copy card link to clipboard",
"copyCardPopup-title": "Copy Card",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
"create": "Create",
"createBoardPopup-title": "Create Board",
"chooseBoardSourcePopup-title": "Import board",
@@ -167,8 +182,11 @@
"edit": "Edit",
"edit-avatar": "Change Avatar",
"edit-profile": "Edit Profile",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
"editCardStartDatePopup-title": "Change start date",
"editCardDueDatePopup-title": "Change due date",
+ "editCardSpentTimePopup-title": "Change spent time",
"editLabelPopup-title": "Change Label",
"editNotificationPopup-title": "Edit Notification",
"editProfilePopup-title": "Edit Profile",
@@ -176,6 +194,7 @@
"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-fail-text": "Error trying to send email",
"email-invalid": "Invalid email",
"email-invite": "Invite via Email",
"email-invite-subject": "__inviter__ sent you an invitation",
@@ -185,6 +204,7 @@
"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.",
+ "enable-wip-limit": "Enable WIP Limit",
"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",
@@ -229,6 +249,8 @@
"info": "Version",
"initials": "Initials",
"invalid-date": "Invalid date",
+ "invalid-time": "Invalid time",
+ "invalid-user": "Invalid user",
"joined": "joined",
"just-invited": "You are just invited to this board",
"keyboard-shortcuts": "Keyboard shortcuts",
@@ -239,18 +261,22 @@
"language": "Language",
"last-admin-desc": "You can’t change roles because there must be at least one admin.",
"leave-board": "Leave Board",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "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-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
"list-move-cards": "Move all cards in this list",
"list-select-cards": "Select all cards in this list",
"listActionPopup-title": "List Actions",
+ "swimlaneActionPopup-title": "Swimlane 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.",
+ "list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve the activity.",
"lists": "Lists",
+ "swimlanes": "Swimlanes",
"log-out": "Log Out",
"log-in": "Log In",
"loginPopup-title": "Log In",
@@ -268,8 +294,9 @@
"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-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
"no-results": "No results",
"normal": "Normal",
"normal-desc": "Can view and edit cards. Can't change settings.",
@@ -305,7 +332,11 @@
"restore": "Restore",
"save": "Save",
"search": "Search",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text to search for?",
"select-color": "Select Color",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
"shortcut-assign-self": "Assign yourself to current card",
"shortcut-autocomplete-emoji": "Autocomplete emoji",
"shortcut-autocomplete-members": "Autocomplete members",
@@ -326,6 +357,11 @@
"team": "Team",
"this-board": "this board",
"this-card": "this card",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"tracking": "Tracking",
@@ -338,14 +374,18 @@
"uploaded-avatar": "Uploaded an avatar",
"username": "Username",
"view-it": "View it",
- "warn-list-archived": "warning: this card is in an archived list",
+ "warn-list-archived": "warning: this card is in an list at Recycle Bin",
"watch": "Watch",
"watching": "Watching",
"watching-info": "You will be notified of any change in this board",
"welcome-board": "Welcome Board",
+ "welcome-swimlane": "Milestone 1",
"welcome-list1": "Basics",
"welcome-list2": "Advanced",
"what-to-do": "What do you want to do?",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
"admin-panel": "Admin Panel",
"settings": "Settings",
"people": "People",
@@ -364,9 +404,12 @@
"smtp-password": "Password",
"smtp-tls": "TLS support",
"send-from": "From",
+ "send-smtp-test": "Send a test email to yourself",
"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.",
+ "email-smtp-test-subject": "SMTP Test Email From Wekan",
+ "email-smtp-test-text": "You have successfully sent an email",
"error-invitation-code-not-exist": "Invitation code doesn't exist",
"error-notAuthorized": "You are not authorized to view this page.",
"outgoing-webhooks": "Outgoing Webhooks",
@@ -390,5 +433,15 @@
"yes": "Yes",
"no": "No",
"accounts": "Accounts",
- "accounts-allowEmailChange": "Allow Email Change"
+ "accounts-allowEmailChange": "Allow Email Change",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Created at",
+ "verified": "Verified",
+ "active": "Active",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
} \ No newline at end of file
diff --git a/i18n/zh-CN.i18n.json b/i18n/zh-CN.i18n.json
index f49f7b26..3b476dac 100644
--- a/i18n/zh-CN.i18n.json
+++ b/i18n/zh-CN.i18n.json
@@ -2,16 +2,17 @@
"accept": "接受",
"act-activity-notify": "[Wekan] 活动通知",
"act-addAttachment": "添加附件 __attachment__ 至卡片 __card__",
- "act-addChecklist": "added checklist __checklist__ to __card__",
- "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
+ "act-addChecklist": "添加清单 __checklist__ 到 __card__",
+ "act-addChecklistItem": "向 __card__ 中的清单 __checklist__ 添加 __checklistItem__",
"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-archivedBoard": "__board__ 已被移入回收站 ",
+ "act-archivedCard": "__card__ 已被移入回收站",
+ "act-archivedList": "__list__ 已被移入回收站",
+ "act-archivedSwimlane": "__swimlane__ 已被移入回收站",
"act-importBoard": "导入看板 __board__",
"act-importCard": "导入卡片 __card__",
"act-importList": "导入列表 __list__",
@@ -26,7 +27,7 @@
"activities": "活动",
"activity": "活动",
"activity-added": "添加 %s 至 %s",
- "activity-archived": "归档 %s",
+ "activity-archived": "%s 已被移入回收站",
"activity-attached": "添加附件 %s 至 %s",
"activity-created": "创建 %s",
"activity-excluded": "排除 %s 从 %s",
@@ -44,6 +45,7 @@
"add-attachment": "添加附件",
"add-board": "添加看板",
"add-card": "添加卡片",
+ "add-swimlane": "添加泳道图",
"add-checklist": "添加待办清单",
"add-checklist-item": "扩充清单",
"add-cover": "添加封面",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "成员",
"admin": "管理员",
"admin-desc": "可以浏览并编辑卡片,移除成员,并且更改该看板的设置",
+ "admin-announcement": "通知",
+ "admin-announcement-active": "激活系统通知",
+ "admin-announcement-title": "管理员的通知",
"all-boards": "全部看板",
"and-n-other-card": "和其他 __count__ 个卡片",
"and-n-other-card_plural": "和其他 __count__ 个卡片",
"apply": "应用",
"app-is-offline": "Wekan 正在加载,请稍等。刷新页面将导致数据丢失。如果 Wekan 无法加载,请检查 Wekan 服务器是否已经停止。",
- "archive": "归档",
- "archive-all": "全部归档",
- "archive-board": "归档看板",
- "archive-card": "归档卡片",
- "archive-list": "归档列表",
- "archive-selection": "归档所选内容",
- "archiveBoardPopup-title": "确定要归档看板吗?",
- "archived-items": "已归档项目",
- "archived-boards": "已归档看板",
+ "archive": "移入回收站",
+ "archive-all": "全部移入回收站",
+ "archive-board": "移动看板到回收站",
+ "archive-card": "移动卡片到回收站",
+ "archive-list": "移动列表到回收站",
+ "archive-swimlane": "移动泳道到回收站",
+ "archive-selection": "移动选择内容到回收站",
+ "archiveBoardPopup-title": "移动看板到回收站?",
+ "archived-items": "回收站",
+ "archived-boards": "回收站中的看板",
"restore-board": "还原看板",
- "no-archived-boards": "没有已归档的看板",
- "archives": "回收箱",
+ "no-archived-boards": "回收站中无看板",
+ "archives": "回收站",
"assign-member": "分配成员",
"attached": "附加",
"attachment": "附件",
@@ -91,15 +97,19 @@
"boardChangeWatchPopup-title": "更改关注状态",
"boardMenuPopup-title": "看板菜单",
"boards": "看板",
- "bucket-example": "例如 “遗愿清单”",
+ "board-view": "看板视图",
+ "board-view-swimlanes": "泳道图",
+ "board-view-lists": "列表",
+ "bucket-example": "例如 “目标清单”",
"cancel": "取消",
- "card-archived": "该卡片已被归档",
+ "card-archived": "此卡片已经被移入回收站。",
"card-comments-title": "该卡片有 %s 条评论",
"card-delete-notice": "彻底删除的操作不可恢复,你将会丢失该卡片相关的所有操作记录。",
"card-delete-pop": "所有的活动将从活动摘要中被移除且您将无法重新打开该卡片。此操作无法撤销。",
- "card-delete-suggest-archive": "你可以将卡片从看板中归档至回收箱,但保留相关活动。",
+ "card-delete-suggest-archive": "将卡片移入回收站可以从看板中删除卡片,相关活动记录将被保留。",
"card-due": "到期",
"card-due-on": "期限",
+ "card-spent": "耗时",
"card-edit-attachments": "编辑附件",
"card-edit-labels": "编辑标签",
"card-edit-members": "编辑成员",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "成员",
"cardMorePopup-title": "更多",
"cards": "卡片",
+ "cards-count": "卡片",
"change": "变更",
"change-avatar": "更改头像",
"change-password": "更改密码",
@@ -130,7 +141,7 @@
"clipboard": "剪贴板或者拖放文件",
"close": "关闭",
"close-board": "关闭看板",
- "close-board-pop": "您可以通过点击主界面顶部的”回收箱“按钮来还原看板。",
+ "close-board-pop": "在主页中点击顶部的“回收站”按钮可以恢复看板。",
"color-black": "黑色",
"color-blue": "蓝色",
"color-green": "绿色",
@@ -146,8 +157,12 @@
"comment-only": "仅能评论",
"comment-only-desc": "只能在卡片上评论。",
"computer": "从本机上传",
+ "confirm-checklist-delete-dialog": "确认要删除清单吗",
"copy-card-link-to-clipboard": "复制卡片链接到剪贴板",
"copyCardPopup-title": "复制卡片",
+ "copyChecklistToManyCardsPopup-title": "复制清单模板至多个卡片",
+ "copyChecklistToManyCardsPopup-instructions": "以JSON格式表示目标卡片的标题和描述",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"第一个卡片的标题\", \"description\":\"第一个卡片的描述\"}, {\"title\":\"第二个卡片的标题\",\"description\":\"第二个卡片的描述\"},{\"title\":\"最后一个卡片的标题\",\"description\":\"最后一个卡片的描述\"} ]",
"create": "创建",
"createBoardPopup-title": "创建看板",
"chooseBoardSourcePopup-title": "导入看板",
@@ -167,8 +182,11 @@
"edit": "编辑",
"edit-avatar": "更改头像",
"edit-profile": "编辑资料",
+ "edit-wip-limit": "编辑最大任务数",
+ "soft-wip-limit": "软在制品限制",
"editCardStartDatePopup-title": "修改起始日期",
"editCardDueDatePopup-title": "修改截止日期",
+ "editCardSpentTimePopup-title": "修改耗时",
"editLabelPopup-title": "更改标签",
"editNotificationPopup-title": "编辑通知",
"editProfilePopup-title": "编辑资料",
@@ -176,6 +194,7 @@
"email-enrollAccount-subject": "已为您在 __siteName__ 创建帐号",
"email-enrollAccount-text": "尊敬的 __user__,\n\n点击下面的链接,即刻开始使用这项服务。\n\n__url__\n\n谢谢。",
"email-fail": "邮件发送失败",
+ "email-fail-text": "尝试发送邮件时出错",
"email-invalid": "邮件地址错误",
"email-invite": "发送邮件邀请",
"email-invite-subject": "__inviter__ 向您发出邀请",
@@ -185,6 +204,7 @@
"email-sent": "邮件已发送",
"email-verifyEmail-subject": "在 __siteName__ 验证您的邮件地址",
"email-verifyEmail-text": "尊敬的 __user__,\n\n点击下面的链接,验证您的邮件地址:\n\n__url__\n\n谢谢。",
+ "enable-wip-limit": "启用最大任务数限制",
"error-board-doesNotExist": "该看板不存在",
"error-board-notAdmin": "需要成为管理员才能执行此操作",
"error-board-notAMember": "需要成为看板成员才能执行此操作",
@@ -229,6 +249,8 @@
"info": "版本",
"initials": "缩写",
"invalid-date": "无效日期",
+ "invalid-time": "非法时间",
+ "invalid-user": "非法用户",
"joined": "关联",
"just-invited": "您刚刚被邀请加入此看板",
"keyboard-shortcuts": "键盘快捷键",
@@ -239,18 +261,22 @@
"language": "语言",
"last-admin-desc": "你不能更改角色,因为至少需要一名管理员。",
"leave-board": "离开看板",
+ "leave-board-pop": "确认要离开 __boardTitle__ 吗?此看板的所有卡片都会将您移除。",
+ "leaveBoardPopup-title": "离开看板?",
"link-card": "关联至该卡片",
- "list-archive-cards": "归档列表中的所有卡片",
- "list-archive-cards-pop": "这将会从本看板中移除该列表中的所有卡片。如果需要浏览已归档的卡片并且将其恢复至看板,请点击 \"菜单\" > \"回收箱\"",
+ "list-archive-cards": "移动此列表中的所有卡片到回收站",
+ "list-archive-cards-pop": "此操作会从看板中删除所有此列表包含的卡片。要查看回收站中的卡片并恢复到看板,请点击“菜单” > “回收站”。",
"list-move-cards": "移动列表中的所有卡片",
"list-select-cards": "选择列表中的所有卡片",
"listActionPopup-title": "列表操作",
+ "swimlaneActionPopup-title": "泳道图操作",
"listImportCardPopup-title": "导入 Trello 卡片",
"listMorePopup-title": "更多",
"link-list": "关联到这个列表",
"list-delete-pop": "所有活动将被从活动动态中删除并且你无法恢复他们,此操作无法撤销。 ",
- "list-delete-suggest-archive": "您可以存档列表将其从板中删除并保留活动。",
+ "list-delete-suggest-archive": "可以将列表移入回收站,看板中将删除列表,但是相关活动记录会被保留。",
"lists": "列表",
+ "swimlanes": "泳道图",
"log-out": "登出",
"log-in": "登录",
"loginPopup-title": "登录",
@@ -268,8 +294,9 @@
"muted-info": "你将不会收到此看板的任何变更通知",
"my-boards": "我的看板",
"name": "名称",
- "no-archived-cards": "没有已归档的卡片",
- "no-archived-lists": "没有已归档的列表。",
+ "no-archived-cards": "回收站中无卡片。",
+ "no-archived-lists": "回收站中无列表。",
+ "no-archived-swimlanes": "回收站中无泳道。",
"no-results": "无结果",
"normal": "普通",
"normal-desc": "可以创建以及编辑卡片,无法更改设置。",
@@ -305,7 +332,11 @@
"restore": "还原",
"save": "保存",
"search": "搜索",
+ "search-cards": "搜索当前看板上的卡片标题和描述",
+ "search-example": "搜索",
"select-color": "选择颜色",
+ "set-wip-limit-value": "设置此列表中的最大任务数",
+ "setWipLimitPopup-title": "设置最大任务数",
"shortcut-assign-self": "分配当前卡片给自己",
"shortcut-autocomplete-emoji": "表情符号自动补全",
"shortcut-autocomplete-members": "自动补全成员",
@@ -326,6 +357,11 @@
"team": "团队",
"this-board": "该看板",
"this-card": "该卡片",
+ "spent-time-hours": "耗时 (小时)",
+ "overtime-hours": "超时 (小时)",
+ "overtime": "超时",
+ "has-overtime-cards": "有超时卡片",
+ "has-spenttime-cards": "耗时卡",
"time": "时间",
"title": "标题",
"tracking": "跟踪",
@@ -338,14 +374,18 @@
"uploaded-avatar": "头像已经上传",
"username": "用户名",
"view-it": "查看",
- "warn-list-archived": "警告: 该卡片位于已归档的列表中",
+ "warn-list-archived": "警告:此卡片属于回收站中的一个列表",
"watch": "关注",
"watching": "关注",
"watching-info": "当此看板发生变更时会通知你",
"welcome-board": "“欢迎”看板",
+ "welcome-swimlane": "里程碑 1",
"welcome-list1": "基本",
"welcome-list2": "高阶",
"what-to-do": "要做什么?",
+ "wipLimitErrorPopup-title": "无效的最大任务数",
+ "wipLimitErrorPopup-dialog-pt1": "此列表中的任务数量已经超过了设置的最大任务数。",
+ "wipLimitErrorPopup-dialog-pt2": "请将一些任务移出此列表,或者设置一个更大的最大任务数。",
"admin-panel": "管理面板",
"settings": "设置",
"people": "人员",
@@ -364,9 +404,12 @@
"smtp-password": "密码",
"smtp-tls": "TLS支持",
"send-from": "发件人",
+ "send-smtp-test": "给自己发送一封测试邮件",
"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非常感谢。",
+ "email-smtp-test-subject": "从Wekan发送SMTP测试邮件",
+ "email-smtp-test-text": "你已成功发送邮件",
"error-invitation-code-not-exist": "邀请码不存在",
"error-notAuthorized": "您无权查看此页面。",
"outgoing-webhooks": "外部Web挂钩",
@@ -374,7 +417,7 @@
"new-outgoing-webhook": "新建外部Web挂钩",
"no-name": "(未知)",
"Wekan_version": "Wekan版本",
- "Node_version": "节点版本",
+ "Node_version": "Node.js版本",
"OS_Arch": "系统架构",
"OS_Cpus": "系统 CPU数量",
"OS_Freemem": "系统可用内存",
@@ -390,5 +433,15 @@
"yes": "是",
"no": "否",
"accounts": "账号",
- "accounts-allowEmailChange": "允许邮箱变更"
+ "accounts-allowEmailChange": "允许邮箱变更",
+ "accounts-allowUserNameChange": "允许变更用户名",
+ "createdAt": "创建于",
+ "verified": "已验证",
+ "active": "活跃",
+ "card-received": "已接收",
+ "card-received-on": "接收于",
+ "card-end": "终止",
+ "card-end-on": "终止于",
+ "editCardReceivedDatePopup-title": "修改接收日期",
+ "editCardEndDatePopup-title": "修改终止日期"
} \ No newline at end of file
diff --git a/i18n/zh-TW.i18n.json b/i18n/zh-TW.i18n.json
index 23566314..082668dd 100644
--- a/i18n/zh-TW.i18n.json
+++ b/i18n/zh-TW.i18n.json
@@ -9,9 +9,10 @@
"act-createCard": "將__card__加入__list__",
"act-createList": "新增__list__至__board__",
"act-addBoardMember": "在__board__中新增成員__member__",
- "act-archivedBoard": "封存__board__",
- "act-archivedCard": "封存__card__",
- "act-archivedList": "封存__list__",
+ "act-archivedBoard": "__board__ moved to Recycle Bin",
+ "act-archivedCard": "__card__ moved to Recycle Bin",
+ "act-archivedList": "__list__ moved to Recycle Bin",
+ "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
"act-importBoard": "匯入__board__",
"act-importCard": "匯入__card__",
"act-importList": "匯入__list__",
@@ -26,7 +27,7 @@
"activities": "活動",
"activity": "活動",
"activity-added": "新增 %s 至 %s",
- "activity-archived": "封存 %s",
+ "activity-archived": "%s moved to Recycle Bin",
"activity-attached": "新增附件 %s 至 %s",
"activity-created": "建立 %s",
"activity-excluded": "排除 %s 從 %s",
@@ -44,6 +45,7 @@
"add-attachment": "新增附件",
"add-board": "新增看板",
"add-card": "新增卡片",
+ "add-swimlane": "Add Swimlane",
"add-checklist": "新增待辦清單",
"add-checklist-item": "新增項目",
"add-cover": "新增封面",
@@ -54,23 +56,27 @@
"addMemberPopup-title": "成員",
"admin": "管理員",
"admin-desc": "可以瀏覽並編輯卡片,移除成員,並且更改該看板的設定",
+ "admin-announcement": "Announcement",
+ "admin-announcement-active": "Active System-Wide Announcement",
+ "admin-announcement-title": "Announcement from Administrator",
"all-boards": "全部看板",
"and-n-other-card": "和其他 __count__ 個卡片",
"and-n-other-card_plural": "和其他 __count__ 個卡片",
"apply": "送出",
"app-is-offline": "請稍候,資料讀取中,重整頁面可能會導致資料遺失。如果一直讀取,請檢查 Wekan 的伺服器是否正確運行。",
- "archive": "刪除",
- "archive-all": "全部刪除",
- "archive-board": "刪除看板",
- "archive-card": "刪除卡片",
- "archive-list": "封存此清單",
- "archive-selection": "刪除所選內容",
- "archiveBoardPopup-title": "確定要刪除看板嗎?",
- "archived-items": "封存",
- "archived-boards": "已封存看板",
+ "archive": "Move to Recycle Bin",
+ "archive-all": "Move All to Recycle Bin",
+ "archive-board": "Move Board to Recycle Bin",
+ "archive-card": "Move Card to Recycle Bin",
+ "archive-list": "Move List to Recycle Bin",
+ "archive-swimlane": "Move Swimlane to Recycle Bin",
+ "archive-selection": "Move selection to Recycle Bin",
+ "archiveBoardPopup-title": "Move Board to Recycle Bin?",
+ "archived-items": "Recycle Bin",
+ "archived-boards": "Boards in Recycle Bin",
"restore-board": "還原看板",
- "no-archived-boards": "沒有已封存的看板",
- "archives": "封存",
+ "no-archived-boards": "No Boards in Recycle Bin.",
+ "archives": "Recycle Bin",
"assign-member": "分配成員",
"attached": "附加",
"attachment": "附件",
@@ -91,15 +97,19 @@
"boardChangeWatchPopup-title": "更改觀察",
"boardMenuPopup-title": "看板選單",
"boards": "看板",
+ "board-view": "Board View",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-lists": "清單",
"bucket-example": "例如 “目標清單”",
"cancel": "取消",
- "card-archived": "該卡片已被刪除",
+ "card-archived": "This card is moved to Recycle Bin.",
"card-comments-title": "該卡片有 %s 則評論",
"card-delete-notice": "徹底刪除的操作不可復原,你將會遺失該卡片相關的所有操作記錄。",
"card-delete-pop": "所有的動作將從活動動態中被移除且您將無法重新打開該卡片。此操作無法復原。",
- "card-delete-suggest-archive": "你可以將卡片從看板中刪除至回收筒,但保留相關活動。",
+ "card-delete-suggest-archive": "You can move a card Recycle Bin to remove it from the board and preserve the activity.",
"card-due": "到期",
"card-due-on": "到期",
+ "card-spent": "Spent Time",
"card-edit-attachments": "編輯附件",
"card-edit-labels": "編輯標籤",
"card-edit-members": "編輯成員",
@@ -114,6 +124,7 @@
"cardMembersPopup-title": "成員",
"cardMorePopup-title": "更多",
"cards": "卡片",
+ "cards-count": "卡片",
"change": "變更",
"change-avatar": "更改大頭貼",
"change-password": "更改密碼",
@@ -130,7 +141,7 @@
"clipboard": "剪貼簿貼上或者拖曳檔案",
"close": "關閉",
"close-board": "關閉看板",
- "close-board-pop": "您可以透過點選主介面上方的”回收筒“按鈕來還原看板。",
+ "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
"color-black": "黑色",
"color-blue": "藍色",
"color-green": "綠色",
@@ -146,8 +157,12 @@
"comment-only": "只可以發表評論",
"comment-only-desc": "只可以對卡片發表評論",
"computer": "從本機上傳",
+ "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist",
"copy-card-link-to-clipboard": "將卡片連結複製到剪貼板",
"copyCardPopup-title": "Copy Card",
+ "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
+ "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+ "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
"create": "建立",
"createBoardPopup-title": "建立看板",
"chooseBoardSourcePopup-title": "匯入看板",
@@ -167,8 +182,11 @@
"edit": "編輯",
"edit-avatar": "更改大頭貼",
"edit-profile": "編輯資料",
+ "edit-wip-limit": "Edit WIP Limit",
+ "soft-wip-limit": "Soft WIP Limit",
"editCardStartDatePopup-title": "更改開始日期",
"editCardDueDatePopup-title": "更改到期日期",
+ "editCardSpentTimePopup-title": "Change spent time",
"editLabelPopup-title": "更改標籤",
"editNotificationPopup-title": "更改通知",
"editProfilePopup-title": "編輯資料",
@@ -176,6 +194,7 @@
"email-enrollAccount-subject": "您在 __siteName__ 的帳號已經建立",
"email-enrollAccount-text": "親愛的 __user__,\n\n點選下面的連結,即刻開始使用這項服務。\n\n__url__\n\n謝謝。",
"email-fail": "郵件寄送失敗",
+ "email-fail-text": "Error trying to send email",
"email-invalid": "電子郵件地址錯誤",
"email-invite": "寄送郵件邀請",
"email-invite-subject": "__inviter__ 向您發出邀請",
@@ -185,6 +204,7 @@
"email-sent": "郵件已寄送",
"email-verifyEmail-subject": "驗證您在 __siteName__ 的電子郵件",
"email-verifyEmail-text": "親愛的 __user__,\n\n點選下面的連結,驗證您的電子郵件地址:\n\n__url__\n\n謝謝。",
+ "enable-wip-limit": "Enable WIP Limit",
"error-board-doesNotExist": "該看板不存在",
"error-board-notAdmin": "需要成為管理員才能執行此操作",
"error-board-notAMember": "需要成為看板成員才能執行此操作",
@@ -229,6 +249,8 @@
"info": "版本",
"initials": "縮寫",
"invalid-date": "無效的日期",
+ "invalid-time": "Invalid time",
+ "invalid-user": "Invalid user",
"joined": "關聯",
"just-invited": "您剛剛被邀請加入此看板",
"keyboard-shortcuts": "鍵盤快速鍵",
@@ -239,18 +261,22 @@
"language": "語言",
"last-admin-desc": "你不能更改角色,因為至少需要一名管理員。",
"leave-board": "離開看板",
+ "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.",
+ "leaveBoardPopup-title": "Leave Board ?",
"link-card": "關聯至該卡片",
- "list-archive-cards": "刪除清單中的所有卡片",
- "list-archive-cards-pop": "這將會從本看板中移除該清單中的所有卡片。如果需要瀏覽已刪除的卡片並且將其回復至看板,請點選\"選單\">\"回收筒\"",
+ "list-archive-cards": "Move all cards in this list to Recycle Bin",
+ "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
"list-move-cards": "移動清單中的所有卡片",
"list-select-cards": "選擇清單中的所有卡片",
"listActionPopup-title": "清單操作",
+ "swimlaneActionPopup-title": "Swimlane Actions",
"listImportCardPopup-title": "匯入 Trello 卡片",
"listMorePopup-title": "更多",
"link-list": "連結到這個清單",
"list-delete-pop": "所有的動作將從活動動態中被移除且您將無法再開啟該清單\b。此操作無法復原。",
- "list-delete-suggest-archive": "你可以將從清單中刪除至回收筒,但保留相關活動",
+ "list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve the activity.",
"lists": "清單",
+ "swimlanes": "Swimlanes",
"log-out": "登出",
"log-in": "登入",
"loginPopup-title": "登入",
@@ -268,8 +294,9 @@
"muted-info": "您將不會收到有關這個看板的任何訊息",
"my-boards": "我的看板",
"name": "名稱",
- "no-archived-cards": "沒有已刪除的卡片",
- "no-archived-lists": "沒有已刪除的清單",
+ "no-archived-cards": "No cards in Recycle Bin.",
+ "no-archived-lists": "No lists in Recycle Bin.",
+ "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
"no-results": "無結果",
"normal": "普通",
"normal-desc": "可以建立以及編輯卡片,無法更改。",
@@ -305,7 +332,11 @@
"restore": "還原",
"save": "儲存",
"search": "搜尋",
+ "search-cards": "Search from card titles and descriptions on this board",
+ "search-example": "Text to search for?",
"select-color": "選擇顏色",
+ "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
+ "setWipLimitPopup-title": "Set WIP Limit",
"shortcut-assign-self": "分配目前卡片給自己",
"shortcut-autocomplete-emoji": "自動完成表情符號",
"shortcut-autocomplete-members": "自動補齊成員",
@@ -326,6 +357,11 @@
"team": "團隊",
"this-board": "這個看板",
"this-card": "這個卡片",
+ "spent-time-hours": "Spent time (hours)",
+ "overtime-hours": "Overtime (hours)",
+ "overtime": "Overtime",
+ "has-overtime-cards": "Has overtime cards",
+ "has-spenttime-cards": "Has spent time cards",
"time": "時間",
"title": "標題",
"tracking": "追蹤",
@@ -338,14 +374,18 @@
"uploaded-avatar": "大頭貼已經上傳",
"username": "使用者名稱",
"view-it": "檢視",
- "warn-list-archived": "警告: 該卡片位於已刪除的清單中",
+ "warn-list-archived": "warning: this card is in an list at Recycle Bin",
"watch": "觀察",
"watching": "觀察中",
"watching-info": "你將會收到關於這個看板所有的變更通知",
"welcome-board": "歡迎進入看板",
+ "welcome-swimlane": "Milestone 1",
"welcome-list1": "基本",
"welcome-list2": "進階",
"what-to-do": "要做什麼?",
+ "wipLimitErrorPopup-title": "Invalid WIP Limit",
+ "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+ "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
"admin-panel": "控制台",
"settings": "設定",
"people": "成員",
@@ -364,9 +404,12 @@
"smtp-password": "密碼",
"smtp-tls": "支援 TLS",
"send-from": "從",
+ "send-smtp-test": "Send a test email to yourself",
"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謝謝。",
+ "email-smtp-test-subject": "SMTP Test Email From Wekan",
+ "email-smtp-test-text": "You have successfully sent an email",
"error-invitation-code-not-exist": "邀請碼不存在",
"error-notAuthorized": "沒有適合的權限觀看",
"outgoing-webhooks": "設定 Webhooks",
@@ -390,5 +433,15 @@
"yes": "是",
"no": "否",
"accounts": "帳號",
- "accounts-allowEmailChange": "准許變更電子信箱"
+ "accounts-allowEmailChange": "准許變更電子信箱",
+ "accounts-allowUserNameChange": "Allow Username Change",
+ "createdAt": "Created at",
+ "verified": "Verified",
+ "active": "Active",
+ "card-received": "Received",
+ "card-received-on": "Received on",
+ "card-end": "End",
+ "card-end-on": "Ends on",
+ "editCardReceivedDatePopup-title": "Change received date",
+ "editCardEndDatePopup-title": "Change end date"
} \ No newline at end of file
diff --git a/meta/t9n-changelog/fi.md b/meta/t9n-changelog/fi.md
new file mode 100644
index 00000000..b27c0926
--- /dev/null
+++ b/meta/t9n-changelog/fi.md
@@ -0,0 +1,20 @@
+# v0.75 2018-02-16 Wekan julkaisu
+
+Tämä julkaisu lisää seuraavat ominaisuudet:
+
+- [Tarkistuslista mallit](https://github.com/wekan/wekan/pull/1470);
+- Lisätty [Suomenkielinen muutosloki](https://github.com/wekan/wekan/tree/devel/meta/t9n-changelog)
+ ja [lisää suomennoksia](https://github.com/wekan/wekan/blob/devel/sandstorm-pkgdef.capnp)
+ Sandstormiin.
+
+
+Kiitos GitHub käyttäjille erikturk ja xet7 heidän osallistumisistaan.
+
+# v0.74 2018-02-13 Wekan julkaisu
+
+Tämä julkaisu korjaa seuraavat bugit:
+
+- [Poistettu Emoji tuki, jotta MAC osoitteet, kellonajat jne näkyvät oikein](https://github.com/wekan/wekan/commit/056843d66c361594d5d4478cfe86e2e405333b91).
+ HUOM: Voit silti käyttää Unicode Emojeita, tämä vain poistaa rikkinäisen automaattimuunnoksen Emojeiksi.
+
+Kiitos GitHub käyttäjälle xet7 osallistumisista.
diff --git a/models/accountSettings.js b/models/accountSettings.js
index db4087c0..6dfbac5d 100644
--- a/models/accountSettings.js
+++ b/models/accountSettings.js
@@ -23,11 +23,17 @@ AccountSettings.allow({
if (Meteor.isServer) {
Meteor.startup(() => {
- AccountSettings.upsert({ _id: 'accounts-allowEmailChange' }, {
+ AccountSettings.upsert({_id: 'accounts-allowEmailChange'}, {
$setOnInsert: {
booleanValue: false,
sort: 0,
},
});
+ AccountSettings.upsert({_id: 'accounts-allowUserNameChange'}, {
+ $setOnInsert: {
+ booleanValue: false,
+ sort: 1,
+ },
+ });
});
}
diff --git a/models/activities.js b/models/activities.js
index 237283f8..f64b53f8 100644
--- a/models/activities.js
+++ b/models/activities.js
@@ -23,6 +23,9 @@ Activities.helpers({
list() {
return Lists.findOne(this.listId);
},
+ swimlane() {
+ return Swimlanes.findOne(this.swimlaneId);
+ },
oldList() {
return Lists.findOne(this.oldListId);
},
@@ -39,7 +42,7 @@ Activities.helpers({
return Checklists.findOne(this.checklistId);
},
checklistItem() {
- return Checklists.findOne(this.checklistId).getItem(this.checklistItemId);
+ return ChecklistItems.findOne(this.checklistItemId);
},
customField() {
return CustomFields.findOne(this.customFieldId);
@@ -114,6 +117,7 @@ if (Meteor.isServer) {
if (activity.commentId) {
const comment = activity.comment();
params.comment = comment.text;
+ params.commentId = comment._id;
}
if (activity.attachmentId) {
const attachment = activity.attachment();
diff --git a/models/announcements.js b/models/announcements.js
new file mode 100644
index 00000000..2cb1e1b7
--- /dev/null
+++ b/models/announcements.js
@@ -0,0 +1,36 @@
+Announcements = new Mongo.Collection('announcements');
+
+Announcements.attachSchema(new SimpleSchema({
+ enabled: {
+ type: Boolean,
+ defaultValue: false,
+ },
+ title: {
+ type: String,
+ optional: true,
+ },
+ body: {
+ type: String,
+ optional: true,
+ },
+ sort: {
+ type: Number,
+ decimal: true,
+ },
+}));
+
+Announcements.allow({
+ update(userId) {
+ const user = Users.findOne(userId);
+ return user && user.isAdmin;
+ },
+});
+
+if (Meteor.isServer) {
+ Meteor.startup(() => {
+ const announcements = Announcements.findOne({});
+ if(!announcements){
+ Announcements.insert({enabled: false, sort: 0});
+ }
+ });
+}
diff --git a/models/attachments.js b/models/attachments.js
index 560bec99..5e5c4926 100644
--- a/models/attachments.js
+++ b/models/attachments.js
@@ -1,83 +1,90 @@
-Attachments = new FS.Collection('attachments', {
- stores: [
+ Attachments = new FS.Collection('attachments', {
+ stores: [
- // XXX Add a new store for cover thumbnails so we don't load big images in
- // the general board view
- new FS.Store.GridFS('attachments', {
- // If the uploaded document is not an image we need to enforce browser
- // download instead of execution. This is particularly important for HTML
- // files that the browser will just execute if we don't serve them with the
- // appropriate `application/octet-stream` MIME header which can lead to user
- // data leaks. I imagine other formats (like PDF) can also be attack vectors.
- // See https://github.com/wekan/wekan/issues/99
- // XXX Should we use `beforeWrite` option of CollectionFS instead of
- // collection-hooks?
- // We should use `beforeWrite`.
- beforeWrite: (fileObj) => {
- if (!fileObj.isImage()) {
- return {
- type: 'application/octet-stream',
- };
+ // XXX Add a new store for cover thumbnails so we don't load big images in
+ // the general board view
+ new FS.Store.GridFS('attachments', {
+ // If the uploaded document is not an image we need to enforce browser
+ // download instead of execution. This is particularly important for HTML
+ // files that the browser will just execute if we don't serve them with the
+ // appropriate `application/octet-stream` MIME header which can lead to user
+ // data leaks. I imagine other formats (like PDF) can also be attack vectors.
+ // See https://github.com/wekan/wekan/issues/99
+ // XXX Should we use `beforeWrite` option of CollectionFS instead of
+ // collection-hooks?
+ // We should use `beforeWrite`.
+ beforeWrite: (fileObj) => {
+ if (!fileObj.isImage()) {
+ return {
+ type: 'application/octet-stream',
+ };
+ }
+ return {};
+ },
+ }),
+ ],
+ });
+
+
+ if (Meteor.isServer) {
+ Attachments.allow({
+ insert(userId, doc) {
+ return allowIsBoardMember(userId, Boards.findOne(doc.boardId));
+ },
+ update(userId, doc) {
+ return allowIsBoardMember(userId, Boards.findOne(doc.boardId));
+ },
+ remove(userId, doc) {
+ return allowIsBoardMember(userId, Boards.findOne(doc.boardId));
+ },
+ // We authorize the attachment download either:
+ // - if the board is public, everyone (even unconnected) can download it
+ // - if the board is private, only board members can download it
+ download(userId, doc) {
+ const board = Boards.findOne(doc.boardId);
+ if (board.isPublic()) {
+ return true;
+ } else {
+ return board.hasMember(userId);
}
- return {};
},
- }),
- ],
-});
-if (Meteor.isServer) {
- Attachments.allow({
- insert(userId, doc) {
- return allowIsBoardMember(userId, Boards.findOne(doc.boardId));
- },
- update(userId, doc) {
- return allowIsBoardMember(userId, Boards.findOne(doc.boardId));
- },
- remove(userId, doc) {
- return allowIsBoardMember(userId, Boards.findOne(doc.boardId));
- },
- // We authorize the attachment download either:
- // - if the board is public, everyone (even unconnected) can download it
- // - if the board is private, only board members can download it
- download(userId, doc) {
- const board = Boards.findOne(doc.boardId);
- if (board.isPublic()) {
- return true;
- } else {
- return board.hasMember(userId);
- }
- },
+ fetch: ['boardId'],
+ });
+ }
- fetch: ['boardId'],
- });
-}
+ // XXX Enforce a schema for the Attachments CollectionFS
-// XXX Enforce a schema for the Attachments CollectionFS
+ if (Meteor.isServer) {
+ Attachments.files.after.insert((userId, doc) => {
+ // If the attachment doesn't have a source field
+ // or its source is different than import
+ if (!doc.source || doc.source !== 'import') {
+ // Add activity about adding the attachment
+ Activities.insert({
+ userId,
+ type: 'card',
+ activityType: 'addAttachment',
+ attachmentId: doc._id,
+ boardId: doc.boardId,
+ cardId: doc.cardId,
+ });
+ } else {
+ // Don't add activity about adding the attachment as the activity
+ // be imported and delete source field
+ Attachments.update({
+ _id: doc._id,
+ }, {
+ $unset: {
+ source: '',
+ },
+ });
+ }
+ });
-if (Meteor.isServer) {
- Attachments.files.after.insert((userId, doc) => {
- // If the attachment doesn't have a source field
- // or its source is different than import
- if (!doc.source || doc.source !== 'import') {
- // Add activity about adding the attachment
- Activities.insert({
- userId,
- type: 'card',
- activityType: 'addAttachment',
+ Attachments.files.after.remove((userId, doc) => {
+ Activities.remove({
attachmentId: doc._id,
- boardId: doc.boardId,
- cardId: doc.cardId,
});
- } else {
- // Don't add activity about adding the attachment as the activity
- // be imported and delete source field
- Attachments.update( {_id: doc._id}, {$unset: { source : '' } } );
- }
- });
-
- Attachments.files.after.remove((userId, doc) => {
- Activities.remove({
- attachmentId: doc._id,
});
- });
-}
+ }
diff --git a/models/boards.js b/models/boards.js
index 98c0e46d..44ce0b62 100644
--- a/models/boards.js
+++ b/models/boards.js
@@ -187,6 +187,20 @@ Boards.helpers({
return Lists.find({ boardId: this._id, archived: false }, { sort: { sort: 1 } });
},
+ swimlanes() {
+ return Swimlanes.find({ boardId: this._id, archived: false }, { sort: { sort: 1 } });
+ },
+
+ hasOvertimeCards(){
+ const card = Cards.findOne({isOvertime: true, boardId: this._id, archived: false} );
+ return card !== undefined;
+ },
+
+ hasSpentTimeCards(){
+ const card = Cards.findOne({spentTime: { $gt: 0 }, boardId: this._id, archived: false} );
+ return card !== undefined;
+ },
+
activities() {
return Activities.find({ boardId: this._id }, { sort: { createdAt: -1 } });
},
@@ -246,6 +260,27 @@ Boards.helpers({
Boards.direct.update(this._id, { $push: { labels: { _id, name, color } } });
return _id;
},
+
+ searchCards(term) {
+ check(term, Match.OneOf(String, null, undefined));
+
+ let query = { boardId: this._id };
+ const projection = { limit: 10, sort: { createdAt: -1 } };
+
+ if (term) {
+ const regex = new RegExp(term, 'i');
+
+ query = {
+ boardId: this._id,
+ $or: [
+ { title: regex },
+ { description: regex },
+ ],
+ };
+ }
+
+ return Cards.find(query, projection);
+ },
});
Boards.mutations({
@@ -302,6 +337,15 @@ Boards.mutations({
return { $pull: { labels: { _id: labelId } } };
},
+ changeOwnership(fromId, toId) {
+ const memberIndex = this.memberIndex(fromId);
+ return {
+ $set: {
+ [`members.${memberIndex}.userId`]: toId,
+ },
+ };
+ },
+
addMember(memberId) {
const memberIndex = this.memberIndex(memberId);
if (memberIndex >= 0) {
@@ -560,83 +604,152 @@ 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.add('GET', '/api/users/:userId/boards', function (req, res) {
+ try {
+ 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': paramUserId,
+ }, {
+ sort: ['title'],
+ }).map(function(board) {
+ return {
+ _id: board._id,
+ title: board.title,
+ };
+ });
- JsonRoutes.sendResult(res, {code: 200, data});
+ JsonRoutes.sendResult(res, {code: 200, data});
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
});
- 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', function (req, res) {
+ try {
+ Authentication.checkUserId(req.userId);
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: Boards.find({ permission: 'public' }).map(function (doc) {
+ return {
+ _id: doc._id,
+ title: doc.title,
+ };
+ }),
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
});
- JsonRoutes.add('GET', '/api/boards/:id', function (req, res, next) {
- const id = req.params.id;
- Authentication.checkBoardAccess( req.userId, id);
+ JsonRoutes.add('GET', '/api/boards/:id', function (req, res) {
+ try {
+ const id = req.params.id;
+ Authentication.checkBoardAccess(req.userId, id);
- JsonRoutes.sendResult(res, {
- code: 200,
- data: Boards.findOne({ _id: id }),
- });
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: Boards.findOne({ _id: id }),
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
});
- 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,
+ JsonRoutes.add('POST', '/api/boards', function (req, res) {
+ try {
+ 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,
},
- ],
- permission: 'public',
- color: 'belize',
- });
- JsonRoutes.sendResult(res, {
- code: 200,
- data: {
- _id: id,
- },
- });
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
+ });
+
+ JsonRoutes.add('DELETE', '/api/boards/:id', function (req, res) {
+ try {
+ Authentication.checkUserId(req.userId);
+ const id = req.params.id;
+ Boards.remove({ _id: id });
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data:{
+ _id: id,
+ },
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
});
- JsonRoutes.add('DELETE', '/api/boards/:id', function (req, res, next) {
- Authentication.checkUserId( req.userId);
+ JsonRoutes.add('PUT', '/api/boards/:id/labels', function (req, res) {
+ Authentication.checkUserId(req.userId);
const id = req.params.id;
- Boards.remove({ _id: id });
- JsonRoutes.sendResult(res, {
- code: 200,
- data:{
- _id: id,
- },
- });
+ try {
+ if (req.body.hasOwnProperty('label')) {
+ const board = Boards.findOne({ _id: id });
+ const color = req.body.label.color;
+ const name = req.body.label.name;
+ const labelId = Random.id(6);
+ if (!board.getLabel(name, color)) {
+ Boards.direct.update({ _id: id }, { $push: { labels: { _id: labelId, name, color } } });
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: labelId,
+ });
+ } else {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ });
+ }
+ }
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ data: error,
+ });
+ }
});
}
diff --git a/models/cardComments.js b/models/cardComments.js
index 352030f1..b6cb10fa 100644
--- a/models/cardComments.js
+++ b/models/cardComments.js
@@ -87,66 +87,98 @@ 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', function (req, res) {
+ try {
+ 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,
+ };
+ }),
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
});
- 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('GET', '/api/boards/:boardId/cards/:cardId/comments/:commentId', function (req, res) {
+ try {
+ 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 }),
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
});
- 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.direct.insert({
- userId: req.body.authorId,
- text: req.body.comment,
- cardId: paramCardId,
- boardId: paramBoardId,
- });
+ JsonRoutes.add('POST', '/api/boards/:boardId/cards/:cardId/comments', function (req, res) {
+ try {
+ Authentication.checkUserId( req.userId);
+ const paramBoardId = req.params.boardId;
+ const paramCardId = req.params.cardId;
+ const id = CardComments.direct.insert({
+ userId: req.body.authorId,
+ text: req.body.comment,
+ cardId: paramCardId,
+ boardId: paramBoardId,
+ });
- const cardComment = CardComments.findOne({_id: id, cardId:paramCardId, boardId: paramBoardId });
- commentCreation(req.body.authorId, cardComment);
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: id,
+ },
+ });
- JsonRoutes.sendResult(res, {
- code: 200,
- data: {
- _id: id,
- },
- });
+ const cardComment = CardComments.findOne({_id: id, cardId:paramCardId, boardId: paramBoardId });
+ commentCreation(req.body.authorId, cardComment);
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
});
- 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,
- },
- });
+ JsonRoutes.add('DELETE', '/api/boards/:boardId/cards/:cardId/comments/:commentId', function (req, res) {
+ try {
+ 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,
+ },
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
});
}
diff --git a/models/cards.js b/models/cards.js
index 17abf430..8b917ee3 100644
--- a/models/cards.js
+++ b/models/cards.js
@@ -18,9 +18,12 @@ Cards.attachSchema(new SimpleSchema({
listId: {
type: String,
},
- // The system could work without this `boardId` information (we could deduce
- // the board identifier from the card), but it would make the system more
- // difficult to manage and less efficient.
+ swimlaneId: {
+ type: String,
+ },
+ // The system could work without this `boardId` information (we could deduce
+ // the board identifier from the card), but it would make the system more
+ // difficult to manage and less efficient.
boardId: {
type: String,
},
@@ -71,6 +74,10 @@ Cards.attachSchema(new SimpleSchema({
type: [String],
optional: true,
},
+ receivedAt: {
+ type: Date,
+ optional: true,
+ },
startAt: {
type: Date,
optional: true,
@@ -79,8 +86,22 @@ Cards.attachSchema(new SimpleSchema({
type: Date,
optional: true,
},
- // XXX Should probably be called `authorId`. Is it even needed since we have
- // the `members` field?
+ endAt: {
+ type: Date,
+ optional: true,
+ },
+ spentTime: {
+ type: Number,
+ decimal: true,
+ optional: true,
+ },
+ isOvertime: {
+ type: Boolean,
+ defaultValue: false,
+ optional: true,
+ },
+ // XXX Should probably be called `authorId`. Is it even needed since we have
+ // the `members` field?
userId: {
type: String,
autoValue() { // eslint-disable-line consistent-return
@@ -151,13 +172,13 @@ Cards.helpers({
cover() {
const cover = Attachments.findOne(this.coverId);
- // if we return a cover before it is fully stored, we will get errors when we try to display it
- // todo XXX we could return a default "upload pending" image in the meantime?
+ // if we return a cover before it is fully stored, we will get errors when we try to display it
+ // todo XXX we could return a default "upload pending" image in the meantime?
return cover && cover.url() && cover;
},
checklists() {
- return Checklists.find({cardId: this._id}, {sort: {createdAt: 1}});
+ return Checklists.find({cardId: this._id}, {sort: { sort: 1 } });
},
checklistItemCount() {
@@ -219,6 +240,14 @@ Cards.helpers({
cardId: this._id,
});
},
+
+ canBeRestored() {
+ const list = Lists.findOne({_id: this.listId});
+ if(!list.getWipLimit('soft') && list.getWipLimit('enabled') && list.getWipLimit('value') === list.cards().count()){
+ return false;
+ }
+ return true;
+ },
});
Cards.mutations({
@@ -238,11 +267,15 @@ Cards.mutations({
return {$set: {description}};
},
- move(listId, sortIndex) {
- const mutatedFields = {listId};
- if (sortIndex) {
- mutatedFields.sort = sortIndex;
- }
+ move(swimlaneId, listId, sortIndex) {
+ const list = Lists.findOne(listId);
+ const mutatedFields = {
+ swimlaneId,
+ listId,
+ boardId: list.boardId,
+ sort: sortIndex,
+ };
+
return {$set: mutatedFields};
},
@@ -312,6 +345,14 @@ Cards.mutations({
return {$unset: {coverId: ''}};
},
+ setReceived(receivedAt) {
+ return {$set: {receivedAt}};
+ },
+
+ unsetReceived() {
+ return {$unset: {receivedAt: ''}};
+ },
+
setStart(startAt) {
return {$set: {startAt}};
},
@@ -327,6 +368,26 @@ Cards.mutations({
unsetDue() {
return {$unset: {dueAt: ''}};
},
+
+ setEnd(endAt) {
+ return {$set: {endAt}};
+ },
+
+ unsetEnd() {
+ return {$unset: {endAt: ''}};
+ },
+
+ setOvertime(isOvertime) {
+ return {$set: {isOvertime}};
+ },
+
+ setSpentTime(spentTime) {
+ return {$set: {spentTime}};
+ },
+
+ unsetSpentTime() {
+ return {$unset: {spentTime: '', isOvertime: false}};
+ },
});
@@ -371,7 +432,7 @@ function cardMembers(userId, doc, fieldNames, modifier) {
if (!_.contains(fieldNames, 'members'))
return;
let memberId;
- // Say hello to the new member
+ // Say hello to the new member
if (modifier.$addToSet && modifier.$addToSet.members) {
memberId = modifier.$addToSet.members;
if (!_.contains(doc.members, memberId)) {
@@ -385,10 +446,10 @@ function cardMembers(userId, doc, fieldNames, modifier) {
}
}
- // Say goodbye to the former member
+ // Say goodbye to the former member
if (modifier.$pull && modifier.$pull.members) {
memberId = modifier.$pull.members;
- // Check that the former member is member of the card
+ // Check that the former member is member of the card
if (_.contains(doc.members, memberId)) {
Activities.insert({
userId,
@@ -428,8 +489,8 @@ function cardRemover(userId, doc) {
if (Meteor.isServer) {
- // Cards are often fetched within a board, so we create an index to make these
- // queries more efficient.
+ // 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, createdAt: -1});
});
@@ -438,31 +499,31 @@ if (Meteor.isServer) {
cardCreation(userId, doc);
});
- // New activity for card (un)archivage
+ // New activity for card (un)archivage
Cards.after.update((userId, doc, fieldNames) => {
cardState(userId, doc, fieldNames);
});
- //New activity for card moves
+ //New activity for card moves
Cards.after.update(function (userId, doc, fieldNames) {
const oldListId = this.previous.listId;
cardMove(userId, doc, fieldNames, oldListId);
});
- // Add a new activity if we add or remove a member to the card
+ // Add a new activity if we add or remove a member to the card
Cards.before.update((userId, doc, fieldNames, modifier) => {
cardMembers(userId, doc, fieldNames, modifier);
});
- // Remove all activities associated with a card if we remove the card
- // Remove also card_comments / checklists / attachments
+ // Remove all activities associated with a card if we remove the card
+ // Remove also card_comments / checklists / attachments
Cards.after.remove((userId, doc) => {
cardRemover(userId, doc);
});
}
//LISTS REST API
if (Meteor.isServer) {
- JsonRoutes.add('GET', '/api/boards/:boardId/lists/:listId/cards', function (req, res, next) {
+ JsonRoutes.add('GET', '/api/boards/:boardId/lists/:listId/cards', function (req, res) {
const paramBoardId = req.params.boardId;
const paramListId = req.params.listId;
Authentication.checkBoardAccess(req.userId, paramBoardId);
@@ -478,7 +539,7 @@ if (Meteor.isServer) {
});
});
- JsonRoutes.add('GET', '/api/boards/:boardId/lists/:listId/cards/:cardId', function (req, res, next) {
+ JsonRoutes.add('GET', '/api/boards/:boardId/lists/:listId/cards/:cardId', function (req, res) {
const paramBoardId = req.params.boardId;
const paramListId = req.params.listId;
const paramCardId = req.params.cardId;
@@ -489,11 +550,12 @@ if (Meteor.isServer) {
});
});
- JsonRoutes.add('POST', '/api/boards/:boardId/lists/:listId/cards', function (req, res, next) {
+ JsonRoutes.add('POST', '/api/boards/:boardId/lists/:listId/cards', function (req, res) {
Authentication.checkUserId(req.userId);
const paramBoardId = req.params.boardId;
const paramListId = req.params.listId;
const check = Users.findOne({_id: req.body.authorId});
+ const members = req.body.members || [req.body.authorId];
if (typeof check !== 'undefined') {
const id = Cards.direct.insert({
title: req.body.title,
@@ -501,8 +563,9 @@ if (Meteor.isServer) {
listId: paramListId,
description: req.body.description,
userId: req.body.authorId,
+ swimlaneId: req.body.swimlaneId,
sort: 0,
- members: [req.body.authorId],
+ members,
});
JsonRoutes.sendResult(res, {
code: 200,
@@ -521,7 +584,7 @@ if (Meteor.isServer) {
}
});
- JsonRoutes.add('PUT', '/api/boards/:boardId/lists/:listId/cards/:cardId', function (req, res, next) {
+ JsonRoutes.add('PUT', '/api/boards/:boardId/lists/:listId/cards/:cardId', function (req, res) {
Authentication.checkUserId(req.userId);
const paramBoardId = req.params.boardId;
const paramCardId = req.params.cardId;
@@ -530,12 +593,12 @@ if (Meteor.isServer) {
if (req.body.hasOwnProperty('title')) {
const newTitle = req.body.title;
Cards.direct.update({_id: paramCardId, listId: paramListId, boardId: paramBoardId, archived: false},
- {$set: {title: newTitle}});
+ {$set: {title: newTitle}});
}
if (req.body.hasOwnProperty('listId')) {
const newParamListId = req.body.listId;
Cards.direct.update({_id: paramCardId, listId: paramListId, boardId: paramBoardId, archived: false},
- {$set: {listId: newParamListId}});
+ {$set: {listId: newParamListId}});
const card = Cards.findOne({_id: paramCardId} );
cardMove(req.body.authorId, card, {fieldName: 'listId'}, paramListId);
@@ -544,7 +607,12 @@ if (Meteor.isServer) {
if (req.body.hasOwnProperty('description')) {
const newDescription = req.body.description;
Cards.direct.update({_id: paramCardId, listId: paramListId, boardId: paramBoardId, archived: false},
- {$set: {description: newDescription}});
+ {$set: {description: newDescription}});
+ }
+ if (req.body.hasOwnProperty('labelIds')) {
+ const newlabelIds = req.body.labelIds;
+ Cards.direct.update({_id: paramCardId, listId: paramListId, boardId: paramBoardId, archived: false},
+ {$set: {labelIds: newlabelIds}});
}
JsonRoutes.sendResult(res, {
code: 200,
@@ -555,7 +623,7 @@ if (Meteor.isServer) {
});
- JsonRoutes.add('DELETE', '/api/boards/:boardId/lists/:listId/cards/:cardId', function (req, res, next) {
+ JsonRoutes.add('DELETE', '/api/boards/:boardId/lists/:listId/cards/:cardId', function (req, res) {
Authentication.checkUserId(req.userId);
const paramBoardId = req.params.boardId;
const paramListId = req.params.listId;
diff --git a/models/checklistItems.js b/models/checklistItems.js
new file mode 100644
index 00000000..e075eda2
--- /dev/null
+++ b/models/checklistItems.js
@@ -0,0 +1,145 @@
+ChecklistItems = new Mongo.Collection('checklistItems');
+
+ChecklistItems.attachSchema(new SimpleSchema({
+ title: {
+ type: String,
+ },
+ sort: {
+ type: Number,
+ decimal: true,
+ },
+ isFinished: {
+ type: Boolean,
+ defaultValue: false,
+ },
+ checklistId: {
+ type: String,
+ },
+ cardId: {
+ type: String,
+ },
+}));
+
+ChecklistItems.allow({
+ insert(userId, doc) {
+ return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId));
+ },
+ update(userId, doc) {
+ return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId));
+ },
+ remove(userId, doc) {
+ return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId));
+ },
+ fetch: ['userId', 'cardId'],
+});
+
+ChecklistItems.before.insert((userId, doc) => {
+ if (!doc.userId) {
+ doc.userId = userId;
+ }
+});
+
+// Mutations
+ChecklistItems.mutations({
+ setTitle(title) {
+ return { $set: { title } };
+ },
+ toggleItem() {
+ return { $set: { isFinished: !this.isFinished } };
+ },
+ move(checklistId, sortIndex) {
+ const cardId = Checklists.findOne(checklistId).cardId;
+ const mutatedFields = {
+ cardId,
+ checklistId,
+ sort: sortIndex,
+ };
+
+ return {$set: mutatedFields};
+ },
+});
+
+// Activities helper
+function itemCreation(userId, doc) {
+ const card = Cards.findOne(doc.cardId);
+ const boardId = card.boardId;
+ Activities.insert({
+ userId,
+ activityType: 'addChecklistItem',
+ cardId: doc.cardId,
+ boardId,
+ checklistId: doc.checklistId,
+ checklistItemId: doc._id,
+ });
+}
+
+function itemRemover(userId, doc) {
+ Activities.remove({
+ checklistItemId: doc._id,
+ });
+}
+
+// Activities
+if (Meteor.isServer) {
+ Meteor.startup(() => {
+ ChecklistItems._collection._ensureIndex({ checklistId: 1 });
+ });
+
+ ChecklistItems.after.insert((userId, doc) => {
+ itemCreation(userId, doc);
+ });
+
+ ChecklistItems.after.remove((userId, doc) => {
+ itemRemover(userId, doc);
+ });
+}
+
+if (Meteor.isServer) {
+ JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId/items/:itemId', function (req, res) {
+ Authentication.checkUserId( req.userId);
+ const paramItemId = req.params.itemId;
+ const checklistItem = ChecklistItems.findOne({ _id: paramItemId });
+ if (checklistItem) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: checklistItem,
+ });
+ } else {
+ JsonRoutes.sendResult(res, {
+ code: 500,
+ });
+ }
+ });
+
+ JsonRoutes.add('PUT', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId/items/:itemId', function (req, res) {
+ Authentication.checkUserId( req.userId);
+
+ const paramItemId = req.params.itemId;
+
+ if (req.body.hasOwnProperty('isFinished')) {
+ ChecklistItems.direct.update({_id: paramItemId}, {$set: {isFinished: req.body.isFinished}});
+ }
+ if (req.body.hasOwnProperty('title')) {
+ ChecklistItems.direct.update({_id: paramItemId}, {$set: {title: req.body.title}});
+ }
+
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: paramItemId,
+ },
+ });
+ });
+
+ JsonRoutes.add('DELETE', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId/items/:itemId', function (req, res) {
+ Authentication.checkUserId( req.userId);
+ const paramItemId = req.params.itemId;
+ ChecklistItems.direct.remove({ _id: paramItemId });
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: paramItemId,
+ },
+ });
+ });
+}
diff --git a/models/checklists.js b/models/checklists.js
index 35ef8ae1..c58453ef 100644
--- a/models/checklists.js
+++ b/models/checklists.js
@@ -6,24 +6,7 @@ Checklists.attachSchema(new SimpleSchema({
},
title: {
type: String,
- },
- items: {
- type: [Object],
- defaultValue: [],
- },
- 'items.$._id': {
- type: String,
- },
- 'items.$.title': {
- type: String,
- },
- 'items.$.sort': {
- type: Number,
- decimal: true,
- },
- 'items.$.isFinished': {
- type: Boolean,
- defaultValue: false,
+ defaultValue: 'Checklist',
},
finishedAt: {
type: Date,
@@ -44,41 +27,26 @@ Checklists.attachSchema(new SimpleSchema({
type: Number,
decimal: true,
},
- newItemIndex: {
- type: Number,
- decimal: true,
- defaultValue: 0,
- },
}));
-const self = Checklists;
-
Checklists.helpers({
itemCount() {
- return this.items.length;
+ return ChecklistItems.find({ checklistId: this._id }).count();
},
- getItems() {
- return this.items.sort(function (itemA, itemB) {
- if (itemA.sort < itemB.sort) {
- return -1;
- }
- if (itemA.sort > itemB.sort) {
- return 1;
- }
- return 0;
- });
+ items() {
+ return ChecklistItems.find({
+ checklistId: this._id,
+ }, { sort: ['sort'] });
},
finishedCount() {
- return this.items.filter((item) => {
- return item.isFinished;
- }).length;
+ return ChecklistItems.find({
+ checklistId: this._id,
+ isFinished: true,
+ }).count();
},
isFinished() {
return 0 !== this.itemCount() && this.itemCount() === this.finishedCount();
},
- getItem(_id) {
- return _.findWhere(this.items, { _id });
- },
itemIndex(itemId) {
const items = self.findOne({_id : this._id}).items;
return _.pluck(items, '_id').indexOf(itemId);
@@ -106,82 +74,9 @@ Checklists.before.insert((userId, doc) => {
});
Checklists.mutations({
- //for checklist itself
setTitle(title) {
return { $set: { title } };
},
- //for items in checklist
- addItem(title) {
- const itemCount = this.itemCount();
- const _id = `${this._id}${this.newItemIndex}`;
- return {
- $addToSet: { items: { _id, title, isFinished: false, sort: itemCount } },
- $set: { newItemIndex: this.newItemIndex + 1},
- };
- },
- removeItem(itemId) {
- return { $pull: { items: { _id: itemId } } };
- },
- editItem(itemId, title) {
- if (this.getItem(itemId)) {
- const itemIndex = this.itemIndex(itemId);
- return {
- $set: {
- [`items.${itemIndex}.title`]: title,
- },
- };
- }
- return {};
- },
- finishItem(itemId) {
- if (this.getItem(itemId)) {
- const itemIndex = this.itemIndex(itemId);
- return {
- $set: {
- [`items.${itemIndex}.isFinished`]: true,
- },
- };
- }
- return {};
- },
- resumeItem(itemId) {
- if (this.getItem(itemId)) {
- const itemIndex = this.itemIndex(itemId);
- return {
- $set: {
- [`items.${itemIndex}.isFinished`]: false,
- },
- };
- }
- return {};
- },
- toggleItem(itemId) {
- const item = this.getItem(itemId);
- if (item) {
- const itemIndex = this.itemIndex(itemId);
- return {
- $set: {
- [`items.${itemIndex}.isFinished`]: !item.isFinished,
- },
- };
- }
- return {};
- },
- sortItems(itemIDs) {
- const validItems = [];
- for (const itemID of itemIDs) {
- if (this.getItem(itemID)) {
- validItems.push(this.itemIndex(itemID));
- }
- }
- const modifiedValues = {};
- for (let i = 0; i < validItems.length; i++) {
- modifiedValues[`items.${validItems[i]}.sort`] = i;
- }
- return {
- $set: modifiedValues,
- };
- },
});
if (Meteor.isServer) {
@@ -199,30 +94,6 @@ if (Meteor.isServer) {
});
});
- //TODO: so there will be no activity for adding item into checklist, maybe will be implemented in the future.
- // The future is now
- Checklists.after.update((userId, doc, fieldNames, modifier) => {
- if (fieldNames.includes('items')) {
- if (modifier.$addToSet) {
- Activities.insert({
- userId,
- activityType: 'addChecklistItem',
- cardId: doc.cardId,
- boardId: Cards.findOne(doc.cardId).boardId,
- checklistId: doc._id,
- checklistItemId: modifier.$addToSet.items._id,
- });
- } else if (modifier.$pull) {
- const activity = Activities.findOne({
- checklistItemId: modifier.$pull.items._id,
- });
- if (activity) {
- Activities.remove(activity._id);
- }
- }
- }
- });
-
Checklists.before.remove((userId, doc) => {
const activities = Activities.find({ checklistId: doc._id });
if (activities) {
@@ -233,64 +104,91 @@ if (Meteor.isServer) {
});
}
-//CARD COMMENT REST API
if (Meteor.isServer) {
- JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/checklists', function (req, res, next) {
+ JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/checklists', function (req, res) {
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,
- };
- }),
+ const checklists = Checklists.find({ cardId: paramCardId }).map(function (doc) {
+ return {
+ _id: doc._id,
+ title: doc.title,
+ };
});
+ if (checklists) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: checklists,
+ });
+ } else {
+ JsonRoutes.sendResult(res, {
+ code: 500,
+ });
+ }
});
- JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId', function (req, res, next) {
+ JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId', function (req, res) {
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 }),
- });
+ const checklist = Checklists.findOne({ _id: paramChecklistId, cardId: paramCardId });
+ if (checklist) {
+ checklist.items = ChecklistItems.find({checklistId: checklist._id}).map(function (doc) {
+ return {
+ _id: doc._id,
+ title: doc.title,
+ isFinished: doc.isFinished,
+ };
+ });
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: checklist,
+ });
+ } else {
+ JsonRoutes.sendResult(res, {
+ code: 500,
+ });
+ }
});
- JsonRoutes.add('POST', '/api/boards/:boardId/cards/:cardId/checklists', function (req, res, next) {
+ JsonRoutes.add('POST', '/api/boards/:boardId/cards/:cardId/checklists', function (req, res) {
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,
- },
+ const paramCardId = req.params.cardId;
+ const id = Checklists.insert({
+ title: req.body.title,
+ cardId: paramCardId,
+ sort: 0,
});
+ if (id) {
+ req.body.items.forEach(function (item, idx) {
+ ChecklistItems.insert({
+ cardId: paramCardId,
+ checklistId: id,
+ title: item.title,
+ sort: idx,
+ });
+ });
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: id,
+ },
+ });
+ } else {
+ JsonRoutes.sendResult(res, {
+ code: 400,
+ });
+ }
});
- JsonRoutes.add('DELETE', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId', function (req, res, next) {
+ JsonRoutes.add('DELETE', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId', function (req, res) {
Authentication.checkUserId( req.userId);
- const paramCommentId = req.params.commentId;
- const paramCardId = req.params.cardId;
- Checklists.remove({ _id: paramCommentId, cardId: paramCardId });
+ const paramChecklistId = req.params.checklistId;
+ Checklists.remove({ _id: paramChecklistId });
JsonRoutes.sendResult(res, {
code: 200,
data: {
- _id: paramCardId,
+ _id: paramChecklistId,
},
});
});
diff --git a/models/export.js b/models/export.js
index 49656134..aff66801 100644
--- a/models/export.js
+++ b/models/export.js
@@ -53,12 +53,16 @@ class Exporter {
_.extend(result, Boards.findOne(this._boardId, { fields: { stars: 0 } }));
result.lists = Lists.find(byBoard, noBoardId).fetch();
result.cards = Cards.find(byBoard, noBoardId).fetch();
+ result.swimlanes = Swimlanes.find(byBoard, noBoardId).fetch();
result.comments = CardComments.find(byBoard, noBoardId).fetch();
result.activities = Activities.find(byBoard, noBoardId).fetch();
result.checklists = [];
+ result.checklistItems = [];
result.cards.forEach((card) => {
result.checklists.push(...Checklists.find({ cardId: card._id }).fetch());
+ result.checklistItems.push(...ChecklistItems.find({ cardId: card._id }).fetch());
});
+
// [Old] for attachments we only export IDs and absolute url to original doc
// [New] Encode attachment to base64
const getBase64Data = function(doc, callback) {
diff --git a/models/integrations.js b/models/integrations.js
index 826873ce..1062b93b 100644
--- a/models/integrations.js
+++ b/models/integrations.js
@@ -59,132 +59,188 @@ Integrations.allow({
//INTEGRATIONS REST API
if (Meteor.isServer) {
// Get all integrations in board
- JsonRoutes.add('GET', '/api/boards/:boardId/integrations', function(req, res, next) {
- const paramBoardId = req.params.boardId;
- Authentication.checkBoardAccess(req.userId, paramBoardId);
+ JsonRoutes.add('GET', '/api/boards/:boardId/integrations', function(req, res) {
+ try {
+ const paramBoardId = req.params.boardId;
+ Authentication.checkBoardAccess(req.userId, paramBoardId);
- const data = Integrations.find({ boardId: paramBoardId }, { fields: { token: 0 } }).map(function(doc) {
- return doc;
- });
+ const data = Integrations.find({ boardId: paramBoardId }, { fields: { token: 0 } }).map(function(doc) {
+ return doc;
+ });
- JsonRoutes.sendResult(res, {code: 200, data});
+ JsonRoutes.sendResult(res, {code: 200, data});
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
});
// Get a single integration in board
- JsonRoutes.add('GET', '/api/boards/:boardId/integrations/:intId', function(req, res, next) {
- const paramBoardId = req.params.boardId;
- const paramIntId = req.params.intId;
- Authentication.checkBoardAccess(req.userId, paramBoardId);
-
- JsonRoutes.sendResult(res, {
- code: 200,
- data: Integrations.findOne({ _id: paramIntId, boardId: paramBoardId }, { fields: { token: 0 } }),
- });
+ JsonRoutes.add('GET', '/api/boards/:boardId/integrations/:intId', function(req, res) {
+ try {
+ const paramBoardId = req.params.boardId;
+ const paramIntId = req.params.intId;
+ Authentication.checkBoardAccess(req.userId, paramBoardId);
+
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: Integrations.findOne({ _id: paramIntId, boardId: paramBoardId }, { fields: { token: 0 } }),
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
});
// Create a new integration
- JsonRoutes.add('POST', '/api/boards/:boardId/integrations', function(req, res, next) {
- const paramBoardId = req.params.boardId;
- Authentication.checkBoardAccess(req.userId, paramBoardId);
-
- const id = Integrations.insert({
- userId: req.userId,
- boardId: paramBoardId,
- url: req.body.url,
- });
-
- JsonRoutes.sendResult(res, {
- code: 200,
- data: {
- _id: id,
- },
- });
+ JsonRoutes.add('POST', '/api/boards/:boardId/integrations', function(req, res) {
+ try {
+ const paramBoardId = req.params.boardId;
+ Authentication.checkBoardAccess(req.userId, paramBoardId);
+
+ const id = Integrations.insert({
+ userId: req.userId,
+ boardId: paramBoardId,
+ url: req.body.url,
+ });
+
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: id,
+ },
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
});
// Edit integration data
- JsonRoutes.add('PUT', '/api/boards/:boardId/integrations/:intId', function (req, res, next) {
- const paramBoardId = req.params.boardId;
- const paramIntId = req.params.intId;
- Authentication.checkBoardAccess(req.userId, paramBoardId);
+ JsonRoutes.add('PUT', '/api/boards/:boardId/integrations/:intId', function (req, res) {
+ try {
+ const paramBoardId = req.params.boardId;
+ const paramIntId = req.params.intId;
+ Authentication.checkBoardAccess(req.userId, paramBoardId);
+
+ if (req.body.hasOwnProperty('enabled')) {
+ const newEnabled = req.body.enabled;
+ Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
+ {$set: {enabled: newEnabled}});
+ }
+ if (req.body.hasOwnProperty('title')) {
+ const newTitle = req.body.title;
+ Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
+ {$set: {title: newTitle}});
+ }
+ if (req.body.hasOwnProperty('url')) {
+ const newUrl = req.body.url;
+ Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
+ {$set: {url: newUrl}});
+ }
+ if (req.body.hasOwnProperty('token')) {
+ const newToken = req.body.token;
+ Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
+ {$set: {token: newToken}});
+ }
+ if (req.body.hasOwnProperty('activities')) {
+ const newActivities = req.body.activities;
+ Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
+ {$set: {activities: newActivities}});
+ }
- if (req.body.hasOwnProperty('enabled')) {
- const newEnabled = req.body.enabled;
- Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
- {$set: {enabled: newEnabled}});
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: paramIntId,
+ },
+ });
}
- if (req.body.hasOwnProperty('title')) {
- const newTitle = req.body.title;
- Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
- {$set: {title: newTitle}});
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
}
- if (req.body.hasOwnProperty('url')) {
- const newUrl = req.body.url;
- Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
- {$set: {url: newUrl}});
- }
- if (req.body.hasOwnProperty('token')) {
- const newToken = req.body.token;
- Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
- {$set: {token: newToken}});
- }
- if (req.body.hasOwnProperty('activities')) {
- const newActivities = req.body.activities;
- Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
- {$set: {activities: newActivities}});
- }
-
- JsonRoutes.sendResult(res, {
- code: 200,
- data: {
- _id: paramIntId,
- },
- });
});
// Delete subscribed activities
- JsonRoutes.add('DELETE', '/api/boards/:boardId/integrations/:intId/activities', function (req, res, next) {
- const paramBoardId = req.params.boardId;
- const paramIntId = req.params.intId;
- const newActivities = req.body.activities;
- Authentication.checkBoardAccess(req.userId, paramBoardId);
-
- Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
- {$pullAll: {activities: newActivities}});
-
- JsonRoutes.sendResult(res, {
- code: 200,
- data: Integrations.findOne({_id: paramIntId, boardId: paramBoardId}, { fields: {_id: 1, activities: 1}}),
- });
+ JsonRoutes.add('DELETE', '/api/boards/:boardId/integrations/:intId/activities', function (req, res) {
+ try {
+ const paramBoardId = req.params.boardId;
+ const paramIntId = req.params.intId;
+ const newActivities = req.body.activities;
+ Authentication.checkBoardAccess(req.userId, paramBoardId);
+
+ Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
+ {$pullAll: {activities: newActivities}});
+
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: Integrations.findOne({_id: paramIntId, boardId: paramBoardId}, { fields: {_id: 1, activities: 1}}),
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
});
// Add subscribed activities
- JsonRoutes.add('POST', '/api/boards/:boardId/integrations/:intId/activities', function (req, res, next) {
- const paramBoardId = req.params.boardId;
- const paramIntId = req.params.intId;
- const newActivities = req.body.activities;
- Authentication.checkBoardAccess(req.userId, paramBoardId);
-
- Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
- {$addToSet: {activities: { $each: newActivities}}});
-
- JsonRoutes.sendResult(res, {
- code: 200,
- data: Integrations.findOne({_id: paramIntId, boardId: paramBoardId}, { fields: {_id: 1, activities: 1}}),
- });
+ JsonRoutes.add('POST', '/api/boards/:boardId/integrations/:intId/activities', function (req, res) {
+ try {
+ const paramBoardId = req.params.boardId;
+ const paramIntId = req.params.intId;
+ const newActivities = req.body.activities;
+ Authentication.checkBoardAccess(req.userId, paramBoardId);
+
+ Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
+ {$addToSet: {activities: { $each: newActivities}}});
+
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: Integrations.findOne({_id: paramIntId, boardId: paramBoardId}, { fields: {_id: 1, activities: 1}}),
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
});
// Delete integration
- JsonRoutes.add('DELETE', '/api/boards/:boardId/integrations/:intId', function (req, res, next) {
- const paramBoardId = req.params.boardId;
- const paramIntId = req.params.intId;
- Authentication.checkBoardAccess(req.userId, paramBoardId);
-
- Integrations.direct.remove({_id: paramIntId, boardId: paramBoardId});
- JsonRoutes.sendResult(res, {
- code: 200,
- data: {
- _id: paramIntId,
- },
- });
+ JsonRoutes.add('DELETE', '/api/boards/:boardId/integrations/:intId', function (req, res) {
+ try {
+ const paramBoardId = req.params.boardId;
+ const paramIntId = req.params.intId;
+ Authentication.checkBoardAccess(req.userId, paramBoardId);
+
+ Integrations.direct.remove({_id: paramIntId, boardId: paramBoardId});
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: paramIntId,
+ },
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
});
}
diff --git a/models/invitationCodes.js b/models/invitationCodes.js
index 5761977a..53163f06 100644
--- a/models/invitationCodes.js
+++ b/models/invitationCodes.js
@@ -34,8 +34,8 @@ InvitationCodes.helpers({
});
// InvitationCodes.before.insert((userId, doc) => {
- // doc.createdAt = new Date();
- // doc.authorId = userId;
+// doc.createdAt = new Date();
+// doc.authorId = userId;
// });
if (Meteor.isServer) {
diff --git a/models/lists.js b/models/lists.js
index d9a5b8e2..6f6996cb 100644
--- a/models/lists.js
+++ b/models/lists.js
@@ -42,6 +42,23 @@ Lists.attachSchema(new SimpleSchema({
}
},
},
+ wipLimit: {
+ type: Object,
+ optional: true,
+ },
+ 'wipLimit.value': {
+ type: Number,
+ decimal: false,
+ defaultValue: 1,
+ },
+ 'wipLimit.enabled': {
+ type: Boolean,
+ defaultValue: false,
+ },
+ 'wipLimit.soft': {
+ type: Boolean,
+ defaultValue: false,
+ },
}));
Lists.allow({
@@ -58,11 +75,15 @@ Lists.allow({
});
Lists.helpers({
- cards() {
- return Cards.find(Filter.mongoSelector({
+ cards(swimlaneId) {
+ const selector = {
listId: this._id,
archived: false,
- }), { sort: ['sort'] });
+ };
+ if (swimlaneId)
+ selector.swimlaneId = swimlaneId;
+ return Cards.find(Filter.mongoSelector(selector),
+ { sort: ['sort'] });
},
allCards() {
@@ -72,6 +93,17 @@ Lists.helpers({
board() {
return Boards.findOne(this.boardId);
},
+
+ getWipLimit(option){
+ const list = Lists.findOne({ _id: this._id });
+ if(!list.wipLimit) { // Necessary check to avoid exceptions for the case where the doc doesn't have the wipLimit field yet set
+ return 0;
+ } else if(!option) {
+ return list.wipLimit;
+ } else {
+ return list.wipLimit[option] ? list.wipLimit[option] : 0; // Necessary check to avoid exceptions for the case where the doc doesn't have the wipLimit field yet set
+ }
+ },
});
Lists.mutations({
@@ -86,6 +118,44 @@ Lists.mutations({
restore() {
return { $set: { archived: false } };
},
+
+ toggleSoftLimit(toggle) {
+ return { $set: { 'wipLimit.soft': toggle } };
+ },
+
+ toggleWipLimit(toggle) {
+ return { $set: { 'wipLimit.enabled': toggle } };
+ },
+
+ setWipLimit(limit) {
+ return { $set: { 'wipLimit.value': limit } };
+ },
+});
+
+Meteor.methods({
+ applyWipLimit(listId, limit){
+ check(listId, String);
+ check(limit, Number);
+ if(limit === 0){
+ limit = 1;
+ }
+ Lists.findOne({ _id: listId }).setWipLimit(limit);
+ },
+
+ enableWipLimit(listId) {
+ check(listId, String);
+ const list = Lists.findOne({ _id: listId });
+ if(list.getWipLimit('value') === 0){
+ list.setWipLimit(1);
+ }
+ list.toggleWipLimit(!list.getWipLimit('enabled'));
+ },
+
+ enableSoftLimit(listId) {
+ check(listId, String);
+ const list = Lists.findOne({ _id: listId });
+ list.toggleSoftLimit(!list.getWipLimit('soft'));
+ },
});
Lists.hookOptions.after.update = { fetchPrevious: false };
@@ -131,57 +201,89 @@ 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', function (req, res) {
+ try {
+ 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,
+ };
+ }),
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
});
- 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('GET', '/api/boards/:boardId/lists/:listId', function (req, res) {
+ try {
+ 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 }),
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
});
- 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('POST', '/api/boards/:boardId/lists', function (req, res) {
+ try {
+ 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,
+ },
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
});
- 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,
- },
- });
+ JsonRoutes.add('DELETE', '/api/boards/:boardId/lists/:listId', function (req, res) {
+ try {
+ 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,
+ },
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
});
}
diff --git a/models/settings.js b/models/settings.js
index a490d9c5..34f693d9 100644
--- a/models/settings.js
+++ b/models/settings.js
@@ -105,7 +105,7 @@ if (Meteor.isServer) {
inviter: Users.findOne(icode.authorId).username,
user: icode.email.split('@')[0],
icode: icode.code,
- url: FlowRouter.url('sign-in'),
+ url: FlowRouter.url('sign-up'),
};
const lang = author.getLanguage();
Email.send({
@@ -141,5 +141,31 @@ if (Meteor.isServer) {
}
});
},
+
+ sendSMTPTestEmail() {
+ if (!Meteor.userId()) {
+ throw new Meteor.Error('invalid-user');
+ }
+ const user = Meteor.user();
+ if (!user.emails && !user.emails[0] && user.emails[0].address) {
+ throw new Meteor.Error('email-invalid');
+ }
+ this.unblock();
+ const lang = user.getLanguage();
+ try {
+ Email.send({
+ to: user.emails[0].address,
+ from: Accounts.emailTemplates.from,
+ subject: TAPi18n.__('email-smtp-test-subject', {lng: lang}),
+ text: TAPi18n.__('email-smtp-test-text', {lng: lang}),
+ });
+ } catch ({message}) {
+ throw new Meteor.Error('email-fail', `${TAPi18n.__('email-fail-text', {lng: lang})}: ${ message }`, message);
+ }
+ return {
+ message: 'email-sent',
+ email: user.emails[0].address,
+ };
+ },
});
}
diff --git a/models/swimlanes.js b/models/swimlanes.js
new file mode 100644
index 00000000..72ef3f36
--- /dev/null
+++ b/models/swimlanes.js
@@ -0,0 +1,219 @@
+Swimlanes = new Mongo.Collection('swimlanes');
+
+Swimlanes.attachSchema(new SimpleSchema({
+ title: {
+ type: String,
+ },
+ archived: {
+ type: Boolean,
+ autoValue() { // eslint-disable-line consistent-return
+ if (this.isInsert && !this.isSet) {
+ return false;
+ }
+ },
+ },
+ boardId: {
+ type: String,
+ },
+ createdAt: {
+ type: Date,
+ autoValue() { // eslint-disable-line consistent-return
+ if (this.isInsert) {
+ return new Date();
+ } else {
+ this.unset();
+ }
+ },
+ },
+ sort: {
+ type: Number,
+ decimal: true,
+ // XXX We should probably provide a default
+ optional: true,
+ },
+ updatedAt: {
+ type: Date,
+ optional: true,
+ autoValue() { // eslint-disable-line consistent-return
+ if (this.isUpdate) {
+ return new Date();
+ } else {
+ this.unset();
+ }
+ },
+ },
+}));
+
+Swimlanes.allow({
+ insert(userId, doc) {
+ return allowIsBoardMemberNonComment(userId, Boards.findOne(doc.boardId));
+ },
+ update(userId, doc) {
+ return allowIsBoardMemberNonComment(userId, Boards.findOne(doc.boardId));
+ },
+ remove(userId, doc) {
+ return allowIsBoardMemberNonComment(userId, Boards.findOne(doc.boardId));
+ },
+ fetch: ['boardId'],
+});
+
+Swimlanes.helpers({
+ cards() {
+ return Cards.find(Filter.mongoSelector({
+ swimlaneId: this._id,
+ archived: false,
+ }), { sort: ['sort'] });
+ },
+
+ allCards() {
+ return Cards.find({ swimlaneId: this._id });
+ },
+
+ board() {
+ return Boards.findOne(this.boardId);
+ },
+});
+
+Swimlanes.mutations({
+ rename(title) {
+ return { $set: { title } };
+ },
+
+ archive() {
+ return { $set: { archived: true } };
+ },
+
+ restore() {
+ return { $set: { archived: false } };
+ },
+});
+
+Swimlanes.hookOptions.after.update = { fetchPrevious: false };
+
+if (Meteor.isServer) {
+ Meteor.startup(() => {
+ Swimlanes._collection._ensureIndex({ boardId: 1 });
+ });
+
+ Swimlanes.after.insert((userId, doc) => {
+ Activities.insert({
+ userId,
+ type: 'swimlane',
+ activityType: 'createSwimlane',
+ boardId: doc.boardId,
+ swimlaneId: doc._id,
+ });
+ });
+
+ Swimlanes.before.remove((userId, doc) => {
+ Activities.insert({
+ userId,
+ type: 'swimlane',
+ activityType: 'removeSwimlane',
+ boardId: doc.boardId,
+ swimlaneId: doc._id,
+ title: doc.title,
+ });
+ });
+
+ Swimlanes.after.update((userId, doc) => {
+ if (doc.archived) {
+ Activities.insert({
+ userId,
+ type: 'swimlane',
+ activityType: 'archivedSwimlane',
+ swimlaneId: doc._id,
+ boardId: doc.boardId,
+ });
+ }
+ });
+}
+
+//SWIMLANE REST API
+if (Meteor.isServer) {
+ JsonRoutes.add('GET', '/api/boards/:boardId/swimlanes', function (req, res) {
+ try {
+ const paramBoardId = req.params.boardId;
+ Authentication.checkBoardAccess( req.userId, paramBoardId);
+
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: Swimlanes.find({ boardId: paramBoardId, archived: false }).map(function (doc) {
+ return {
+ _id: doc._id,
+ title: doc.title,
+ };
+ }),
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
+ });
+
+ JsonRoutes.add('GET', '/api/boards/:boardId/swimlanes/:swimlaneId', function (req, res) {
+ try {
+ const paramBoardId = req.params.boardId;
+ const paramSwimlaneId = req.params.swimlaneId;
+ Authentication.checkBoardAccess( req.userId, paramBoardId);
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: Swimlanes.findOne({ _id: paramSwimlaneId, boardId: paramBoardId, archived: false }),
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
+ });
+
+ JsonRoutes.add('POST', '/api/boards/:boardId/swimlanes', function (req, res) {
+ try {
+ Authentication.checkUserId( req.userId);
+ const paramBoardId = req.params.boardId;
+ const id = Swimlanes.insert({
+ title: req.body.title,
+ boardId: paramBoardId,
+ });
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: id,
+ },
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
+ });
+
+ JsonRoutes.add('DELETE', '/api/boards/:boardId/swimlanes/:swimlaneId', function (req, res) {
+ try {
+ Authentication.checkUserId( req.userId);
+ const paramBoardId = req.params.boardId;
+ const paramSwimlaneId = req.params.swimlaneId;
+ Swimlanes.remove({ _id: paramSwimlaneId, boardId: paramBoardId });
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: paramSwimlaneId,
+ },
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
+ });
+
+}
diff --git a/models/trelloCreator.js b/models/trelloCreator.js
index e7f98e85..30f0bc2b 100644
--- a/models/trelloCreator.js
+++ b/models/trelloCreator.js
@@ -23,6 +23,8 @@ export class TrelloCreator {
// Map of labels Trello ID => Wekan ID
this.labels = {};
+ // Default swimlane
+ this.swimlane = null;
// Map of lists Trello ID => Wekan ID
this.lists = {};
// Map of cards Trello ID => Wekan ID
@@ -113,7 +115,6 @@ export class TrelloCreator {
check(trelloLabels, [Match.ObjectIncluding({
// XXX refine control by validating 'color' against a list of allowed
// values (is it worth the maintenance?)
- color: String,
name: String,
})]);
}
@@ -150,6 +151,7 @@ export class TrelloCreator {
isAdmin: true,
isActive: true,
isCommentOnly: false,
+ swimlaneId: false,
}],
permission: this.getPermission(trelloBoard.prefs.permissionLevel),
slug: getSlug(trelloBoard.name) || 'board',
@@ -176,6 +178,7 @@ export class TrelloCreator {
isAdmin: this.getAdmin(trelloMembership.memberType),
isActive: true,
isCommentOnly: false,
+ swimlaneId: false,
});
}
}
@@ -184,7 +187,7 @@ export class TrelloCreator {
trelloBoard.labels.forEach((label) => {
const labelToCreate = {
_id: Random.id(6),
- color: label.color,
+ color: label.color ? label.color : 'black',
name: label.name,
};
// We need to remember them by Trello ID, as this is the only ref we have
@@ -229,6 +232,7 @@ export class TrelloCreator {
dateLastActivity: this._now(),
description: card.desc,
listId: this.lists[card.idList],
+ swimlaneId: this.swimlane,
sort: card.pos,
title: card.name,
// we attribute the card to its creator if available
@@ -375,6 +379,7 @@ export class TrelloCreator {
// we require.
createdAt: this._now(this.createdAt.lists[list.id]),
title: list.name,
+ sort: list.pos,
};
const listId = Lists.direct.insert(listToCreate);
Lists.direct.update(listId, {$set: {'updatedAt': this._now()}});
@@ -396,29 +401,51 @@ export class TrelloCreator {
});
}
+ createSwimlanes(boardId) {
+ const swimlaneToCreate = {
+ archived: false,
+ boardId,
+ // We are being defensing here by providing a default date (now) if the
+ // creation date wasn't found on the action log. This happen on old
+ // Wekan boards (eg from 2013) that didn't log the 'createList' action
+ // we require.
+ createdAt: this._now(),
+ title: 'Default',
+ sort: 1,
+ };
+ const swimlaneId = Swimlanes.direct.insert(swimlaneToCreate);
+ Swimlanes.direct.update(swimlaneId, {$set: {'updatedAt': this._now()}});
+ this.swimlane = swimlaneId;
+ }
+
createChecklists(trelloChecklists) {
trelloChecklists.forEach((checklist) => {
- // Create the checklist
- const checklistToCreate = {
- cardId: this.cards[checklist.idCard],
- title: checklist.name,
- createdAt: this._now(),
- sort: checklist.pos,
- };
- const checklistId = Checklists.direct.insert(checklistToCreate);
- // keep track of Trello id => WeKan id
- this.checklists[checklist.id] = checklistId;
- // 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',
- sort: item.pos,
+ if (this.cards[checklist.idCard]) {
+ // Create the checklist
+ const checklistToCreate = {
+ cardId: this.cards[checklist.idCard],
+ title: checklist.name,
+ createdAt: this._now(),
+ sort: checklist.pos,
+ };
+ const checklistId = Checklists.direct.insert(checklistToCreate);
+ // keep track of Trello id => WeKan id
+ this.checklists[checklist.id] = checklistId;
+ // Now add the items to the checklistItems
+ let counter = 0;
+ checklist.checkItems.forEach((item) => {
+ counter++;
+ const checklistItemTocreate = {
+ _id: checklistId + counter,
+ title: item.name,
+ checklistId: this.checklists[checklist.id],
+ cardId: this.cards[checklist.idCard],
+ sort: item.pos,
+ isFinished: item.state === 'complete',
+ };
+ ChecklistItems.direct.insert(checklistItemTocreate);
});
- });
- Checklists.direct.update(checklistId, {$set: {items: itemsToCreate}});
+ }
});
}
@@ -604,6 +631,7 @@ export class TrelloCreator {
this.parseActions(board.actions);
const boardId = this.createBoardAndLabels(board);
this.createLists(board.lists, boardId);
+ this.createSwimlanes(boardId);
this.createCards(board.cards, boardId);
this.createChecklists(board.checklists);
this.importActions(board.actions, boardId);
diff --git a/models/users.js b/models/users.js
index c2238cde..0093f7cb 100644
--- a/models/users.js
+++ b/models/users.js
@@ -43,7 +43,9 @@ Users.attachSchema(new SimpleSchema({
optional: true,
autoValue() { // eslint-disable-line consistent-return
if (this.isInsert && !this.isSet) {
- return {};
+ return {
+ boardView: 'board-view-lists',
+ };
}
},
},
@@ -95,6 +97,10 @@ Users.attachSchema(new SimpleSchema({
type: String,
optional: true,
},
+ 'profile.boardView': {
+ type: String,
+ optional: true,
+ },
services: {
type: Object,
optional: true,
@@ -108,8 +114,23 @@ Users.attachSchema(new SimpleSchema({
type: Boolean,
optional: true,
},
+ createdThroughApi: {
+ type: Boolean,
+ optional: true,
+ },
+ loginDisabled: {
+ type: Boolean,
+ optional: true,
+ },
}));
+Users.allow({
+ update(userId) {
+ const user = Users.findOne(userId);
+ return user && Meteor.user().isAdmin;
+ },
+});
+
// Search a user in the complete server database by its name or username. This
// is used for instance to add a new user to a board.
const searchInFields = ['username', 'profile.fullname'];
@@ -144,36 +165,36 @@ if (Meteor.isClient) {
Users.helpers({
boards() {
- return Boards.find({ userId: this._id });
+ return Boards.find({ 'members.userId': this._id });
},
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);
},
@@ -183,7 +204,7 @@ Users.helpers({
},
getEmailBuffer() {
- const { emailBuffer = [] } = this.profile;
+ const {emailBuffer = []} = this.profile;
return emailBuffer;
},
@@ -308,22 +329,30 @@ Users.mutations({
},
setAvatarUrl(avatarUrl) {
- return { $set: { 'profile.avatarUrl': avatarUrl } };
+ return {$set: {'profile.avatarUrl': avatarUrl}};
},
setShowCardsCountAt(limit) {
- return { $set: { 'profile.showCardsCountAt': limit } };
+ return {$set: {'profile.showCardsCountAt': limit}};
+ },
+
+ setBoardView(view) {
+ return {
+ $set : {
+ 'profile.boardView': view,
+ },
+ };
},
});
Meteor.methods({
- setUsername(username) {
+ setUsername(username, userId) {
check(username, String);
- const nUsersWithUsername = Users.find({ username }).count();
+ const nUsersWithUsername = Users.find({username}).count();
if (nUsersWithUsername > 0) {
throw new Meteor.Error('username-already-taken');
} else {
- Users.update(this.userId, { $set: { username } });
+ Users.update(userId, {$set: {username}});
}
},
toggleSystemMessages() {
@@ -334,13 +363,13 @@ Meteor.methods({
check(limit, Number);
Meteor.user().setShowCardsCountAt(limit);
},
- setEmail(email) {
+ setEmail(email, userId) {
check(email, String);
- const existingUser = Users.findOne({ 'emails.address': email }, { fields: { _id: 1 } });
+ const existingUser = Users.findOne({'emails.address': email}, {fields: {_id: 1}});
if (existingUser) {
throw new Meteor.Error('email-already-taken');
} else {
- Users.update(this.userId, {
+ Users.update(userId, {
$set: {
emails: [{
address: email,
@@ -350,11 +379,19 @@ Meteor.methods({
});
}
},
- setUsernameAndEmail(username, email) {
+ setUsernameAndEmail(username, email, userId) {
check(username, String);
check(email, String);
- Meteor.call('setUsername', username);
- Meteor.call('setEmail', email);
+ check(userId, String);
+ Meteor.call('setUsername', username, userId);
+ Meteor.call('setEmail', email, userId);
+ },
+ setPassword(newPassword, userId) {
+ check(userId, String);
+ check(newPassword, String);
+ if(Meteor.user().isAdmin){
+ Accounts.setPassword(userId, newPassword);
+ }
},
});
@@ -371,8 +408,8 @@ if (Meteor.isServer) {
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;
+ _.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();
@@ -380,9 +417,9 @@ if (Meteor.isServer) {
const posAt = username.indexOf('@');
let user = null;
if (posAt >= 0) {
- user = Users.findOne({ emails: { $elemMatch: { address: username } } });
+ user = Users.findOne({emails: {$elemMatch: {address: username}}});
} else {
- user = Users.findOne(username) || Users.findOne({ username });
+ user = Users.findOne(username) || Users.findOne({username});
}
if (user) {
if (user._id === inviter._id) throw new Meteor.Error('error-user-notAllowSelf');
@@ -392,7 +429,7 @@ if (Meteor.isServer) {
// Set in lowercase email before creating account
const email = username.toLowerCase();
username = email.substring(0, posAt);
- const newUserId = Accounts.createUser({ username, email });
+ const newUserId = Accounts.createUser({username, email});
if (!newUserId) throw new Meteor.Error('error-user-notCreated');
// assume new user speak same language with inviter
if (inviter.profile && inviter.profile.language) {
@@ -426,7 +463,7 @@ if (Meteor.isServer) {
} catch (e) {
throw new Meteor.Error('email-fail', e.message);
}
- return { username: user.username, email: user.emails[0].address };
+ return {username: user.username, email: user.emails[0].address};
},
});
Accounts.onCreateUser((options, user) => {
@@ -435,6 +472,12 @@ if (Meteor.isServer) {
user.isAdmin = true;
return user;
}
+
+ if (options.from === 'admin') {
+ user.createdThroughApi = true;
+ return user;
+ }
+
const disableRegistration = Settings.findOne().disableRegistration;
if (!disableRegistration) {
return user;
@@ -443,11 +486,16 @@ if (Meteor.isServer) {
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 });
+ 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 };
+ user.profile = {icode: options.profile.invitationcode};
+ user.profile.boardView = 'board-view-lists';
}
return user;
@@ -459,7 +507,7 @@ if (Meteor.isServer) {
Meteor.startup(() => {
Users._collection._ensureIndex({
username: 1,
- }, { unique: true });
+ }, {unique: true});
});
// Each board document contains the de-normalized number of users that have
@@ -478,6 +526,7 @@ if (Meteor.isServer) {
function getStarredBoardsIds(doc) {
return doc.profile && doc.profile.starredBoards;
}
+
const oldIds = getStarredBoardsIds(this.previous);
const newIds = getStarredBoardsIds(user);
@@ -486,9 +535,10 @@ 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);
incrementBoards(_.difference(newIds, oldIds), +1);
});
@@ -514,8 +564,14 @@ if (Meteor.isServer) {
permission: 'private',
}, fakeUser, (err, boardId) => {
- ['welcome-list1', 'welcome-list2'].forEach((title) => {
- Lists.insert({ title: TAPi18n.__(title), boardId }, fakeUser);
+ Swimlanes.insert({
+ title: TAPi18n.__('welcome-swimlane'),
+ boardId,
+ sort: 1,
+ }, fakeUser);
+
+ ['welcome-list1', 'welcome-list2'].forEach((title, titleIndex) => {
+ Lists.insert({title: TAPi18n.__(title), boardId, sort: titleIndex}, fakeUser);
});
});
});
@@ -524,10 +580,21 @@ if (Meteor.isServer) {
Users.after.insert((userId, doc) => {
+ if (doc.createdThroughApi) {
+ // The admin user should be able to create a user despite disabling registration because
+ // it is two different things (registration and creation).
+ // So, when a new user is created via the api (only admin user can do that) one must avoid
+ // the disableRegistration check.
+ // Issue : https://github.com/wekan/wekan/issues/1232
+ // PR : https://github.com/wekan/wekan/pull/1251
+ Users.update(doc._id, {$set: {createdThroughApi: ''}});
+ return;
+ }
+
//invite user to corresponding boards
const disableRegistration = Settings.findOne().disableRegistration;
if (disableRegistration) {
- const invitationCode = InvitationCodes.findOne({ code: doc.profile.icode, valid: true });
+ const invitationCode = InvitationCodes.findOne({code: doc.profile.icode, valid: true});
if (!invitationCode) {
throw new Meteor.Error('error-invitation-code-not-exist');
} else {
@@ -539,8 +606,8 @@ if (Meteor.isServer) {
doc.profile = {};
}
doc.profile.invitedBoards = invitationCode.boardsToBeInvited;
- Users.update(doc._id, { $set: { profile: doc.profile } });
- InvitationCodes.update(invitationCode._id, { $set: { valid: false } });
+ Users.update(doc._id, {$set: {profile: doc.profile}});
+ InvitationCodes.update(invitationCode._id, {$set: {valid: false}});
}
}
});
@@ -549,59 +616,143 @@ if (Meteor.isServer) {
// 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/user', function(req, res) {
+ try {
+ Authentication.checkLoggedIn(req.userId);
+ const data = Meteor.users.findOne({ _id: req.userId});
+ delete data.services;
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data,
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
});
- 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', function (req, res) {
+ try {
+ Authentication.checkUserId(req.userId);
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: Meteor.users.find({}).map(function (doc) {
+ return { _id: doc._id, username: doc.username };
+ }),
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
});
- 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('GET', '/api/users/:id', function (req, res) {
+ try {
+ Authentication.checkUserId(req.userId);
+ const id = req.params.id;
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: Meteor.users.findOne({ _id: id }),
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
});
- 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('PUT', '/api/users/:id', function (req, res) {
+ try {
+ Authentication.checkUserId(req.userId);
+ const id = req.params.id;
+ const action = req.body.action;
+ let data = Meteor.users.findOne({ _id: id });
+ if (data !== undefined) {
+ if (action === 'takeOwnership') {
+ data = Boards.find({
+ 'members.userId': id,
+ 'members.isAdmin': true,
+ }).map(function(board) {
+ if (board.hasMember(req.userId)) {
+ board.removeMember(req.userId);
+ }
+ board.changeOwnership(id, req.userId);
+ return {
+ _id: board._id,
+ title: board.title,
+ };
+ });
+ } else {
+ if ((action === 'disableLogin') && (id !== req.userId)) {
+ Users.update({ _id: id }, { $set: { loginDisabled: true, 'services.resume.loginTokens': '' } });
+ } else if (action === 'enableLogin') {
+ Users.update({ _id: id }, { $set: { loginDisabled: '' } });
+ }
+ data = Meteor.users.findOne({ _id: id });
+ }
+ }
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data,
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
});
- 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,
- },
- });
+ JsonRoutes.add('POST', '/api/users/', function (req, res) {
+ try {
+ Authentication.checkUserId(req.userId);
+ const id = Accounts.createUser({
+ username: req.body.username,
+ email: req.body.email,
+ password: req.body.password,
+ from: 'admin',
+ });
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: id,
+ },
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
});
-}
+ JsonRoutes.add('DELETE', '/api/users/:id', function (req, res) {
+ try {
+ Authentication.checkUserId(req.userId);
+ const id = req.params.id;
+ Meteor.users.remove({ _id: id });
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: {
+ _id: id,
+ },
+ });
+ }
+ catch (error) {
+ JsonRoutes.sendResult(res, {
+ code: 200,
+ data: error,
+ });
+ }
+ });
+}
diff --git a/models/wekanCreator.js b/models/wekanCreator.js
index 3cd65fd7..4551979b 100644
--- a/models/wekanCreator.js
+++ b/models/wekanCreator.js
@@ -14,6 +14,7 @@ export class WekanCreator {
board: null,
cards: {},
lists: {},
+ swimlanes: {},
};
// The object creator Wekan Id, indexed by the object Wekan id
// (so we only parse actions once!)
@@ -23,6 +24,8 @@ export class WekanCreator {
// Map of labels Wekan ID => Wekan ID
this.labels = {};
+ // Map of swimlanes Wekan ID => Wekan ID
+ this.swimlanes = {};
// Map of lists Wekan ID => Wekan ID
this.lists = {};
// Map of cards Wekan ID => Wekan ID
@@ -33,6 +36,8 @@ export class WekanCreator {
this.attachmentIds = {};
// Map of checklists Wekan ID => Wekan ID
this.checklists = {};
+ // Map of checklistItems Wekan ID => Wekan ID
+ this.checklistItems = {};
// The comments, indexed by Wekan card id (to map when importing cards)
this.comments = {};
// the members, indexed by Wekan member id => Wekan user ID
@@ -121,59 +126,62 @@ export class WekanCreator {
})]);
}
+ checkSwimlanes(wekanSwimlanes) {
+ check(wekanSwimlanes, [Match.ObjectIncluding({
+ archived: Boolean,
+ title: String,
+ })]);
+ }
+
checkChecklists(wekanChecklists) {
check(wekanChecklists, [Match.ObjectIncluding({
cardId: String,
title: String,
- items: [Match.ObjectIncluding({
- isFinished: Boolean,
- title: String,
- })],
+ })]);
+ }
+
+ checkChecklistItems(wekanChecklistItems) {
+ check(wekanChecklistItems, [Match.ObjectIncluding({
+ cardId: String,
+ title: String,
})]);
}
// You must call parseActions before calling this one.
- createBoardAndLabels(wekanBoard) {
+ createBoardAndLabels(boardToImport) {
const boardToCreate = {
- archived: wekanBoard.archived,
- color: wekanBoard.color,
+ archived: boardToImport.archived,
+ color: boardToImport.color,
// very old boards won't have a creation activity so no creation date
- createdAt: this._now(wekanBoard.createdAt),
+ createdAt: this._now(boardToImport.createdAt),
labels: [],
members: [{
userId: Meteor.userId(),
- isAdmin: true,
+ wekanId: Meteor.userId(),
isActive: true,
+ isAdmin: true,
isCommentOnly: false,
+ swimlaneId: false,
}],
// Standalone Export has modifiedAt missing, adding modifiedAt to fix it
- modifiedAt: this._now(wekanBoard.modifiedAt),
- permission: wekanBoard.permission,
- slug: getSlug(wekanBoard.title) || 'board',
+ modifiedAt: this._now(boardToImport.modifiedAt),
+ permission: boardToImport.permission,
+ slug: getSlug(boardToImport.title) || 'board',
stars: 0,
- title: wekanBoard.title,
+ title: boardToImport.title,
};
// now add other members
- if(wekanBoard.members) {
- wekanBoard.members.forEach((wekanMember) => {
- const wekanId = wekanMember.userId;
- // do we have a mapping?
- if(this.members[wekanId]) {
- const wekanId = this.members[wekanId];
- // do we already have it in our list?
- const wekanMember = boardToCreate.members.find((wekanMember) => wekanMember.userId === wekanId);
- if(!wekanMember) {
- boardToCreate.members.push({
- userId: wekanId,
- isAdmin: wekanMember.isAdmin,
- isActive: true,
- isCommentOnly: false,
- });
- }
- }
+ if(boardToImport.members) {
+ boardToImport.members.forEach((wekanMember) => {
+ // do we already have it in our list?
+ if(!boardToCreate.members.some((member) => member.wekanId === wekanMember.wekanId))
+ boardToCreate.members.push({
+ ... wekanMember,
+ userId: wekanMember.wekanId,
+ });
});
}
- wekanBoard.labels.forEach((label) => {
+ boardToImport.labels.forEach((label) => {
const labelToCreate = {
_id: Random.id(6),
color: label.color,
@@ -192,7 +200,7 @@ export class WekanCreator {
boardId,
createdAt: this._now(),
source: {
- id: wekanBoard.id,
+ id: boardToImport.id,
system: 'Wekan',
},
// We attribute the import to current user,
@@ -220,11 +228,15 @@ export class WekanCreator {
dateLastActivity: this._now(),
description: card.description,
listId: this.lists[card.listId],
+ swimlaneId: this.swimlanes[card.swimlaneId],
sort: card.sort,
title: card.title,
// we attribute the card to its creator if available
userId: this._user(this.createdBy.cards[card._id]),
+ isOvertime: card.isOvertime || false,
+ startAt: card.startAt ? this._now(card.startAt) : null,
dueAt: card.dueAt ? this._now(card.dueAt) : null,
+ spentTime: card.spentTime || null,
};
// add labels
if (card.labelIds) {
@@ -378,7 +390,7 @@ export class WekanCreator {
}
createLists(wekanLists, boardId) {
- wekanLists.forEach((list) => {
+ wekanLists.forEach((list, listIndex) => {
const listToCreate = {
archived: list.archived,
boardId,
@@ -388,6 +400,7 @@ export class WekanCreator {
// we require.
createdAt: this._now(this.createdAt.lists[list.id]),
title: list.title,
+ sort: list.sort ? list.sort : listIndex,
};
const listId = Lists.direct.insert(listToCreate);
Lists.direct.update(listId, {$set: {'updatedAt': this._now()}});
@@ -409,7 +422,27 @@ export class WekanCreator {
});
}
+ createSwimlanes(wekanSwimlanes, boardId) {
+ wekanSwimlanes.forEach((swimlane, swimlaneIndex) => {
+ const swimlaneToCreate = {
+ archived: swimlane.archived,
+ boardId,
+ // We are being defensing here by providing a default date (now) if the
+ // creation date wasn't found on the action log. This happen on old
+ // Wekan boards (eg from 2013) that didn't log the 'createList' action
+ // we require.
+ createdAt: this._now(this.createdAt.swimlanes[swimlane._id]),
+ title: swimlane.title,
+ sort: swimlane.sort ? swimlane.sort : swimlaneIndex,
+ };
+ const swimlaneId = Swimlanes.direct.insert(swimlaneToCreate);
+ Swimlanes.direct.update(swimlaneId, {$set: {'updatedAt': this._now()}});
+ this.swimlanes[swimlane._id] = swimlaneId;
+ });
+ }
+
createChecklists(wekanChecklists) {
+ const result = [];
wekanChecklists.forEach((checklist, checklistIndex) => {
// Create the checklist
const checklistToCreate = {
@@ -419,19 +452,24 @@ export class WekanCreator {
sort: checklist.sort ? checklist.sort : checklistIndex,
};
const checklistId = Checklists.direct.insert(checklistToCreate);
- // keep track of Wekan id => WeKan id
this.checklists[checklist._id] = checklistId;
- // Now add the items to the checklist
- const itemsToCreate = [];
- checklist.items.forEach((item, itemIndex) => {
- itemsToCreate.push({
- _id: checklistId + itemsToCreate.length,
- title: item.title,
- isFinished: item.isFinished,
- sort: item.sort ? item.sort : itemIndex,
- });
- });
- Checklists.direct.update(checklistId, {$set: {items: itemsToCreate}});
+ result.push(checklistId);
+ });
+ return result;
+ }
+
+ createChecklistItems(wekanChecklistItems) {
+ wekanChecklistItems.forEach((checklistitem, checklistitemIndex) => {
+ // Create the checklistItem
+ const checklistItemTocreate = {
+ title: checklistitem.title,
+ checklistId: this.checklists[checklistitem.checklistId],
+ cardId: this.cards[checklistitem.cardId],
+ sort: checklistitem.sort ? checklistitem.sort : checklistitemIndex,
+ isFinished: checklistitem.isFinished,
+ };
+ const checklistItemId = ChecklistItems.direct.insert(checklistItemTocreate);
+ this.checklistItems[checklistitem._id] = checklistItemId;
});
}
@@ -445,14 +483,17 @@ export class WekanCreator {
const wekanAttachment = wekanBoard.attachments.filter((attachment) => {
return attachment._id === activity.attachmentId;
})[0];
- if(wekanAttachment.url || wekanAttachment.file) {
+
+ if ( typeof wekanAttachment !== 'undefined' && wekanAttachment ) {
+ if(wekanAttachment.url || wekanAttachment.file) {
// we cannot actually create the Wekan attachment, because we don't yet
// have the cards to attach it to, so we store it in the instance variable.
- const wekanCardId = activity.cardId;
- if(!this.attachments[wekanCardId]) {
- this.attachments[wekanCardId] = [];
+ const wekanCardId = activity.cardId;
+ if(!this.attachments[wekanCardId]) {
+ this.attachments[wekanCardId] = [];
+ }
+ this.attachments[wekanCardId].push(wekanAttachment);
}
- this.attachments[wekanCardId].push(wekanAttachment);
}
break;
}
@@ -481,6 +522,11 @@ export class WekanCreator {
const listId = activity.listId;
this.createdAt.lists[listId] = activity.createdAt;
break;
+ }
+ case 'createSwimlane': {
+ const swimlaneId = activity.swimlaneId;
+ this.createdAt.swimlanes[swimlaneId] = activity.createdAt;
+ break;
}}
});
}
@@ -602,8 +648,10 @@ export class WekanCreator {
this.checkBoard(board);
this.checkLabels(board.labels);
this.checkLists(board.lists);
+ this.checkSwimlanes(board.swimlanes);
this.checkCards(board.cards);
this.checkChecklists(board.checklists);
+ this.checkChecklistItems(board.checklistItems);
} catch (e) {
throw new Meteor.Error('error-json-schema');
}
@@ -620,8 +668,10 @@ export class WekanCreator {
this.parseActivities(board);
const boardId = this.createBoardAndLabels(board);
this.createLists(board.lists, boardId);
+ this.createSwimlanes(board.swimlanes, boardId);
this.createCards(board.cards, boardId);
this.createChecklists(board.checklists);
+ this.createChecklistItems(board.checklistItems);
this.importActivities(board.activities, boardId);
// XXX add members
return boardId;
diff --git a/package.json b/package.json
index aacb2f90..1d62fdb6 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "wekan",
- "version": "0.39.0",
+ "version": "0.95.0",
"description": "The open-source Trello-like kanban",
"private": true,
"scripts": {
@@ -23,14 +23,12 @@
"eslint": "^2.0.0"
},
"dependencies": {
- "babel-runtime": "^6.23.0",
- "bcrypt": "^1.0.2",
- "bson": "^1.0.4",
- "es6-promise": "^4.1.0",
- "meteor-node-stubs": "^0.2.6",
+ "babel-runtime": "^6.26.0",
+ "bcrypt": "^2.0.1",
+ "bson-ext": "^2.0.0",
+ "es6-promise": "^4.2.4",
+ "meteor-node-stubs": "^0.4.1",
"os": "^0.1.1",
- "winston": "^2.3.1",
- "winston-zulip": "0.0.6",
- "xss": "^0.3.3"
+ "xss": "^0.3.8"
}
}
diff --git a/public/fonts/roboto-bold.woff b/public/fonts/roboto-bold.woff
index bf737c1c..6ec255f5 100644
--- a/public/fonts/roboto-bold.woff
+++ b/public/fonts/roboto-bold.woff
Binary files differ
diff --git a/public/fonts/roboto-bold.woff2 b/public/fonts/roboto-bold.woff2
index 11cde5d0..f779b2c5 100644
--- a/public/fonts/roboto-bold.woff2
+++ b/public/fonts/roboto-bold.woff2
Binary files differ
diff --git a/public/fonts/roboto-regular.woff b/public/fonts/roboto-regular.woff
index 941dfa4b..f9a02e26 100644
--- a/public/fonts/roboto-regular.woff
+++ b/public/fonts/roboto-regular.woff
Binary files differ
diff --git a/public/fonts/roboto-regular.woff2 b/public/fonts/roboto-regular.woff2
index 120796bb..cebe610d 100644
--- a/public/fonts/roboto-regular.woff2
+++ b/public/fonts/roboto-regular.woff2
Binary files differ
diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp
index feb000f1..bd5994e9 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 = 26,
+ appVersion = 80,
# Increment this for every release.
- appMarketingVersion = (defaultText = "0.39.0~2017-09-18"),
+ appMarketingVersion = (defaultText = "0.95.0~2018-05-08"),
# Human-readable presentation of the app version.
minUpgradableAppVersion = 0,
@@ -90,6 +90,7 @@ const pkgdef :Spk.PackageDefinition = (
defaultText = embed "CHANGELOG.md",
localizations = [
(locale = "fr", text = embed "meta/t9n-changelog/fr.md"),
+ (locale = "fi", text = embed "meta/t9n-changelog/fi.md"),
],
)
)
@@ -117,12 +118,14 @@ const pkgdef :Spk.PackageDefinition = (
defaultText = "participate",
localizations = [
(locale = "fr", text = "participer"),
+ (locale = "fi", text = "osallistu"),
],
),
description = (
defaultText = "allows participating in the board",
localizations = [
(locale = "fr", text = "permet de participer dans le tableau"),
+ (locale = "fi", text = "mahdollistaa taululle osallistumisen"),
],
)
), (
@@ -131,12 +134,14 @@ const pkgdef :Spk.PackageDefinition = (
defaultText = "configure",
localizations = [
(locale = "fr", text = "configurer"),
+ (locale = "fi", text = "asetukset"),
],
),
description = (
defaultText = "allows configuring the board",
localizations = [
(locale = "fr", text = "permet de configurer le tableau"),
+ (locale = "fi", text = "mahdollistaa taulun asetusten määrittämisen"),
],
)
)],
@@ -146,6 +151,7 @@ const pkgdef :Spk.PackageDefinition = (
defaultText = "observer",
localizations = [
(locale = "fr", text = "observateur"),
+ (locale = "fi", text = "tarkkailija"),
],
),
permissions = [false, false],
@@ -153,6 +159,7 @@ const pkgdef :Spk.PackageDefinition = (
defaultText = "can read",
localizations = [
(locale = "fr", text = "peut lire"),
+ (locale = "fi", text = "voi lukea"),
],
)
), (
@@ -160,6 +167,7 @@ const pkgdef :Spk.PackageDefinition = (
defaultText = "member",
localizations = [
(locale = "fr", text = "membre"),
+ (locale = "fi", text = "jäsen"),
],
),
permissions = [true, false],
@@ -167,6 +175,7 @@ const pkgdef :Spk.PackageDefinition = (
defaultText = "can edit",
localizations = [
(locale = "fr", text = "peut éditer"),
+ (locale = "fi", text = "voi muokata"),
],
),
default = true,
diff --git a/sandstorm.js b/sandstorm.js
index 6b7c8172..3ea85fef 100644
--- a/sandstorm.js
+++ b/sandstorm.js
@@ -22,7 +22,9 @@ const sandstormBoard = {
if (isSandstorm && Meteor.isServer) {
const fs = require('fs');
- const Capnp = require('capnp');
+ const pathParts = process.cwd().split('/');
+ const path = pathParts.join('/');
+ const Capnp = Npm.require(`${path}../../../node_modules/capnp.js`);
const Package = Capnp.importSystem('sandstorm/package.capnp');
const Powerbox = Capnp.importSystem('sandstorm/powerbox.capnp');
const Identity = Capnp.importSystem('sandstorm/identity.capnp');
@@ -250,6 +252,10 @@ if (isSandstorm && Meteor.isServer) {
Users.after.insert((userId, doc) => {
if (!Boards.findOne(sandstormBoard._id)) {
Boards.insert(sandstormBoard, { validate: false });
+ Swimlanes.insert({
+ title: 'Default',
+ boardId: sandstormBoard._id,
+ });
Activities.update(
{ activityTypeId: sandstormBoard._id },
{ $set: { userId: doc._id }}
diff --git a/server/authentication.js b/server/authentication.js
index 23ed8f56..8059f176 100644
--- a/server/authentication.js
+++ b/server/authentication.js
@@ -1,4 +1,18 @@
+import Fiber from 'fibers';
+
Meteor.startup(() => {
+
+ // Node Fibers 100% CPU usage issue
+ // https://github.com/wekan/wekan-mongodb/issues/2#issuecomment-381453161
+ // https://github.com/meteor/meteor/issues/9796#issuecomment-381676326
+ // https://github.com/sandstorm-io/sandstorm/blob/0f1fec013fe7208ed0fd97eb88b31b77e3c61f42/shell/server/00-startup.js#L99-L129
+ Fiber.poolSize = 1e9;
+
+ Accounts.validateLoginAttempt(function (options) {
+ const user = options.user || {};
+ return !user.loginDisabled;
+ });
+
Authentication = {};
Authentication.checkUserId = function (userId) {
diff --git a/server/logger.js b/server/logger.js
deleted file mode 100644
index 70caa292..00000000
--- a/server/logger.js
+++ /dev/null
@@ -1,66 +0,0 @@
-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/migrations.js b/server/migrations.js
index 99125976..0fdd1fe0 100644
--- a/server/migrations.js
+++ b/server/migrations.js
@@ -109,9 +109,9 @@ Migrations.add('add-member-isactive-field', () => {
Boards.find({}, {fields: {members: 1}}).forEach((board) => {
const allUsersWithSomeActivity = _.chain(
Activities.find({ boardId: board._id }, { fields:{ userId:1 }}).fetch())
- .pluck('userId')
- .uniq()
- .value();
+ .pluck('userId')
+ .uniq()
+ .value();
const currentUsers = _.pluck(board.members, 'userId');
const formerUsers = _.difference(allUsersWithSomeActivity, currentUsers);
@@ -130,3 +130,92 @@ Migrations.add('add-member-isactive-field', () => {
Boards.update(board._id, {$set: {members: newMemberSet}}, noValidate);
});
});
+
+Migrations.add('add-sort-checklists', () => {
+ Checklists.find().forEach((checklist, index) => {
+ if (!checklist.hasOwnProperty('sort')) {
+ Checklists.direct.update(
+ checklist._id,
+ { $set: { sort: index } },
+ noValidate
+ );
+ }
+ checklist.items.find().forEach((item, index) => {
+ if (!item.hasOwnProperty('sort')) {
+ Checklists.direct.update(
+ { _id: checklist._id, 'items._id': item._id },
+ { $set: { 'items.$.sort': index } },
+ noValidate
+ );
+ }
+ });
+ });
+});
+
+Migrations.add('add-swimlanes', () => {
+ Boards.find().forEach((board) => {
+ const swimlane = Swimlanes.findOne({ boardId: board._id });
+ let swimlaneId = '';
+ if (swimlane)
+ swimlaneId = swimlane._id;
+ else
+ swimlaneId = Swimlanes.direct.insert({
+ boardId: board._id,
+ title: 'Default',
+ });
+
+ Cards.find({ boardId: board._id }).forEach((card) => {
+ if (!card.hasOwnProperty('swimlaneId')) {
+ Cards.direct.update(
+ { _id: card._id },
+ { $set: { swimlaneId } },
+ noValidate
+ );
+ }
+ });
+ });
+});
+
+Migrations.add('add-views', () => {
+ Boards.find().forEach((board) => {
+ if (!board.hasOwnProperty('view')) {
+ Boards.direct.update(
+ { _id: board._id },
+ { $set: { view: 'board-view-swimlanes' } },
+ noValidate
+ );
+ }
+ });
+});
+
+Migrations.add('add-checklist-items', () => {
+ Checklists.find().forEach((checklist) => {
+ // Create new items
+ _.sortBy(checklist.items, 'sort').forEach((item, index) => {
+ ChecklistItems.direct.insert({
+ title: checklist.title,
+ sort: index,
+ isFinished: item.isFinished,
+ checklistId: checklist._id,
+ cardId: checklist.cardId,
+ });
+ });
+
+ // Delete old ones
+ Checklists.direct.update({ _id: checklist._id },
+ { $unset: { items : 1 } },
+ noValidate
+ );
+ });
+});
+
+Migrations.add('add-profile-view', () => {
+ Users.find().forEach((user) => {
+ // Set default view
+ Users.direct.update(
+ { _id: user._id },
+ { $set: { 'profile.boardView': 'board-view-lists' } },
+ noValidate
+ );
+ });
+});
diff --git a/server/notifications/outgoing.js b/server/notifications/outgoing.js
index 07a0a903..779d41a0 100644
--- a/server/notifications/outgoing.js
+++ b/server/notifications/outgoing.js
@@ -29,7 +29,10 @@ Meteor.methods({
text: `${text}`,
};
- ['cardId', 'listId', 'oldListId', 'boardId'].forEach((key) => {
+ [ 'cardId', 'listId', 'oldListId',
+ 'boardId', 'comment', 'user',
+ 'card', 'commentId',
+ ].forEach((key) => {
if (params[key]) value[key] = params[key];
});
value.description = description;
diff --git a/server/observableChanges.js b/server/observableChanges.js
deleted file mode 100644
index 390ae093..00000000
--- a/server/observableChanges.js
+++ /dev/null
@@ -1,100 +0,0 @@
-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/announcements.js b/server/publications/announcements.js
new file mode 100644
index 00000000..efebf640
--- /dev/null
+++ b/server/publications/announcements.js
@@ -0,0 +1,3 @@
+Meteor.publish('announcements', function() {
+ return Announcements.find();
+});
diff --git a/server/publications/boards.js b/server/publications/boards.js
index 7cadf0c6..b52ac49f 100644
--- a/server/publications/boards.js
+++ b/server/publications/boards.js
@@ -73,6 +73,7 @@ Meteor.publishRelations('board', function(boardId) {
],
}, { limit: 1 }), function(boardId, board) {
this.cursor(Lists.find({ boardId }));
+ this.cursor(Swimlanes.find({ boardId }));
this.cursor(Integrations.find({ boardId }));
this.cursor(CustomFields.find({ boardId }, { sort: { name: 1 } }));
@@ -101,6 +102,7 @@ Meteor.publishRelations('board', function(boardId) {
this.cursor(CardComments.find({ cardId }));
this.cursor(Attachments.find({ cardId }));
this.cursor(Checklists.find({ cardId }));
+ this.cursor(ChecklistItems.find({ cardId }));
});
if (board.members) {
diff --git a/server/publications/people.js b/server/publications/people.js
new file mode 100644
index 00000000..f3c2bdfe
--- /dev/null
+++ b/server/publications/people.js
@@ -0,0 +1,7 @@
+Meteor.publish('people', (limit) => {
+ check(limit, Number);
+ return Users.find({}, {
+ limit,
+ sort: {createdAt: -1},
+ });
+});
diff --git a/snap-src/Caddyfile b/snap-src/Caddyfile
new file mode 100644
index 00000000..07ed4143
--- /dev/null
+++ b/snap-src/Caddyfile
@@ -0,0 +1,5 @@
+http://:8080
+proxy / localhost:3001 {
+ websocket
+ transparent
+}
diff --git a/snap-src/bin/caddy-control b/snap-src/bin/caddy-control
new file mode 100755
index 00000000..46d36c6b
--- /dev/null
+++ b/snap-src/bin/caddy-control
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+# get wekan/mongo settings
+source $SNAP/bin/wekan-read-settings
+
+if [ "$CADDY_ENABLED" = "true" ]; then
+ env LC_ALL=C caddy -conf=$SNAP_COMMON/Caddyfile -host=localhost:${CADDY_PORT}
+else
+ echo "caddy is disabled. Stop service"
+ snapctl stop --disable ${SNAP_NAME}.caddy
+ # sleep here, in case snapctl fails to stop service so we do not restart too often
+fi
diff --git a/snap-src/config b/snap-src/bin/config
index dbf8402c..813c3d3f 100755
--- a/snap-src/config
+++ b/snap-src/bin/config
@@ -1,17 +1,14 @@
#!/bin/sh
-# store here all configuration options for wekan snap
-# read configured settings first
-SETTINGS_FILE="$SNAP_COMMON/wekan_settings.sh"
-[ -f $SETTINGS_FILE ] && . $SETTINGS_FILE
+# All supported keys are defined here together with descriptions and default values
# list of supported keys
-keys="MONGODB_BIND_UNIX_SOCKET MONGODB_BIND_IP MONGODB_PORT MAIL_URL MAIL_FROM ROOT_URL PORT DISABLE_MONGODB"
+keys="MONGODB_BIND_UNIX_SOCKET MONGODB_BIND_IP MONGODB_PORT MAIL_URL MAIL_FROM ROOT_URL PORT DISABLE_MONGODB CADDY_ENABLED CADDY_BIND_PORT"
# default values
DESCRIPTION_MONGODB_BIND_UNIX_SOCKET="mongodb binding unix socket:\n"\
"\t\t\t Default behaviour will preffer binding over unix socket, to disable unix socket binding set value to 'nill' string\n"\
-"\t\t\t To bind to instance of mongo provided through contect interface set to relative path to the socket inside shared directory"
+"\t\t\t To bind to instance of mongodb provided through content interface,set value to relative path to the socket inside '$SNAP_DATA/shared' directory"
DEFAULT_MONGODB_BIND_UNIX_SOCKET="$SNAP_DATA/share"
KEY_MONGODB_BIND_UNIX_SOCKET="mongodb-bind-unix-socket"
@@ -39,6 +36,14 @@ DESCRIPTION_PORT="port wekan is exposed at"
DEFAULT_PORT="8080"
KEY_PORT="port"
-DESCRIPTION_DISABLE_MONGODB="Disable mongodb service: use only if binding to database outside of the snap. Valid values: [true,false]"
+DESCRIPTION_DISABLE_MONGODB="Disable mongodb service: use only if binding to database outside of the ${SNAP_NAME} snap. Valid values: [true,false]"
DEFAULT_DISABLE_MONGODB="false"
KEY_DISABLE_MONGODB="disable-mongodb"
+
+DESCRIPTION_CADDY_ENABLED="Enable caddy service (caddy - Every Site on HTTPS) personal license for non-commercial use only, see https://caddyserver.com/products/licenses . Set to 'true' to enable caddy\n\t\tcaddy settings are handled through $SNAP_COMMON/Caddyfile"
+DEFAULT_CADDY_ENABLED="false"
+KEY_CADDY_ENABLED="caddy-enabled"
+
+DESCRIPTION_CADDY_BIND_PORT="Port on which caddy will expect proxy, value set here will be set in $SNAP_COMMON/Caddyfile"
+DEFAULT_CADDY_BIND_PORT="3001"
+KEY_CADDY_BIND_PORT="caddy-bind-port"
diff --git a/snap-src/mongodb-backup b/snap-src/bin/mongodb-backup
index bef8bf9b..bef8bf9b 100755
--- a/snap-src/mongodb-backup
+++ b/snap-src/bin/mongodb-backup
diff --git a/snap-src/mongodb-control b/snap-src/bin/mongodb-control
index 08af132d..a7a98739 100755
--- a/snap-src/mongodb-control
+++ b/snap-src/bin/mongodb-control
@@ -4,7 +4,8 @@
source $SNAP/bin/wekan-read-settings
if [ "true" == "${DISABLE_MONGODB}" ]; then
- echo "mongodb is disabled. Not starting it"
+ echo "mongodb is disabled. Stop service"
+ snapctl stop --disable ${SNAP_NAME}.mongodb
exit 0
fi
diff --git a/snap-src/mongodb-restore b/snap-src/bin/mongodb-restore
index c1c82775..c1c82775 100755
--- a/snap-src/mongodb-restore
+++ b/snap-src/bin/mongodb-restore
diff --git a/snap-src/wekan-control b/snap-src/bin/wekan-control
index 905642ed..bc2cefde 100755
--- a/snap-src/wekan-control
+++ b/snap-src/bin/wekan-control
@@ -1,8 +1,5 @@
#!/bin/bash
-SYSTEMD_WEKAN_SERVICE="snap.${SNAP_NAME}.wekan"
-SYSTEMD_MONGODB_SERVICE="snap.${SNAP_NAME}.mongodb"
-
# get wekan/mongo settings
source $SNAP/bin/wekan-read-settings
diff --git a/snap-src/wekan-help b/snap-src/bin/wekan-help
index bbf0e138..ee565500 100755
--- a/snap-src/wekan-help
+++ b/snap-src/bin/wekan-help
@@ -1,15 +1,17 @@
#!/bin/bash
-source $SNAP/bin/config &>/dev/null
+# first read settings
+source $SNAP/bin/wekan-read-settings &>/dev/null
+if [ "$CADDY_ENABLED" = "true" ]; then
+ # tweak port nunmber as it has been remapped
+ export PORT=${CADDY_PORT} &>/dev/null
+fi
echo -e "Wekan: The open-source Trello-like kanban.\n"
-echo -e "Make sure you have connected all interfaces, check more by calling $ snap interfaces"
+echo -e "Make sure you have connected all interfaces, check more by calling $ snap interfaces ${SNAP_NAME}"
echo -e "\n"
-echo -e "${SNAP_NAME} has two services, to check status/restart/stop use systemd commands"
-echo -e "mongodb service:"
-echo -e "\t$ sudo systemctl status/start/stop/restart snap.$SNAP_NAME.mongodb"
-echo -e "wekan service"
-echo -e "\t$ sudo systemctl status/start/stop/restart snap.$SNAP_NAME.wekan"
+echo -e "${SNAP_NAME} has multiple services, to check status use systemctl"
+echo -e "\t$ systemctl status snap.$SNAP_NAME.*"
echo -e "\n"
echo -e "To make backup of wekan's database use: $ ${SNAP_NAME}.database-backup [backup file]"
echo -e "\t backup file is optional parameter, if not passed backup is created in directory:"
@@ -42,7 +44,5 @@ do
echo -e "\t\tCurrent value set to: '${!key}', (default value: '${!default_value}')"
fi
done
-echo -e "\nFor changes to take effect restart wekan service,"
-echo -e "if mongodb key was change also restart mongodb service, before restarting wekan"
-echo -e "to restart mongodb: $ sudo systemctl restart snap.$SNAP_NAME.mongodb"
-echo -e "to restart wekan: $ sudo systemctl restart snap.$SNAP_NAME.wekan"
+
+echo -e "\n!!!! Some changes result in restart of some or all services, use with caution !!!!!"
diff --git a/snap-src/bin/wekan-read-settings b/snap-src/bin/wekan-read-settings
new file mode 100755
index 00000000..f216c2a8
--- /dev/null
+++ b/snap-src/bin/wekan-read-settings
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+# read wekan config
+source $SNAP/bin/config
+
+
+for key in ${keys[@]}
+do
+ default_value="DEFAULT_$key"
+ description="DESCRIPTION_$key"
+ snappy_key="KEY_$key"
+ value=$(snapctl get ${!snappy_key})
+ if [ "x$value" == "x" ]; then
+ echo -e "$key=${!default_value} (default value)"
+ export $key=${!default_value}
+ else
+ echo -e "$key=$value"
+ export $key=$value
+ fi
+done
+
+# if caddy is enabled, do update port settings based on caddy file
+if [ "$CADDY_ENABLED" = "true" ]; then
+ echo "caddy is enabled, adjusting ports"
+ export CADDY_PORT=${PORT}
+ echo -e "CADDY_PORT=$CADDY_PORT"
+ export PORT=${CADDY_BIND_PORT}
+ echo -e "PORT=$PORT"
+fi
diff --git a/snap-src/wekan-read-settings b/snap-src/wekan-read-settings
deleted file mode 100755
index aec05bba..00000000
--- a/snap-src/wekan-read-settings
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/bin/sh
-
-# read wekan config
-source $SNAP/bin/config
-
-# TODO: uncomment following, once snapctl can be called from outside the hooks
-# for key in ${keys[@]}
-# do
-# # snappy is picky about key syntax, using mapping
-# MAP_KEY="KEY_$key"
-# SNAPPY_KEY=
-# if value=$(snapctl get ${!MAP_KEY}); then
-# echo "$key='$value'"
-# export $key=$value
-# else
-# # use default value
-# default_value="DEFAULT_$key"
-# echo "using default value: $key='${!default_value}'"
-# export $key=${!default_value}
-# fi
-# done
-
-# TODO: get rid of this workaround once above can be used
-# loop through all values, and if not defined, use default value
-for key in ${keys[@]}
-do
- if [ "x" == "x${!key}" ]; then
- # use default value
- default_value="DEFAULT_$key"
- echo "using default value: $key='${!default_value}'"
- export $key=${!default_value}
- # echo "export $key='${!def_value}'" >> $SETTINGS_FILE
- else
- echo "$key='${!key}'"
- fi
-done
diff --git a/snap/hooks/configure b/snap/hooks/configure
index 1e2b0ec7..f2f4cda1 100755
--- a/snap/hooks/configure
+++ b/snap/hooks/configure
@@ -1,32 +1,35 @@
#!/bin/bash
+exec >> $SNAP_DATA/hook.log 2>&1
+echo "$(date '+%Y-%m-%d %H:%M:%S') $0: Entering hook"
+
+set -x
+
# read wekan config
. $SNAP/bin/config
-# create run dir, we're going to use it for unix socket
-mkdir -p $SNAP_DATA/share
-mkdir -p $SNAP_DATA/shared
-
# settings were altered by user, safest way to get them applied is to restart service
+# first check if caddy service is enabled
+value=$(snapctl get caddy-enabled)
+if [ "$value" = "true" ]; then
+ # update caddy file
+ bind_port=$(snapctl get caddy-bind-port)
+ port=$(snapctl get port)
+ [ "x" != "x${bind_port}" ] && sed -i 's|proxy / localhost:.* {|proxy / localhost:'"${bind_port}"' {|g' $SNAP_COMMON/Caddyfile
+ [ "x" != "x$port" ] && sed -i 's|http://:.*|http://:'"${port}"'|g' $SNAP_COMMON/Caddyfile
+ snapctl start --enable ${SNAP_NAME}.caddy 2>&1 || true
+ snapctl restart ${SNAP_NAME}.caddy 2>&1 || true
+else
+ snapctl stop --disable ${SNAP_NAME}.caddy 2>&1 || true
+fi
-# TODO: remove this workaround once it's not needed
-# for the moment we can't read settings outside of the hook,
-# so store all settings in helpper script which is then picked by main wrapper
-echo -e "#!/bin/sh\n" > $SETTINGS_FILE
-for key in ${keys[@]}
-do
- # snappy is picky about key syntax, using mapping
- MAP_KEY="KEY_$key"
- if value=$(snapctl get ${!MAP_KEY}); then
- echo "export $key='$value'" >> $SETTINGS_FILE
- elif [ -d "${!key}" ]; then
- # store back value from SETTINGS_FILE
- echo "export $key='${!key}'" >> $SETTINGS_FILE
- fi
-done
-
-# set file executable
-chmod 755 $SETTINGS_FILE
-# we can't use snapctl to restart service, may be one day ....
+value=$(snapctl get disable-mongodb)
+if [ "$value" = "true" ]; then
+ snapctl stop --disable ${SNAP_NAME}.mongodb 2>&1 || true
+else
+ snapctl start --enable ${SNAP_NAME}.mongodb 2>&1 || true
+ snapctl restart ${SNAP_NAME}.mongodb 2>&1 || true
+fi
-echo "Setting has been updated, restart service."
+# restart all services
+snapctl restart ${SNAP_NAME}.wekan 2>&1 || true
diff --git a/snap/hooks/install b/snap/hooks/install
new file mode 100755
index 00000000..7bc908eb
--- /dev/null
+++ b/snap/hooks/install
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+exec >> $SNAP_DATA/hook.log 2>&1
+echo "$(date '+%Y-%m-%d %H:%M:%S') $0: Entering hook"
+
+# coppy caddy file in place
+[ ! -e $SNAP_COMMON/Caddyfile ] && cp $SNAP/Caddyfile $SNAP_COMMON/Caddyfile
+
+# create run dir, we're going to use it for unix socket
+mkdir -p $SNAP_DATA/share
+mkdir -p $SNAP_DATA/shared
+
diff --git a/snap/hooks/post-refresh b/snap/hooks/post-refresh
new file mode 120000
index 00000000..f7ffc47a
--- /dev/null
+++ b/snap/hooks/post-refresh
@@ -0,0 +1 @@
+install \ No newline at end of file
diff --git a/snapcraft.yaml b/snapcraft.yaml
index 5df6b1cd..088e1524 100644
--- a/snapcraft.yaml
+++ b/snapcraft.yaml
@@ -21,6 +21,12 @@ plugs:
interface: content
target: $SNAP_DATA/shared
+hooks:
+ configure:
+ plugs:
+ - network
+ - network-bind
+
slots:
mongodb-slot:
interface: content
@@ -38,6 +44,11 @@ apps:
daemon: simple
plugs: [network, network-bind]
+ caddy:
+ command: caddy-control
+ daemon: simple
+ plugs: [network, network-bind]
+
help:
command: wekan-help
@@ -54,7 +65,7 @@ apps:
parts:
mongodb:
- source: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-3.2.16.tgz
+ source: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-3.2.19.tgz
plugin: dump
stage-packages: [libssl1.0.0]
filesets:
@@ -70,25 +81,49 @@ parts:
wekan:
source: .
plugin: nodejs
- node-engine: 4.8.4
+ node-engine: 8.11.1
node-packages:
- - npm@4.6.1
+ - npm@5.5.1
- node-gyp
- node-pre-gyp
- - fibers@1.0.15
+ - fibers@2.0.0
build-packages:
+ - ca-certificates
+ - apt-utils
- python
- g++
- capnproto
- - nodejs
- - nodejs-legacy
+ - npm
- curl
- prepare: |
+ - execstack
+ override-build: |
echo "Cleaning environment first"
rm -rf ~/.meteor ~/.npm /usr/local/lib/node_modules
- echo "installing meteor first"
+ # Node Fibers 100% CPU usage issue:
+ # https://github.com/wekan/wekan-mongodb/issues/2#issuecomment-381453161
+ # https://github.com/meteor/meteor/issues/9796#issuecomment-381676326
+ # https://github.com/sandstorm-io/sandstorm/blob/0f1fec013fe7208ed0fd97eb88b31b77e3c61f42/shell/server/00-startup.js#L99-L129
+ # Also see beginning of wekan/server/authentication.js
+ # import Fiber from "fibers";
+ # Fiber.poolSize = 1e9;
+ # Download node version 8.11.1 that has fix included, node binary copied from Sandstorm
+ # Description at https://releases.wekan.team/node.txt
+ # SHA256SUM: 18c99d5e79e2fe91e75157a31be30e5420787213684d4048eb91e602e092725d
+ echo "18c99d5e79e2fe91e75157a31be30e5420787213684d4048eb91e602e092725d node" >> node-SHASUMS256.txt.asc
+ curl https://releases.wekan.team/node -o node
+ # Verify Fibers patched node authenticity
+ echo "Fibers 100% CPU issue patched node authenticity:"
+ grep node node-SHASUMS256.txt.asc | shasum -a 256 -c -
+ rm -f node-SHASUMS256.txt.asc
+ chmod +x node
+ mv node `which node`
+ # DOES NOT WORK: paxctl fix.
+ # Removed from build-packages: - paxctl
+ #echo "Applying paxctl fix for alpine linux: https://github.com/wekan/wekan/issues/1303"
+ #paxctl -mC `which node`
+ echo "Installing meteor"
curl https://install.meteor.com/ -o install_meteor.sh
- sed -i "s|RELEASE=.*|RELEASE=\"1.4.4.1\"|g" install_meteor.sh
+ sed -i "s|RELEASE=.*|RELEASE=\"1.6.0.1\"|g" install_meteor.sh
chmod +x install_meteor.sh
sh install_meteor.sh
rm install_meteor.sh
@@ -96,34 +131,42 @@ parts:
cd packages
git clone --depth 1 -b master https://github.com/wekan/flow-router.git kadira-flow-router
git clone --depth 1 -b master https://github.com/meteor-useraccounts/core.git meteor-useraccounts-core
- sed -i 's/api\.versionsFrom/\/\/api.versionsFrom/' ~/.meteor/packages/meteor-useraccounts-core/package.js
+ sed -i 's/api\.versionsFrom/\/\/api.versionsFrom/' meteor-useraccounts-core/package.js
cd ..
- build: |
rm -rf package-lock.json .build
meteor add standard-minifier-js --allow-superuser
meteor npm install --allow-superuser
meteor build .build --directory --allow-superuser
cp -f fix-download-unicode/cfs_access-point.txt .build/bundle/programs/server/packages/cfs_access-point.js
- sed -i "s|build\/Release\/bson|browser_build\/bson|g" .build/bundle/programs/server/npm/node_modules/meteor/cfs_gridfs/node_modules/mongodb/node_modules/bson/ext/index.js
cd .build/bundle/programs/server/npm/node_modules/meteor/npm-bcrypt
rm -rf node_modules/bcrypt
- npm install bcrypt
+ meteor npm install --save bcrypt
+ # Change to directory .build/bundle/programs/server
cd ../../../../
npm install
- install: |
+ meteor npm install --save bcrypt
+ # Change back to Wekan source directory
+ cd ../../../..
cp -r .build/bundle/* $SNAPCRAFT_PART_INSTALL/
cp .build/bundle/.node_version.txt $SNAPCRAFT_PART_INSTALL/
+ rm $SNAPCRAFT_PART_INSTALL/lib/node_modules/wekan
+ execstack --clear-execstack $SNAPCRAFT_PART_INSTALL/programs/server/npm/node_modules/meteor/rajit_bootstrap3-datepicker/lib/bootstrap-datepicker/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs
organize:
README: README.wekan
helpers:
source: snap-src
plugin: dump
+
+ caddy:
+ plugin: dump
+ source: https://caddyserver.com/download/linux/amd64?license=personal
+ source-type: tar
organize:
- wekan-control: bin/wekan-control
- mongodb-control: bin/mongodb-control
- wekan-read-settings: bin/wekan-read-settings
- wekan-help: bin/wekan-help
- mongodb-backup: bin/mongodb-backup
- mongodb-restore: bin/mongodb-restore
- config: bin/config
+ caddy: bin/caddy
+ CHANGES.txt: CADDY_CHANGES.txt
+ EULA.txt: CADDY_EULA.txt
+ LICENSES.txt: CADDY_LICENSES.txt
+ README.txt: CADDY_README.txt
+ stage:
+ - -init